diff --git a/.editorconfig b/.editorconfig index 5e19cc2d6..8eaf9a3bf 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,13 +2,267 @@ # editorconfig.org root = true -[*.{cs}] +# NOTE: Requires **VS2019 16.3** or later + +# Stylecop.ruleset +# Description: Rules for Sonarr + +# Code files +[*.cs] charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true indent_style = space indent_size = 4 +# Sort using and Import directives with System.* appearing first +dotnet_sort_system_directives_first = true + +# Avoid "this." and "Me." if not necessary +dotnet_style_qualification_for_field = false:refactoring +dotnet_style_qualification_for_property = false:refactoring +dotnet_style_qualification_for_method = false:refactoring +dotnet_style_qualification_for_event = false:refactoring + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_switch_labels = true +csharp_indent_labels = flush_left + +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion +dotnet_naming_style.instance_field_style.capitalization = camel_case +dotnet_naming_style.instance_field_style.required_prefix = _ + +# Prefer "var" everywhere +csharp_style_var_for_built_in_types = true:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion +csharp_style_var_elsewhere = true:suggestion + +# Stylecop Rules +dotnet_diagnostic.SA0001.severity = none +dotnet_diagnostic.SA1005.severity = none +dotnet_diagnostic.SA1025.severity = none +dotnet_diagnostic.SA1101.severity = none +dotnet_diagnostic.SA1116.severity = none +dotnet_diagnostic.SA1118.severity = none +dotnet_diagnostic.SA1122.severity = none +dotnet_diagnostic.SA1201.severity = suggestion +dotnet_diagnostic.SA1202.severity = suggestion +dotnet_diagnostic.SA1204.severity = suggestion +dotnet_diagnostic.SA1300.severity = none +dotnet_diagnostic.SA1303.severity = none +dotnet_diagnostic.SA1304.severity = none +dotnet_diagnostic.SA1306.severity = none +dotnet_diagnostic.SA1309.severity = none +dotnet_diagnostic.SA1310.severity = none +dotnet_diagnostic.SA1401.severity = none +dotnet_diagnostic.SA1402.severity = none +dotnet_diagnostic.SA1404.severity = suggestion +dotnet_diagnostic.SA1405.severity = suggestion +dotnet_diagnostic.SA1406.severity = suggestion +dotnet_diagnostic.SA1410.severity = suggestion +dotnet_diagnostic.SA1411.severity = suggestion +dotnet_diagnostic.SA1413.severity = none +dotnet_diagnostic.SA1516.severity = none +dotnet_diagnostic.SA1600.severity = none +dotnet_diagnostic.SA1601.severity = none +dotnet_diagnostic.SA1602.severity = none +dotnet_diagnostic.SA1604.severity = none +dotnet_diagnostic.SA1605.severity = none +dotnet_diagnostic.SA1606.severity = none +dotnet_diagnostic.SA1607.severity = none +dotnet_diagnostic.SA1608.severity = none +dotnet_diagnostic.SA1610.severity = none +dotnet_diagnostic.SA1611.severity = none +dotnet_diagnostic.SA1612.severity = none +dotnet_diagnostic.SA1613.severity = none +dotnet_diagnostic.SA1614.severity = none +dotnet_diagnostic.SA1615.severity = none +dotnet_diagnostic.SA1616.severity = none +dotnet_diagnostic.SA1617.severity = none +dotnet_diagnostic.SA1618.severity = none +dotnet_diagnostic.SA1619.severity = none +dotnet_diagnostic.SA1620.severity = none +dotnet_diagnostic.SA1621.severity = none +dotnet_diagnostic.SA1622.severity = none +dotnet_diagnostic.SA1623.severity = none +dotnet_diagnostic.SA1624.severity = none +dotnet_diagnostic.SA1625.severity = none +dotnet_diagnostic.SA1626.severity = none +dotnet_diagnostic.SA1627.severity = none +dotnet_diagnostic.SA1629.severity = none +dotnet_diagnostic.SA1633.severity = none +dotnet_diagnostic.SA1634.severity = none +dotnet_diagnostic.SA1635.severity = none +dotnet_diagnostic.SA1636.severity = none +dotnet_diagnostic.SA1637.severity = none +dotnet_diagnostic.SA1638.severity = none +dotnet_diagnostic.SA1640.severity = none +dotnet_diagnostic.SA1641.severity = none +dotnet_diagnostic.SA1642.severity = none +dotnet_diagnostic.SA1643.severity = none +dotnet_diagnostic.SA1648.severity = none +dotnet_diagnostic.SA1649.severity = none +dotnet_diagnostic.SA1651.severity = none +dotnet_diagnostic.SX1309.severity = warning + +# Microsoft Analyzers that fail and need to be sorted thru +dotnet_diagnostic.ASP0000.severity = suggestion +dotnet_diagnostic.CA1000.severity = suggestion +dotnet_diagnostic.CA1001.severity = suggestion +dotnet_diagnostic.CA1002.severity = suggestion +dotnet_diagnostic.CA1003.severity = suggestion +dotnet_diagnostic.CA1008.severity = suggestion +dotnet_diagnostic.CA1010.severity = suggestion +dotnet_diagnostic.CA1012.severity = suggestion +dotnet_diagnostic.CA1014.severity = suggestion +dotnet_diagnostic.CA1016.severity = suggestion +dotnet_diagnostic.CA1017.severity = suggestion +dotnet_diagnostic.CA1018.severity = suggestion +dotnet_diagnostic.CA1019.severity = suggestion +dotnet_diagnostic.CA1021.severity = suggestion +dotnet_diagnostic.CA1024.severity = suggestion +dotnet_diagnostic.CA1027.severity = suggestion +dotnet_diagnostic.CA1028.severity = suggestion +dotnet_diagnostic.CA1030.severity = suggestion +dotnet_diagnostic.CA1031.severity = suggestion +dotnet_diagnostic.CA1032.severity = suggestion +dotnet_diagnostic.CA1033.severity = suggestion +dotnet_diagnostic.CA1034.severity = suggestion +dotnet_diagnostic.CA1036.severity = suggestion +dotnet_diagnostic.CA1040.severity = suggestion +dotnet_diagnostic.CA1041.severity = suggestion +dotnet_diagnostic.CA1043.severity = suggestion +dotnet_diagnostic.CA1044.severity = suggestion +dotnet_diagnostic.CA1050.severity = suggestion +dotnet_diagnostic.CA1051.severity = suggestion +dotnet_diagnostic.CA1052.severity = suggestion +dotnet_diagnostic.CA1054.severity = suggestion +dotnet_diagnostic.CA1055.severity = suggestion +dotnet_diagnostic.CA1056.severity = suggestion +dotnet_diagnostic.CA1058.severity = suggestion +dotnet_diagnostic.CA1060.severity = suggestion +dotnet_diagnostic.CA1061.severity = suggestion +dotnet_diagnostic.CA1062.severity = suggestion +dotnet_diagnostic.CA1063.severity = suggestion +dotnet_diagnostic.CA1064.severity = suggestion +dotnet_diagnostic.CA1065.severity = suggestion +dotnet_diagnostic.CA1066.severity = suggestion +dotnet_diagnostic.CA1067.severity = suggestion +dotnet_diagnostic.CA1068.severity = suggestion +dotnet_diagnostic.CA1069.severity = suggestion +dotnet_diagnostic.CA1200.severity = suggestion +dotnet_diagnostic.CA1303.severity = suggestion +dotnet_diagnostic.CA1304.severity = suggestion +dotnet_diagnostic.CA1305.severity = suggestion +dotnet_diagnostic.CA1307.severity = suggestion +dotnet_diagnostic.CA1308.severity = suggestion +dotnet_diagnostic.CA1309.severity = suggestion +dotnet_diagnostic.CA1310.severity = suggestion +dotnet_diagnostic.CA1401.severity = suggestion +dotnet_diagnostic.CA1416.severity = suggestion +dotnet_diagnostic.CA1507.severity = suggestion +dotnet_diagnostic.CA1508.severity = suggestion +dotnet_diagnostic.CA1707.severity = suggestion +dotnet_diagnostic.CA1708.severity = suggestion +dotnet_diagnostic.CA1710.severity = suggestion +dotnet_diagnostic.CA1711.severity = suggestion +dotnet_diagnostic.CA1712.severity = suggestion +dotnet_diagnostic.CA1714.severity = suggestion +dotnet_diagnostic.CA1715.severity = suggestion +dotnet_diagnostic.CA1716.severity = suggestion +dotnet_diagnostic.CA1717.severity = suggestion +dotnet_diagnostic.CA1720.severity = suggestion +dotnet_diagnostic.CA1721.severity = suggestion +dotnet_diagnostic.CA1724.severity = suggestion +dotnet_diagnostic.CA1725.severity = suggestion +dotnet_diagnostic.CA1801.severity = suggestion +dotnet_diagnostic.CA1802.severity = suggestion +dotnet_diagnostic.CA1805.severity = suggestion +dotnet_diagnostic.CA1806.severity = suggestion +dotnet_diagnostic.CA1810.severity = suggestion +dotnet_diagnostic.CA1812.severity = suggestion +dotnet_diagnostic.CA1813.severity = suggestion +dotnet_diagnostic.CA1814.severity = suggestion +dotnet_diagnostic.CA1815.severity = suggestion +dotnet_diagnostic.CA1816.severity = suggestion +dotnet_diagnostic.CA1819.severity = suggestion +dotnet_diagnostic.CA1822.severity = suggestion +dotnet_diagnostic.CA1823.severity = suggestion +dotnet_diagnostic.CA1824.severity = suggestion +dotnet_diagnostic.CA2000.severity = suggestion +dotnet_diagnostic.CA2002.severity = suggestion +dotnet_diagnostic.CA2007.severity = suggestion +dotnet_diagnostic.CA2008.severity = suggestion +dotnet_diagnostic.CA2009.severity = suggestion +dotnet_diagnostic.CA2010.severity = suggestion +dotnet_diagnostic.CA2011.severity = suggestion +dotnet_diagnostic.CA2012.severity = suggestion +dotnet_diagnostic.CA2013.severity = suggestion +dotnet_diagnostic.CA2100.severity = suggestion +dotnet_diagnostic.CA2101.severity = suggestion +dotnet_diagnostic.CA2119.severity = suggestion +dotnet_diagnostic.CA2153.severity = suggestion +dotnet_diagnostic.CA2200.severity = suggestion +dotnet_diagnostic.CA2201.severity = suggestion +dotnet_diagnostic.CA2207.severity = suggestion +dotnet_diagnostic.CA2208.severity = suggestion +dotnet_diagnostic.CA2211.severity = suggestion +dotnet_diagnostic.CA2213.severity = suggestion +dotnet_diagnostic.CA2214.severity = suggestion +dotnet_diagnostic.CA2215.severity = suggestion +dotnet_diagnostic.CA2216.severity = suggestion +dotnet_diagnostic.CA2219.severity = suggestion +dotnet_diagnostic.CA2225.severity = suggestion +dotnet_diagnostic.CA2226.severity = suggestion +dotnet_diagnostic.CA2227.severity = suggestion +dotnet_diagnostic.CA2229.severity = suggestion +dotnet_diagnostic.CA2231.severity = suggestion +dotnet_diagnostic.CA2234.severity = suggestion +dotnet_diagnostic.CA2235.severity = suggestion +dotnet_diagnostic.CA2237.severity = suggestion +dotnet_diagnostic.CA2241.severity = suggestion +dotnet_diagnostic.CA2242.severity = suggestion +dotnet_diagnostic.CA2243.severity = suggestion +dotnet_diagnostic.CA2244.severity = suggestion +dotnet_diagnostic.CA2245.severity = suggestion +dotnet_diagnostic.CA2246.severity = suggestion +dotnet_diagnostic.CA3061.severity = suggestion +dotnet_diagnostic.CA3075.severity = suggestion +dotnet_diagnostic.CA3076.severity = suggestion +dotnet_diagnostic.CA3077.severity = suggestion +dotnet_diagnostic.CA3147.severity = suggestion +dotnet_diagnostic.CA5350.severity = suggestion +dotnet_diagnostic.CA5351.severity = suggestion +dotnet_diagnostic.CA5359.severity = suggestion +dotnet_diagnostic.CA5360.severity = suggestion +dotnet_diagnostic.CA5363.severity = suggestion +dotnet_diagnostic.CA5364.severity = suggestion +dotnet_diagnostic.CA5365.severity = suggestion +dotnet_diagnostic.CA5366.severity = suggestion +dotnet_diagnostic.CA5368.severity = suggestion +dotnet_diagnostic.CA5369.severity = suggestion +dotnet_diagnostic.CA5370.severity = suggestion +dotnet_diagnostic.CA5371.severity = suggestion +dotnet_diagnostic.CA5372.severity = suggestion +dotnet_diagnostic.CA5373.severity = suggestion +dotnet_diagnostic.CA5374.severity = suggestion +dotnet_diagnostic.CA5379.severity = suggestion +dotnet_diagnostic.CA5384.severity = suggestion +dotnet_diagnostic.CA5385.severity = suggestion +dotnet_diagnostic.CA5392.severity = suggestion +dotnet_diagnostic.CA5394.severity = suggestion +dotnet_diagnostic.CA5397.severity = suggestion + +dotnet_diagnostic.SYSLIB0006.severity = none +dotnet_diagnostic.SYSLIB0014.severity = none + [*.{js,html,js,hbs,less,css}] charset = utf-8 trim_trailing_whitespace = true diff --git a/.gitignore b/.gitignore index e0931490a..073135e2e 100644 --- a/.gitignore +++ b/.gitignore @@ -117,12 +117,15 @@ src/UI/.idea/* *log.txt node_modules/ _output* +_artifacts _rawPackage/ _dotTrace* _tests* _publish* _temp* *.Result.xml +coverage*.xml +coverage*.json setup/Output/ *.~is @@ -133,12 +136,28 @@ bin obj output/* +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# Packages +Sonarr_*/ +Sonarr_*.zip +Sonarr_*.gz +gecko.zip +geckodriver.exe #OS X metadata files ._* .DS_Store _start +_temp_*/**/* + +# Windows thumbnail cache files +Thumbs.db src/.idea/ /distribution/windows/setup/output/* diff --git a/build.sh b/build.sh index 22275fa11..423711611 100755 --- a/build.sh +++ b/build.sh @@ -1,122 +1,49 @@ -#! /bin/bash -msBuildVersion='15.0' -outputFolder='./_output' -outputFolderWindows='./_output_windows' -outputFolderLinux='./_output_linux' -outputFolderMacOS='./_output_macos' -outputFolderMacOSApp='./_output_macos_app' -testPackageFolder='./_tests' -testPackageFolderWindows='./_tests_windows' -testPackageFolderLinux='./_tests_linux' -sourceFolder='./src' -slnFile=$sourceFolder/Sonarr.sln -updateSubFolder=Sonarr.Update +#! /usr/bin/env bash +set -e -nuget='tools/nuget/nuget.exe'; -vswhere='tools/vswhere/vswhere.exe'; - -. ./version.sh - -CheckExitCode() -{ - "$@" - local status=$? - if [ $status -ne 0 ]; then - echo "error with $1" >&2 - exit 1 - fi - return $status -} +outputFolder='_output' +testPackageFolder='_tests' +artifactsFolder="_artifacts"; ProgressStart() { - echo "##teamcity[blockOpened name='$1']" - echo "##teamcity[progressStart '$1']" + echo "Start '$1'" } ProgressEnd() { - echo "##teamcity[progressFinish '$1']" - echo "##teamcity[blockClosed name='$1']" + echo "Finish '$1'" } UpdateVersionNumber() { - if [ "$BUILD_NUMBER" != "" ]; then + if [ "$SONARRVERSION" != "" ]; then echo "Updating Version Info" - verMajorMinorRevision=`echo "$buildVersion" | cut -d. -f1,2,3` - verBuild=`echo "${BUILD_NUMBER}" | cut -d. -f4` - BUILD_NUMBER=$verMajorMinorRevision.$verBuild - echo "##teamcity[buildNumber '$BUILD_NUMBER']" - sed -i "s/[0-9.*]\+<\/AssemblyVersion>/$BUILD_NUMBER<\/AssemblyVersion>/g" ./src/Directory.Build.props - sed -i "s/[\$()A-Za-z-]\+<\/AssemblyConfiguration>/${BRANCH:-dev}<\/AssemblyConfiguration>/g" ./src/Directory.Build.props + sed -i'' -e "s/[0-9.*]\+<\/AssemblyVersion>/$SONARRVERSION<\/AssemblyVersion>/g" src/Directory.Build.props + sed -i'' -e "s/[\$()A-Za-z-]\+<\/AssemblyConfiguration>/${BUILD_SOURCEBRANCHNAME}<\/AssemblyConfiguration>/g" src/Directory.Build.props + sed -i'' -e "s/10.0.0.0<\/string>/$SONARRVERSION<\/string>/g" distribution/osx/Sonarr.app/Contents/Info.plist fi } -CreateReleaseInfo() +EnableBsdSupport() { - if [ "$BUILD_NUMBER" != "" ]; then - echo "Create Release Info" - echo -e "# Do Not Edit\nReleaseVersion=$BUILD_NUMBER\nBranch=${BRANCH:-dev}" > $outputFolder/release_info + #todo enable sdk with + #SDK_PATH=$(dotnet --list-sdks | grep -P '5\.\d\.\d+' | head -1 | sed 's/\(5\.[0-9]*\.[0-9]*\).*\[\(.*\)\]/\2\/\1/g') + # BUNDLED_VERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props" + + if grep -qv freebsd-x64 src/Directory.Build.props; then + sed -i'' -e "s^\(.*\)^\1;freebsd-x64^g" src/Directory.Build.props fi } -CleanFolder() -{ - local path=$1 - local keepConfigFiles=$2 - - find $path -name "*.transform" -exec rm "{}" \; - - if [ $keepConfigFiles != true ] ; then - find $path -name "*.dll.config" -exec rm "{}" \; - fi - - echo "Removing FluentValidation.Resources files" - find $path -name "FluentValidation.resources.dll" -exec rm "{}" \; - find $path -name "App.config" -exec rm "{}" \; - - echo "Removing vshost files" - find $path -name "*.vshost.exe" -exec rm "{}" \; - - echo "Removing dylib files" - find $path -name "*.dylib" -exec rm "{}" \; - - echo "Removing Empty folders" - find $path -depth -empty -type d -exec rm -r "{}" \; -} - -BuildWithMSBuild() -{ - msBuildPath=`$vswhere -latest -products \* -requires Microsoft.Component.MSBuild -find MSBuild\\\\\*\*\\\\Bin\\\\MSBuild.exe` - msBuildPath=${msBuildPath/C:\\/\/c\/} - msBuildPath=${msBuildPath//\\/\/} - msBuildDir=$(dirname "$msBuildPath") - - echo $msBuildDir - - export PATH=$msBuildDir:$PATH - CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Clean //m - $nuget restore $slnFile - CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Build //m //p:AllowedReferenceRelatedFileExtensions=.pdb -} - -BuildWithXbuild() -{ - export MONO_IOMAP=case - CheckExitCode msbuild /t:Clean $slnFile - mono $nuget restore $slnFile - CheckExitCode msbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile -} - LintUI() { ProgressStart 'ESLint' - CheckExitCode yarn lint + yarn lint ProgressEnd 'ESLint' ProgressStart 'Stylelint' - CheckExitCode yarn stylelint + yarn stylelint ProgressEnd 'Stylelint' } @@ -127,331 +54,323 @@ Build() rm -rf $outputFolder rm -rf $testPackageFolder - if [ $runtime = "dotnet" ] ; then - BuildWithMSBuild + slnFile=src/Sonarr.sln + + if [ $os = "windows" ]; then + platform=Windows else - BuildWithXbuild + platform=Posix fi - CleanFolder $outputFolder false + dotnet clean $slnFile -c Debug + dotnet clean $slnFile -c Release - echo "Removing Mono.Posix.dll" - rm $outputFolder/Mono.Posix.dll + if [[ -z "$RID" || -z "$FRAMEWORK" ]]; + then + dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -t:PublishAllRids + else + dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$RID -t:PublishAllRids + fi ProgressEnd 'Build' } -RunWebpack() +YarnInstall() { ProgressStart 'yarn install' - yarn install + yarn install --frozen-lockfile --network-timeout 120000 ProgressEnd 'yarn install' +} - LintUI - +RunWebpack() +{ ProgressStart 'Running webpack' - CheckExitCode yarn run build --env production + yarn run build --env production ProgressEnd 'Running webpack' } -CreateMdbs() +PackageFiles() { - local path=$1 - if [ $runtime = "dotnet" ] ; then - local pdbFiles=( $(find $path -name "*.pdb") ) - for filename in "${pdbFiles[@]}" - do - if [ -e ${filename%.pdb}.dll ] ; then - tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.dll - fi - if [ -e ${filename%.pdb}.exe ] ; then - tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.exe - fi - done - fi + local folder="$1" + local framework="$2" + local runtime="$3" + + rm -rf $folder + mkdir -p $folder + cp -r $outputFolder/$framework/$runtime/publish/* $folder + cp -r $outputFolder/Sonarr.Update/$framework/$runtime/publish $folder/Sonarr.Update + cp -r $outputFolder/UI $folder + + echo "Adding LICENSE" + cp LICENSE.md $folder } -PatchMono() +PackageLinux() { - local path=$1 + local framework="$1" + local runtime="$2" - # Below we deal with some mono incompatibilities with windows-only dotnet core/standard libs - # See: https://github.com/mono/mono/blob/master/tools/nuget-hash-extractor/download.sh - # That list defines assemblies that are prohibited from being loaded from the appdir, instead loading from mono GAC. + ProgressStart "Creating $runtime Package for $framework" - # We have debian dependencies to get these installed or facades from mono 5.10+ - for assembly in System.IO.Compression System.Runtime.InteropServices.RuntimeInformation System.Net.Http System.Globalization.Extensions System.Text.Encoding.CodePages System.Threading.Overlapped - do - if [ -e $path/$assembly.dll ]; then - if [ -e $sourceFolder/Libraries/Mono/$assembly.dll ]; then - echo "Copy Mono-specific facade $assembly.dll (uses win32 interop)" - cp $sourceFolder/Libraries/Mono/$assembly.dll $path/$assembly.dll - else - echo "Remove $assembly.dll (uses win32 interop)" - rm $path/$assembly.dll - fi - - fi - done + local folder=$artifactsFolder/$runtime/$framework/Sonarr - # Copy more stable version of Vectors for mono <5.12 - if [ -e $path/System.Numerics.Vectors.dll ]; then - packageDir="$HOME/.nuget/packages/system.numerics.vectors/4.5.0" - - if [ ! -d "$HOME/.nuget/packages/system.numerics.vectors/4.5.0" ]; then - # May reside in the NuGetFallback folder, which is harder to find - # Download somewhere to get the real cache populated - if [ $runtime = "dotnet" ] ; then - $nuget install System.Numerics.Vectors -Version 4.5.0 -Output ./_temp/System.Numerics.Vectors - else - mono $nuget install System.Numerics.Vectors -Version 4.5.0 -Output ./_temp/System.Numerics.Vectors - fi - rm -rf ./_temp/System.Numerics.Vectors - fi - # Copy the netstandard2.0 version rather than net46 - cp "$packageDir/lib/netstandard2.0/System.Numerics.Vectors.dll" $path/ - fi -} - -PackageMono() -{ - ProgressStart 'Creating Mono Package' - - rm -rf $outputFolderLinux - - echo "Copying Binaries" - cp -r $outputFolder $outputFolderLinux - - echo "Creating MDBs" - CreateMdbs $outputFolderLinux - - echo "Removing PDBs" - find $outputFolderLinux -name "*.pdb" -exec rm "{}" \; + PackageFiles "$folder" "$framework" "$runtime" echo "Removing Service helpers" - rm -f $outputFolderLinux/ServiceUninstall.* - rm -f $outputFolderLinux/ServiceInstall.* - - echo "Removing native windows binaries Sqlite, MediaInfo" - rm -f $outputFolderLinux/sqlite3.* - rm -f $outputFolderLinux/MediaInfo.* - - PatchMono $outputFolderLinux - - echo "Adding Sonarr.Core.dll.config (for dllmap)" - cp $sourceFolder/NzbDrone.Core/Sonarr.Core.dll.config $outputFolderLinux - - # Remove Http binding redirect by renaming it - # We don't need this anymore once our minimum mono version is 5.10 - sed -i "s/System.Net.Http/System.Net.Http.Mono/g" $outputFolderLinux/Sonarr.Console.exe.config - - echo "Renaming Sonarr.Console.exe to Sonarr.exe" - rm $outputFolderLinux/Sonarr.exe* - for file in $outputFolderLinux/Sonarr.Console.exe*; do - mv "$file" "${file//.Console/}" - done + rm -f $folder/ServiceUninstall.* + rm -f $folder/ServiceInstall.* echo "Removing Sonarr.Windows" - rm $outputFolderLinux/Sonarr.Windows.* + rm $folder/Sonarr.Windows.* echo "Adding Sonarr.Mono to UpdatePackage" - cp $outputFolderLinux/Sonarr.Mono.* $outputFolderLinux/$updateSubFolder/ + cp $folder/Sonarr.Mono.* $folder/Sonarr.Update + if [ "$framework" = "net6.0" ]; then + cp $folder/Mono.Posix.NETStandard.* $folder/Sonarr.Update + cp $folder/libMonoPosixHelper.* $folder/Sonarr.Update + fi - ProgressEnd 'Creating Mono Package' + ProgressEnd "Creating $runtime Package for $framework" } PackageMacOS() { - ProgressStart 'Creating MacOS Package' - - rm -rf $outputFolderMacOS - mkdir $outputFolderMacOS + local framework="$1" - echo "Copying Binaries" - cp -r $outputFolderLinux/* $outputFolderMacOS + ProgressStart "Creating MacOS Package for $framework" - echo "Adding Sonarr Launcher" - cp ./distribution/osx/Launcher/dist/Launcher $outputFolderMacOS/ - mv $outputFolderMacOS/Sonarr.exe $outputFolderMacOS/Sonarr.exe.bak - mv $outputFolderMacOS/Launcher $outputFolderMacOS/Sonarr - mv $outputFolderMacOS/Sonarr.exe.bak $outputFolderMacOS/Sonarr.exe - chmod +x $outputFolderMacOS/Sonarr + local folder=$artifactsFolder/macos/$framework/Sonarr - echo "Adding Sonarr.Update Launcher" - cp ./distribution/osx/Launcher/dist/Launcher $outputFolderMacOS/Sonarr.Update/ - mv $outputFolderMacOS/Sonarr.Update/Sonarr.Update.exe $outputFolderMacOS/Sonarr.Update/Sonarr.Update.exe.bak - mv $outputFolderMacOS/Sonarr.Update/Launcher $outputFolderMacOS/Sonarr.Update/Sonarr.Update - mv $outputFolderMacOS/Sonarr.Update/Sonarr.Update.exe.bak $outputFolderMacOS/Sonarr.Update/Sonarr.Update.exe - chmod +x $outputFolderMacOS/Sonarr.Update/Sonarr.Update + PackageFiles "$folder" "$framework" "osx-x64" - echo "Adding sqlite dylibs" - cp $sourceFolder/Libraries/Sqlite/*.dylib $outputFolderMacOS + echo "Removing Service helpers" + rm -f $folder/ServiceUninstall.* + rm -f $folder/ServiceInstall.* - echo "Adding MediaInfo dylib" - cp $sourceFolder/Libraries/MediaInfo/*.dylib $outputFolderMacOS + echo "Removing Sonarr.Windows" + rm $folder/Sonarr.Windows.* + + echo "Adding Sonarr.Mono to UpdatePackage" + cp $folder/Sonarr.Mono.* $folder/Sonarr.Update + if [ "$framework" = "net6.0" ]; then + cp $folder/Mono.Posix.NETStandard.* $folder/Sonarr.Update + cp $folder/libMonoPosixHelper.* $folder/Sonarr.Update + fi ProgressEnd 'Creating MacOS Package' } PackageMacOSApp() { - ProgressStart 'Creating macOS App Package' + local framework="$1" + + ProgressStart "Creating macOS App Package for $framework" - rm -rf $outputFolderMacOSApp - mkdir $outputFolderMacOSApp - cp -r ./distribution/osx/Sonarr.app $outputFolderMacOSApp - mkdir -p $outputFolderMacOSApp/Sonarr.app/Contents/MacOS + local folder=$artifactsFolder/macos-app/$framework - echo "Adding Sonarr Launcher" - cp ./distribution/osx/Launcher/dist/Launcher $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/ - mv $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/Launcher $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/Sonarr - chmod +x $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/Sonarr + rm -rf $folder + mkdir -p $folder + cp -r distribution/osx/Sonarr.app $folder + mkdir -p $folder/Sonarr.app/Contents/MacOS echo "Copying Binaries" - mkdir -p $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/bin - cp -r $outputFolderLinux/* $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/bin/ - - echo "Adding sqlite dylibs" - cp $sourceFolder/Libraries/Sqlite/*.dylib $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/bin/ - - echo "Adding MediaInfo dylib" - cp $sourceFolder/Libraries/MediaInfo/*.dylib $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/bin/ + cp -r $artifactsFolder/macos/$framework/Sonarr/* $folder/Sonarr.app/Contents/MacOS echo "Removing Update Folder" - rm -r $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/bin/Sonarr.Update - echo "# Do Not Edit\nPackageVersion=${BUILD_NUMBER}\nPackageAuthor=[Team Sonarr](https://sonarr.tv)\nReleaseVersion=${BUILD_NUMBER}\nUpdateMethod=$PackageUpdater\nBranch=${Branch:-master}" > $outputFolderMacOSApp/Sonarr.app/Contents/MacOS/package_info + rm -r $folder/Sonarr.app/Contents/MacOS/Sonarr.Update ProgressEnd 'Creating macOS App Package' } -PackageTestsMono() -{ - ProgressStart 'Creating Mono Test Package' - - rm -rf $testPackageFolderLinux - - echo "Copying Binaries" - cp -r $testPackageFolder $testPackageFolderLinux - - if [ $runtime = "dotnet" ] ; then - $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderLinux - else - mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderLinux - fi - - echo "Creating MDBs" - CreateMdbs $testPackageFolderLinux - - echo "Removing PDBs" - find $testPackageFolderLinux -name "*.pdb" -exec rm "{}" \; - - PatchMono $testPackageFolderLinux - - echo "Adding Sonarr.Core.dll.config (for dllmap)" - cp $sourceFolder/NzbDrone.Core/Sonarr.Core.dll.config $testPackageFolderLinux - - # Remove Http binding redirect by renaming it - # We don't need this anymore once our minimum mono version is 5.10 - sed -i "s/System.Net.Http/System.Net.Http.Mono/g" $testPackageFolderLinux/Sonarr.Common.Test.dll.config - - cp ./test.sh $testPackageFolderLinux/ - dos2unix $testPackageFolderLinux/test.sh - - echo "Removing Sonarr.Windows" - rm $testPackageFolderLinux/Sonarr.Windows.* - - rm -f $testPackageFolderLinux/*.log.config - - CleanFolder $testPackageFolderLinux true - - ProgressEnd 'Creating Linux Test Package' -} - -PackageTestsWindows() -{ - ProgressStart 'Creating Windows Test Package' - - rm -rf $testPackageFolderWindows - - echo "Copying Binaries" - cp -r $testPackageFolder $testPackageFolderWindows - - if [ $runtime = "dotnet" ] ; then - $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderWindows - else - mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderWindows - fi - - cp ./test.sh $testPackageFolderWindows - - echo "Removing Sonarr.Mono" - rm -f $testPackageFolderWindows/Sonarr.Mono.* - - rm -f $testPackageFolderWindows/*.log.config - - CleanFolder $testPackageFolderWindows true - - ProgressEnd 'Creating Windows Test Package' -} - PackageWindows() { - ProgressStart 'Creating Windows Package' - - rm -rf $outputFolderWindows + local framework="$1" + local runtime="$2" - echo "Copying Binaries" - cp -r $outputFolder $outputFolderWindows + ProgressStart "Creating Windows Package for $framework" + + local folder=$artifactsFolder/$runtime/$framework/Sonarr + + PackageFiles "$folder" "$framework" "$runtime" + cp -r $outputFolder/$framework-windows/$runtime/publish/* $folder echo "Removing Sonarr.Mono" - rm -f $outputFolderWindows/Sonarr.Mono.* + rm -f $folder/Sonarr.Mono.* + rm -f $folder/Mono.Posix.NETStandard.* + rm -f $folder/libMonoPosixHelper.* echo "Adding Sonarr.Windows to UpdatePackage" - cp $outputFolderWindows/Sonarr.Windows.* $outputFolderWindows/$updateSubFolder/ + cp $folder/Sonarr.Windows.* $folder/Sonarr.Update ProgressEnd 'Creating Windows Package' } -PublishArtifacts() +Package() { - ProgressStart 'Publishing Artifacts' + local framework="$1" + local runtime="$2" + local SPLIT - # Tests - echo "##teamcity[publishArtifacts '$testPackageFolderWindows/** => tests.windows.zip']" - echo "##teamcity[publishArtifacts '$testPackageFolderLinux/** => tests.linux.zip']" + IFS='-' read -ra SPLIT <<< "$runtime" - # Releases - echo "##teamcity[publishArtifacts '$outputFolderWindows/** => Sonarr.$BRANCH.$BUILD_NUMBER.windows.zip!Sonarr']" - echo "##teamcity[publishArtifacts '$outputFolderLinux/** => Sonarr.$BRANCH.$BUILD_NUMBER.linux.tar.gz!Sonarr']" - echo "##teamcity[publishArtifacts '$outputFolderMacOS/** => Sonarr.$BRANCH.$BUILD_NUMBER.macos.tar.gz!Sonarr']" - echo "##teamcity[publishArtifacts '$outputFolderMacOSApp/** => Sonarr.$BRANCH.$BUILD_NUMBER.macos.zip']" - - # Debian Package - echo "##teamcity[publishArtifacts 'distribution/** => distribution.zip']" - - ProgressEnd 'Publishing Artifacts' + case "${SPLIT[0]}" in + linux|freebsd*) + PackageLinux "$framework" "$runtime" + ;; + win) + PackageWindows "$framework" "$runtime" + ;; + osx) + PackageMacOS "$framework" + PackageMacOSApp "$framework" + ;; + esac +} + +PackageTests() +{ + local framework="$1" + local runtime="$2" + + cp test.sh "$testPackageFolder/$framework/$runtime/publish" + + rm -f $testPackageFolder/$framework/$runtime/*.log.config + + ProgressEnd 'Creating Test Package' } # Use mono or .net depending on OS case "$(uname -s)" in CYGWIN*|MINGW32*|MINGW64*|MSYS*) # on windows, use dotnet - runtime="dotnet" + os="windows" ;; *) # otherwise use mono - runtime="mono" + os="posix" ;; esac -UpdateVersionNumber -Build -CreateReleaseInfo -RunWebpack -PackageMono -PackageMacOS -PackageMacOSApp -PackageTestsMono -PackageTestsWindows -PackageWindows -PublishArtifacts +POSITIONAL=() + +if [ $# -eq 0 ]; then + echo "No arguments provided, building everything" + BACKEND=YES + FRONTEND=YES + PACKAGES=YES + LINT=YES + ENABLE_BSD=NO +fi + +while [[ $# -gt 0 ]] +do +key="$1" + +case $key in + --backend) + BACKEND=YES + shift # past argument + ;; + --enable-bsd) + ENABLE_BSD=YES + shift # past argument + ;; + -r|--runtime) + RID="$2" + shift # past argument + shift # past value + ;; + -f|--framework) + FRAMEWORK="$2" + shift # past argument + shift # past value + ;; + --frontend) + FRONTEND=YES + shift # past argument + ;; + --packages) + PACKAGES=YES + shift # past argument + ;; + --lint) + LINT=YES + shift # past argument + ;; + --all) + BACKEND=YES + FRONTEND=YES + PACKAGES=YES + LINT=YES + shift # past argument + ;; + *) # unknown option + POSITIONAL+=("$1") # save it in an array for later + shift # past argument + ;; +esac +done +set -- "${POSITIONAL[@]}" # restore positional parameters + +if [ "$BACKEND" = "YES" ]; +then + UpdateVersionNumber + if [ "$ENABLE_BSD" = "YES" ]; + then + EnableBsdSupport + fi + Build + if [[ -z "$RID" || -z "$FRAMEWORK" ]]; + then + PackageTests "net6.0" "win-x64" + PackageTests "net6.0" "win-x86" + PackageTests "net6.0" "linux-x64" + PackageTests "net6.0" "linux-musl-x64" + PackageTests "net6.0" "osx-x64" + if [ "$ENABLE_BSD" = "YES" ]; + then + PackageTests "net6.0" "freebsd-x64" + fi + else + PackageTests "$FRAMEWORK" "$RID" + fi +fi + +if [ "$FRONTEND" = "YES" ]; +then + YarnInstall + RunWebpack +fi + +if [ "$LINT" = "YES" ]; +then + if [ -z "$FRONTEND" ]; + then + YarnInstall + fi + + LintUI +fi + +if [ "$PACKAGES" = "YES" ]; +then + UpdateVersionNumber + + if [[ -z "$RID" || -z "$FRAMEWORK" ]]; + then + Package "net6.0" "win-x64" + Package "net6.0" "win-x86" + Package "net6.0" "linux-x64" + Package "net6.0" "linux-musl-x64" + Package "net6.0" "linux-arm64" + Package "net6.0" "linux-musl-arm64" + Package "net6.0" "linux-arm" + Package "net6.0" "osx-x64" + if [ "$ENABLE_BSD" = "YES" ]; + then + Package "net6.0" "freebsd-x64" + fi + else + Package "$FRAMEWORK" "$RID" + fi +fi diff --git a/distribution/osx/Launcher/LICENSE.LGPL.md b/distribution/osx/Launcher/LICENSE.LGPL.md deleted file mode 100644 index c5bf65e21..000000000 --- a/distribution/osx/Launcher/LICENSE.LGPL.md +++ /dev/null @@ -1,459 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - \ No newline at end of file diff --git a/distribution/osx/Launcher/README.md b/distribution/osx/Launcher/README.md deleted file mode 100644 index 5345e871d..000000000 --- a/distribution/osx/Launcher/README.md +++ /dev/null @@ -1,28 +0,0 @@ -Code reused from duplicati, licensed under LGPL 2.1 -Modified for Sonarr by Taloth Saldono - -see here for the original source: https://github.com/duplicati/duplicati/tree/679981d29f8a6e445d3c1e6d41e72a673ffaa653/Installer/OSX - -License -------- - -Sonarr as a whole is licensed under GPL 3.0 as specified in the git repository root. - -But to preserve the original intent of the duplicati project, the modified versions of the sources in this folder are dual licensed under LGPL 2.1 and GPL 3.0. -Note: This exception can be freely removed in any copy of Sonarr sources as per LGPL/GPL licensing terms. - -A copy of the LGPL 2.1 license is included in the LICENSE.LGPL.md file. - -Purpose -------- - -The Launcher is a bootstrap/shim application that checks if the appropriate version of mono is installed and subsequently use it to execute Sonarr. -By using a separate application, instead of a shell script, this allows the user to assign certain operating system permissions to Sonarr specifically. - -Compiling the Launcher ----------------------- - -You need an OSX installation with xcode -Then run compile.sh in a terminal - -The generated dist/Launcher can be renamed to Sonarr and Sonarr.Update to serve as shims to run Sonarr.exe and Sonarr.Update.exe respectively. diff --git a/distribution/osx/Launcher/dist/Launcher b/distribution/osx/Launcher/dist/Launcher deleted file mode 100755 index be72543ea..000000000 Binary files a/distribution/osx/Launcher/dist/Launcher and /dev/null differ diff --git a/distribution/osx/Launcher/src/Launcher.m b/distribution/osx/Launcher/src/Launcher.m deleted file mode 100644 index 5af282665..000000000 --- a/distribution/osx/Launcher/src/Launcher.m +++ /dev/null @@ -1,32 +0,0 @@ -#import "run-with-mono.h" -#import "PFMoveApplication.h" - -int const MONO_VERSION_MAJOR = 5; -int const MONO_VERSION_MINOR = 20; - -int main() { - @autoreleasepool { - // Use our own executable name so the same compiled binary to be used for forks - NSString * const FileName = NSProcessInfo.processInfo.arguments[0].lastPathComponent; - - // Sonarr.Update.exe - NSString * const ASSEMBLY = [NSString stringWithFormat:@"%@.exe", FileName]; - - // Sonarr Update - NSString * const APP_NAME = [FileName stringByReplacingOccurrencesOfString:@"." withString:@" "]; - - // -sonarrupdate - NSString * const PROCESS_NAME = [NSString stringWithFormat:@"-%@", [FileName stringByReplacingOccurrencesOfString:@"." withString:@""].lowercaseString]; - - @try - { - PFMoveToApplicationsFolderIfNecessary(); - } - @catch (NSException * ex) - { - NSLog(@"Translocation/Quarantine check failed, starting normally. Reason: %@", ex.reason); - } - - return [RunWithMono runAssemblyWithMono:APP_NAME procnamesuffix:PROCESS_NAME assembly:ASSEMBLY major:MONO_VERSION_MAJOR minor:MONO_VERSION_MINOR]; - } -} diff --git a/distribution/osx/Launcher/src/PFMoveApplication.h b/distribution/osx/Launcher/src/PFMoveApplication.h deleted file mode 100644 index c86a21a9b..000000000 --- a/distribution/osx/Launcher/src/PFMoveApplication.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// PFMoveApplication.h, version 1.24 -// LetsMove -// -// Created by Andy Kim at Potion Factory LLC on 9/17/09 -// -// The contents of this file are dedicated to the public domain. - -#ifdef __cplusplus -extern "C" { -#endif - -#import - -/** - Moves the running application to ~/Applications or /Applications if the former does not exist. - After the move, it relaunches app from the new location. - DOES NOT work for sandboxed applications. - - Call from \c NSApplication's delegate method \c -applicationWillFinishLaunching: method. */ -void PFMoveToApplicationsFolderIfNecessary(void); - -/** - Check whether an app move is currently in progress. - Returns YES if LetsMove is currently in-progress trying to move the app to the Applications folder, or NO otherwise. - This can be used to work around a crash with apps that terminate after last window is closed. - See https://github.com/potionfactory/LetsMove/issues/64 for details. */ -BOOL PFMoveIsInProgress(void); - -#ifdef __cplusplus -} -#endif \ No newline at end of file diff --git a/distribution/osx/Launcher/src/PFMoveApplication.m b/distribution/osx/Launcher/src/PFMoveApplication.m deleted file mode 100644 index 35effaec4..000000000 --- a/distribution/osx/Launcher/src/PFMoveApplication.m +++ /dev/null @@ -1,565 +0,0 @@ -// -// PFMoveApplication.m, version 1.24 -// LetsMove -// -// Created by Andy Kim at Potion Factory LLC on 9/17/09 -// -// The contents of this file are dedicated to the public domain. - -#import "PFMoveApplication.h" - -#import -#import -#import -#import - -@interface LetsMove : NSObject -@end - -@implementation LetsMove -+ (NSBundle *)bundle { - return [NSBundle bundleForClass:self]; -} -@end - -// Strings -// These are macros to be able to use custom i18n tools -#define _I10NS(nsstr) NSLocalizedStringFromTableInBundle(nsstr, @"MoveApplication", [LetsMove bundle], nil) -#define kStrMoveApplicationCouldNotMove _I10NS(@"Could not move to Applications folder") -#define kStrMoveApplicationQuestionTitle _I10NS(@"Move to Applications folder?") -#define kStrMoveApplicationQuestionTitleHome _I10NS(@"Move to Applications folder in your Home folder?") -#define kStrMoveApplicationQuestionMessage _I10NS(@"I can move myself to the Applications folder if you'd like.") -#define kStrMoveApplicationButtonMove _I10NS(@"Move to Applications Folder") -#define kStrMoveApplicationButtonDoNotMove _I10NS(@"Do Not Move") -#define kStrMoveApplicationQuestionInfoWillRequirePasswd _I10NS(@"Note that this will require an administrator password.") -#define kStrMoveApplicationQuestionInfoInDownloadsFolder _I10NS(@"This will keep your Downloads folder uncluttered.") - -// Needs to be defined for compiling under 10.5 SDK -#ifndef NSAppKitVersionNumber10_5 - #define NSAppKitVersionNumber10_5 949 -#endif - -// By default, we use a small control/font for the suppression button. -// If you prefer to use the system default (to match your other alerts), -// set this to 0. -#define PFUseSmallAlertSuppressCheckbox 1 - - -static NSString *AlertSuppressKey = @"moveToApplicationsFolderAlertSuppress"; -static BOOL MoveInProgress = NO; - -// Helper functions -static NSString *PreferredInstallLocation(BOOL *isUserDirectory); -static BOOL IsInApplicationsFolder(NSString *path); -static BOOL IsInDownloadsFolder(NSString *path); -static BOOL IsApplicationAtPathRunning(NSString *path); -static BOOL IsApplicationAtPathNested(NSString *path); -static NSString *ContainingDiskImageDevice(NSString *path); -static BOOL Trash(NSString *path); -static BOOL DeleteOrTrash(NSString *path); -static BOOL AuthorizedInstall(NSString *srcPath, NSString *dstPath, BOOL *canceled); -static BOOL CopyBundle(NSString *srcPath, NSString *dstPath); -static NSString *ShellQuotedString(NSString *string); -static void Relaunch(NSString *destinationPath); - -// Main worker function -void PFMoveToApplicationsFolderIfNecessary(void) { - - // Make sure to do our work on the main thread. - // Apparently Electron apps need this for things to work properly. - if (![NSThread isMainThread]) { - dispatch_async(dispatch_get_main_queue(), ^{ - PFMoveToApplicationsFolderIfNecessary(); - }); - return; - } - - // Skip if user suppressed the alert before - if ([[NSUserDefaults standardUserDefaults] boolForKey:AlertSuppressKey]) return; - - // Path of the bundle - NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; - - // Check if the bundle is embedded in another application - BOOL isNestedApplication = IsApplicationAtPathNested(bundlePath); - - // Skip if the application is already in some Applications folder, - // unless it's inside another app's bundle. - if (IsInApplicationsFolder(bundlePath) && !isNestedApplication) return; - - // OK, looks like we'll need to do a move - set the status variable appropriately - MoveInProgress = YES; - - // File Manager - NSFileManager *fm = [NSFileManager defaultManager]; - - // Are we on a disk image? - NSString *diskImageDevice = ContainingDiskImageDevice(bundlePath); - - // Since we are good to go, get the preferred installation directory. - BOOL installToUserApplications = NO; - NSString *applicationsDirectory = PreferredInstallLocation(&installToUserApplications); - NSString *bundleName = [bundlePath lastPathComponent]; - NSString *destinationPath = [applicationsDirectory stringByAppendingPathComponent:bundleName]; - - // Check if we need admin password to write to the Applications directory - BOOL needAuthorization = ([fm isWritableFileAtPath:applicationsDirectory] == NO); - - // Check if the destination bundle is already there but not writable - needAuthorization |= ([fm fileExistsAtPath:destinationPath] && ![fm isWritableFileAtPath:destinationPath]); - - // Setup the alert - NSAlert *alert = [[[NSAlert alloc] init] autorelease]; - { - NSString *informativeText = nil; - - [alert setMessageText:(installToUserApplications ? kStrMoveApplicationQuestionTitleHome : kStrMoveApplicationQuestionTitle)]; - - informativeText = kStrMoveApplicationQuestionMessage; - - if (needAuthorization) { - informativeText = [informativeText stringByAppendingString:@" "]; - informativeText = [informativeText stringByAppendingString:kStrMoveApplicationQuestionInfoWillRequirePasswd]; - } - else if (IsInDownloadsFolder(bundlePath)) { - // Don't mention this stuff if we need authentication. The informative text is long enough as it is in that case. - informativeText = [informativeText stringByAppendingString:@" "]; - informativeText = [informativeText stringByAppendingString:kStrMoveApplicationQuestionInfoInDownloadsFolder]; - } - - [alert setInformativeText:informativeText]; - - // Add accept button - [alert addButtonWithTitle:kStrMoveApplicationButtonMove]; - - // Add deny button - NSButton *cancelButton = [alert addButtonWithTitle:kStrMoveApplicationButtonDoNotMove]; - [cancelButton setKeyEquivalent:[NSString stringWithFormat:@"%C", 0x1b]]; // Escape key - - // Setup suppression button - [alert setShowsSuppressionButton:YES]; - - if (PFUseSmallAlertSuppressCheckbox) { - NSCell *cell = [[alert suppressionButton] cell]; - [cell setControlSize:NSSmallControlSize]; - [cell setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; - } - } - - // Activate app -- work-around for focus issues related to "scary file from internet" OS dialog. - if (![NSApp isActive]) { - [NSApp activateIgnoringOtherApps:YES]; - } - - if ([alert runModal] == NSAlertFirstButtonReturn) { - NSLog(@"INFO -- Moving myself to the Applications folder"); - - // Move - if (needAuthorization) { - BOOL authorizationCanceled; - - if (!AuthorizedInstall(bundlePath, destinationPath, &authorizationCanceled)) { - if (authorizationCanceled) { - NSLog(@"INFO -- Not moving because user canceled authorization"); - MoveInProgress = NO; - return; - } - else { - NSLog(@"ERROR -- Could not copy myself to /Applications with authorization"); - goto fail; - } - } - } - else { - // If a copy already exists in the Applications folder, put it in the Trash - if ([fm fileExistsAtPath:destinationPath]) { - // But first, make sure that it's not running - if (IsApplicationAtPathRunning(destinationPath)) { - // Give the running app focus and terminate myself - NSLog(@"INFO -- Switching to an already running version"); - [[NSTask launchedTaskWithLaunchPath:@"/usr/bin/open" arguments:[NSArray arrayWithObject:destinationPath]] waitUntilExit]; - MoveInProgress = NO; - exit(0); - } - else { - if (!Trash([applicationsDirectory stringByAppendingPathComponent:bundleName])) - goto fail; - } - } - - if (!CopyBundle(bundlePath, destinationPath)) { - NSLog(@"ERROR -- Could not copy myself to %@", destinationPath); - goto fail; - } - } - - // Trash the original app. It's okay if this fails. - // NOTE: This final delete does not work if the source bundle is in a network mounted volume. - // Calling rm or file manager's delete method doesn't work either. It's unlikely to happen - // but it'd be great if someone could fix this. - if (!isNestedApplication && diskImageDevice == nil && !DeleteOrTrash(bundlePath)) { - NSLog(@"WARNING -- Could not delete application after moving it to Applications folder"); - } - - // Relaunch. - Relaunch(destinationPath); - - // Launched from within a disk image? -- unmount (if no files are open after 5 seconds, - // otherwise leave it mounted). - if (diskImageDevice && !isNestedApplication) { - NSString *script = [NSString stringWithFormat:@"(/bin/sleep 5 && /usr/bin/hdiutil detach %@) &", ShellQuotedString(diskImageDevice)]; - [NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:[NSArray arrayWithObjects:@"-c", script, nil]]; - } - - MoveInProgress = NO; - exit(0); - } - // Save the alert suppress preference if checked - else if ([[alert suppressionButton] state] == NSOnState) { - [[NSUserDefaults standardUserDefaults] setBool:YES forKey:AlertSuppressKey]; - } - - MoveInProgress = NO; - return; - -fail: - { - // Show failure message - alert = [[[NSAlert alloc] init] autorelease]; - [alert setMessageText:kStrMoveApplicationCouldNotMove]; - [alert runModal]; - MoveInProgress = NO; - } -} - -BOOL PFMoveIsInProgress() { - return MoveInProgress; -} - -#pragma mark - -#pragma mark Helper Functions - -static NSString *PreferredInstallLocation(BOOL *isUserDirectory) { - // Return the preferred install location. - // Assume that if the user has a ~/Applications folder, they'd prefer their - // applications to go there. - - NSFileManager *fm = [NSFileManager defaultManager]; - - /* - NSArray *userApplicationsDirs = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES); - - if ([userApplicationsDirs count] > 0) { - NSString *userApplicationsDir = [userApplicationsDirs objectAtIndex:0]; - BOOL isDirectory; - - if ([fm fileExistsAtPath:userApplicationsDir isDirectory:&isDirectory] && isDirectory) { - // User Applications directory exists. Get the directory contents. - NSArray *contents = [fm contentsOfDirectoryAtPath:userApplicationsDir error:NULL]; - - // Check if there is at least one ".app" inside the directory. - for (NSString *contentsPath in contents) { - if ([[contentsPath pathExtension] isEqualToString:@"app"]) { - if (isUserDirectory) *isUserDirectory = YES; - return [userApplicationsDir stringByResolvingSymlinksInPath]; - } - } - } - } - */ - - // No user Applications directory in use. Return the machine local Applications directory - if (isUserDirectory) *isUserDirectory = NO; - - return [[NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSLocalDomainMask, YES) lastObject] stringByResolvingSymlinksInPath]; -} - -static BOOL IsInApplicationsFolder(NSString *path) { - // Check all the normal Application directories - NSArray *applicationDirs = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSAllDomainsMask, YES); - for (NSString *appDir in applicationDirs) { - if ([path hasPrefix:appDir]) return YES; - } - - // Also, handle the case that the user has some other Application directory (perhaps on a separate data partition). - if ([[path pathComponents] containsObject:@"Applications"]) return YES; - - return NO; -} - -static BOOL IsInDownloadsFolder(NSString *path) { - NSArray *downloadDirs = NSSearchPathForDirectoriesInDomains(NSDownloadsDirectory, NSAllDomainsMask, YES); - for (NSString *downloadsDirPath in downloadDirs) { - if ([path hasPrefix:downloadsDirPath]) return YES; - } - - return NO; -} - -static BOOL IsApplicationAtPathRunning(NSString *bundlePath) { - bundlePath = [bundlePath stringByStandardizingPath]; - -#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 - // Use the new API on 10.6 or higher to determine if the app is already running - if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) { - for (NSRunningApplication *runningApplication in [[NSWorkspace sharedWorkspace] runningApplications]) { - NSString *runningAppBundlePath = [[[runningApplication bundleURL] path] stringByStandardizingPath]; - if ([runningAppBundlePath isEqualToString:bundlePath]) { - return YES; - } - } - return NO; - } -#endif - // Use the shell to determine if the app is already running on systems 10.5 or lower - NSString *script = [NSString stringWithFormat:@"/bin/ps ax -o comm | /usr/bin/grep %@/ | /usr/bin/grep -v grep >/dev/null", ShellQuotedString(bundlePath)]; - NSTask *task = [NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:[NSArray arrayWithObjects:@"-c", script, nil]]; - [task waitUntilExit]; - - // If the task terminated with status 0, it means that the final grep produced 1 or more lines of output. - // Which means that the app is already running - return [task terminationStatus] == 0; -} - -static BOOL IsApplicationAtPathNested(NSString *path) { - NSString *containingPath = [path stringByDeletingLastPathComponent]; - - NSArray *components = [containingPath pathComponents]; - for (NSString *component in components) { - if ([[component pathExtension] isEqualToString:@"app"]) { - return YES; - } - } - - return NO; -} - -static NSString *ContainingDiskImageDevice(NSString *path) { - NSString *containingPath = [path stringByDeletingLastPathComponent]; - - struct statfs fs; - if (statfs([containingPath fileSystemRepresentation], &fs) || (fs.f_flags & MNT_ROOTFS)) - return nil; - - NSString *device = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:fs.f_mntfromname length:strlen(fs.f_mntfromname)]; - - NSTask *hdiutil = [[[NSTask alloc] init] autorelease]; - [hdiutil setLaunchPath:@"/usr/bin/hdiutil"]; - [hdiutil setArguments:[NSArray arrayWithObjects:@"info", @"-plist", nil]]; - [hdiutil setStandardOutput:[NSPipe pipe]]; - [hdiutil launch]; - [hdiutil waitUntilExit]; - - NSData *data = [[[hdiutil standardOutput] fileHandleForReading] readDataToEndOfFile]; - NSDictionary *info = nil; -#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 - if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) { - info = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:NULL error:NULL]; - } - else { -#endif -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10 - info = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListImmutable format:NULL errorDescription:NULL]; -#endif -#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 - } -#endif - - if (![info isKindOfClass:[NSDictionary class]]) return nil; - - NSArray *images = (NSArray *)[info objectForKey:@"images"]; - if (![images isKindOfClass:[NSArray class]]) return nil; - - for (NSDictionary *image in images) { - if (![image isKindOfClass:[NSDictionary class]]) return nil; - - id systemEntities = [image objectForKey:@"system-entities"]; - if (![systemEntities isKindOfClass:[NSArray class]]) return nil; - - for (NSDictionary *systemEntity in systemEntities) { - if (![systemEntity isKindOfClass:[NSDictionary class]]) return nil; - - NSString *devEntry = [systemEntity objectForKey:@"dev-entry"]; - if (![devEntry isKindOfClass:[NSString class]]) return nil; - - if ([devEntry isEqualToString:device]) - return device; - } - } - - return nil; -} - -static BOOL Trash(NSString *path) { - BOOL result = NO; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 - if (floor(NSAppKitVersionNumber) >= NSAppKitVersionNumber10_8) { - result = [[NSFileManager defaultManager] trashItemAtURL:[NSURL fileURLWithPath:path] resultingItemURL:NULL error:NULL]; - } -#endif -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_11 - if (!result) { - result = [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation - source:[path stringByDeletingLastPathComponent] - destination:@"" - files:[NSArray arrayWithObject:[path lastPathComponent]] - tag:NULL]; - } -#endif - - // As a last resort try trashing with AppleScript. - // This allows us to trash the app in macOS Sierra even when the app is running inside - // an app translocation image. - if (!result) { - NSAppleScript *appleScript = [[[NSAppleScript alloc] initWithSource: - [NSString stringWithFormat:@"\ - set theFile to POSIX file \"%@\" \n\ - tell application \"Finder\" \n\ - move theFile to trash \n\ - end tell", path]] autorelease]; - NSDictionary *errorDict = nil; - NSAppleEventDescriptor *scriptResult = [appleScript executeAndReturnError:&errorDict]; - if (scriptResult == nil) { - NSLog(@"Trash AppleScript error: %@", errorDict); - } - result = (scriptResult != nil); - } - - if (!result) { - NSLog(@"ERROR -- Could not trash '%@'", path); - } - - return result; -} - -static BOOL DeleteOrTrash(NSString *path) { - NSError *error; - - if ([[NSFileManager defaultManager] removeItemAtPath:path error:&error]) { - return YES; - } - else { - // Don't log warning if on Sierra and running inside App Translocation path - if ([path rangeOfString:@"/AppTranslocation/"].location == NSNotFound) - NSLog(@"WARNING -- Could not delete '%@': %@", path, [error localizedDescription]); - - return Trash(path); - } -} - -static BOOL AuthorizedInstall(NSString *srcPath, NSString *dstPath, BOOL *canceled) { - if (canceled) *canceled = NO; - - // Make sure that the destination path is an app bundle. We're essentially running 'sudo rm -rf' - // so we really don't want to fuck this up. - if (![[dstPath pathExtension] isEqualToString:@"app"]) return NO; - - // Do some more checks - if ([[dstPath stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0) return NO; - if ([[srcPath stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0) return NO; - - int pid, status; - AuthorizationRef myAuthorizationRef; - - // Get the authorization - OSStatus err = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &myAuthorizationRef); - if (err != errAuthorizationSuccess) return NO; - - AuthorizationItem myItems = {kAuthorizationRightExecute, 0, NULL, 0}; - AuthorizationRights myRights = {1, &myItems}; - AuthorizationFlags myFlags = (AuthorizationFlags)(kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights | kAuthorizationFlagPreAuthorize); - - err = AuthorizationCopyRights(myAuthorizationRef, &myRights, NULL, myFlags, NULL); - if (err != errAuthorizationSuccess) { - if (err == errAuthorizationCanceled && canceled) - *canceled = YES; - goto fail; - } - - static OSStatus (*security_AuthorizationExecuteWithPrivileges)(AuthorizationRef authorization, const char *pathToTool, - AuthorizationFlags options, char * const *arguments, - FILE **communicationsPipe) = NULL; - if (!security_AuthorizationExecuteWithPrivileges) { - // On 10.7, AuthorizationExecuteWithPrivileges is deprecated. We want to still use it since there's no - // good alternative (without requiring code signing). We'll look up the function through dyld and fail - // if it is no longer accessible. If Apple removes the function entirely this will fail gracefully. If - // they keep the function and throw some sort of exception, this won't fail gracefully, but that's a - // risk we'll have to take for now. - security_AuthorizationExecuteWithPrivileges = (OSStatus (*)(AuthorizationRef, const char*, - AuthorizationFlags, char* const*, - FILE **)) dlsym(RTLD_DEFAULT, "AuthorizationExecuteWithPrivileges"); - } - if (!security_AuthorizationExecuteWithPrivileges) goto fail; - - // Delete the destination - { - char *args[] = {"-rf", (char *)[dstPath fileSystemRepresentation], NULL}; - err = security_AuthorizationExecuteWithPrivileges(myAuthorizationRef, "/bin/rm", kAuthorizationFlagDefaults, args, NULL); - if (err != errAuthorizationSuccess) goto fail; - - // Wait until it's done - pid = wait(&status); - if (pid == -1 || !WIFEXITED(status)) goto fail; // We don't care about exit status as the destination most likely does not exist - } - - // Copy - { - char *args[] = {"-pR", (char *)[srcPath fileSystemRepresentation], (char *)[dstPath fileSystemRepresentation], NULL}; - err = security_AuthorizationExecuteWithPrivileges(myAuthorizationRef, "/bin/cp", kAuthorizationFlagDefaults, args, NULL); - if (err != errAuthorizationSuccess) goto fail; - - // Wait until it's done - pid = wait(&status); - if (pid == -1 || !WIFEXITED(status) || WEXITSTATUS(status)) goto fail; - } - - AuthorizationFree(myAuthorizationRef, kAuthorizationFlagDefaults); - return YES; - -fail: - AuthorizationFree(myAuthorizationRef, kAuthorizationFlagDefaults); - return NO; -} - -static BOOL CopyBundle(NSString *srcPath, NSString *dstPath) { - NSFileManager *fm = [NSFileManager defaultManager]; - NSError *error = nil; - - if ([fm copyItemAtPath:srcPath toPath:dstPath error:&error]) { - return YES; - } - else { - NSLog(@"ERROR -- Could not copy '%@' to '%@' (%@)", srcPath, dstPath, error); - return NO; - } -} - -static NSString *ShellQuotedString(NSString *string) { - return [NSString stringWithFormat:@"'%@'", [string stringByReplacingOccurrencesOfString:@"'" withString:@"'\\''"]]; -} - -static void Relaunch(NSString *destinationPath) { - // The shell script waits until the original app process terminates. - // This is done so that the relaunched app opens as the front-most app. - int pid = [[NSProcessInfo processInfo] processIdentifier]; - - // Command run just before running open /final/path - NSString *preOpenCmd = @""; - - NSString *quotedDestinationPath = ShellQuotedString(destinationPath); - - // OS X >=10.5: - // Before we launch the new app, clear xattr:com.apple.quarantine to avoid - // duplicate "scary file from the internet" dialog. - if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) { - // Add the -r flag on 10.6 - preOpenCmd = [NSString stringWithFormat:@"/usr/bin/xattr -d -r com.apple.quarantine %@", quotedDestinationPath]; - } - else { - preOpenCmd = [NSString stringWithFormat:@"/usr/bin/xattr -d com.apple.quarantine %@", quotedDestinationPath]; - } - - NSString *script = [NSString stringWithFormat:@"(while /bin/kill -0 %d >&/dev/null; do /bin/sleep 0.1; done; %@; /usr/bin/open %@) &", pid, preOpenCmd, quotedDestinationPath]; - - [NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:[NSArray arrayWithObjects:@"-c", script, nil]]; -} \ No newline at end of file diff --git a/distribution/osx/Launcher/src/compile.sh b/distribution/osx/Launcher/src/compile.sh deleted file mode 100644 index e8947aff9..000000000 --- a/distribution/osx/Launcher/src/compile.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# -fobjc-arc: enables ARC -# -fmodules: enables modules so you can import with `@import AppKit;` -# -mmacosx-version-min=10.6: support older OS X versions, this might increase the binary size - -if [ ! -d "../dist" ]; then mkdir ../dist; fi - -clang PFMoveApplication.m -fno-objc-arc -fmodules -mmacosx-version-min=10.6 -c -o PFMoveApplication.o -clang run-with-mono.m Launcher.m PFMoveApplication.o -fobjc-arc -fmodules -mmacosx-version-min=10.6 -o ../dist/Launcher -rm PFMoveApplication.o - -if [ "$1" == "install" ] && [ "$2" != "" ]; then - echo "Installing to $2" - cp ../dist/Launcher $2 - chmod +x $2 -fi diff --git a/distribution/osx/Launcher/src/run-with-mono.h b/distribution/osx/Launcher/src/run-with-mono.h deleted file mode 100644 index c95536103..000000000 --- a/distribution/osx/Launcher/src/run-with-mono.h +++ /dev/null @@ -1,11 +0,0 @@ -@import Foundation; -@import AppKit; - -@interface RunWithMono : NSObject { -} - -+ (void) openDownloadLink:(NSButton*)button; -+ (bool) showDownloadMonoDialog:(NSString *)appName major:(int)major minor:(int)minor; -+ (int) runAssemblyWithMono:(NSString *)appName procnamesuffix:(NSString *)procnamesuffix assembly:(NSString *)assembly major:(int) major minor:(int) minor; - -@end \ No newline at end of file diff --git a/distribution/osx/Launcher/src/run-with-mono.m b/distribution/osx/Launcher/src/run-with-mono.m deleted file mode 100644 index 2979fcc53..000000000 --- a/distribution/osx/Launcher/src/run-with-mono.m +++ /dev/null @@ -1,258 +0,0 @@ -#import "run-with-mono.h" - -@import Foundation; -@import AppKit; - -NSString * const VERSION_TITLE = @"Cannot launch %@"; -NSString * const VERSION_MSG = @"%@ requires the Mono Framework version %d.%d or later."; -NSString * const DOWNLOAD_URL = @"http://www.mono-project.com/download/stable/#download-mac"; - -// Helper method to see if the user has requested debug output -bool D() { - NSString* v = [[[NSProcessInfo processInfo]environment]objectForKey:@"DEBUG"]; - if (v == nil || v.length == 0 || [v isEqual:@"0"] || [v isEqual:@"false"] || [v isEqual:@"f"]) - return false; - return true; -} - -// Wrapper method to invoke commandline operations and return the string output -NSString *runCommand(NSString *program, NSArray *arguments) { - NSPipe *pipe = [NSPipe pipe]; - NSFileHandle *file = pipe.fileHandleForReading; - - NSTask *task = [[NSTask alloc] init]; - task.launchPath = program; - task.arguments = arguments; - task.standardOutput = pipe; - - [task launch]; - - NSData *data = [file readDataToEndOfFile]; - [file closeFile]; - [task waitUntilExit]; - - NSString *cmdOutput = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; - if (cmdOutput == nil || cmdOutput.length == 0) - return nil; - - return [cmdOutput stringByTrimmingCharactersInSet: - [NSCharacterSet whitespaceAndNewlineCharacterSet]]; -} - -// Checks if the Mono version is greater than or equal to the desired version -bool isValidMono(NSString *mono, int major, int minor) { - NSFileManager *fileManager = [NSFileManager defaultManager]; - - if (mono == nil) - return false; - - if (![fileManager fileExistsAtPath:mono] || ![fileManager isExecutableFileAtPath:mono]) - return false; - - NSString *versionInfo = runCommand(mono, @[@"--version"]); - - NSRange rg = [versionInfo rangeOfString:@"Mono JIT compiler version \\d+\\.\\d+" options:NSRegularExpressionSearch]; - if (rg.location != NSNotFound) { - versionInfo = [versionInfo substringWithRange:rg]; - if (D()) NSLog(@"Matched version: %@", versionInfo); - rg = [versionInfo rangeOfString:@"\\d+\\.\\d+" options:NSRegularExpressionSearch]; - if (rg.location != NSNotFound) { - versionInfo = [versionInfo substringWithRange:rg]; - if (D()) NSLog(@"Matched version: %@", versionInfo); - - NSArray *versionComponents = [versionInfo componentsSeparatedByString:@"."]; - if ([versionComponents[0] intValue] < major) - return false; - if ([versionComponents[0] intValue] == major && [versionComponents[1] intValue] < minor) - return false; - - return true; - } - } - - return false; -} - -// Attempts to locate a mono with a valid version -NSString *findMono(int major, int minor) { - NSFileManager *fileManager = [NSFileManager defaultManager]; - - NSString *currentMono = runCommand(@"/usr/bin/which", @[@"mono"]); - if (D()) NSLog(@"which mono: %@", currentMono); - - if (isValidMono(currentMono, major, minor)) { - if (D()) NSLog(@"Found mono with: %@", currentMono); - return currentMono; - } - - NSArray *probepaths = @[@"/usr/local/bin/mono", @"/Library/Frameworks/Mono.framework/Versions/Current/bin/mono", @"/opt/local/bin/mono"]; - for(NSString* probepath in probepaths) { - if (D()) NSLog(@"Trying mono with: %@", probepath); - if (isValidMono(probepath, major, minor)) { - if (D()) NSLog(@"Found mono with: %@", probepath); - return probepath; - } - } - - if (D()) NSLog(@"Failed to find Mono, returning: %@", nil); - return nil; -} - -// Check Bundle for quarantine -void checkBundle() { - - NSString * const bundlePath = [[NSBundle mainBundle] bundlePath]; - NSString * const attributes = runCommand(@"/usr/bin/xattr", @[@"-l", bundlePath]); - if (D()) NSLog(@"Attributes: %@", attributes); - if ([attributes containsString:@"com.apple.quarantine:"]) { - runCommand(@"/usr/bin/xattr", @[@"-dr", @"com.apple.quarantine", bundlePath]); - NSLog(@"Removed quarantine attribute from bundle"); - } -} - - -@implementation RunWithMono - -+ (void) openDownloadLink:(NSButton*)button { - if (D()) NSLog(@"Clicked Download"); - runCommand(@"/usr/bin/open", @[DOWNLOAD_URL]); -} - -// Shows the download dialog, prompting to download Mono -+ (bool) showDownloadMonoDialog:(NSString *)appName major:(int)major minor:(int)minor { - NSAlert *alert = [[NSAlert alloc] init]; - - [alert setInformativeText:[NSString stringWithFormat:VERSION_MSG, appName, major, minor]]; - [alert setMessageText:[NSString stringWithFormat:VERSION_TITLE, appName]]; - [alert addButtonWithTitle:@"Cancel"]; - [alert addButtonWithTitle:@"Retry"]; - [alert addButtonWithTitle:@"Download"]; - - NSButton *downloadButton = [[alert buttons] objectAtIndex:2]; - - [downloadButton setTarget:self]; - [downloadButton setAction:@selector(openDownloadLink:)]; - - NSModalResponse btn = [alert runModal]; - if (btn == NSAlertFirstButtonReturn) { - if (D()) NSLog(@"Clicked Cancel"); - return true; - } - else if (btn == NSAlertSecondButtonReturn) { - if (D()) NSLog(@"Clicked Retry"); - return false; - } - - return true; -} - -// Top-level method, finds Mono with an appropriate version and launches the assembly -+ (int) runAssemblyWithMono: (NSString *)appName procnamesuffix:(NSString *)procnamesuffix assembly:(NSString *)assembly major:(int) major minor:(int) minor { - NSFileManager *fileManager = [NSFileManager defaultManager]; - - NSString *assemblyPath; - bool found = false; - - NSString *localPath = NSProcessInfo.processInfo.arguments[0].stringByDeletingLastPathComponent; - NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; - NSArray *paths = @[ - localPath, - [NSString pathWithComponents:@[localPath, @"bin"]], - resourcePath, - [NSString pathWithComponents:@[resourcePath, @"bin"]] - ]; - for (NSString* entryFolder in paths) { - if (D()) NSLog(@"Checking folder: %@", entryFolder); - - assemblyPath = [NSString pathWithComponents:@[entryFolder, assembly]]; - - if ([fileManager fileExistsAtPath:assemblyPath]) { - found = true; - break; - } - } - - if (!found) { - NSLog(@"Assembly file not found"); - return 1; - } - - if (D()) NSLog(@"assemblyPath: %@", assemblyPath); - - checkBundle(); - - NSString *currentMono = findMono(major, minor); - - while (currentMono == nil) { - NSLog(@"No valid mono found!"); - bool close = [self showDownloadMonoDialog:appName major:major minor:minor]; - if (close) - return 1; - currentMono = findMono(major, minor); - } - - // Setup dylib fallback loading - NSMutableArray * dylibPath = [NSMutableArray arrayWithObject:assemblyPath.stringByDeletingLastPathComponent]; - - // Update the PATH to use the specified mono version - if ([currentMono hasPrefix:@"/"]) - { - NSString * curMonoBinDir = currentMono.stringByDeletingLastPathComponent; - NSString * curMonoDir = curMonoBinDir.stringByDeletingLastPathComponent; - NSString * curMonoLibDir = [NSString pathWithComponents:@[curMonoDir, @"lib"]]; - - NSString * curEnvPath = [NSString stringWithUTF8String:getenv("PATH")]; - NSString * newEnvPath = [NSString stringWithFormat:@"%@:%@", curMonoBinDir, curEnvPath]; - setenv("PATH", newEnvPath.UTF8String, 1); - - [dylibPath addObject:curMonoLibDir]; - - NSLog(@"Added %@ to PATH", curMonoBinDir); - } - - // Setup libsqlite? - /* if [[ -f '/opt/local/lib/libsqlite3.0.dylib' ]]; then - export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH" - fi - */ - - [dylibPath addObjectsFromArray:@[@"$HOME/lib", @"/usr/local/lib", @"/lib", @"/usr/lib"]]; - - setenv("DYLD_FALLBACK_LIBRARY_PATH", [dylibPath componentsJoinedByString:@":"].UTF8String, 1); - - if (D()) NSLog(@"Running %@ --debug %@", currentMono, assemblyPath); - - // Copy commandline arguments - NSMutableArray* arguments = [[NSMutableArray alloc] init]; - // Disabled suffix for now coz it's confusing and not preserved on in-app restart - [arguments addObject:currentMono]; - //[arguments addObject:[currentMono stringByAppendingString:procnamesuffix]]; - [arguments addObject:@"--debug"]; - [arguments addObjectsFromArray:[[NSProcessInfo processInfo] arguments]]; - - // replace the executable-path with the assembly path - [arguments replaceObjectAtIndex:2 withObject:assemblyPath]; - - // Try switch to mono using execv - char * cPath = strdup([currentMono UTF8String]); - char ** cArgs; - char ** pArgNext = cArgs = malloc(sizeof(*cArgs) * ([arguments count] + 1)); - for (NSString *s in arguments) { - *pArgNext++ = strdup([s UTF8String]); - } - *pArgNext = NULL; - int ret = execv(cPath, cArgs); - if (ret != 0) - NSLog(@"Failed execv with errno @d", errno); - // execv failed, cleanup - pArgNext = cArgs; - for (NSString *s in arguments) { - free(*pArgNext++); - } - free(cArgs); - free(cPath); - - return -1; -} - -@end \ No newline at end of file diff --git a/distribution/osx/Sonarr.old.sh b/distribution/osx/Sonarr.old.sh deleted file mode 100644 index 33c3230b5..000000000 --- a/distribution/osx/Sonarr.old.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/sh - -#get the bundle's MacOS directory full path -DIR=$(cd "$(dirname "$0")"; pwd) - -#change these values to match your app -EXE_PATH="$DIR/Sonarr.exe" -APPNAME="Sonarr" - -#set up environment -if [[ -x '/opt/local/bin/mono' ]]; then - # Macports and mono-supplied installer path - export PATH="/opt/local/bin:$PATH" -elif [[ -x '/usr/local/bin/mono' ]]; then - # Homebrew-supplied path to mono - export PATH="/usr/local/bin:$PATH" -fi - -export DYLD_FALLBACK_LIBRARY_PATH="$DIR" - -if [ -e /Library/Frameworks/Mono.framework ]; then - MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current - export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH" - export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$MONO_FRAMEWORK_PATH/lib" -fi - -if [[ -f '/opt/local/lib/libsqlite3.0.dylib' ]]; then - export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH" -fi - -export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$HOME/lib:/usr/local/lib:/lib:/usr/lib" - -#mono version check -REQUIRED_MAJOR=4 -REQUIRED_MINOR=6 - -VERSION_TITLE="Cannot launch $APPNAME" -VERSION_MSG="$APPNAME requires Mono Runtime Environment(MRE) $REQUIRED_MAJOR.$REQUIRED_MINOR or later." -DOWNLOAD_URL="http://www.mono-project.com/download/#download-mac" - -MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' | cut -f5 -d\ )" -# if [[ -o DEBUG ]]; then osascript -e "display dialog \"MONO_VERSION: $MONO_VERSION\""; fi - - -MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)" -MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)" -if [ -z "$MONO_VERSION" ] \ - || [ $MONO_VERSION_MAJOR -lt $REQUIRED_MAJOR ] \ - || [ $MONO_VERSION_MAJOR -eq $REQUIRED_MAJOR -a $MONO_VERSION_MINOR -lt $REQUIRED_MINOR ] -then - osascript \ - -e "set question to display dialog \"$VERSION_MSG\" with title \"$VERSION_TITLE\" buttons {\"Cancel\", \"Download...\"} default button 2" \ - -e "if button returned of question is equal to \"Download...\" then open location \"$DOWNLOAD_URL\"" - echo "$VERSION_TITLE" - echo "$VERSION_MSG" - exit 1 -fi - -MONO_EXEC="exec mono --debug" - -#run app using mono -$MONO_EXEC "$EXE_PATH" diff --git a/distribution/windows/setup/sonarr.iss b/distribution/windows/setup/sonarr.iss index 5fc1e53ae..10430e153 100644 --- a/distribution/windows/setup/sonarr.iss +++ b/distribution/windows/setup/sonarr.iss @@ -7,8 +7,9 @@ #define ForumsURL "https://forums.sonarr.tv/" #define AppExeName "Sonarr.exe" #define BuildNumber "3.0" -#define BuildNumber GetEnv('BUILD_NUMBER') #define BranchName GetEnv('BRANCH') +#define Framework GetEnv('FRAMEWORK') +#define Runtime GetEnv('RUNTIME') [Setup] ; NOTE: The value of AppId uniquely identifies this application. @@ -16,7 +17,7 @@ ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{56C1065D-3523-4025-B76D-6F73F67F7F71} AppName={#AppName} -AppVersion=3.0 +AppVersion={#BuildNumber} AppPublisher={#AppPublisher} AppPublisherURL={#AppURL} AppSupportURL={#ForumsURL} @@ -26,7 +27,7 @@ DefaultDirName={commonappdata}\Sonarr\bin DisableDirPage=yes DefaultGroupName={#AppName} DisableProgramGroupPage=yes -OutputBaseFilename=Sonarr.{#BranchName}.{#BuildNumber}.windows +OutputBaseFilename=Sonarr.{#BranchName}.{#BuildNumber}.windows.{#Framework} SolidCompression=yes AppCopyright=Creative Commons 3.0 License AllowUNCPath=False @@ -49,8 +50,8 @@ Name: "startupShortcut"; Description: "Create shortcut in Startup folder (Starts Name: "none"; Description: "Do not start automatically"; GroupDescription: "Start automatically"; Flags: exclusive unchecked [Files] -Source: "..\..\..\_output_windows\Sonarr.exe"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\..\..\_output_windows\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "..\..\..\_artifacts\{#Runtime}\{#Framework}\Sonarr\Sonarr.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\..\..\_artifacts\{#Runtime}\{#Framework}\Sonarr\*"; Excludes: "Sonarr.Update"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] @@ -80,26 +81,3 @@ begin Exec('net', 'stop nzbdrone', '', 0, ewWaitUntilTerminated, ResultCode) Exec('sc', 'delete nzbdrone', '', 0, ewWaitUntilTerminated, ResultCode) end; - -function Framework472IsNotInstalled(): Boolean; -var - bSuccess: Boolean; - regVersion: Cardinal; -begin - Result := True; -bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Release', regVersion); - if (True = bSuccess) and (regVersion >= 461808) then begin - Result := False; - end; -end; - -function InitializeSetup(): Boolean; -begin - if Framework472IsNotInstalled() then begin - MsgBox('Sonarr requires Microsoft .NET Framework 4.7.2 or higher.'#13#13 - 'Please use Windows Update to install this version'#13 - 'or download it from https://dotnet.microsoft.com/download/dotnet-framework.', mbInformation, MB_OK); - result := false; - end else - result := true; -end; diff --git a/frontend/src/System/Status/About/About.js b/frontend/src/System/Status/About/About.js index afb95de7d..d0bf07958 100644 --- a/frontend/src/System/Status/About/About.js +++ b/frontend/src/System/Status/About/About.js @@ -18,7 +18,8 @@ class About extends Component { version, packageVersion, packageAuthor, - isMonoRuntime, + isNetCore, + isDocker, runtimeVersion, appData, startupPath, @@ -45,14 +46,18 @@ class About extends Component { } { - isMonoRuntime ? + isNetCore && : + title=".Net Version" + data={`Yes (${runtimeVersion})`} + /> + } + + { + isDocker && } @@ -92,8 +97,9 @@ About.propTypes = { version: PropTypes.string.isRequired, packageVersion: PropTypes.string, packageAuthor: PropTypes.string, - isMonoRuntime: PropTypes.bool.isRequired, + isNetCore: PropTypes.bool.isRequired, runtimeVersion: PropTypes.string.isRequired, + isDocker: PropTypes.bool.isRequired, appData: PropTypes.string.isRequired, startupPath: PropTypes.string.isRequired, mode: PropTypes.string.isRequired, diff --git a/package.json b/package.json index b91be8dca..fa4f7382a 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@fortawesome/free-regular-svg-icons": "5.15.3", "@fortawesome/free-solid-svg-icons": "5.15.3", "@fortawesome/react-fontawesome": "0.1.14", - "@microsoft/signalr": "5.0.5", + "@microsoft/signalr": "6.0.3", "@sentry/browser": "6.3.1", "@sentry/integrations": "6.3.1", "classnames": "2.3.1", diff --git a/src/Common/CodeAnalysisDictionary.xml b/src/Common/CodeAnalysisDictionary.xml deleted file mode 100644 index 857f46c4e..000000000 --- a/src/Common/CodeAnalysisDictionary.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Ack - Minifier - Jsonp - Linktionary - Scaleout - Redis - Owin - Stringify - Unminify - Unminified - Stateful - SignalR - Hubservable - Sse - GitHub - - - \ No newline at end of file diff --git a/src/Common/CommonAssemblyInfo.cs b/src/Common/CommonAssemblyInfo.cs deleted file mode 100644 index c245672c6..000000000 --- a/src/Common/CommonAssemblyInfo.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. - -using System; -using System.Reflection; -using System.Resources; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyCompany("Microsoft Open Technologies, Inc.")] -[assembly: AssemblyCopyright("© Microsoft Open Technologies, Inc. All rights reserved.")] - -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: AssemblyConfiguration("")] -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] - -[assembly: NeutralResourcesLanguage("en-US")] \ No newline at end of file diff --git a/src/Common/CommonVersionInfo.cs b/src/Common/CommonVersionInfo.cs deleted file mode 100644 index d674c376f..000000000 --- a/src/Common/CommonVersionInfo.cs +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. - -using System.Reflection; - -[assembly: AssemblyVersion("10.0.0.*")] diff --git a/src/Common/GlobalSuppressions.cs b/src/Common/GlobalSuppressions.cs deleted file mode 100644 index ec9dfe318..000000000 --- a/src/Common/GlobalSuppressions.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. - -// This file is used by Code Analysis to maintain SuppressMessage -// attributes that are applied to this project. -// Project-level suppressions either have no target or are given -// a specific target and scoped to a namespace, type, member, etc. -// -// To add a suppression to this file, right-click the message in the -// Code Analysis results, point to "Suppress Message", and click -// "In Suppression File". -// You do not need to add suppressions to this file manually. - -using System.Diagnostics.CodeAnalysis; - -[assembly: SuppressMessage("Microsoft.Design", "CA2210:AssembliesShouldHaveValidStrongNames", Justification = "Strong naming is done on the CI.")] -[assembly: SuppressMessage("Microsoft.Naming", "CA1703:ResourceStringsShouldBeSpelledCorrectly", MessageId = "param", Scope = "resource", Target = "Microsoft.AspNet.SignalR.Resources.resources")] -[assembly: SuppressMessage("Microsoft.Usage", "CA2243:AttributeStringLiteralsShouldParseCorrectly", Justification = "We use semver")] -[assembly: SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.AspNet.SignalR.Messaging.ScaleoutTaskQueue.#.cctor()", Justification = "The task is cached")] diff --git a/src/Common/Microsoft.AspNet.SignalR.ruleset b/src/Common/Microsoft.AspNet.SignalR.ruleset deleted file mode 100644 index 38ad3e9ec..000000000 --- a/src/Common/Microsoft.AspNet.SignalR.ruleset +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Common/Microsoft.AspNet.SignalR.targets b/src/Common/Microsoft.AspNet.SignalR.targets deleted file mode 100644 index 291b985a8..000000000 --- a/src/Common/Microsoft.AspNet.SignalR.targets +++ /dev/null @@ -1,40 +0,0 @@ - - - - $(ArtifactsDir)\$(MSBuildProjectName) - $(ArtifactsDir)\$(MSBuildProjectName)\bin - - - - $(MSBuildThisFileDirectory)Microsoft.AspNet.SignalR.ruleset - false - 1591 - true - - - - $(DefineConstants);CODE_ANALYSIS - 11.0 - - - - $(DefineConstants);MONO - - - - $(DefineConstants);SIGNED - true - true - $(KeyFile) - - - - - GlobalSuppressions.cs - - - - - - - \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index b45f9f3f7..e213bdc20 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,6 +1,13 @@ + true + false + + AnyCPU + true + win-x64;win-x86;osx-x64;linux-x64;linux-musl-x64;linux-arm;linux-arm64;linux-musl-arm64 + $(MSBuildThisFileDirectory)..\ @@ -17,6 +24,10 @@ true true true + + + false + true @@ -32,12 +43,11 @@ $(SonarrRootDir)_output\Sonarr.Update\ + false $([MSBuild]::MakeRelative('$(MSBuildProjectDirectory)', '$(BaseIntermediateOutputPath)')) $([MSBuild]::MakeRelative('$(MSBuildProjectDirectory)', '$(IntermediateOutputPath)')) $([MSBuild]::MakeRelative('$(MSBuildProjectDirectory)', '$(OutputPath)')) - - full true @@ -45,17 +55,19 @@ true true + false Sonarr sonarr.tv - Copyright 2010-$([System.DateTime]::Now.ToString('yyyy')) sonarr.tv (GNU General Public v3) + Copyright 2014-$([System.DateTime]::Now.ToString('yyyy')) sonarr.tv (GNU General Public v3) 10.0.0.* $(Configuration)-dev + en false false @@ -71,10 +83,64 @@ - - false - $(MSBuildProjectName.Replace('Sonarr','NzbDrone')) - \ No newline at end of file + + + + + + + + + + + + + + + + false + + + + + + + true + + + + + true + + + + + true + + + + + + <_UsingDefaultRuntimeIdentifier>true + win-x64 + + + + <_UsingDefaultRuntimeIdentifier>true + linux-x64 + + + + <_UsingDefaultRuntimeIdentifier>true + osx-x64 + + + diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets new file mode 100644 index 000000000..4cf15bc72 --- /dev/null +++ b/src/Directory.Build.targets @@ -0,0 +1,4 @@ + + + + diff --git a/src/Libraries/Mono.Posix.dll b/src/Libraries/Mono.Posix.dll deleted file mode 100644 index 8e219445f..000000000 Binary files a/src/Libraries/Mono.Posix.dll and /dev/null differ diff --git a/src/Libraries/Mono/System.Globalization.Extensions.dll b/src/Libraries/Mono/System.Globalization.Extensions.dll deleted file mode 100644 index 8c0861579..000000000 Binary files a/src/Libraries/Mono/System.Globalization.Extensions.dll and /dev/null differ diff --git a/src/Libraries/Mono/System.Runtime.InteropServices.RuntimeInformation.dll b/src/Libraries/Mono/System.Runtime.InteropServices.RuntimeInformation.dll deleted file mode 100644 index e55b5eb23..000000000 Binary files a/src/Libraries/Mono/System.Runtime.InteropServices.RuntimeInformation.dll and /dev/null differ diff --git a/src/Libraries/Mono/System.Text.Encoding.CodePages.dll b/src/Libraries/Mono/System.Text.Encoding.CodePages.dll deleted file mode 100644 index 414770bc0..000000000 Binary files a/src/Libraries/Mono/System.Text.Encoding.CodePages.dll and /dev/null differ diff --git a/src/Libraries/Mono/System.Threading.Overlapped.dll b/src/Libraries/Mono/System.Threading.Overlapped.dll deleted file mode 100644 index c06475843..000000000 Binary files a/src/Libraries/Mono/System.Threading.Overlapped.dll and /dev/null differ diff --git a/src/Libraries/Mono/readme.txt b/src/Libraries/Mono/readme.txt deleted file mode 100644 index f1251a98f..000000000 --- a/src/Libraries/Mono/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -Copied from mono/4.5/Facades of the mono 5.4 release. -These are the mono version of the dotnet Core TypeForwardedTo assemblies. -Using these assemblies is no longer necessary once we reach mono 5.18 as minimum version \ No newline at end of file diff --git a/src/Marr.Data/DataMapper.cs b/src/Marr.Data/DataMapper.cs index 51423b988..b8ee4fed0 100644 --- a/src/Marr.Data/DataMapper.cs +++ b/src/Marr.Data/DataMapper.cs @@ -38,15 +38,6 @@ namespace Marr.Data private DbCommand _command; - /// - /// Initializes a DataMapper for the given provider type and connection string. - /// - /// Ex: - /// The database connection string. - public DataMapper(string providerName, string connectionString) - : this(DbProviderFactories.GetFactory(providerName), connectionString) - { } - /// /// A database provider agnostic initialization. /// diff --git a/src/Marr.Data/Marr.Data.csproj b/src/Marr.Data/Marr.Data.csproj index e57aa9941..8f92f948d 100644 --- a/src/Marr.Data/Marr.Data.csproj +++ b/src/Marr.Data/Marr.Data.csproj @@ -1,7 +1,6 @@  - net462 - x86 + netstandard2.0 3.17.0.0 false diff --git a/src/NzbDrone.Api.Test/Sonarr.Api.Test.csproj b/src/NzbDrone.Api.Test/Sonarr.Api.Test.csproj index 88f16cc3a..b7755139a 100644 --- a/src/NzbDrone.Api.Test/Sonarr.Api.Test.csproj +++ b/src/NzbDrone.Api.Test/Sonarr.Api.Test.csproj @@ -1,10 +1,9 @@  - net462 - x86 + net6.0 - + diff --git a/src/NzbDrone.Automation.Test/AutomationTest.cs b/src/NzbDrone.Automation.Test/AutomationTest.cs index febe1651d..2144b35db 100644 --- a/src/NzbDrone.Automation.Test/AutomationTest.cs +++ b/src/NzbDrone.Automation.Test/AutomationTest.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using FluentAssertions; using NLog; @@ -9,7 +10,7 @@ using NzbDrone.Automation.Test.PageModel; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Test.Common; using OpenQA.Selenium; -using OpenQA.Selenium.Firefox; +using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Remote; namespace NzbDrone.Automation.Test @@ -34,7 +35,14 @@ namespace NzbDrone.Automation.Test [OneTimeSetUp] public void SmokeTestSetup() { - driver = new FirefoxDriver(); + var options = new ChromeOptions(); + options.AddArguments("--headless"); + var service = ChromeDriverService.CreateDefaultService(); + + // Timeout as windows automation tests seem to take alot longer to get going + driver = new ChromeDriver(service, options, new TimeSpan(0, 3, 0)); + + driver.Manage().Window.Size = new System.Drawing.Size(1920, 1080); _runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger()); _runner.KillAll(); @@ -56,6 +64,19 @@ namespace NzbDrone.Automation.Test .Select(e => e.Text); } + protected void TakeScreenshot(string name) + { + try + { + Screenshot image = ((ITakesScreenshot)driver).GetScreenshot(); + image.SaveAsFile($"./{name}_test_screenshot.png", ScreenshotImageFormat.Png); + } + catch (Exception ex) + { + Console.WriteLine($"Failed to save screenshot {name}, {ex.Message}"); + } + } + [OneTimeTearDown] public void SmokeTestTearDown() { diff --git a/src/NzbDrone.Automation.Test/Sonarr.Automation.Test.csproj b/src/NzbDrone.Automation.Test/Sonarr.Automation.Test.csproj index d25dd9156..b5388248b 100644 --- a/src/NzbDrone.Automation.Test/Sonarr.Automation.Test.csproj +++ b/src/NzbDrone.Automation.Test/Sonarr.Automation.Test.csproj @@ -1,11 +1,10 @@  - net462 - x86 + net6.0 - + diff --git a/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs b/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs index da1e5fb5f..2be842067 100644 --- a/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs +++ b/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs @@ -439,7 +439,7 @@ namespace NzbDrone.Common.Test.DiskTests [Test] public void CopyFolder_should_not_copy_casesensitive_folder() { - MonoOnly(); + PosixOnly(); WithRealDiskProvider(); @@ -540,9 +540,10 @@ namespace NzbDrone.Common.Test.DiskTests } [Test] + [Platform(Exclude = "MacOsX")] public void MoveFolder_should_rename_casesensitive_folder() { - MonoOnly(); + PosixOnly(); WithRealDiskProvider(); diff --git a/src/NzbDrone.Common.Test/EnsureTest/PathExtensionFixture.cs b/src/NzbDrone.Common.Test/EnsureTest/PathExtensionFixture.cs index 3388df9ad..9d51e806f 100644 --- a/src/NzbDrone.Common.Test/EnsureTest/PathExtensionFixture.cs +++ b/src/NzbDrone.Common.Test/EnsureTest/PathExtensionFixture.cs @@ -1,4 +1,4 @@ -using NUnit.Framework; +using NUnit.Framework; using NzbDrone.Common.EnsureThat; using NzbDrone.Test.Common; @@ -19,7 +19,7 @@ namespace NzbDrone.Common.Test.EnsureTest [TestCase(@"/var/user/file with, comma.mkv")] public void EnsureLinuxPath(string path) { - MonoOnly(); + PosixOnly(); Ensure.That(path, () => path).IsValidPath(); } } diff --git a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs index f769d08bc..e11c6a2a6 100644 --- a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs +++ b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs @@ -250,11 +250,6 @@ namespace NzbDrone.Common.Test.Http [Test] public void should_follow_redirects_to_https() { - if (typeof(TDispatcher) == typeof(ManagedHttpDispatcher) && PlatformInfo.IsMono) - { - Assert.Ignore("Will fail on tls1.2 via managed dispatcher, ignore."); - } - var request = new HttpRequestBuilder($"http://{_httpBinHost}/redirect-to") .AddQueryParam("url", $"https://sonarr.tv/") .Build(); @@ -758,7 +753,7 @@ namespace NzbDrone.Common.Test.Http { try { - string url = $"http://{_httpBinHost}/response-headers?Set-Cookie={Uri.EscapeUriString(malformedCookie)}"; + string url = $"http://{_httpBinHost}/response-headers?Set-Cookie={Uri.EscapeDataString(malformedCookie)}"; var requestSet = new HttpRequest(url); requestSet.AllowAutoRedirect = false; diff --git a/src/NzbDrone.Common.Test/PathExtensionFixture.cs b/src/NzbDrone.Common.Test/PathExtensionFixture.cs index 2c82d799a..f86bceac3 100644 --- a/src/NzbDrone.Common.Test/PathExtensionFixture.cs +++ b/src/NzbDrone.Common.Test/PathExtensionFixture.cs @@ -52,7 +52,7 @@ namespace NzbDrone.Common.Test [TestCase(@"//CAPITAL//lower// ", @"/CAPITAL/lower")] public void Clean_Path_Linux(string dirty, string clean) { - MonoOnly(); + PosixOnly(); var result = dirty.CleanFilePath(); result.Should().Be(clean); @@ -152,14 +152,14 @@ namespace NzbDrone.Common.Test [TestCase(@"/test", "/")] public void path_should_return_parent_mono(string path, string parentPath) { - MonoOnly(); + PosixOnly(); path.GetParentPath().Should().Be(parentPath); } [Test] public void path_should_return_parent_for_oversized_path() { - MonoOnly(); + PosixOnly(); // This test will fail on Windows if long path support is not enabled: https://www.howtogeek.com/266621/how-to-make-windows-10-accept-file-paths-over-260-characters/ // It will also fail if the app isn't configured to use long path (such as resharper): https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/ @@ -223,7 +223,7 @@ namespace NzbDrone.Common.Test public void get_actual_casing_should_return_actual_casing_for_local_dir_in_windows() { WindowsOnly(); - var path = Directory.GetCurrentDirectory().Replace("c:\\","C:\\").Replace("system32", "System32"); + var path = Directory.GetCurrentDirectory().Replace("c:\\", "C:\\").Replace("d:\\", "D:\\").Replace("system32", "System32"); path.ToUpper().GetActualCasing().Should().Be(path); path.ToLower().GetActualCasing().Should().Be(path); @@ -232,7 +232,7 @@ namespace NzbDrone.Common.Test [Test] public void get_actual_casing_should_return_original_value_in_linux() { - MonoOnly(); + PosixOnly(); var path = Directory.GetCurrentDirectory(); path.GetActualCasing().Should().Be(path); path.GetActualCasing().Should().Be(path); @@ -280,7 +280,7 @@ namespace NzbDrone.Common.Test [Test] public void GetUpdateClientExePath() { - GetIAppDirectoryInfo().GetUpdateClientExePath().Should().BeEquivalentTo(@"C:\Temp\sonarr_update\Sonarr.Update.exe".AsOsAgnostic()); + GetIAppDirectoryInfo().GetUpdateClientExePath(PlatformType.DotNet).Should().BeEquivalentTo(@"C:\Temp\sonarr_update\Sonarr.Update.exe".AsOsAgnostic()); } [Test] @@ -306,7 +306,7 @@ namespace NzbDrone.Common.Test [Test] public void GetAncestorFolders_should_return_all_ancestors_in_path_Linux() { - MonoOnly(); + PosixOnly(); var path = @"/Test/TV/Series Title"; var result = path.GetAncestorFolders(); diff --git a/src/NzbDrone.Common.Test/ProcessProviderFixture.cs b/src/NzbDrone.Common.Test/ProcessProviderFixture.cs index e27ca5486..796f63382 100644 --- a/src/NzbDrone.Common.Test/ProcessProviderFixture.cs +++ b/src/NzbDrone.Common.Test/ProcessProviderFixture.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Threading; using FluentAssertions; using NUnit.Framework; +using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Model; using NzbDrone.Common.Processes; using NzbDrone.Test.Common; @@ -13,6 +14,7 @@ using NzbDrone.Test.Dummy; namespace NzbDrone.Common.Test { + [NonParallelizable] [TestFixture] public class ProcessProviderFixture : TestBase { @@ -65,19 +67,22 @@ namespace NzbDrone.Common.Test } [Test] + [Retry(3)] public void Should_be_able_to_start_process() { var process = StartDummyProcess(); Thread.Sleep(500); - Subject.Exists(DummyApp.DUMMY_PROCCESS_NAME).Should() - .BeTrue("one running dummy process"); + var check = Subject.GetProcessById(process.Id); + check.Should().NotBeNull(); + + process.Refresh(); + process.HasExited.Should().BeFalse(); process.Kill(); process.WaitForExit(); - - Subject.Exists(DummyApp.DUMMY_PROCCESS_NAME).Should().BeFalse(); + process.HasExited.Should().BeTrue(); } [Test] @@ -131,6 +136,8 @@ namespace NzbDrone.Common.Test [Test] + [Platform(Exclude = "MacOsX")] + [Retry(3)] public void kill_all_should_kill_all_process_with_name() { var dummy1 = StartDummyProcess(); @@ -146,8 +153,33 @@ namespace NzbDrone.Common.Test private Process StartDummyProcess() { - var path = Path.Combine(TestContext.CurrentContext.TestDirectory, DummyApp.DUMMY_PROCCESS_NAME + ".exe"); - return Subject.Start(path); + var processStarted = new ManualResetEventSlim(); + + string suffix; + if (OsInfo.IsWindows) + { + suffix = ".exe"; + } + else + { + suffix = ""; + } + + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, DummyApp.DUMMY_PROCCESS_NAME + suffix); + var process = Subject.Start(path, onOutputDataReceived: (string data) => + { + if (data.StartsWith("Dummy process. ID:")) + { + processStarted.Set(); + } + }); + + if (!processStarted.Wait(5000)) + { + Assert.Fail("Failed to start process within 2 sec"); + } + + return process; } [Test] diff --git a/src/NzbDrone.Common.Test/ServiceProviderTests.cs b/src/NzbDrone.Common.Test/ServiceProviderFixture.cs similarity index 94% rename from src/NzbDrone.Common.Test/ServiceProviderTests.cs rename to src/NzbDrone.Common.Test/ServiceProviderFixture.cs index 23645a2d1..93ee3d703 100644 --- a/src/NzbDrone.Common.Test/ServiceProviderTests.cs +++ b/src/NzbDrone.Common.Test/ServiceProviderFixture.cs @@ -1,17 +1,18 @@ using System; using System.Security.Principal; using System.ServiceProcess; +using System.Threading; using FluentAssertions; using NUnit.Framework; using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Processes; using NzbDrone.Test.Common; using NzbDrone.Test.Common.Categories; namespace NzbDrone.Common.Test { [TestFixture] - [Timeout(15000)] - public class ServiceProviderTests : TestBase + public class ServiceProviderFixture : TestBase { private const string ALWAYS_INSTALLED_SERVICE = "SCardSvr"; //Smart Card private const string TEMP_SERVICE_NAME = "NzbDrone_Nunit"; @@ -20,6 +21,9 @@ namespace NzbDrone.Common.Test public void Setup() { WindowsOnly(); + + Mocker.SetConstant(Mocker.Resolve()); + CleanupService(); } @@ -71,6 +75,7 @@ namespace NzbDrone.Common.Test Subject.Install(TEMP_SERVICE_NAME); Subject.ServiceExist(TEMP_SERVICE_NAME).Should().BeTrue(); Subject.Uninstall(TEMP_SERVICE_NAME); + Thread.Sleep(2000); Subject.ServiceExist(TEMP_SERVICE_NAME).Should().BeFalse(); ExceptionVerification.ExpectedWarns(1); diff --git a/src/NzbDrone.Common.Test/Sonarr.Common.Test.csproj b/src/NzbDrone.Common.Test/Sonarr.Common.Test.csproj index 4943ba2b8..0c42e8606 100644 --- a/src/NzbDrone.Common.Test/Sonarr.Common.Test.csproj +++ b/src/NzbDrone.Common.Test/Sonarr.Common.Test.csproj @@ -1,14 +1,10 @@  - net462 - x86 + net6.0 - - - diff --git a/src/NzbDrone.Common.Test/TPLTests/RateLimitServiceFixture.cs b/src/NzbDrone.Common.Test/TPLTests/RateLimitServiceFixture.cs index 83f3e95be..b2ff87a06 100644 --- a/src/NzbDrone.Common.Test/TPLTests/RateLimitServiceFixture.cs +++ b/src/NzbDrone.Common.Test/TPLTests/RateLimitServiceFixture.cs @@ -10,6 +10,7 @@ using FluentAssertions; namespace NzbDrone.Common.Test.TPLTests { [TestFixture] + [Platform(Exclude = "MacOsX")] public class RateLimitServiceFixture : TestBase { private DateTime _epoch; diff --git a/src/NzbDrone.Common/ArchiveService.cs b/src/NzbDrone.Common/ArchiveService.cs index 2a45d7215..1871bd8ad 100644 --- a/src/NzbDrone.Common/ArchiveService.cs +++ b/src/NzbDrone.Common/ArchiveService.cs @@ -85,7 +85,9 @@ namespace NzbDrone.Common string fullZipToPath = Path.Combine(destination, entryFileName); string directoryName = Path.GetDirectoryName(fullZipToPath); if (directoryName.Length > 0) + { Directory.CreateDirectory(directoryName); + } // Unzip file in buffered chunks. This is just as fast as unpacking to a buffer the full size // of the file, but does not waste memory. @@ -103,7 +105,7 @@ namespace NzbDrone.Common Stream inStream = File.OpenRead(compressedFile); Stream gzipStream = new GZipInputStream(inStream); - TarArchive tarArchive = TarArchive.CreateInputTarArchive(gzipStream); + TarArchive tarArchive = TarArchive.CreateInputTarArchive(gzipStream, null); tarArchive.ExtractContents(destination); tarArchive.Close(); diff --git a/src/NzbDrone.Common/Composition/ContainerBuilderBase.cs b/src/NzbDrone.Common/Composition/ContainerBuilderBase.cs index 20485b56b..009b356ef 100644 --- a/src/NzbDrone.Common/Composition/ContainerBuilderBase.cs +++ b/src/NzbDrone.Common/Composition/ContainerBuilderBase.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.Loader; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Messaging; using TinyIoC; @@ -21,15 +24,74 @@ namespace NzbDrone.Common.Composition assemblies.Add(OsInfo.IsWindows ? "Sonarr.Windows" : "Sonarr.Mono"); assemblies.Add("Sonarr.Common"); - foreach (var assembly in assemblies) + var startupPath = AppDomain.CurrentDomain.BaseDirectory; + + foreach (var assemblyName in assemblies) { - _loadedTypes.AddRange(Assembly.Load(assembly).GetExportedTypes()); + _loadedTypes.AddRange(AssemblyLoadContext.Default.LoadFromAssemblyPath(Path.Combine(startupPath, $"{assemblyName}.dll")).GetExportedTypes()); } + var toRegisterResolver = new List { "System.Data.SQLite" }; + toRegisterResolver.AddRange(assemblies.Intersect(new[] { "Sonarr.Core" })); + RegisterNativeResolver(toRegisterResolver); + AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ContainerResolveEventHandler); + Container = new Container(new TinyIoCContainer(), _loadedTypes); AutoRegisterInterfaces(); Container.Register(args); - } + } + + private static Assembly ContainerResolveEventHandler(object sender, ResolveEventArgs args) + { + var resolver = new AssemblyDependencyResolver(args.RequestingAssembly.Location); + var assemblyPath = resolver.ResolveAssemblyToPath(new AssemblyName(args.Name)); + + if (assemblyPath == null) + { + return null; + } + + return AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath); + } + + public static void RegisterNativeResolver(IEnumerable assemblyNames) + { + // This ensures we look for sqlite3 using libsqlite3.so.0 on Linux and not libsqlite3.so which + // is less likely to exist. + foreach (var name in assemblyNames) + { + var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath( + Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{name}.dll")); + + try + { + NativeLibrary.SetDllImportResolver(assembly, LoadNativeLib); + } + catch (InvalidOperationException) + { + // This can only be set once per assembly + // Catch required for NzbDrone.Host tests + } + } + } + + private static IntPtr LoadNativeLib(string libraryName, Assembly assembly, DllImportSearchPath? dllImportSearchPath) + { + var mappedName = libraryName; + if (OsInfo.IsLinux) + { + if (libraryName == "sqlite3") + { + mappedName = "libsqlite3.so.0"; + } + else if (libraryName == "mediainfo") + { + mappedName = "libmediainfo.so.0"; + } + } + + return NativeLibrary.Load(mappedName, assembly, dllImportSearchPath); + } private void AutoRegisterInterfaces() { diff --git a/src/NzbDrone.Common/ConvertBase32.cs b/src/NzbDrone.Common/ConvertBase32.cs index 29cb3618e..3ee7803d5 100644 --- a/src/NzbDrone.Common/ConvertBase32.cs +++ b/src/NzbDrone.Common/ConvertBase32.cs @@ -16,7 +16,7 @@ int bitBufferCount = 0; int index = 0; - for (int i = 0; i < str.Length;i++ ) + for (int i = 0; i < str.Length; i++) { bitBuffer = (bitBuffer << 5) | ValidChars.IndexOf(str[i]); bitBufferCount += 5; diff --git a/src/NzbDrone.Common/EnsureThat/Resources/ExceptionMessages.Designer.cs b/src/NzbDrone.Common/EnsureThat/Resources/ExceptionMessages.Designer.cs index 5b800bb9c..0dda76095 100644 --- a/src/NzbDrone.Common/EnsureThat/Resources/ExceptionMessages.Designer.cs +++ b/src/NzbDrone.Common/EnsureThat/Resources/ExceptionMessages.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.17626 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -9,6 +9,9 @@ //------------------------------------------------------------------------------ namespace NzbDrone.Common.EnsureThat.Resources { + using System; + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -16,7 +19,7 @@ namespace NzbDrone.Common.EnsureThat.Resources { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class ExceptionMessages { diff --git a/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs b/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs index 116c22eee..b48110a52 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs @@ -47,7 +47,6 @@ namespace NzbDrone.Common.EnvironmentInfo { throw new SonarrStartupException("Cannot create AppFolder, Access to the path {0} is denied", _appFolderInfo.AppDataFolder); } - if (OsInfo.IsWindows) { @@ -82,8 +81,15 @@ namespace NzbDrone.Common.EnvironmentInfo if (_startupContext.Args.ContainsKey(StartupContext.APPDATA)) { - if (_diskProvider.FileExists(_appFolderInfo.GetDatabase())) return; - if (!_diskProvider.FileExists(oldDbFile)) return; + if (_diskProvider.FileExists(_appFolderInfo.GetDatabase())) + { + return; + } + + if (!_diskProvider.FileExists(oldDbFile)) + { + return; + } MoveSqliteDatabase(oldDbFile, _appFolderInfo.GetDatabase()); RemovePidFile(); @@ -125,25 +131,33 @@ namespace NzbDrone.Common.EnvironmentInfo private void InitializeMonoApplicationData() { - if (OsInfo.IsWindows) return; + if (OsInfo.IsWindows) + { + return; + } try { - var configHome = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); - if (configHome == "/.config" || - configHome.EndsWith("/.config") && !_diskProvider.FolderExists(configHome.GetParentPath()) || + // It seems that DoNotVerify is the mono behaviour even though .net docs specify a blank string + // should be returned if the data doesn't exist. For compatibility with .net core, explicitly + // set DoNotVerify (which makes sense given we're explicitly checking that the folder exists) + var configHome = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData, Environment.SpecialFolderOption.DoNotVerify); + if (configHome.IsNullOrWhiteSpace() || + configHome == "/.config" || + (configHome.EndsWith("/.config") && !_diskProvider.FolderExists(configHome.GetParentPath())) || !_diskProvider.FolderExists(configHome)) { - // Tell mono to use appData/.config as ApplicationData folder. + // Tell mono/netcore to use appData/.config as ApplicationData folder. Environment.SetEnvironmentVariable("XDG_CONFIG_HOME", Path.Combine(_appFolderInfo.AppDataFolder, ".config")); } - var dataHome = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); - if (dataHome == "/.local/share" || - dataHome.EndsWith("/.local/share") && !_diskProvider.FolderExists(dataHome.GetParentPath().GetParentPath()) || + var dataHome = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData, Environment.SpecialFolderOption.DoNotVerify); + if (dataHome.IsNullOrWhiteSpace() || + dataHome == "/.local/share" || + (dataHome.EndsWith("/.local/share") && !_diskProvider.FolderExists(dataHome.GetParentPath().GetParentPath())) || !_diskProvider.FolderExists(dataHome)) { - // Tell mono to use appData/.config/share as LocalApplicationData folder. + // Tell mono/netcore to use appData/.config/share as LocalApplicationData folder. Environment.SetEnvironmentVariable("XDG_DATA_HOME", Path.Combine(_appFolderInfo.AppDataFolder, ".config/share")); } } diff --git a/src/NzbDrone.Common/EnvironmentInfo/AppFolderInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/AppFolderInfo.cs index 331c7ee25..133aaaff5 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/AppFolderInfo.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/AppFolderInfo.cs @@ -16,7 +16,7 @@ namespace NzbDrone.Common.EnvironmentInfo public class AppFolderInfo : IAppFolderInfo { - private readonly Environment.SpecialFolder DATA_SPECIAL_FOLDER = Environment.SpecialFolder.CommonApplicationData; + private readonly Environment.SpecialFolder _dataSpecialFolder = Environment.SpecialFolder.CommonApplicationData; private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(AppFolderInfo)); @@ -24,7 +24,7 @@ namespace NzbDrone.Common.EnvironmentInfo { if (OsInfo.IsNotWindows) { - DATA_SPECIAL_FOLDER = Environment.SpecialFolder.ApplicationData; + _dataSpecialFolder = Environment.SpecialFolder.ApplicationData; } if (startupContext.Args.ContainsKey(StartupContext.APPDATA)) @@ -34,8 +34,8 @@ namespace NzbDrone.Common.EnvironmentInfo } else { - AppDataFolder = Path.Combine(Environment.GetFolderPath(DATA_SPECIAL_FOLDER, Environment.SpecialFolderOption.None), "Sonarr"); - LegacyAppDataFolder = Path.Combine(Environment.GetFolderPath(DATA_SPECIAL_FOLDER, Environment.SpecialFolderOption.None), "NzbDrone"); + AppDataFolder = Path.Combine(Environment.GetFolderPath(_dataSpecialFolder, Environment.SpecialFolderOption.DoNotVerify), "Sonarr"); + LegacyAppDataFolder = Path.Combine(Environment.GetFolderPath(_dataSpecialFolder, Environment.SpecialFolderOption.DoNotVerify), "NzbDrone"); } StartUpFolder = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory.FullName; diff --git a/src/NzbDrone.Common/EnvironmentInfo/BuildInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/BuildInfo.cs index 45869e636..603d5836f 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/BuildInfo.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/BuildInfo.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; @@ -30,7 +29,7 @@ namespace NzbDrone.Common.EnvironmentInfo public static string AppName { get; } = "Sonarr"; public static Version Version { get; } - public static String Branch { get; } + public static string Branch { get; } public static string Release { get; } public static DateTime BuildDateTime @@ -54,4 +53,4 @@ namespace NzbDrone.Common.EnvironmentInfo } } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Common/EnvironmentInfo/IOsVersionAdapter.cs b/src/NzbDrone.Common/EnvironmentInfo/IOsVersionAdapter.cs index ed0cd2e17..25a3cbf1f 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/IOsVersionAdapter.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/IOsVersionAdapter.cs @@ -6,4 +6,4 @@ namespace NzbDrone.Common.EnvironmentInfo bool Enabled { get; } OsVersionModel Read(); } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs index cad3d3002..2c9bf896a 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/OsInfo.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using NLog; @@ -11,10 +12,13 @@ namespace NzbDrone.Common.EnvironmentInfo public static Os Os { get; } public static bool IsNotWindows => !IsWindows; - public static bool IsLinux => Os == Os.Linux; + public static bool IsLinux => Os == Os.Linux || Os == Os.LinuxMusl || Os == Os.Bsd; public static bool IsOsx => Os == Os.Osx; public static bool IsWindows => Os == Os.Windows; + // this needs to not be static so we can mock it + public bool IsDocker { get; } + public string Version { get; } public string Name { get; } public string FullName { get; } @@ -33,18 +37,7 @@ namespace NzbDrone.Common.EnvironmentInfo case PlatformID.MacOSX: case PlatformID.Unix: { - // Sometimes Mac OS reports itself as Unix - if (Directory.Exists("/System/Library/CoreServices/") && - (File.Exists("/System/Library/CoreServices/SystemVersion.plist") || - File.Exists("/System/Library/CoreServices/ServerVersion.plist")) - ) - { - Os = Os.Osx; - } - else - { - Os = Os.Linux; - } + Os = GetPosixFlavour(); break; } } @@ -82,6 +75,64 @@ namespace NzbDrone.Common.EnvironmentInfo Name = Os.ToString(); FullName = Name; } + + if (IsLinux && File.Exists("/proc/1/cgroup") && File.ReadAllText("/proc/1/cgroup").Contains("/docker/")) + { + IsDocker = true; + } + } + + private static Os GetPosixFlavour() + { + var output = RunAndCapture("uname", "-s"); + + if (output.StartsWith("Darwin")) + { + return Os.Osx; + } + else if (output.Contains("BSD")) + { + return Os.Bsd; + } + else + { +#if ISMUSL + return Os.LinuxMusl; +#else + return Os.Linux; +#endif + } + } + + private static string RunAndCapture(string filename, string args) + { + var processStartInfo = new ProcessStartInfo + { + FileName = filename, + Arguments = args, + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardOutput = true + }; + + var output = string.Empty; + + try + { + using (var p = Process.Start(processStartInfo)) + { + // To avoid deadlocks, always read the output stream first and then wait. + output = p.StandardOutput.ReadToEnd(); + + p.WaitForExit(1000); + } + } + catch (Exception) + { + output = string.Empty; + } + + return output; } } @@ -90,12 +141,15 @@ namespace NzbDrone.Common.EnvironmentInfo string Version { get; } string Name { get; } string FullName { get; } + bool IsDocker { get; } } public enum Os { Windows, Linux, - Osx + Osx, + LinuxMusl, + Bsd } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Common/EnvironmentInfo/OsVersionModel.cs b/src/NzbDrone.Common/EnvironmentInfo/OsVersionModel.cs index f36a27134..c20865813 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/OsVersionModel.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/OsVersionModel.cs @@ -26,4 +26,4 @@ namespace NzbDrone.Common.EnvironmentInfo public string FullName { get; } public string Version { get; } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Common/EnvironmentInfo/PlatformInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/PlatformInfo.cs index c8469ef09..23fcc00b1 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/PlatformInfo.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/PlatformInfo.cs @@ -1,7 +1,4 @@ -using System; -using System.Reflection; -using System.Text.RegularExpressions; -using Microsoft.Win32; +using System; namespace NzbDrone.Common.EnvironmentInfo { @@ -9,7 +6,8 @@ namespace NzbDrone.Common.EnvironmentInfo public enum PlatformType { DotNet = 0, - Mono = 1 + Mono = 1, + NetCore = 2 } public interface IPlatformInfo @@ -19,28 +17,18 @@ namespace NzbDrone.Common.EnvironmentInfo public class PlatformInfo : IPlatformInfo { - private static readonly Regex MonoVersionRegex = new Regex(@"(?<=\W|^)(?\d+\.\d+(\.\d+)?(\.\d+)?)(?=\W)", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static PlatformType _platform; private static Version _version; static PlatformInfo() { - if (Type.GetType("Mono.Runtime") != null) - { - _platform = PlatformType.Mono; - _version = GetMonoVersion(); - } - else - { - _platform = PlatformType.DotNet; - _version = GetDotNetVersion(); - } + _platform = PlatformType.NetCore; + _version = Environment.Version; } public static PlatformType Platform => _platform; - public static bool IsMono => Platform == PlatformType.Mono; public static bool IsDotNet => Platform == PlatformType.DotNet; + public static bool IsNetCore => Platform == PlatformType.NetCore; public static string PlatformName { @@ -50,8 +38,10 @@ namespace NzbDrone.Common.EnvironmentInfo { return ".NET"; } - - return "Mono"; + else + { + return ".NET Core"; + } } } @@ -61,98 +51,5 @@ namespace NzbDrone.Common.EnvironmentInfo { return _version; } - - private static Version GetMonoVersion() - { - try - { - var type = Type.GetType("Mono.Runtime"); - - if (type != null) - { - var displayNameMethod = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static); - if (displayNameMethod != null) - { - var displayName = displayNameMethod.Invoke(null, null).ToString(); - var versionMatch = MonoVersionRegex.Match(displayName); - - if (versionMatch.Success) - { - return new Version(versionMatch.Groups["version"].Value); - } - } - } - } - catch (Exception ex) - { - Console.WriteLine("Couldnt get Mono version: " + ex.ToString()); - } - - return new Version(); - } - - private static Version GetDotNetVersion() - { - try - { - const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"; - using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)) - { - if (ndpKey == null) - { - return new Version(4, 0); - } - - var releaseKey = (int)ndpKey.GetValue("Release"); - - if (releaseKey >= 528040) - { - return new Version(4, 8, 0); - } - if (releaseKey >= 461808) - { - return new Version(4, 7, 2); - } - if (releaseKey >= 461308) - { - return new Version(4, 7, 1); - } - if (releaseKey >= 460798) - { - return new Version(4, 7); - } - if (releaseKey >= 394802) - { - return new Version(4, 6, 2); - } - if (releaseKey >= 394254) - { - return new Version(4, 6, 1); - } - if (releaseKey >= 393295) - { - return new Version(4, 6); - } - if (releaseKey >= 379893) - { - return new Version(4, 5, 2); - } - if (releaseKey >= 378675) - { - return new Version(4, 5, 1); - } - if (releaseKey >= 378389) - { - return new Version(4, 5); - } - } - } - catch (Exception ex) - { - Console.WriteLine("Couldnt get .NET framework version: " + ex.ToString()); - } - - return new Version(4, 0); - } } } diff --git a/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs index febace9af..f5d06bf64 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs @@ -23,13 +23,15 @@ namespace NzbDrone.Common.EnvironmentInfo serviceProvider.ServiceExist(ServiceProvider.SERVICE_NAME) && serviceProvider.GetStatus(ServiceProvider.SERVICE_NAME) == ServiceControllerStatus.StartPending; - //Guarded to avoid issues when running in a non-managed process - var entry = Assembly.GetEntryAssembly(); + // net6.0 will return Sonarr.dll for entry assembly, we need the actual + // executable name (Sonarr on linux). On mono this will return the location of + // the mono executable itself, which is not what we want. + var entry = Process.GetCurrentProcess().MainModule; if (entry != null) { - ExecutingApplication = entry.Location; - IsWindowsTray = OsInfo.IsWindows && entry.ManifestModule.Name == $"{ProcessProvider.SONARR_PROCESS_NAME}.exe"; + ExecutingApplication = entry.FileName; + IsWindowsTray = OsInfo.IsWindows && entry.ModuleName == $"{ProcessProvider.SONARR_PROCESS_NAME}.exe"; } } @@ -42,7 +44,7 @@ namespace NzbDrone.Common.EnvironmentInfo // An official build running outside of the testing environment. (Analytics configurable) IsProduction = !IsTesting && officialBuild; - + // An unofficial build running outside of the testing environment. (Analytics enabled) IsDevelopment = !IsTesting && !officialBuild && !InternalIsDebug(); } @@ -63,6 +65,11 @@ namespace NzbDrone.Common.EnvironmentInfo { get { + if (OsInfo.IsNotWindows) + { + return false; + } + try { var principal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); @@ -124,10 +131,25 @@ namespace NzbDrone.Common.EnvironmentInfo { var lowerProcessName = Process.GetCurrentProcess().ProcessName.ToLower(); - if (lowerProcessName.Contains("vshost")) return true; - if (lowerProcessName.Contains("nunit")) return true; - if (lowerProcessName.Contains("jetbrain")) return true; - if (lowerProcessName.Contains("resharper")) return true; + if (lowerProcessName.Contains("vshost")) + { + return true; + } + + if (lowerProcessName.Contains("nunit")) + { + return true; + } + + if (lowerProcessName.Contains("jetbrain")) + { + return true; + } + + if (lowerProcessName.Contains("resharper")) + { + return true; + } } catch { @@ -137,24 +159,50 @@ namespace NzbDrone.Common.EnvironmentInfo try { var currentAssemblyLocation = typeof(RuntimeInfo).Assembly.Location; - if (currentAssemblyLocation.ToLower().Contains("_output")) return true; + if (currentAssemblyLocation.ToLower().Contains("_output")) + { + return true; + } + + if (currentAssemblyLocation.ToLower().Contains("_tests")) + { + return true; + } } catch { - } var lowerCurrentDir = Directory.GetCurrentDirectory().ToLower(); - if (lowerCurrentDir.Contains("teamcity")) return true; - if (lowerCurrentDir.Contains("buildagent")) return true; - if (lowerCurrentDir.Contains("_output")) return true; + if (lowerCurrentDir.Contains("vsts")) + { + return true; + } + + if (lowerCurrentDir.Contains("buildagent")) + { + return true; + } + + if (lowerCurrentDir.Contains("_output")) + { + return true; + } + + if (lowerCurrentDir.Contains("_tests")) + { + return true; + } return false; } private static bool InternalIsDebug() { - if (BuildInfo.IsDebug || Debugger.IsAttached) return true; + if (BuildInfo.IsDebug || Debugger.IsAttached) + { + return true; + } return false; } @@ -162,7 +210,10 @@ namespace NzbDrone.Common.EnvironmentInfo private static bool InternalIsOfficialBuild() { //Official builds will never have such a high revision - if (BuildInfo.Version.Major >= 10 || BuildInfo.Version.Revision > 10000) return false; + if (BuildInfo.Version.Major >= 10 || BuildInfo.Version.Revision > 10000) + { + return false; + } return true; } diff --git a/src/NzbDrone.Common/EnvironmentInfo/StartupContext.cs b/src/NzbDrone.Common/EnvironmentInfo/StartupContext.cs index 91c1aeaba..fff01a253 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/StartupContext.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/StartupContext.cs @@ -24,6 +24,7 @@ namespace NzbDrone.Common.EnvironmentInfo public const string TERMINATE = "terminateexisting"; public const string RESTART = "restart"; public const string REGISTER_URL = "registerurl"; + public const string NO_SINGLE_INSTANCE_CHECK = "nosingleinstancecheck"; public const string EXIT_IMMEDIATELY = "exitimmediately"; public StartupContext(params string[] args) diff --git a/src/NzbDrone.Common/Extensions/DictionaryExtensions.cs b/src/NzbDrone.Common/Extensions/DictionaryExtensions.cs index d92005875..7f0fe06ce 100644 --- a/src/NzbDrone.Common/Extensions/DictionaryExtensions.cs +++ b/src/NzbDrone.Common/Extensions/DictionaryExtensions.cs @@ -6,16 +6,17 @@ namespace NzbDrone.Common.Extensions { public static class DictionaryExtensions { - public static TValue GetValueOrDefault(this IDictionary dictionary, TKey key, TValue defaultValue = default(TValue)) - { - TValue value; - return dictionary.TryGetValue(key, out value) ? value : defaultValue; - } - public static Dictionary Merge(this Dictionary first, Dictionary second) { - if (first == null) throw new ArgumentNullException(nameof(first)); - if (second == null) throw new ArgumentNullException(nameof(second)); + if (first == null) + { + throw new ArgumentNullException("first"); + } + + if (second == null) + { + throw new ArgumentNullException("second"); + } var merged = new Dictionary(); first.ToList().ForEach(kv => merged[kv.Key] = kv.Value); @@ -28,5 +29,19 @@ namespace NzbDrone.Common.Extensions { collection.Add(new KeyValuePair(key, value)); } + + public static IDictionary SelectDictionary(this IDictionary dictionary, + Func, ValueTuple> selection) + { + return dictionary.Select(selection).ToDictionary(t => t.Item1, t => t.Item2); + } + + public static IDictionary SelectDictionary( + this IDictionary dictionary, + Func, TNewKey> keySelector, + Func, TNewValue> valueSelector) + { + return dictionary.SelectDictionary(p => { return (keySelector(p), valueSelector(p)); }); + } } } diff --git a/src/NzbDrone.Common/Extensions/IEnumerableExtensions.cs b/src/NzbDrone.Common/Extensions/IEnumerableExtensions.cs index afa00d3a5..0d2b6fb11 100644 --- a/src/NzbDrone.Common/Extensions/IEnumerableExtensions.cs +++ b/src/NzbDrone.Common/Extensions/IEnumerableExtensions.cs @@ -7,13 +7,6 @@ namespace NzbDrone.Common.Extensions { public static class EnumerableExtensions { - public static IEnumerable DistinctBy(this IEnumerable source, Func keySelector) - { - var knownKeys = new HashSet(); - - return source.Where(element => knownKeys.Add(keySelector(element))); - } - public static IEnumerable IntersectBy(this IEnumerable first, Func firstKeySelector, IEnumerable second, Func secondKeySelector, IEqualityComparer keyComparer) @@ -117,5 +110,14 @@ namespace NzbDrone.Common.Extensions // // return descending ? source.OrderByDescending(orderByFunc) : source.OrderBy(orderByFunc); // } + public static string ConcatToString(this IEnumerable source, string separator = ", ") + { + return string.Join(separator, source.Select(x => x.ToString())); + } + + public static string ConcatToString(this IEnumerable source, Func predicate, string separator = ", ") + { + return string.Join(separator, source.Select(predicate)); + } } } diff --git a/src/NzbDrone.Common/Extensions/PathExtensions.cs b/src/NzbDrone.Common/Extensions/PathExtensions.cs index d02e1b15d..d03e2b1fd 100644 --- a/src/NzbDrone.Common/Extensions/PathExtensions.cs +++ b/src/NzbDrone.Common/Extensions/PathExtensions.cs @@ -16,7 +16,7 @@ namespace NzbDrone.Common.Extensions private const string DB_RESTORE = "sonarr.restore"; private const string LOG_DB = "logs.db"; private const string NLOG_CONFIG_FILE = "nlog.config"; - private const string UPDATE_CLIENT_EXE = "Sonarr.Update.exe"; + private const string UPDATE_CLIENT_EXE_NAME = "Sonarr.Update"; private static readonly string UPDATE_SANDBOX_FOLDER_NAME = "sonarr_update" + Path.DirectorySeparatorChar; private static readonly string UPDATE_PACKAGE_FOLDER_NAME = "Sonarr" + Path.DirectorySeparatorChar; @@ -34,7 +34,8 @@ namespace NzbDrone.Common.Extensions var info = new FileInfo(path.Trim()); - if (OsInfo.IsWindows && info.FullName.StartsWith(@"\\")) //UNC + //UNC + if (OsInfo.IsWindows && info.FullName.StartsWith(@"\\")) { return info.FullName.TrimEnd('/', '\\', ' '); } @@ -54,7 +55,11 @@ namespace NzbDrone.Common.Extensions comparison = DiskProviderBase.PathStringComparison; } - if (firstPath.Equals(secondPath, comparison.Value)) return true; + if (firstPath.Equals(secondPath, comparison.Value)) + { + return true; + } + return string.Equals(firstPath.CleanFilePath(), secondPath.CleanFilePath(), comparison.Value); } @@ -260,6 +265,21 @@ namespace NzbDrone.Common.Extensions return substring.Substring(0, lastSeparatorIndex); } + public static string ProcessNameToExe(this string processName, PlatformType runtime) + { + if (OsInfo.IsWindows || runtime != PlatformType.NetCore) + { + processName += ".exe"; + } + + return processName; + } + + public static string ProcessNameToExe(this string processName) + { + return processName.ProcessNameToExe(PlatformInfo.Platform); + } + public static string GetAppDataPath(this IAppFolderInfo appFolderInfo) { return appFolderInfo.AppDataFolder; @@ -320,9 +340,9 @@ namespace NzbDrone.Common.Extensions return Path.Combine(GetUpdatePackageFolder(appFolderInfo), UPDATE_CLIENT_FOLDER_NAME); } - public static string GetUpdateClientExePath(this IAppFolderInfo appFolderInfo) + public static string GetUpdateClientExePath(this IAppFolderInfo appFolderInfo, PlatformType runtime) { - return Path.Combine(GetUpdateSandboxFolder(appFolderInfo), UPDATE_CLIENT_EXE); + return Path.Combine(GetUpdateSandboxFolder(appFolderInfo), UPDATE_CLIENT_EXE_NAME).ProcessNameToExe(runtime); } public static string GetDatabase(this IAppFolderInfo appFolderInfo) diff --git a/src/NzbDrone.Common/HashUtil.cs b/src/NzbDrone.Common/HashUtil.cs index d826324f3..9038848a8 100644 --- a/src/NzbDrone.Common/HashUtil.cs +++ b/src/NzbDrone.Common/HashUtil.cs @@ -11,7 +11,7 @@ namespace NzbDrone.Common byte[] bytes = Encoding.UTF8.GetBytes(input); foreach (byte myByte in bytes) { - mCrc ^= ((uint)(myByte) << 24); + mCrc ^= (uint)myByte << 24; for (var i = 0; i < 8; i++) { if ((Convert.ToUInt32(mCrc) & 0x80000000) == 0x80000000) @@ -33,4 +33,4 @@ namespace NzbDrone.Common return HashUtil.CalculateCrc(seed); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index d0f92c331..48e8b6ec6 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -33,19 +33,10 @@ namespace NzbDrone.Common.Http.Dispatchers { var webRequest = (HttpWebRequest)WebRequest.Create((Uri)request.Url); - if (PlatformInfo.IsMono && request.ResponseStream == null) - { - // On Mono GZipStream/DeflateStream leaks memory if an exception is thrown, use an intermediate buffer in that case. - webRequest.AutomaticDecompression = DecompressionMethods.None; - webRequest.Headers.Add("Accept-Encoding", "gzip"); - } - else - { - // Deflate is not a standard and could break depending on implementation. - // we should just stick with the more compatible Gzip - //http://stackoverflow.com/questions/8490718/how-to-decompress-stream-deflated-with-java-util-zip-deflater-in-net - webRequest.AutomaticDecompression = DecompressionMethods.GZip; - } + // Deflate is not a standard and could break depending on implementation. + // we should just stick with the more compatible Gzip + //http://stackoverflow.com/questions/8490718/how-to-decompress-stream-deflated-with-java-util-zip-deflater-in-net + webRequest.AutomaticDecompression = DecompressionMethods.GZip; webRequest.Method = request.Method.ToString(); webRequest.UserAgent = _userAgentBuilder.GetUserAgent(request.UseSimplifiedUserAgent); @@ -121,29 +112,7 @@ namespace NzbDrone.Common.Http.Dispatchers { try { - if (request.ResponseStream != null && httpWebResponse.StatusCode == HttpStatusCode.OK) - { - // A target ResponseStream was specified, write to that instead. - // But only on the OK status code, since we don't want to write failures and redirects. - responseStream.CopyTo(request.ResponseStream); - } - else - { - data = responseStream.ToBytes(); - - if (PlatformInfo.IsMono && httpWebResponse.ContentEncoding == "gzip") - { - using (var compressedStream = new MemoryStream(data)) - using (var gzip = new GZipStream(compressedStream, CompressionMode.Decompress)) - using (var decompressedStream = new MemoryStream()) - { - gzip.CopyTo(decompressedStream); - data = decompressedStream.ToArray(); - } - - httpWebResponse.Headers.Remove("Content-Encoding"); - } - } + data = responseStream.ToBytes(); } catch (Exception ex) { diff --git a/src/NzbDrone.Common/Http/HttpAccept.cs b/src/NzbDrone.Common/Http/HttpAccept.cs index 3da3ee443..478d1efe8 100644 --- a/src/NzbDrone.Common/Http/HttpAccept.cs +++ b/src/NzbDrone.Common/Http/HttpAccept.cs @@ -4,6 +4,7 @@ { public static readonly HttpAccept Rss = new HttpAccept("application/rss+xml, text/rss+xml, application/xml, text/xml"); public static readonly HttpAccept Json = new HttpAccept("application/json"); + public static readonly HttpAccept JsonCharset = new HttpAccept("application/json; charset=utf-8"); public static readonly HttpAccept Html = new HttpAccept("text/html"); public string Value { get; private set; } diff --git a/src/NzbDrone.Common/Instrumentation/GlobalExceptionHandlers.cs b/src/NzbDrone.Common/Instrumentation/GlobalExceptionHandlers.cs index cc283da6a..b0f425632 100644 --- a/src/NzbDrone.Common/Instrumentation/GlobalExceptionHandlers.cs +++ b/src/NzbDrone.Common/Instrumentation/GlobalExceptionHandlers.cs @@ -32,7 +32,10 @@ namespace NzbDrone.Common.Instrumentation { var exception = e.ExceptionObject as Exception; - if (exception == null) return; + if (exception == null) + { + return; + } if (exception is NullReferenceException && exception.ToString().Contains("Microsoft.AspNet.SignalR.Transports.TransportHeartbeat.ProcessServerCommand")) @@ -41,16 +44,6 @@ namespace NzbDrone.Common.Instrumentation return; } - if (PlatformInfo.IsMono) - { - if (exception is TypeInitializationException && exception.InnerException is DllNotFoundException || - exception is DllNotFoundException) - { - Logger.Debug(exception, "Minor Fail: " + exception.Message); - return; - } - } - Console.WriteLine("EPIC FAIL: {0}", exception); Logger.Fatal(exception, "EPIC FAIL."); } diff --git a/src/NzbDrone.Common/Instrumentation/InitializeLogger.cs b/src/NzbDrone.Common/Instrumentation/InitializeLogger.cs index aa7696204..912d22abe 100644 --- a/src/NzbDrone.Common/Instrumentation/InitializeLogger.cs +++ b/src/NzbDrone.Common/Instrumentation/InitializeLogger.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using NLog; using NLog.Fluent; using NzbDrone.Common.EnvironmentInfo; diff --git a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs index cb2918ce4..3248354b8 100644 --- a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs +++ b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Data.SQLite; using System.Linq; using System.Net; -using System.Reflection; using System.Threading; using NLog; using NLog.Common; @@ -22,7 +21,8 @@ namespace NzbDrone.Common.Instrumentation.Sentry // don't report uninformative SQLite exceptions // busy/locked are benign https://forums.sonarr.tv/t/owin-sqlite-error-5-database-is-locked/5423/11 // The others will be user configuration problems and silt up Sentry - private static readonly HashSet FilteredSQLiteErrors = new HashSet { + private static readonly HashSet FilteredSQLiteErrors = new HashSet + { SQLiteErrorCode.Busy, SQLiteErrorCode.Locked, SQLiteErrorCode.Perm, @@ -36,7 +36,8 @@ namespace NzbDrone.Common.Instrumentation.Sentry // use string and not Type so we don't need a reference to the project // where these are defined - private static readonly HashSet FilteredExceptionTypeNames = new HashSet { + private static readonly HashSet FilteredExceptionTypeNames = new HashSet + { // UnauthorizedAccessExceptions will just be user configuration issues "UnauthorizedAccessException", // Filter out people stuck in boot loops @@ -45,49 +46,51 @@ namespace NzbDrone.Common.Instrumentation.Sentry "TinyIoCResolutionException" }; - public static readonly List FilteredExceptionMessages = new List { + public static readonly List FilteredExceptionMessages = new List + { // Swallow the many, many exceptions flowing through from Jackett - "Jackett.Common.IndexerException" + "Jackett.Common.IndexerException", + + // Fix openflixr being stupid with permissions + "openflixr" }; // exception types in this list will additionally have the exception message added to the // sentry fingerprint. Make sure that this message doesn't vary by exception // (e.g. containing a path or a url) so that the sentry grouping is sensible - private static readonly HashSet IncludeExceptionMessageTypes = new HashSet { + private static readonly HashSet IncludeExceptionMessageTypes = new HashSet + { "SQLiteException" }; - + private static readonly IDictionary LoggingLevelMap = new Dictionary { - {LogLevel.Debug, SentryLevel.Debug}, - {LogLevel.Error, SentryLevel.Error}, - {LogLevel.Fatal, SentryLevel.Fatal}, - {LogLevel.Info, SentryLevel.Info}, - {LogLevel.Trace, SentryLevel.Debug}, - {LogLevel.Warn, SentryLevel.Warning}, + { LogLevel.Debug, SentryLevel.Debug }, + { LogLevel.Error, SentryLevel.Error }, + { LogLevel.Fatal, SentryLevel.Fatal }, + { LogLevel.Info, SentryLevel.Info }, + { LogLevel.Trace, SentryLevel.Debug }, + { LogLevel.Warn, SentryLevel.Warning }, }; private static readonly IDictionary BreadcrumbLevelMap = new Dictionary { - {LogLevel.Debug, BreadcrumbLevel.Debug}, - {LogLevel.Error, BreadcrumbLevel.Error}, - {LogLevel.Fatal, BreadcrumbLevel.Critical}, - {LogLevel.Info, BreadcrumbLevel.Info}, - {LogLevel.Trace, BreadcrumbLevel.Debug}, - {LogLevel.Warn, BreadcrumbLevel.Warning}, + { LogLevel.Debug, BreadcrumbLevel.Debug }, + { LogLevel.Error, BreadcrumbLevel.Error }, + { LogLevel.Fatal, BreadcrumbLevel.Critical }, + { LogLevel.Info, BreadcrumbLevel.Info }, + { LogLevel.Trace, BreadcrumbLevel.Debug }, + { LogLevel.Warn, BreadcrumbLevel.Warning }, }; private readonly DateTime _startTime = DateTime.UtcNow; private readonly IDisposable _sdk; - private bool _disposed; - private readonly SentryDebounce _debounce; + + private bool _disposed; private bool _unauthorized; public bool FilterEvents { get; set; } - public Version DatabaseVersion { get; set; } - public int DatabaseMigration { get; set; } - public bool SentryEnabled { get; set; } public SentryTarget(string dsn) @@ -98,7 +101,6 @@ namespace NzbDrone.Common.Instrumentation.Sentry o.AttachStacktrace = true; o.MaxBreadcrumbs = 200; o.SendDefaultPii = false; - o.AttachStacktrace = true; o.Debug = false; o.DiagnosticsLevel = SentryLevel.Debug; o.Release = BuildInfo.Release; @@ -136,11 +138,6 @@ namespace NzbDrone.Common.Instrumentation.Sentry scope.SetTag("culture", Thread.CurrentThread.CurrentCulture.Name); scope.SetTag("branch", BuildInfo.Branch); - - if (DatabaseVersion != default(Version)) - { - scope.SetTag("sqlite_version", $"{DatabaseVersion}"); - } }); } @@ -148,12 +145,20 @@ namespace NzbDrone.Common.Instrumentation.Sentry { SentrySdk.ConfigureScope(scope => { - if (osInfo.Name != null && PlatformInfo.IsMono) + }); + } + + public void UpdateScope(Version databaseVersion, int migration, string updateBranch, IPlatformInfo platformInfo) + { + SentrySdk.ConfigureScope(scope => + { + scope.Environment = updateBranch; + scope.SetTag("runtime_version", $"{PlatformInfo.PlatformName} {platformInfo.Version}"); + + if (databaseVersion != default(Version)) { - // Sentry auto-detection of non-Windows platforms isn't that accurate on certain devices. - scope.Contexts.OperatingSystem.Name = osInfo.Name.FirstCharToUpper(); - scope.Contexts.OperatingSystem.RawDescription = osInfo.FullName; - scope.Contexts.OperatingSystem.Version = osInfo.Version.ToString(); + scope.SetTag("sqlite_version", $"{databaseVersion}"); + scope.SetTag("database_migration", $"{migration}"); } }); } @@ -221,7 +226,8 @@ namespace NzbDrone.Common.Instrumentation.Sentry { if (FilterEvents) { - if (logEvent.Exception is SQLiteException sqliteException && FilteredSQLiteErrors.Contains(sqliteException.ResultCode)) + var sqlEx = logEvent.Exception as SQLiteException; + if (sqlEx != null && FilteredSQLiteErrors.Contains(sqlEx.ResultCode)) { return false; } @@ -230,7 +236,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry { return false; } - + if (FilteredExceptionMessages.Any(x => logEvent.Exception.Message.Contains(x))) { return false; diff --git a/src/NzbDrone.Common/Processes/PidFileProvider.cs b/src/NzbDrone.Common/Processes/PidFileProvider.cs index 650fbca69..6dfad29e7 100644 --- a/src/NzbDrone.Common/Processes/PidFileProvider.cs +++ b/src/NzbDrone.Common/Processes/PidFileProvider.cs @@ -14,13 +14,11 @@ namespace NzbDrone.Common.Processes public class PidFileProvider : IProvidePidFile { private readonly IAppFolderInfo _appFolderInfo; - private readonly IProcessProvider _processProvider; private readonly Logger _logger; - public PidFileProvider(IAppFolderInfo appFolderInfo, IProcessProvider processProvider, Logger logger) + public PidFileProvider(IAppFolderInfo appFolderInfo, Logger logger) { _appFolderInfo = appFolderInfo; - _processProvider = processProvider; _logger = logger; } @@ -34,11 +32,11 @@ namespace NzbDrone.Common.Processes var filename = Path.Combine(_appFolderInfo.AppDataFolder, "sonarr.pid"); try { - File.WriteAllText(filename, _processProvider.GetCurrentProcessId().ToString()); + File.WriteAllText(filename, ProcessProvider.GetCurrentProcessId().ToString()); } catch (Exception ex) { - _logger.Error(ex, "Unable to write PID file {0}", filename); + _logger.Error(ex, "Unable to write PID file: " + filename); throw new SonarrStartupException(ex, "Unable to write PID file {0}", filename); } } diff --git a/src/NzbDrone.Common/Processes/ProcessProvider.cs b/src/NzbDrone.Common/Processes/ProcessProvider.cs index 75ac9add1..829dcacb4 100644 --- a/src/NzbDrone.Common/Processes/ProcessProvider.cs +++ b/src/NzbDrone.Common/Processes/ProcessProvider.cs @@ -14,7 +14,6 @@ namespace NzbDrone.Common.Processes { public interface IProcessProvider { - int GetCurrentProcessId(); ProcessInfo GetCurrentProcess(); ProcessInfo GetProcessById(int id); List FindProcessByName(string name); @@ -43,9 +42,9 @@ namespace NzbDrone.Common.Processes _logger = logger; } - public int GetCurrentProcessId() + public static int GetCurrentProcessId() { - return Process.GetCurrentProcess().Id; + return Environment.ProcessId; } public ProcessInfo GetCurrentProcess() @@ -156,7 +155,10 @@ namespace NzbDrone.Common.Processes process.OutputDataReceived += (sender, eventArgs) => { - if (string.IsNullOrWhiteSpace(eventArgs.Data)) return; + if (string.IsNullOrWhiteSpace(eventArgs.Data)) + { + return; + } logger.Debug(eventArgs.Data); @@ -168,7 +170,10 @@ namespace NzbDrone.Common.Processes process.ErrorDataReceived += (sender, eventArgs) => { - if (string.IsNullOrWhiteSpace(eventArgs.Data)) return; + if (string.IsNullOrWhiteSpace(eventArgs.Data)) + { + return; + } logger.Error(eventArgs.Data); @@ -209,8 +214,11 @@ namespace NzbDrone.Common.Processes public ProcessOutput StartAndCapture(string path, string args = null, StringDictionary environmentVariables = null) { var output = new ProcessOutput(); - var process = Start(path, args, environmentVariables, s => output.Lines.Add(new ProcessOutputLine(ProcessOutputLevel.Standard, s)), - error => output.Lines.Add(new ProcessOutputLine(ProcessOutputLevel.Error, error))); + var process = Start(path, + args, + environmentVariables, + s => output.Lines.Add(new ProcessOutputLine(ProcessOutputLevel.Standard, s)), + error => output.Lines.Add(new ProcessOutputLine(ProcessOutputLevel.Error, error))); process.WaitForExit(); output.ExitCode = process.ExitCode; @@ -249,7 +257,7 @@ namespace NzbDrone.Common.Processes process.Refresh(); - if (process.Id != Process.GetCurrentProcess().Id && process.HasExited) + if (process.Id != GetCurrentProcessId() && process.HasExited) { _logger.Debug("Process has already exited"); return; @@ -270,7 +278,7 @@ namespace NzbDrone.Common.Processes foreach (var processInfo in processes) { - if (processInfo.Id == Process.GetCurrentProcess().Id) + if (processInfo.Id == GetCurrentProcessId()) { _logger.Debug("Tried killing own process, skipping: {0} [{1}]", processInfo.Id, processInfo.ProcessName); continue; @@ -283,7 +291,10 @@ namespace NzbDrone.Common.Processes private ProcessInfo ConvertToProcessInfo(Process process) { - if (process == null) return null; + if (process == null) + { + return null; + } process.Refresh(); @@ -291,14 +302,17 @@ namespace NzbDrone.Common.Processes try { - if (process.Id <= 0) return null; + if (process.Id <= 0) + { + return null; + } processInfo = new ProcessInfo(); processInfo.Id = process.Id; processInfo.Name = process.ProcessName; processInfo.StartPath = GetExeFileName(process); - if (process.Id != Process.GetCurrentProcess().Id && process.HasExited) + if (process.Id != GetCurrentProcessId() && process.HasExited) { processInfo = null; } @@ -324,17 +338,7 @@ namespace NzbDrone.Common.Processes private List GetProcessesByName(string name) { - //TODO: move this to an OS specific class - - var monoProcesses = Process.GetProcessesByName("mono") - .Union(Process.GetProcessesByName("mono-sgen")) - .Where(process => - process.Modules.Cast() - .Any(module => - module.ModuleName.ToLower() == name.ToLower() + ".exe")); - - var processes = Process.GetProcessesByName(name) - .Union(monoProcesses).ToList(); + var processes = Process.GetProcessesByName(name).ToList(); _logger.Debug("Found {0} processes with the name: {1}", processes.Count, name); @@ -355,15 +359,6 @@ namespace NzbDrone.Common.Processes private (string Path, string Args) GetPathAndArgs(string path, string args) { - if (PlatformInfo.IsMono && path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)) - { - return ("mono", $"--debug {path} {args}"); - } - if (OsInfo.IsOsx && path.EndsWith(".app", StringComparison.InvariantCultureIgnoreCase)) - { - return ("/usr/bin/open", $"--new {path} --args {args}"); - } - if (OsInfo.IsWindows && path.EndsWith(".bat", StringComparison.InvariantCultureIgnoreCase)) { return ("cmd.exe", $"/c {path} {args}"); diff --git a/src/NzbDrone.Common/ServiceProvider.cs b/src/NzbDrone.Common/ServiceProvider.cs index 26de640da..5beac74d0 100644 --- a/src/NzbDrone.Common/ServiceProvider.cs +++ b/src/NzbDrone.Common/ServiceProvider.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Specialized; -using System.Configuration.Install; using System.Diagnostics; using System.Linq; using System.ServiceProcess; @@ -64,28 +62,33 @@ namespace NzbDrone.Common { _logger.Info("Installing service '{0}'", serviceName); + var args = $"create {serviceName} " + + $"DisplayName= \"{serviceName}\" " + + $"binpath= \"{Process.GetCurrentProcess().MainModule.FileName}\" " + + "start= auto " + + "depend= EventLog/Tcpip/http " + + "obj= \"NT AUTHORITY\\LocalService\""; - var installer = new ServiceProcessInstaller - { - Account = ServiceAccount.LocalService - }; + _logger.Info(args); - var serviceInstaller = new ServiceInstaller(); + var installOutput = _processProvider.StartAndCapture("sc.exe", args); + if (installOutput.ExitCode != 0) + { + _logger.Error($"Failed to install service: {installOutput.Lines.Select(x => x.Content).ConcatToString("\n")}"); + throw new ApplicationException("Failed to install service"); + } - string[] cmdline = { @"/assemblypath=" + Process.GetCurrentProcess().MainModule.FileName }; + _logger.Info(installOutput.Lines.Select(x => x.Content).ConcatToString("\n")); - var context = new InstallContext("service_install.log", cmdline); - serviceInstaller.Context = context; - serviceInstaller.DisplayName = serviceName; - serviceInstaller.ServiceName = serviceName; - serviceInstaller.Description = "Sonarr Application Server"; - serviceInstaller.StartType = ServiceStartMode.Automatic; - serviceInstaller.ServicesDependedOn = new[] { "EventLog", "Tcpip", "http" }; + var descOutput = _processProvider.StartAndCapture("sc.exe", $"description {serviceName} \"Sonarr Application Server\""); + if (descOutput.ExitCode != 0) + { + _logger.Error($"Failed to install service: {descOutput.Lines.Select(x => x.Content).ConcatToString("\n")}"); + throw new ApplicationException("Failed to install service"); + } - serviceInstaller.Parent = installer; - - serviceInstaller.Install(new ListDictionary()); + _logger.Info(descOutput.Lines.Select(x => x.Content).ConcatToString("\n")); _logger.Info("Service Has installed successfully."); } @@ -96,12 +99,8 @@ namespace NzbDrone.Common Stop(serviceName); - var serviceInstaller = new ServiceInstaller(); - - var context = new InstallContext("service_uninstall.log", null); - serviceInstaller.Context = context; - serviceInstaller.ServiceName = serviceName; - serviceInstaller.Uninstall(null); + var output = _processProvider.StartAndCapture("sc.exe", $"delete {serviceName}"); + _logger.Info(output.Lines.Select(x => x.Content).ConcatToString("\n")); _logger.Info("{0} successfully uninstalled", serviceName); } @@ -151,7 +150,7 @@ namespace NzbDrone.Common public ServiceControllerStatus GetStatus(string serviceName) { - return GetService(serviceName).Status; + return GetService(serviceName).Status; } public void Start(string serviceName) diff --git a/src/NzbDrone.Common/Sonarr.Common.csproj b/src/NzbDrone.Common/Sonarr.Common.csproj index 6c06ca1bf..a1b748f21 100644 --- a/src/NzbDrone.Common/Sonarr.Common.csproj +++ b/src/NzbDrone.Common/Sonarr.Common.csproj @@ -1,21 +1,21 @@  - net462 - x86 + net6.0 + ISMUSL - + - - + + - - - - + + + + diff --git a/src/NzbDrone.Common/TPL/Debouncer.cs b/src/NzbDrone.Common/TPL/Debouncer.cs index d8c961ddc..0fa101525 100644 --- a/src/NzbDrone.Common/TPL/Debouncer.cs +++ b/src/NzbDrone.Common/TPL/Debouncer.cs @@ -17,7 +17,7 @@ namespace NzbDrone.Common.TPL _timer.Elapsed += timer_Elapsed; } - void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { if (_paused == 0) { @@ -60,4 +60,4 @@ namespace NzbDrone.Common.TPL } } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Common/TPL/RateLimitService.cs b/src/NzbDrone.Common/TPL/RateLimitService.cs index 5030ead23..87b0ff22f 100644 --- a/src/NzbDrone.Common/TPL/RateLimitService.cs +++ b/src/NzbDrone.Common/TPL/RateLimitService.cs @@ -33,7 +33,7 @@ namespace NzbDrone.Common.TPL var waitUntil = DateTime.UtcNow.Add(interval); if (subKey.IsNotNullOrWhiteSpace()) - { + { // Expand the base key timer, but don't extend it beyond now+interval. var baseUntil = _rateLimitStore.AddOrUpdate(key, (s) => waitUntil, diff --git a/src/NzbDrone.Common/TPL/TaskExtensions.cs b/src/NzbDrone.Common/TPL/TaskExtensions.cs index aea8f3a11..93b884732 100644 --- a/src/NzbDrone.Common/TPL/TaskExtensions.cs +++ b/src/NzbDrone.Common/TPL/TaskExtensions.cs @@ -25,4 +25,4 @@ namespace NzbDrone.Common.TPL return task; } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Console/Sonarr.Console.csproj b/src/NzbDrone.Console/Sonarr.Console.csproj index f0c615b21..845fe03cc 100644 --- a/src/NzbDrone.Console/Sonarr.Console.csproj +++ b/src/NzbDrone.Console/Sonarr.Console.csproj @@ -1,12 +1,14 @@  Exe - net462 - x86 + net6.0 ..\NzbDrone.Host\Sonarr.ico app.manifest + + Sonarr + diff --git a/src/NzbDrone.Core.Test/Download/DownloadServiceFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadServiceFixture.cs index cab05ed5c..2a5b2f15a 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadServiceFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadServiceFixture.cs @@ -164,7 +164,7 @@ namespace NzbDrone.Core.Test.Download Mocker.GetMock() .Verify(v => v.RecordFailure(It.IsAny(), - It.IsInRange(TimeSpan.FromMinutes(4.9), TimeSpan.FromMinutes(5.1), Range.Inclusive)), Times.Once()); + It.IsInRange(TimeSpan.FromMinutes(4.9), TimeSpan.FromMinutes(5.1), Moq.Range.Inclusive)), Times.Once()); } [Test] diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/DotnetVersionCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/DotnetVersionCheckFixture.cs deleted file mode 100644 index fcea50858..000000000 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/DotnetVersionCheckFixture.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using NUnit.Framework; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Core.HealthCheck.Checks; -using NzbDrone.Core.Test.Framework; - -namespace NzbDrone.Core.Test.HealthCheck.Checks -{ - [TestFixture] - public class DotnetVersionCheckFixture : CoreTest - { - private void GivenOutput(string version) - { - WindowsOnly(); - - Mocker.GetMock() - .SetupGet(s => s.Version) - .Returns(new Version(version)); - } - - [TestCase("4.7.2")] - [TestCase("4.8")] - public void should_return_ok(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeOk(); - } - - public void should_return_notice(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeNotice(); - } - - public void should_return_warning(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeWarning(); - } - - [TestCase("4.5")] - [TestCase("4.5.2")] - [TestCase("4.6.1")] - [TestCase("4.6.2")] - [TestCase("4.7")] - [TestCase("4.7.1")] - public void should_return_error(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeError(); - } - - [Test] - public void should_return_nok_for_net462_on_Win1511() - { - Mocker.GetMock() - .SetupGet(v => v.Version) - .Returns("10.0.14392"); - - GivenOutput("4.6.2"); - - Subject.Check().ShouldBeError(); - } - } -} diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoDebugFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoDebugFixture.cs deleted file mode 100644 index d0f629051..000000000 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoDebugFixture.cs +++ /dev/null @@ -1,59 +0,0 @@ -using NUnit.Framework; -using NzbDrone.Core.HealthCheck.Checks; -using NzbDrone.Core.Test.Framework; -using NzbDrone.Test.Common; -using static NzbDrone.Core.HealthCheck.Checks.MonoDebugCheck; - -namespace NzbDrone.Core.Test.HealthCheck.Checks -{ - [TestFixture] - public class MonoDebugFixture : CoreTest - { - private void GivenHasStackFrame(bool hasStackFrame) - { - Mocker.GetMock() - .Setup(f => f.HasStackFrameInfo()) - .Returns(hasStackFrame); - } - - [Test] - public void should_return_ok_if_windows() - { - WindowsOnly(); - - Subject.Check().ShouldBeOk(); - } - - [Test] - public void should_return_ok_if_not_debug() - { - MonoOnly(); - - GivenHasStackFrame(false); - - Subject.Check().ShouldBeOk(); - } - - [Test] - public void should_log_warning_if_not_debug() - { - MonoOnly(); - - GivenHasStackFrame(false); - - Subject.Check(); - - ExceptionVerification.ExpectedWarns(1); - } - - [Test] - public void should_return_ok_if_debug() - { - MonoOnly(); - - GivenHasStackFrame(true); - - Subject.Check().ShouldBeOk(); - } - } -} diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoVersionCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoVersionCheckFixture.cs deleted file mode 100644 index 613eca188..000000000 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoVersionCheckFixture.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using NUnit.Framework; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Core.HealthCheck.Checks; -using NzbDrone.Core.Test.Framework; - -namespace NzbDrone.Core.Test.HealthCheck.Checks -{ - [TestFixture] - public class MonoVersionCheckFixture : CoreTest - { - private void GivenOutput(string version) - { - MonoOnly(); - - Mocker.GetMock() - .SetupGet(s => s.Version) - .Returns(new Version(version)); - } - - [TestCase("5.18")] - [TestCase("5.20")] - [TestCase("6.4")] - public void should_return_ok(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeOk(); - } - - public void should_return_notice(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeNotice(); - } - - public void should_return_warning(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeWarning(); - } - - [TestCase("2.10.2")] - [TestCase("2.10.8.1")] - [TestCase("3.0.0.1")] - [TestCase("3.2.0.1")] - [TestCase("3.2.1")] - [TestCase("3.2.7")] - [TestCase("3.6.1")] - [TestCase("3.8")] - [TestCase("3.10")] - [TestCase("4.0.0.0")] - [TestCase("4.2")] - [TestCase("4.4.0")] - [TestCase("4.4.1")] - [TestCase("5.4")] - [TestCase("5.8")] - [TestCase("5.10")] - [TestCase("5.12")] - [TestCase("5.14")] - [TestCase("5.16")] - public void should_return_error(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeError(); - } - } -} diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/UpdateCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/UpdateCheckFixture.cs index 310544e5c..02e0a34ee 100644 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/UpdateCheckFixture.cs +++ b/src/NzbDrone.Core.Test/HealthCheck/Checks/UpdateCheckFixture.cs @@ -1,4 +1,4 @@ -using Moq; +using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; @@ -31,7 +31,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks [Test] public void should_return_error_when_app_folder_is_write_protected_and_update_automatically_is_enabled() { - MonoOnly(); + PosixOnly(); const string startupFolder = @"/opt/nzbdrone"; @@ -53,7 +53,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks [Test] public void should_return_error_when_ui_folder_is_write_protected_and_update_automatically_is_enabled() { - MonoOnly(); + PosixOnly(); const string startupFolder = @"/opt/nzbdrone"; const string uiFolder = @"/opt/nzbdrone/UI"; @@ -80,7 +80,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks [Test] public void should_not_return_error_when_app_folder_is_write_protected_and_external_script_enabled() { - MonoOnly(); + PosixOnly(); Mocker.GetMock() .Setup(s => s.UpdateAutomatically) diff --git a/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/ImportApprovedEpisodesFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/ImportApprovedEpisodesFixture.cs index 0f913b7c8..f8519f201 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/ImportApprovedEpisodesFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/ImportApprovedEpisodesFixture.cs @@ -302,7 +302,7 @@ namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport [Test] public void should_get_relative_path_when_there_is_no_grandparent_mono() { - MonoOnly(); + PosixOnly(); var name = "Series.Title.S01E01.720p.HDTV.x264-Sonarr"; var outputPath = "/"; diff --git a/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/NotUnpackingSpecificationFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/NotUnpackingSpecificationFixture.cs index 74a5086d1..31335a97a 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/NotUnpackingSpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/NotUnpackingSpecificationFixture.cs @@ -1,4 +1,4 @@ -using System; +using System; using FizzWare.NBuilder; using FluentAssertions; using Moq; @@ -74,7 +74,7 @@ namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Specifications [Test] public void should_return_false_if_unopacking_on_linux() { - MonoOnly(); + PosixOnly(); GivenInWorkingFolder(); GivenLastWriteTimeUtc(DateTime.UtcNow.AddDays(-5)); diff --git a/src/NzbDrone.Core.Test/MediaFiles/MediaFileServiceTests/FilterFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MediaFileServiceTests/FilterFixture.cs index 172d0c571..5e74ea3e3 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/MediaFileServiceTests/FilterFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/MediaFileServiceTests/FilterFixture.cs @@ -111,7 +111,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests [Test] public void filter_should_return_none_existing_files_not_ignoring_case() { - MonoOnly(); + PosixOnly(); var files = new List() { @@ -147,4 +147,4 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests Subject.FilterExistingFiles(files, _series).Should().Contain(files.First()); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Core.Test/Sonarr.Core.Test.csproj b/src/NzbDrone.Core.Test/Sonarr.Core.Test.csproj index bcdad3f2e..e27c8c26a 100644 --- a/src/NzbDrone.Core.Test/Sonarr.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/Sonarr.Core.Test.csproj @@ -1,10 +1,9 @@  - net462 - x86 + net6.0 - + diff --git a/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs b/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs index 362355ebf..bf57792bd 100644 --- a/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs +++ b/src/NzbDrone.Core.Test/UpdateTests/UpdatePackageProviderFixture.cs @@ -14,6 +14,11 @@ namespace NzbDrone.Core.Test.UpdateTests [SetUp] public void Setup() { + if (OsInfo.Os == Os.LinuxMusl || OsInfo.Os == Os.Bsd) + { + throw new IgnoreException("Ignore until we have musl releases"); + } + Mocker.GetMock().SetupGet(c => c.Version).Returns(new Version("9.9.9")); } diff --git a/src/NzbDrone.Core.Test/ValidationTests/SystemFolderValidatorFixture.cs b/src/NzbDrone.Core.Test/ValidationTests/SystemFolderValidatorFixture.cs index 39a7c68e4..9facd5d16 100644 --- a/src/NzbDrone.Core.Test/ValidationTests/SystemFolderValidatorFixture.cs +++ b/src/NzbDrone.Core.Test/ValidationTests/SystemFolderValidatorFixture.cs @@ -3,6 +3,7 @@ using System.IO; using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; +using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; using NzbDrone.Core.Validation.Paths; @@ -50,10 +51,11 @@ namespace NzbDrone.Core.Test.ValidationTests [Test] public void should_not_be_valid_if_set_to_bin_folder() { - MonoOnly(); + PosixOnly(); + var bin = OsInfo.IsOsx ? "/System" : "/bin"; var series = Builder.CreateNew() - .With(s => s.Path = "/bin") + .With(s => s.Path = bin) .Build(); _validator.Validate(series).IsValid.Should().BeFalse(); @@ -62,10 +64,11 @@ namespace NzbDrone.Core.Test.ValidationTests [Test] public void should_not_be_valid_if_child_of_bin_folder() { - MonoOnly(); + PosixOnly(); + var bin = OsInfo.IsOsx ? "/System" : "/bin"; var series = Builder.CreateNew() - .With(s => s.Path = "/bin/test") + .With(s => s.Path = Path.Combine(bin, "test")) .Build(); _validator.Validate(series).IsValid.Should().BeFalse(); diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index 3a523df9f..a97c337e2 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -181,7 +181,7 @@ namespace NzbDrone.Core.Configuration public string Branch => GetValue("Branch", "main").ToLowerInvariant(); - public string LogLevel => GetValue("LogLevel", "info"); + public string LogLevel => GetValue("LogLevel", "info").ToLowerInvariant(); public string ConsoleLogLevel => GetValue("ConsoleLogLevel", string.Empty, persist: false); public string SslCertPath => GetValue("SslCertPath", ""); @@ -202,8 +202,7 @@ namespace NzbDrone.Core.Configuration } } - // public string UiFolder => GetValue("UiFolder", "UI", false);GetValue("UiFolder", "UI", false); - public string UiFolder => "UI"; + public string UiFolder => BuildInfo.IsDebug ? Path.Combine("..", "UI") : "UI"; public string InstanceName { @@ -257,7 +256,7 @@ namespace NzbDrone.Core.Configuration var valueHolder = parentContainer.Descendants(key).ToList(); - if (valueHolder.Count() == 1) + if (valueHolder.Count == 1) { return valueHolder.First().Value.Trim(); } diff --git a/src/NzbDrone.Core/Download/Clients/Hadouken/HadoukenProxy.cs b/src/NzbDrone.Core/Download/Clients/Hadouken/HadoukenProxy.cs index b51479d10..1b34d4455 100644 --- a/src/NzbDrone.Core/Download/Clients/Hadouken/HadoukenProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/Hadouken/HadoukenProxy.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net; using NLog; @@ -12,7 +12,7 @@ namespace NzbDrone.Core.Download.Clients.Hadouken { HadoukenSystemInfo GetSystemInfo(HadoukenSettings settings); HadoukenTorrent[] GetTorrents(HadoukenSettings settings); - IDictionary GetConfig(HadoukenSettings settings); + IReadOnlyDictionary GetConfig(HadoukenSettings settings); string AddTorrentFile(HadoukenSettings settings, byte[] fileContent); void AddTorrentUri(HadoukenSettings settings, string torrentUrl); void RemoveTorrent(HadoukenSettings settings, string downloadId); @@ -42,9 +42,9 @@ namespace NzbDrone.Core.Download.Clients.Hadouken return GetTorrents(result.Torrents); } - public IDictionary GetConfig(HadoukenSettings settings) + public IReadOnlyDictionary GetConfig(HadoukenSettings settings) { - return ProcessRequest>(settings, "webui.getSettings"); + return ProcessRequest>(settings, "webui.getSettings"); } public string AddTorrentFile(HadoukenSettings settings, byte[] fileContent) @@ -181,4 +181,4 @@ namespace NzbDrone.Core.Download.Clients.Hadouken return HadoukenTorrentState.Unknown; } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs b/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs index 93ca1edfc..5e45eed14 100644 --- a/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs +++ b/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs @@ -1,4 +1,4 @@ -using FluentValidation.Results; +using FluentValidation.Results; using NLog; using NzbDrone.Common.Disk; using NzbDrone.Common.Http; @@ -35,7 +35,7 @@ namespace NzbDrone.Core.Download.Clients.Vuze // - A multi-file torrent is downloaded in a job folder and 'outputPath' points to that directory directly. // - A single-file torrent is downloaded in the root folder and 'outputPath' poinst to that root folder. // We have to make sure the return value points to the job folder OR file. - if (outputPath == null || outputPath.FileName == torrent.Name || torrent.FileCount > 1) + if (outputPath.FileName == torrent.Name || torrent.FileCount > 1) { _logger.Trace("Vuze output directory: {0}", outputPath); } diff --git a/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/XbmcMetadata.cs b/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/XbmcMetadata.cs index 145a054d5..a6db71e37 100644 --- a/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/XbmcMetadata.cs +++ b/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/XbmcMetadata.cs @@ -313,11 +313,8 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc video.Add(new XElement("scantype", episodeFile.MediaInfo.ScanType)); video.Add(new XElement("width", episodeFile.MediaInfo.Width)); - if (episodeFile.MediaInfo.RunTime != null) - { - video.Add(new XElement("duration", episodeFile.MediaInfo.RunTime.TotalMinutes)); - video.Add(new XElement("durationinseconds", Math.Round(episodeFile.MediaInfo.RunTime.TotalSeconds))); - } + video.Add(new XElement("duration", episodeFile.MediaInfo.RunTime.TotalMinutes)); + video.Add(new XElement("durationinseconds", Math.Round(episodeFile.MediaInfo.RunTime.TotalSeconds))); streamDetails.Add(video); diff --git a/src/NzbDrone.Core/Hashing.cs b/src/NzbDrone.Core/Hashing.cs index bf7b9a52b..1423dcbfe 100644 --- a/src/NzbDrone.Core/Hashing.cs +++ b/src/NzbDrone.Core/Hashing.cs @@ -8,7 +8,7 @@ namespace NzbDrone.Core { public static string SHA256Hash(this string input) { - using (var hash = SHA256Managed.Create()) + using (var hash = SHA256.Create()) { var enc = Encoding.UTF8; return GetHash(hash.ComputeHash(enc.GetBytes(input))); @@ -17,7 +17,7 @@ namespace NzbDrone.Core public static string SHA256Hash(this Stream input) { - using (var hash = SHA256Managed.Create()) + using (var hash = SHA256.Create()) { return GetHash(hash.ComputeHash(input)); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DotnetVersionCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DotnetVersionCheck.cs deleted file mode 100644 index f261a9425..000000000 --- a/src/NzbDrone.Core/HealthCheck/Checks/DotnetVersionCheck.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using NLog; -using NzbDrone.Common.EnvironmentInfo; - -namespace NzbDrone.Core.HealthCheck.Checks -{ - public class DotnetVersionCheck : HealthCheckBase - { - private readonly IPlatformInfo _platformInfo; - private readonly IOsInfo _osInfo; - private readonly Logger _logger; - - public DotnetVersionCheck(IPlatformInfo platformInfo, IOsInfo osInfo, Logger logger) - { - _platformInfo = platformInfo; - _osInfo = osInfo; - _logger = logger; - } - - public override HealthCheck Check() - { - if (!PlatformInfo.IsDotNet) - { - return new HealthCheck(GetType()); - } - - var dotnetVersion = _platformInfo.Version; - - // Target .Net version, which would allow us to increase our target framework - var targetVersion = new Version("4.7.2"); - if (dotnetVersion >= targetVersion) - { - _logger.Debug("Dotnet version is {0} or better: {1}", targetVersion, dotnetVersion); - return new HealthCheck(GetType()); - } - - // Supported .net version but below our desired target - var stableVersion = new Version("4.7.2"); - if (dotnetVersion >= stableVersion) - { - _logger.Debug("Dotnet version is {0} or better: {1}", stableVersion, dotnetVersion); - return new HealthCheck(GetType(), HealthCheckResult.Notice, - $"Currently installed .Net Framework {dotnetVersion} is supported but we recommend upgrading to at least {targetVersion}.", - "#currently-installed-net-framework-is-supported-but-upgrading-is-recommended"); - } - - if (Version.TryParse(_osInfo.Version, out var osVersion) && osVersion < new Version("10.0.14393")) - { - return new HealthCheck(GetType(), HealthCheckResult.Error, - $"Currently installed .Net Framework {dotnetVersion} is no longer supported. However your Operating System cannot be upgraded to {targetVersion}.", - "#currently-installed-net-framework-is-old-and-unsupported"); - } - - var oldVersion = new Version("4.6.2"); - if (dotnetVersion >= oldVersion) - { - return new HealthCheck(GetType(), HealthCheckResult.Error, - $"Currently installed .Net Framework {dotnetVersion} is no longer supported. Please upgrade the .Net Framework to at least {targetVersion}.", - "#currently-installed-net-framework-is-old-and-unsupported"); - } - - return new HealthCheck(GetType(), HealthCheckResult.Error, - $"Currently installed .Net Framework {dotnetVersion} is old and unsupported. Please upgrade the .Net Framework to at least {targetVersion}.", - "#currently-installed-net-framework-is-old-and-unsupported"); - } - - public override bool CheckOnSchedule => false; - } -} diff --git a/src/NzbDrone.Core/HealthCheck/Checks/MonoDebugCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/MonoDebugCheck.cs deleted file mode 100644 index 3296c199f..000000000 --- a/src/NzbDrone.Core/HealthCheck/Checks/MonoDebugCheck.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Diagnostics; -using NLog; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Common.Extensions; - -namespace NzbDrone.Core.HealthCheck.Checks -{ - public class MonoDebugCheck : HealthCheckBase - { - private readonly Logger _logger; - private readonly StackFrameHelper _stackFrameHelper; - - public override bool CheckOnSchedule => false; - - public MonoDebugCheck(Logger logger, StackFrameHelper stackFrameHelper) - { - _logger = logger; - _stackFrameHelper = stackFrameHelper; - } - - public class StackFrameHelper - { - public virtual bool HasStackFrameInfo() - { - var stackTrace = new StackTrace(true); - - return stackTrace.FrameCount > 0 && stackTrace.GetFrame(0).GetFileName().IsNotNullOrWhiteSpace(); - } - } - - public override HealthCheck Check() - { - if (!PlatformInfo.IsMono) - { - return new HealthCheck(GetType()); - } - - if (!_stackFrameHelper.HasStackFrameInfo()) - { - _logger.Warn("Mono is not running with --debug switch"); - return new HealthCheck(GetType()); - } - - return new HealthCheck(GetType()); - } - } -} diff --git a/src/NzbDrone.Core/HealthCheck/Checks/MonoTlsCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/MonoTlsCheck.cs deleted file mode 100644 index fffcc8c14..000000000 --- a/src/NzbDrone.Core/HealthCheck/Checks/MonoTlsCheck.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Linq; -using System.Reflection; -using NLog; -using NLog.Fluent; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Common.Instrumentation.Extensions; - -namespace NzbDrone.Core.HealthCheck.Checks -{ - public class MonoTlsCheck : HealthCheckBase - { - private readonly IPlatformInfo _platformInfo; - private readonly Logger _logger; - - public MonoTlsCheck(IPlatformInfo platformInfo, Logger logger) - { - _platformInfo = platformInfo; - _logger = logger; - } - - public override HealthCheck Check() - { - if (!PlatformInfo.IsMono) - { - return new HealthCheck(GetType()); - } - - var monoVersion = _platformInfo.Version; - - if (monoVersion >= new Version("5.8.0") && Environment.GetEnvironmentVariable("MONO_TLS_PROVIDER") == "legacy") - { - _logger.Debug() - .Message("Mono version {0} and legacy TLS provider is selected, recommending user to switch to btls.", monoVersion) - .WriteSentryDebug("LegacyTlsProvider", monoVersion.ToString()) - .Write(); - - return new HealthCheck(GetType(), HealthCheckResult.Warning, "Sonarr Mono 4.x tls workaround still enabled, consider removing MONO_TLS_PROVIDER=legacy environment option"); - } - - return new HealthCheck(GetType()); - } - - public override bool CheckOnSchedule => false; - } -} diff --git a/src/NzbDrone.Core/HealthCheck/Checks/MonoVersionCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/MonoVersionCheck.cs deleted file mode 100644 index 54ab89e74..000000000 --- a/src/NzbDrone.Core/HealthCheck/Checks/MonoVersionCheck.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using NLog; -using NzbDrone.Common.EnvironmentInfo; - -namespace NzbDrone.Core.HealthCheck.Checks -{ - public class MonoVersionCheck : HealthCheckBase - { - private readonly IPlatformInfo _platformInfo; - private readonly Logger _logger; - - public MonoVersionCheck(IPlatformInfo platformInfo, Logger logger) - { - _platformInfo = platformInfo; - _logger = logger; - } - - public override HealthCheck Check() - { - if (!PlatformInfo.IsMono) - { - return new HealthCheck(GetType()); - } - - var monoVersion = _platformInfo.Version; - - // Known buggy Mono versions - if (monoVersion == new Version("4.4.0") || monoVersion == new Version("4.4.1")) - { - _logger.Debug("Mono version {0}", monoVersion); - return new HealthCheck(GetType(), HealthCheckResult.Error, - $"Currently installed Mono version {monoVersion} has a bug that causes issues connecting to indexers/download clients. You should upgrade to a higher version", - "#currently-installed-mono-version-is-old-and-unsupported"); - } - - // Currently best stable Mono version (5.18 gets us .net 4.7.2 support) - var bestVersion = new Version("5.20"); - var targetVersion = new Version("5.18"); - if (monoVersion >= targetVersion) - { - _logger.Debug("Mono version is {0} or better: {1}", targetVersion, monoVersion); - return new HealthCheck(GetType()); - } - - // Stable Mono versions - var stableVersion = new Version("5.18"); - if (monoVersion >= stableVersion) - { - _logger.Debug("Mono version is {0} or better: {1}", stableVersion, monoVersion); - return new HealthCheck(GetType(), HealthCheckResult.Notice, - $"Currently installed Mono version {monoVersion} is supported but upgrading to {bestVersion} is recommended.", - "#currently-installed-mono-version-is-supported-but-upgrading-is-recommended"); - } - - var oldVersion = new Version("5.4"); - if (monoVersion >= oldVersion) - { - return new HealthCheck(GetType(), HealthCheckResult.Error, - $"Currently installed Mono version {monoVersion} is no longer supported. Please upgrade Mono to version {bestVersion}.", - "#currently-installed-mono-version-is-old-and-unsupported"); - } - - return new HealthCheck(GetType(), HealthCheckResult.Error, - $"Currently installed Mono version {monoVersion} is old and unsupported. Please upgrade Mono to version {bestVersion}.", - "#currently-installed-mono-version-is-old-and-unsupported"); - } - - public override bool CheckOnSchedule => false; - } -} diff --git a/src/NzbDrone.Core/Indexers/Newznab/NewznabCategoryFieldOptionsConverter.cs b/src/NzbDrone.Core/Indexers/Newznab/NewznabCategoryFieldOptionsConverter.cs index 94d5a37c4..d1bf9715b 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/NewznabCategoryFieldOptionsConverter.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/NewznabCategoryFieldOptionsConverter.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; -using System.Web.UI.WebControls; using NzbDrone.Core.Annotations; namespace NzbDrone.Core.Indexers.Newznab diff --git a/src/NzbDrone.Core/MediaCover/ImageResizer.cs b/src/NzbDrone.Core/MediaCover/ImageResizer.cs index c2509d8dd..d9855437c 100644 --- a/src/NzbDrone.Core/MediaCover/ImageResizer.cs +++ b/src/NzbDrone.Core/MediaCover/ImageResizer.cs @@ -1,4 +1,4 @@ -using NzbDrone.Common.Disk; +using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Jpeg; @@ -21,12 +21,6 @@ namespace NzbDrone.Core.MediaCover { _diskProvider = diskProvider; - // Random segfaults on mono 5.0 and 5.4 - if (PlatformInfo.IsMono && platformInfo.Version < new System.Version(5, 8)) - { - return; - } - _enabled = true; // More conservative memory allocation diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeFilePreferredWordCalculator.cs b/src/NzbDrone.Core/MediaFiles/EpisodeFilePreferredWordCalculator.cs index 276fa5c43..2a5128c38 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeFilePreferredWordCalculator.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeFilePreferredWordCalculator.cs @@ -1,8 +1,6 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.Linq; -using System.Web.UI; -using Newtonsoft.Json.Serialization; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Core.Profiles.Releases; diff --git a/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoLib.cs b/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoLib.cs index 9343d103e..11fa19e96 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoLib.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoLib.cs @@ -312,58 +312,58 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo return (int)MediaInfo_Count_Get(_handle, (IntPtr)streamKind, (IntPtr)streamNumber); } - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfo_New(); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern void MediaInfo_Delete(IntPtr handle); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfo_Open(IntPtr handle, IntPtr fileName); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfo_Open_Buffer_Init(IntPtr handle, long fileSize, long fileOffset); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfo_Open_Buffer_Continue(IntPtr handle, byte[] buffer, IntPtr bufferSize); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern long MediaInfo_Open_Buffer_Continue_GoTo_Get(IntPtr handle); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfo_Open_Buffer_Finalize(IntPtr handle); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern void MediaInfo_Close(IntPtr handle); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfo_GetI(IntPtr handle, IntPtr streamKind, IntPtr streamNumber, IntPtr parameter, IntPtr infoKind); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfo_Get(IntPtr handle, IntPtr streamKind, IntPtr streamNumber, IntPtr parameter, IntPtr infoKind, IntPtr searchKind); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfo_Option(IntPtr handle, IntPtr option, IntPtr value); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfo_State_Get(IntPtr handle); - [DllImport("MediaInfo.dll")] - private static extern IntPtr MediaInfo_Count_Get(IntPtr handle, IntPtr StreamKind, IntPtr streamNumber); + [DllImport("mediainfo")] + private static extern IntPtr MediaInfo_Count_Get(IntPtr handle, IntPtr streamKind, IntPtr streamNumber); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfoA_New(); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern void MediaInfoA_Delete(IntPtr handle); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfoA_Open(IntPtr handle, IntPtr fileName); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfoA_Open_Buffer_Init(IntPtr handle, long fileSize, long fileOffset); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfoA_Open_Buffer_Continue(IntPtr handle, byte[] buffer, IntPtr bufferSize); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern long MediaInfoA_Open_Buffer_Continue_GoTo_Get(IntPtr handle); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfoA_Open_Buffer_Finalize(IntPtr handle); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern void MediaInfoA_Close(IntPtr handle); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfoA_GetI(IntPtr handle, IntPtr streamKind, IntPtr streamNumber, IntPtr parameter, IntPtr infoKind); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfoA_Get(IntPtr handle, IntPtr streamKind, IntPtr streamNumber, IntPtr parameter, IntPtr infoKind, IntPtr searchKind); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfoA_Option(IntPtr handle, IntPtr option, IntPtr value); - [DllImport("MediaInfo.dll")] + [DllImport("mediainfo")] private static extern IntPtr MediaInfoA_State_Get(IntPtr handle); - [DllImport("MediaInfo.dll")] - private static extern IntPtr MediaInfoA_Count_Get(IntPtr handle, IntPtr StreamKind, IntPtr streamNumber); + [DllImport("mediainfo")] + private static extern IntPtr MediaInfoA_Count_Get(IntPtr handle, IntPtr streamKind, IntPtr streamNumber); } } diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index db95be169..a573874f0 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -608,7 +608,7 @@ namespace NzbDrone.Core.Organizer private const string MediaInfoVideoDynamicRangeToken = "{MediaInfo VideoDynamicRange}"; private const string MediaInfoVideoDynamicRangeTypeToken = "{MediaInfo VideoDynamicRangeType}"; - private static readonly IDictionary MinimumMediaInfoSchemaRevisions = + private static readonly IReadOnlyDictionary MinimumMediaInfoSchemaRevisions = new Dictionary(FileNameBuilderTokenEqualityComparer.Instance) { {MediaInfoVideoDynamicRangeToken, 5}, diff --git a/src/NzbDrone.Core/Rest/IRestClientFactory.cs b/src/NzbDrone.Core/Rest/IRestClientFactory.cs deleted file mode 100644 index 39754016d..000000000 --- a/src/NzbDrone.Core/Rest/IRestClientFactory.cs +++ /dev/null @@ -1,9 +0,0 @@ -using RestSharp; - -namespace NzbDrone.Core.Rest -{ - public interface IRestClientFactory - { - RestClient BuildClient(string baseUrl); - } -} diff --git a/src/NzbDrone.Core/Rest/JsonNetSerializer.cs b/src/NzbDrone.Core/Rest/JsonNetSerializer.cs deleted file mode 100644 index c674fc51e..000000000 --- a/src/NzbDrone.Core/Rest/JsonNetSerializer.cs +++ /dev/null @@ -1,23 +0,0 @@ -using NzbDrone.Common.Serializer; -using RestSharp.Serializers; - -namespace NzbDrone.Core.Rest -{ - public class JsonNetSerializer : ISerializer - { - public JsonNetSerializer() - { - ContentType = "application/json"; - } - - public string Serialize(object obj) - { - return obj.ToJson(); - } - - public string RootElement { get; set; } - public string Namespace { get; set; } - public string DateFormat { get; set; } - public string ContentType { get; set; } - } -} diff --git a/src/NzbDrone.Core/Rest/RestClientFactory.cs b/src/NzbDrone.Core/Rest/RestClientFactory.cs deleted file mode 100644 index 6197f09ba..000000000 --- a/src/NzbDrone.Core/Rest/RestClientFactory.cs +++ /dev/null @@ -1,34 +0,0 @@ -using RestSharp; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Common.Http.Proxy; - -namespace NzbDrone.Core.Rest -{ - public class RestClientFactory : IRestClientFactory - { - private readonly IHttpProxySettingsProvider _httpProxySettingsProvider; - private readonly ICreateManagedWebProxy _createManagedWebProxy; - - public RestClientFactory(IHttpProxySettingsProvider httpProxySettingsProvider, ICreateManagedWebProxy createManagedWebProxy) - { - _httpProxySettingsProvider = httpProxySettingsProvider; - _createManagedWebProxy = createManagedWebProxy; - } - - public RestClient BuildClient(string baseUrl) - { - var restClient = new RestClient(baseUrl) - { - UserAgent = $"{BuildInfo.AppName}/{BuildInfo.Version} ({OsInfo.Os})" - }; - - var proxySettings = _httpProxySettingsProvider.GetProxySettings(); - if (proxySettings != null) - { - restClient.Proxy = _createManagedWebProxy.GetWebProxy(proxySettings); - } - - return restClient; - } - } -} diff --git a/src/NzbDrone.Core/Rest/RestException.cs b/src/NzbDrone.Core/Rest/RestException.cs deleted file mode 100644 index 207a20e75..000000000 --- a/src/NzbDrone.Core/Rest/RestException.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using RestSharp; - -namespace NzbDrone.Core.Rest -{ - public class RestException : Exception - { - public IRestResponse Response { get; private set; } - - public RestException(IRestResponse response, IRestClient restClient) - : base(string.Format("REST request failed: [{0}] [{1}] at [{2}]", (int)response.StatusCode, response.Request.Method, restClient.BuildUri(response.Request))) - { - Response = response; - } - - public override string ToString() - { - if (Response != null) - { - return base.ToString() + Environment.NewLine + Response.Content; - } - - return base.ToString(); - } - } -} \ No newline at end of file diff --git a/src/NzbDrone.Core/Rest/RestSharpExtensions.cs b/src/NzbDrone.Core/Rest/RestSharpExtensions.cs deleted file mode 100644 index e89144da8..000000000 --- a/src/NzbDrone.Core/Rest/RestSharpExtensions.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System.Net; -using System.Linq; -using NLog; -using NzbDrone.Common.EnsureThat; -using NzbDrone.Common.Instrumentation; -using NzbDrone.Common.Serializer; -using RestSharp; - -namespace NzbDrone.Core.Rest -{ - public static class RestSharpExtensions - { - private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(RestSharpExtensions)); - - public static IRestResponse ValidateResponse(this IRestResponse response, IRestClient restClient) - { - Ensure.That(response, () => response).IsNotNull(); - - if (response.Request == null && response.ErrorException != null) - { - throw response.ErrorException; - } - - Ensure.That(response.Request, () => response.Request).IsNotNull(); - Ensure.That(restClient, () => restClient).IsNotNull(); - - Logger.Debug("Validating Responses from [{0}] [{1}] status: [{2}]", response.Request.Method, restClient.BuildUri(response.Request), response.StatusCode); - - if (response.ResponseUri == null) - { - Logger.Error(response.ErrorException, "Error communicating with server"); - throw response.ErrorException; - } - - switch (response.StatusCode) - { - case HttpStatusCode.OK: - { - return response; - } - case HttpStatusCode.NoContent: - { - return response; - } - case HttpStatusCode.Created: - { - return response; - } - default: - { - Logger.Warn("[{0}] [{1}] Failed. [{2}]", response.Request.Method, response.ResponseUri.ToString(), response.StatusCode); - throw new RestException(response, restClient); - } - } - } - - public static T Read(this IRestResponse restResponse, IRestClient restClient) where T : class, new() - { - restResponse.ValidateResponse(restClient); - - if (restResponse.Content != null) - { - Logger.Trace("Response: " + restResponse.Content); - } - - return Json.Deserialize(restResponse.Content); - } - - public static T ExecuteAndValidate(this IRestClient client, IRestRequest request) where T : class, new() - { - return client.Execute(request).Read(client); - } - - public static IRestResponse ExecuteAndValidate(this IRestClient client, IRestRequest request) - { - return client.Execute(request).ValidateResponse(client); - } - - public static void AddQueryString(this IRestRequest request, string name, object value) - { - request.AddParameter(name, value.ToString(), ParameterType.GetOrPost); - } - - public static object GetHeaderValue(this IRestResponse response, string key) - { - var header = response.Headers.FirstOrDefault(v => v.Name == key); - - if (header == null) return null; - - return header.Value; - } - } -} \ No newline at end of file diff --git a/src/NzbDrone.Core/Sonarr.Core.csproj b/src/NzbDrone.Core/Sonarr.Core.csproj index 9bb78c817..4b60c83b7 100644 --- a/src/NzbDrone.Core/Sonarr.Core.csproj +++ b/src/NzbDrone.Core/Sonarr.Core.csproj @@ -1,7 +1,6 @@  - net462 - x86 + net6.0 @@ -11,9 +10,8 @@ - + - @@ -23,17 +21,10 @@ - - - - Resources\Logo\64.png - - PreserveNewest - diff --git a/src/NzbDrone.Core/Sonarr.Core.dll.config b/src/NzbDrone.Core/Sonarr.Core.dll.config deleted file mode 100644 index a139791b4..000000000 --- a/src/NzbDrone.Core/Sonarr.Core.dll.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/NzbDrone.Core/Update/ConfigureUpdateMechanism.cs b/src/NzbDrone.Core/Update/ConfigureUpdateMechanism.cs index e67b79c84..b1c2b951e 100644 --- a/src/NzbDrone.Core/Update/ConfigureUpdateMechanism.cs +++ b/src/NzbDrone.Core/Update/ConfigureUpdateMechanism.cs @@ -1,13 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Lifecycle; using NzbDrone.Core.Messaging.Events; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace NzbDrone.Core.Update { @@ -18,9 +16,9 @@ namespace NzbDrone.Core.Update public class UpdaterConfigProvider : IUpdaterConfigProvider, IHandle { - private Logger _logger; - private IConfigFileProvider _configFileProvider; - private IDeploymentInfoProvider _deploymentInfoProvider; + private readonly Logger _logger; + private readonly IConfigFileProvider _configFileProvider; + private readonly IDeploymentInfoProvider _deploymentInfoProvider; public UpdaterConfigProvider(IDeploymentInfoProvider deploymentInfoProvider, IConfigFileProvider configFileProvider, Logger logger) { @@ -41,8 +39,8 @@ namespace NzbDrone.Core.Update foreach (var externalMechanism in externalMechanisms) { - if (packageUpdateMechanism != externalMechanism && updateMechanism == externalMechanism || - packageUpdateMechanism == externalMechanism && updateMechanism == UpdateMechanism.BuiltIn) + if ((packageUpdateMechanism != externalMechanism && updateMechanism == externalMechanism) || + (packageUpdateMechanism == externalMechanism && updateMechanism == UpdateMechanism.BuiltIn)) { _logger.Info("Update mechanism {0} not supported in the current configuration, changing to {1}.", updateMechanism, packageUpdateMechanism); ChangeUpdateMechanism(packageUpdateMechanism); @@ -54,14 +52,14 @@ namespace NzbDrone.Core.Update { var currentBranch = _configFileProvider.Branch; var packageBranch = _deploymentInfoProvider.PackageBranch; - if (packageBranch.IsNotNullOrWhiteSpace() & packageBranch != currentBranch) + if (packageBranch.IsNotNullOrWhiteSpace() && packageBranch != currentBranch) { _logger.Info("External updater uses branch {0} instead of the currently selected {1}, changing to {0}.", packageBranch, currentBranch); ChangeBranch(packageBranch); } } } - + private void ChangeUpdateMechanism(UpdateMechanism updateMechanism) { var config = new Dictionary diff --git a/src/NzbDrone.Core/Update/InstallUpdateService.cs b/src/NzbDrone.Core/Update/InstallUpdateService.cs index 080d46efd..c4fa62daa 100644 --- a/src/NzbDrone.Core/Update/InstallUpdateService.cs +++ b/src/NzbDrone.Core/Update/InstallUpdateService.cs @@ -37,7 +37,7 @@ namespace NzbDrone.Core.Update private readonly IConfigFileProvider _configFileProvider; private readonly IRuntimeInfo _runtimeInfo; private readonly IBackupService _backupService; - + private readonly IOsInfo _osInfo; public InstallUpdateService(ICheckUpdateService checkUpdateService, IAppFolderInfo appFolderInfo, @@ -53,6 +53,7 @@ namespace NzbDrone.Core.Update IConfigFileProvider configFileProvider, IRuntimeInfo runtimeInfo, IBackupService backupService, + IOsInfo osInfo, Logger logger) { if (configFileProvider == null) @@ -73,6 +74,7 @@ namespace NzbDrone.Core.Update _configFileProvider = configFileProvider; _runtimeInfo = runtimeInfo; _backupService = backupService; + _osInfo = osInfo; _logger = logger; } @@ -143,7 +145,7 @@ namespace NzbDrone.Core.Update _logger.Info("Preparing client"); _diskTransferService.TransferFolder(_appFolderInfo.GetUpdateClientFolder(), updateSandboxFolder, TransferMode.Move); - var updateClientExePath = _appFolderInfo.GetUpdateClientExePath(); + var updateClientExePath = _appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime); if (!_diskProvider.FileExists(updateClientExePath)) { @@ -151,6 +153,12 @@ namespace NzbDrone.Core.Update return false; } + // Set executable flag on update app + if (OsInfo.IsOsx || (OsInfo.IsLinux && PlatformInfo.IsNetCore)) + { + _diskProvider.SetFilePermissions(updateClientExePath, "755", null); + } + _logger.Info("Starting update client {0}", updateClientExePath); _logger.ProgressInfo("Sonarr will restart shortly."); @@ -228,9 +236,15 @@ namespace NzbDrone.Core.Update return null; } + if (_osInfo.IsDocker) + { + _logger.ProgressDebug("Updating is disabled inside a docker container. Please update the container image."); + return null; + } + if (OsInfo.IsNotWindows && !_configFileProvider.UpdateAutomatically && updateTrigger != CommandTrigger.Manual) { - _logger.ProgressDebug("Auto-update not enabled, not installing available update"); + _logger.ProgressDebug("Auto-update not enabled, not installing available update."); return null; } diff --git a/src/NzbDrone.Core/Update/UpdateCheckService.cs b/src/NzbDrone.Core/Update/UpdateCheckService.cs index 71f5c3d46..fc40e2194 100644 --- a/src/NzbDrone.Core/Update/UpdateCheckService.cs +++ b/src/NzbDrone.Core/Update/UpdateCheckService.cs @@ -26,4 +26,4 @@ namespace NzbDrone.Core.Update return _updatePackageProvider.GetLatestUpdate(_configFileProvider.Branch, BuildInfo.Version); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Core/Update/UpdatePackage.cs b/src/NzbDrone.Core/Update/UpdatePackage.cs index 1583280cb..016398d0f 100644 --- a/src/NzbDrone.Core/Update/UpdatePackage.cs +++ b/src/NzbDrone.Core/Update/UpdatePackage.cs @@ -1,5 +1,5 @@ using System; - +using NzbDrone.Common.EnvironmentInfo; namespace NzbDrone.Core.Update { @@ -12,5 +12,6 @@ namespace NzbDrone.Core.Update public UpdateChanges Changes { get; set; } public string Hash { get; set; } public string Branch { get; set; } + public PlatformType Runtime { get; set; } } } diff --git a/src/NzbDrone.Core/Update/UpdatePackageProvider.cs b/src/NzbDrone.Core/Update/UpdatePackageProvider.cs index 829efb192..fc178eefd 100644 --- a/src/NzbDrone.Core/Update/UpdatePackageProvider.cs +++ b/src/NzbDrone.Core/Update/UpdatePackageProvider.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Runtime.InteropServices; using NzbDrone.Common.Cloud; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Http; @@ -34,6 +35,8 @@ namespace NzbDrone.Core.Update .Resource("/update/{branch}") .AddQueryParam("version", currentVersion) .AddQueryParam("os", OsInfo.Os.ToString().ToLowerInvariant()) + .AddQueryParam("arch", RuntimeInformation.OSArchitecture) + .AddQueryParam("runtime", PlatformInfo.Platform.ToString().ToLowerInvariant()) .AddQueryParam("runtimeVer", _platformInfo.Version) .SetSegment("branch", branch); @@ -45,17 +48,22 @@ namespace NzbDrone.Core.Update var update = _httpClient.Get(request.Build()).Resource; - if (!update.Available) return null; + if (!update.Available) + { + return null; + } return update.UpdatePackage; } - + public List GetRecentUpdates(string branch, Version currentVersion, Version previousVersion) { var request = _requestBuilder.Create() .Resource("/update/{branch}/changes") .AddQueryParam("version", currentVersion) .AddQueryParam("os", OsInfo.Os.ToString().ToLowerInvariant()) + .AddQueryParam("arch", RuntimeInformation.OSArchitecture) + .AddQueryParam("runtime", PlatformInfo.Platform.ToString().ToLowerInvariant()) .AddQueryParam("runtimeVer", _platformInfo.Version) .SetSegment("branch", branch); @@ -75,4 +83,4 @@ namespace NzbDrone.Core.Update return updates.Resource; } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Core/Update/UpdateVerificationFailedException.cs b/src/NzbDrone.Core/Update/UpdateVerificationFailedException.cs index 75e9ae29c..e10710645 100644 --- a/src/NzbDrone.Core/Update/UpdateVerificationFailedException.cs +++ b/src/NzbDrone.Core/Update/UpdateVerificationFailedException.cs @@ -12,4 +12,4 @@ { } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Host.Test/NzbDroneProcessServiceFixture.cs b/src/NzbDrone.Host.Test/NzbDroneProcessServiceFixture.cs index 1354e91d5..3ce41f5df 100644 --- a/src/NzbDrone.Host.Test/NzbDroneProcessServiceFixture.cs +++ b/src/NzbDrone.Host.Test/NzbDroneProcessServiceFixture.cs @@ -50,8 +50,8 @@ namespace NzbDrone.App.Test .Setup(c => c.FindProcessByName(ProcessProvider.SONARR_CONSOLE_PROCESS_NAME)) .Returns(new List { - new ProcessInfo {Id = 10}, - new ProcessInfo {Id = CURRENT_PROCESS_ID} + new ProcessInfo { Id = 10 }, + new ProcessInfo { Id = CURRENT_PROCESS_ID } }); Assert.Throws(() => Subject.PreventStartIfAlreadyRunning()); @@ -66,9 +66,8 @@ namespace NzbDrone.App.Test .Setup(c => c.FindProcessByName(ProcessProvider.SONARR_PROCESS_NAME)) .Returns(new List { - new ProcessInfo {Id = CURRENT_PROCESS_ID}, - new ProcessInfo {Id = 10} - + new ProcessInfo { Id = CURRENT_PROCESS_ID }, + new ProcessInfo { Id = 10 } }); Assert.Throws(() => Subject.PreventStartIfAlreadyRunning()); diff --git a/src/NzbDrone.Host.Test/Sonarr.Host.Test.csproj b/src/NzbDrone.Host.Test/Sonarr.Host.Test.csproj index e25fc31df..de5add8a7 100644 --- a/src/NzbDrone.Host.Test/Sonarr.Host.Test.csproj +++ b/src/NzbDrone.Host.Test/Sonarr.Host.Test.csproj @@ -1,13 +1,9 @@  - net462 - x86 + net6.0 - - - diff --git a/src/NzbDrone.Host/AccessControl/FirewallAdapter.cs b/src/NzbDrone.Host/AccessControl/FirewallAdapter.cs index 794e9edff..6bc836980 100644 --- a/src/NzbDrone.Host/AccessControl/FirewallAdapter.cs +++ b/src/NzbDrone.Host/AccessControl/FirewallAdapter.cs @@ -87,7 +87,10 @@ namespace NzbDrone.Host.AccessControl private bool IsFirewallEnabled() { - if (OsInfo.IsNotWindows) return false; + if (OsInfo.IsNotWindows) + { + return false; + } try { diff --git a/src/NzbDrone.Host/AccessControl/RemoteAccessException.cs b/src/NzbDrone.Host/AccessControl/RemoteAccessException.cs index abd481040..71ea33052 100644 --- a/src/NzbDrone.Host/AccessControl/RemoteAccessException.cs +++ b/src/NzbDrone.Host/AccessControl/RemoteAccessException.cs @@ -5,19 +5,23 @@ namespace NzbDrone.Host.AccessControl { public class RemoteAccessException : NzbDroneException { - public RemoteAccessException(string message, params object[] args) : base(message, args) + public RemoteAccessException(string message, params object[] args) + : base(message, args) { } - public RemoteAccessException(string message) : base(message) + public RemoteAccessException(string message) + : base(message) { } - public RemoteAccessException(string message, Exception innerException, params object[] args) : base(message, innerException, args) + public RemoteAccessException(string message, Exception innerException, params object[] args) + : base(message, innerException, args) { } - public RemoteAccessException(string message, Exception innerException) : base(message, innerException) + public RemoteAccessException(string message, Exception innerException) + : base(message, innerException) { } } diff --git a/src/NzbDrone.Host/Sonarr.Host.csproj b/src/NzbDrone.Host/Sonarr.Host.csproj index a29ca0cbd..9079e601a 100644 --- a/src/NzbDrone.Host/Sonarr.Host.csproj +++ b/src/NzbDrone.Host/Sonarr.Host.csproj @@ -1,20 +1,18 @@  - net462 - x86 + net6.0 + Library - - - - - + + + + + - - @@ -23,6 +21,5 @@ ..\Libraries\Interop.NetFwTypeLib.dll True - diff --git a/src/NzbDrone.Host/WebHost/Middleware/SignalRMiddleware.cs b/src/NzbDrone.Host/WebHost/Middleware/SignalRMiddleware.cs index 0250ac3be..671c5631b 100644 --- a/src/NzbDrone.Host/WebHost/Middleware/SignalRMiddleware.cs +++ b/src/NzbDrone.Host/WebHost/Middleware/SignalRMiddleware.cs @@ -6,7 +6,6 @@ using Microsoft.Extensions.DependencyInjection; using NLog; using NzbDrone.Common.Composition; using NzbDrone.Core.Configuration; -using NzbDrone.Host.Middleware; using NzbDrone.SignalR; namespace NzbDrone.Host.Middleware @@ -16,6 +15,7 @@ namespace NzbDrone.Host.Middleware private readonly IContainer _container; private readonly Logger _logger; private static string API_KEY; + private static string URL_BASE; public int Order => 1; public SignalRMiddleware(IContainer container, @@ -25,6 +25,7 @@ namespace NzbDrone.Host.Middleware _container = container; _logger = logger; API_KEY = configFileProvider.ApiKey; + URL_BASE = configFileProvider.UrlBase; } public void Attach(IApplicationBuilder appBuilder) @@ -56,9 +57,9 @@ namespace NzbDrone.Host.Middleware } }); - appBuilder.UseSignalR(routes => + appBuilder.UseEndpoints(x => { - routes.MapHub("/signalr/messages"); + x.MapHub(URL_BASE + "/signalr/messages"); }); // This is a side effect of haing multiple IoC containers, TinyIoC and whatever @@ -69,4 +70,4 @@ namespace NzbDrone.Host.Middleware _container.Register(hubContext); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Host/WebHost/WebHostController.cs b/src/NzbDrone.Host/WebHost/WebHostController.cs index 547a2ba9e..d9013d07a 100644 --- a/src/NzbDrone.Host/WebHost/WebHostController.cs +++ b/src/NzbDrone.Host/WebHost/WebHostController.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -10,10 +11,10 @@ using Microsoft.Extensions.Logging; using NLog; using NLog.Extensions.Logging; using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Exceptions; using NzbDrone.Common.Extensions; using NzbDrone.Common.Serializer; using NzbDrone.Core.Configuration; -using NzbDrone.Host; using NzbDrone.Host.AccessControl; using NzbDrone.Host.Middleware; using LogLevel = Microsoft.Extensions.Logging.LogLevel; @@ -73,8 +74,21 @@ namespace NzbDrone.Host { options.ConfigureHttpsDefaults(configureOptions => { - var certificate = new X509Certificate2(); - certificate.Import(_configFileProvider.SslCertPath, _configFileProvider.SslCertPassword, X509KeyStorageFlags.DefaultKeySet); + X509Certificate2 certificate; + + try + { + certificate = new X509Certificate2(sslCertPath, _configFileProvider.SslCertPassword, X509KeyStorageFlags.DefaultKeySet); + } + catch (CryptographicException ex) + { + if (ex.HResult == 0x2 || ex.HResult == 0x2006D080) + { + throw new SonarrStartupException(ex, $"The SSL certificate file {sslCertPath} does not exist"); + } + + throw new SonarrStartupException(ex); + } configureOptions.ServerCertificate = certificate; }); @@ -83,6 +97,7 @@ namespace NzbDrone.Host .ConfigureKestrel(serverOptions => { serverOptions.AllowSynchronousIO = true; + serverOptions.Limits.MaxRequestBodySize = null; }) .ConfigureLogging(logging => { @@ -93,15 +108,16 @@ namespace NzbDrone.Host { services .AddSignalR() - .AddJsonProtocol(options => + .AddNewtonsoftJsonProtocol(options => { options.PayloadSerializerSettings = Json.GetSerializerSettings(); }); }) .Configure(app => { - app.UsePathBase(_configFileProvider.UrlBase); + app.UseRouting(); app.Properties["host.AppName"] = BuildInfo.AppName; + app.UsePathBase(_configFileProvider.UrlBase); foreach (var middleWare in _middlewares.OrderBy(c => c.Order)) { @@ -138,4 +154,4 @@ namespace NzbDrone.Host return $"{scheme}://{bindAddress}:{port}"; } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Integration.Test/ApiTests/CommandFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/CommandFixture.cs index 64ed9085d..f1ff009bb 100644 --- a/src/NzbDrone.Integration.Test/ApiTests/CommandFixture.cs +++ b/src/NzbDrone.Integration.Test/ApiTests/CommandFixture.cs @@ -1,19 +1,18 @@ -using FluentAssertions; +using FluentAssertions; using NUnit.Framework; -using Sonarr.Api.V3.Commands; +using NzbDrone.Integration.Test.Client; namespace NzbDrone.Integration.Test.ApiTests { [TestFixture] - [Ignore("Not ready to be used on this branch")] public class CommandFixture : IntegrationTest { [Test] public void should_be_able_to_run_rss_sync() { - var response = Commands.Post(new CommandResource { Name = "rsssync" }); + var response = Commands.Post(new SimpleCommandResource { Name = "rsssync" }); response.Id.Should().NotBe(0); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Integration.Test/ApiTests/IndexerFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/IndexerFixture.cs index 1fd4b30ae..2a17e37ec 100644 --- a/src/NzbDrone.Integration.Test/ApiTests/IndexerFixture.cs +++ b/src/NzbDrone.Integration.Test/ApiTests/IndexerFixture.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using FluentAssertions; using Newtonsoft.Json.Linq; using NUnit.Framework; @@ -34,18 +34,6 @@ namespace NzbDrone.Integration.Test.ApiTests return schema; } - private IndexerResource GetNewznabSchemav3(string name = null) - { - var schema = Indexersv3.Schema().First(v => v.Implementation == "Newznab"); - - schema.Name = name; - schema.EnableRss = false; - schema.EnableAutomaticSearch = false; - schema.EnableInteractiveSearch = false; - - return schema; - } - private Field GetCategoriesField(IndexerResource resource) { var field = resource.Fields.First(v => v.Name == "categories"); @@ -63,16 +51,6 @@ namespace NzbDrone.Integration.Test.ApiTests categoriesField.Value.Should().BeOfType(); } - [Test] - public void v3_categories_should_be_array() - { - var schema = GetNewznabSchemav3(); - - var categoriesField = GetCategoriesField(schema); - - categoriesField.Value.Should().BeOfType(); - } - [Test] public void v2_categories_should_accept_null() { @@ -136,70 +114,5 @@ namespace NzbDrone.Integration.Test.ApiTests resultArray.Should().BeOfType(); resultArray.As().ToObject().Should().BeEquivalentTo(new[] { 1000, 1010 }); } - - [Test] - public void v3_categories_should_accept_null() - { - var schema = GetNewznabSchemav3("Testv3null"); - - var categoriesField = GetCategoriesField(schema); - - categoriesField.Value = null; - - var result = Indexersv3.Post(schema); - - var resultArray = GetCategoriesField(result).Value; - resultArray.Should().BeOfType(); - resultArray.As().Should().BeEmpty(); - } - - [Test] - public void v3_categories_should_accept_emptystring() - { - var schema = GetNewznabSchemav3("Testv3emptystring"); - - var categoriesField = GetCategoriesField(schema); - - categoriesField.Value = ""; - - var result = Indexersv3.Post(schema); - - var resultArray = GetCategoriesField(result).Value; - resultArray.Should().BeOfType(); - resultArray.As().Should().BeEmpty(); - } - - - [Test] - public void v3_categories_should_accept_string() - { - var schema = GetNewznabSchemav3("Testv3string"); - - var categoriesField = GetCategoriesField(schema); - - categoriesField.Value = "1000,1010"; - - var result = Indexersv3.Post(schema); - - var resultArray = GetCategoriesField(result).Value; - resultArray.Should().BeOfType(); - resultArray.As().ToObject().Should().BeEquivalentTo(new[] { 1000, 1010 }); - } - - [Test] - public void v3_categories_should_accept_array() - { - var schema = GetNewznabSchemav3("Testv3array"); - - var categoriesField = GetCategoriesField(schema); - - categoriesField.Value = new object[] { 1000, 1010 }; - - var result = Indexersv3.Post(schema); - - var resultArray = GetCategoriesField(result).Value; - resultArray.Should().BeOfType(); - resultArray.As().ToObject().Should().BeEquivalentTo(new[] { 1000, 1010 }); - } } } diff --git a/src/NzbDrone.Integration.Test/ApiTests/ReleasePushFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/ReleasePushFixture.cs deleted file mode 100644 index 07fc52a00..000000000 --- a/src/NzbDrone.Integration.Test/ApiTests/ReleasePushFixture.cs +++ /dev/null @@ -1,32 +0,0 @@ -using FluentAssertions; -using NUnit.Framework; -using Sonarr.Api.V3.Indexers; -using System.Net; -using System.Collections.Generic; -using System; -using System.Globalization; - -namespace NzbDrone.Integration.Test.ApiTests -{ - [TestFixture] - public class ReleasePushFixture : IntegrationTest - { - [Test] - public void should_have_utc_date() - { - var body = new Dictionary(); - body.Add("guid", "sdfsdfsdf"); - body.Add("title", "The.Series.S01E01"); - body.Add("protocol", "Torrent"); - body.Add("downloadUrl", "https://sonarr.tv/test.torrent"); - body.Add("publishDate", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ssZ", CultureInfo.InvariantCulture)); - - var request = ReleasePush.BuildRequest(); - request.AddJsonBody(body); - var result = ReleasePush.Post(request, HttpStatusCode.OK); - - result.Should().NotBeNull(); - result.AgeHours.Should().BeApproximately(0, 0.1); - } - } -} diff --git a/src/NzbDrone.Integration.Test/ApiTests/SeriesEditorFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/SeriesEditorFixture.cs index 737fbb5da..7854eac92 100644 --- a/src/NzbDrone.Integration.Test/ApiTests/SeriesEditorFixture.cs +++ b/src/NzbDrone.Integration.Test/ApiTests/SeriesEditorFixture.cs @@ -10,6 +10,8 @@ namespace NzbDrone.Integration.Test.ApiTests { private void GivenExistingSeries() { + WaitForCompletion(() => Profiles.All().Count > 0); + foreach (var title in new[] { "90210", "Dexter" }) { var newSeries = Series.Lookup(title).First(); diff --git a/src/NzbDrone.Integration.Test/Client/ClientBase.cs b/src/NzbDrone.Integration.Test/Client/ClientBase.cs index c0baa1b2c..030fbdb85 100644 --- a/src/NzbDrone.Integration.Test/Client/ClientBase.cs +++ b/src/NzbDrone.Integration.Test/Client/ClientBase.cs @@ -1,11 +1,11 @@ -using System.Collections.Generic; +using System.Collections.Generic; +using System.Linq; using System.Net; using FluentAssertions; using NLog; using Sonarr.Http.REST; using NzbDrone.Common.Serializer; using RestSharp; -using System.Linq; using Sonarr.Http; namespace NzbDrone.Integration.Test.Client @@ -60,7 +60,8 @@ namespace NzbDrone.Integration.Test.Client return response.Content; } - public T Execute(IRestRequest request, HttpStatusCode statusCode) where T : class, new() + public T Execute(IRestRequest request, HttpStatusCode statusCode) + where T : class, new() { var content = Execute(request, statusCode); @@ -69,7 +70,9 @@ namespace NzbDrone.Integration.Test.Client private static void AssertDisableCache(IList headers) { - headers.Single(c => c.Name == "Cache-Control").Value.Should().Be("no-cache, no-store, must-revalidate, max-age=0"); + // cache control header gets reordered on net core + ((string)headers.Single(c => c.Name == "Cache-Control").Value).Split(',').Select(x => x.Trim()) + .Should().BeEquivalentTo("no-store, must-revalidate, no-cache, max-age=0".Split(',').Select(x => x.Trim())); headers.Single(c => c.Name == "Pragma").Value.Should().Be("no-cache"); headers.Single(c => c.Name == "Expires").Value.Should().Be("0"); } @@ -84,9 +87,18 @@ namespace NzbDrone.Integration.Test.Client } - public List All() + public List All(Dictionary queryParams = null) { var request = BuildRequest(); + + if (queryParams != null) + { + foreach (var param in queryParams) + { + request.AddParameter(param.Key, param.Value); + } + } + return Get>(request); } @@ -159,19 +171,22 @@ namespace NzbDrone.Integration.Test.Client return Put(request, statusCode); } - public T Get(IRestRequest request, HttpStatusCode statusCode = HttpStatusCode.OK) where T : class, new() + public T Get(IRestRequest request, HttpStatusCode statusCode = HttpStatusCode.OK) + where T : class, new() { request.Method = Method.GET; return Execute(request, statusCode); } - public T Post(IRestRequest request, HttpStatusCode statusCode = HttpStatusCode.Created) where T : class, new() + public T Post(IRestRequest request, HttpStatusCode statusCode = HttpStatusCode.Created) + where T : class, new() { request.Method = Method.POST; return Execute(request, statusCode); } - public T Put(IRestRequest request, HttpStatusCode statusCode = HttpStatusCode.Accepted) where T : class, new() + public T Put(IRestRequest request, HttpStatusCode statusCode = HttpStatusCode.Accepted) + where T : class, new() { request.Method = Method.PUT; return Execute(request, statusCode); @@ -183,4 +198,4 @@ namespace NzbDrone.Integration.Test.Client Execute(request, statusCode); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Integration.Test/Client/CommandClient.cs b/src/NzbDrone.Integration.Test/Client/CommandClient.cs index c35e92eb8..dd49231cb 100644 --- a/src/NzbDrone.Integration.Test/Client/CommandClient.cs +++ b/src/NzbDrone.Integration.Test/Client/CommandClient.cs @@ -1,23 +1,51 @@ -using Sonarr.Api.V3.Commands; -using RestSharp; -using NzbDrone.Core.Messaging.Commands; -using FluentAssertions; -using System.Threading; -using NUnit.Framework; +using System; using System.Linq; +using System.Threading; +using FluentAssertions; +using Newtonsoft.Json; +using NUnit.Framework; +using NzbDrone.Core.Messaging.Commands; +using Sonarr.Http.REST; +using RestSharp; namespace NzbDrone.Integration.Test.Client { - public class CommandClient : ClientBase + public class SimpleCommandResource : RestResource + { + public string Name { get; set; } + public string CommandName { get; set; } + public string Message { get; set; } + public CommandPriority Priority { get; set; } + public CommandStatus Status { get; set; } + public DateTime Queued { get; set; } + public DateTime? Started { get; set; } + public DateTime? Ended { get; set; } + public TimeSpan? Duration { get; set; } + public string Exception { get; set; } + public CommandTrigger Trigger { get; set; } + + [JsonIgnore] + public Command Body { get; set; } + [JsonProperty("body")] + public Command BodyReadOnly + { + get { return Body; } + } + } + + public class CommandClient : ClientBase { public CommandClient(IRestClient restClient, string apiKey) - : base(restClient, apiKey) + : base(restClient, apiKey, "command") { } - public CommandResource PostAndWait(CommandResource command) + public SimpleCommandResource PostAndWait(T command) + where T : Command, new() { - var result = Post(command); + var request = BuildRequest(); + request.AddJsonBody(command); + var result = Post(request); result.Id.Should().NotBe(0); for (var i = 0; i < 50; i++) @@ -48,7 +76,7 @@ namespace NzbDrone.Integration.Test.Client Thread.Sleep(500); resources = All(); } - + Assert.Fail("Commands still processing"); } } diff --git a/src/NzbDrone.Integration.Test/GenericApiFixture.cs b/src/NzbDrone.Integration.Test/GenericApiFixture.cs index d4295a459..1063275c9 100644 --- a/src/NzbDrone.Integration.Test/GenericApiFixture.cs +++ b/src/NzbDrone.Integration.Test/GenericApiFixture.cs @@ -1,8 +1,6 @@ using System.Net; using FluentAssertions; using NUnit.Framework; -using NzbDrone.Common.Extensions; -using NzbDrone.Integration.Test.Client; using RestSharp; namespace NzbDrone.Integration.Test @@ -48,4 +46,4 @@ namespace NzbDrone.Integration.Test response.StatusCode.Should().Be(HttpStatusCode.NotAcceptable); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Integration.Test/HttpLogFixture.cs b/src/NzbDrone.Integration.Test/HttpLogFixture.cs index 4bf3f8166..2f94979e9 100644 --- a/src/NzbDrone.Integration.Test/HttpLogFixture.cs +++ b/src/NzbDrone.Integration.Test/HttpLogFixture.cs @@ -27,9 +27,9 @@ namespace NzbDrone.Integration.Test logLines = Logs.GetLogFileLines(logFile).Skip(logLines.Length + 2).ToArray(); Array.Resize(ref logLines, logLines.Length - 1); - logLines.Should().Contain(v => v.Contains("|Trace|Http|Req") && v.Contains("/api/series/")); - logLines.Should().Contain(v => v.Contains("|Trace|Http|Res") && v.Contains("/api/series/: 400.BadRequest")); - logLines.Should().Contain(v => v.Contains("|Debug|Api|") && v.Contains("/api/series/: 400.BadRequest")); + logLines.Should().Contain(v => v.Contains("|Trace|Http|Req") && v.Contains("/api/v3/series/")); + logLines.Should().Contain(v => v.Contains("|Trace|Http|Res") && v.Contains("/api/v3/series/: 400.BadRequest")); + logLines.Should().Contain(v => v.Contains("|Debug|Api|") && v.Contains("/api/v3/series/: 400.BadRequest")); } } } diff --git a/src/NzbDrone.Integration.Test/IndexHtmlFixture.cs b/src/NzbDrone.Integration.Test/IndexHtmlFixture.cs index dc51501b8..b931620ca 100644 --- a/src/NzbDrone.Integration.Test/IndexHtmlFixture.cs +++ b/src/NzbDrone.Integration.Test/IndexHtmlFixture.cs @@ -15,4 +15,4 @@ namespace NzbDrone.Integration.Test } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Integration.Test/IntegrationTest.cs b/src/NzbDrone.Integration.Test/IntegrationTest.cs index 625f0896e..dd2d2bb3f 100644 --- a/src/NzbDrone.Integration.Test/IntegrationTest.cs +++ b/src/NzbDrone.Integration.Test/IntegrationTest.cs @@ -1,4 +1,7 @@ -using NLog; +using System.Threading; +using NLog; +using NUnit.Framework; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Indexers.Newznab; using NzbDrone.Test.Common; using Sonarr.Api.V3.Indexers; @@ -6,31 +9,41 @@ using Sonarr.Http.ClientSchema; namespace NzbDrone.Integration.Test { + [Parallelizable(ParallelScope.Fixtures)] public abstract class IntegrationTest : IntegrationTestBase { + protected static int StaticPort = 8989; + protected NzbDroneRunner _runner; public override string SeriesRootFolder => GetTempDirectory("SeriesRootFolder"); - protected override string RootUrl => "http://localhost:8989/"; + protected int Port { get; private set; } + + protected override string RootUrl => $"http://localhost:{Port}/"; protected override string ApiKey => _runner.ApiKey; protected override void StartTestTarget() { - _runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger()); - _runner.KillAll(); + Port = Interlocked.Increment(ref StaticPort); + + _runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), Port); + _runner.Kill(); _runner.Start(); } protected override void InitializeTestTarget() { - Indexers.Post(new IndexerResource + // Make sure tasks have been initialized so the config put below doesn't cause errors + WaitForCompletion(() => Tasks.All().SelectList(x => x.TaskName).Contains("RssSync")); + + Indexers.Post(new Sonarr.Api.V3.Indexers.IndexerResource { EnableRss = false, - EnableAutomaticSearch = false, EnableInteractiveSearch = false, + EnableAutomaticSearch = false, ConfigContract = nameof(NewznabSettings), Implementation = nameof(Newznab), Name = "NewznabTest", @@ -46,7 +59,7 @@ namespace NzbDrone.Integration.Test protected override void StopTestTarget() { - _runner.KillAll(); + _runner.Kill(); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Integration.Test/IntegrationTestBase.cs b/src/NzbDrone.Integration.Test/IntegrationTestBase.cs index cfcb140c8..e8007515e 100644 --- a/src/NzbDrone.Integration.Test/IntegrationTestBase.cs +++ b/src/NzbDrone.Integration.Test/IntegrationTestBase.cs @@ -30,6 +30,8 @@ using NzbDrone.Integration.Test.Client; using NzbDrone.SignalR; using NzbDrone.Test.Common.Categories; using RestSharp; +using NzbDrone.Common.Processes; +using Sonarr.Api.V3.System.Tasks; namespace NzbDrone.Integration.Test { @@ -41,6 +43,7 @@ namespace NzbDrone.Integration.Test public ClientBase Blocklist; public CommandClient Commands; + public ClientBase Tasks; public DownloadClientClient DownloadClients; public EpisodeClient Episodes; public ClientBase History; @@ -99,22 +102,18 @@ namespace NzbDrone.Integration.Test protected virtual void InitRestClients() { - RestClient = new RestClient(RootUrl + "api/"); + RestClient = new RestClient(RootUrl + "api/v3/"); RestClient.AddDefaultHeader("Authentication", ApiKey); RestClient.AddDefaultHeader("X-Api-Key", ApiKey); - RestClientv3 = new RestClient(RootUrl + "api/v3/"); - RestClientv3.AddDefaultHeader("Authentication", ApiKey); - RestClientv3.AddDefaultHeader("X-Api-Key", ApiKey); - Blocklist = new ClientBase(RestClient, ApiKey); Commands = new CommandClient(RestClient, ApiKey); + Tasks = new ClientBase(RestClient, ApiKey, "system/task"); DownloadClients = new DownloadClientClient(RestClient, ApiKey); Episodes = new EpisodeClient(RestClient, ApiKey); History = new ClientBase(RestClient, ApiKey); HostConfig = new ClientBase(RestClient, ApiKey, "config/host"); Indexers = new IndexerClient(RestClient, ApiKey); - Indexersv3 = new IndexerClient(RestClientv3, ApiKey); Logs = new LogsClient(RestClient, ApiKey); NamingConfig = new ClientBase(RestClient, ApiKey, "config/naming"); Notifications = new NotificationClient(RestClient, ApiKey); @@ -137,7 +136,7 @@ namespace NzbDrone.Integration.Test [SetUp] public void IntegrationSetUp() { - TempDirectory = Path.Combine(TestContext.CurrentContext.TestDirectory, "_test_" + Process.GetCurrentProcess().Id + "_" + DateTime.UtcNow.Ticks); + TempDirectory = Path.Combine(TestContext.CurrentContext.TestDirectory, "_test_" + ProcessProvider.GetCurrentProcessId() + "_" + DateTime.UtcNow.Ticks); // Wait for things to get quiet, otherwise the previous test might influence the current one. Commands.WaitAll(); @@ -285,6 +284,8 @@ namespace NzbDrone.Integration.Test } } + Commands.WaitAll(); + return result; } @@ -309,7 +310,8 @@ namespace NzbDrone.Integration.Test Directory.CreateDirectory(Path.GetDirectoryName(path)); File.WriteAllText(path, "Fake Episode"); - Commands.PostAndWait(new CommandResource { Name = "refreshseries", Body = new RefreshSeriesCommand(series.Id) }); + Commands.PostAndWait(new RefreshSeriesCommand( series.Id )); + Commands.WaitAll(); result = Episodes.GetEpisodesInSeries(series.Id).Single(v => v.SeasonNumber == season && v.EpisodeNumber == episode); diff --git a/src/NzbDrone.Integration.Test/Sonarr.Integration.Test.csproj b/src/NzbDrone.Integration.Test/Sonarr.Integration.Test.csproj index a26128225..13802b071 100644 --- a/src/NzbDrone.Integration.Test/Sonarr.Integration.Test.csproj +++ b/src/NzbDrone.Integration.Test/Sonarr.Integration.Test.csproj @@ -1,10 +1,10 @@  - net462 - x86 + net6.0 + Library - + diff --git a/src/NzbDrone.Libraries.Test/JsonTests/JsonFixture.cs b/src/NzbDrone.Libraries.Test/JsonTests/JsonFixture.cs index dff1af9f1..95049f2fe 100644 --- a/src/NzbDrone.Libraries.Test/JsonTests/JsonFixture.cs +++ b/src/NzbDrone.Libraries.Test/JsonTests/JsonFixture.cs @@ -25,31 +25,5 @@ namespace NzbDrone.Libraries.Test.JsonTests result.Should().BeEquivalentTo(quality, o => o.IncludingAllRuntimeProperties()); } - - [Test] - public void should_log_start_snippet_on_failure() - { - try - { - Json.Deserialize("asdfl kasjd fsdfs derers"); - } - catch (Exception ex) - { - ex.Message.Should().Contain("snippet '<--error-->asdfl kasjd fsdfs de'"); - } - } - - [Test] - public void should_log_line_snippet_on_failure() - { - try - { - Json.Deserialize("{ \"a\": \r\n\"b\",\r\n \"b\": \"c\", asdfl kasjd fsdfs derers vsdfsdf"); - } - catch (Exception ex) - { - ex.Message.Should().Contain("snippet ' \"b\": \"c\", asdfl <--error-->kasjd fsdfs derers v'"); - } - } } } diff --git a/src/NzbDrone.Libraries.Test/RuntimeInformationFixture.cs b/src/NzbDrone.Libraries.Test/RuntimeInformationFixture.cs index 50f1c6548..3f2f2cdc9 100644 --- a/src/NzbDrone.Libraries.Test/RuntimeInformationFixture.cs +++ b/src/NzbDrone.Libraries.Test/RuntimeInformationFixture.cs @@ -15,10 +15,12 @@ namespace NzbDrone.Libraries.Test var isWindows = OsInfo.IsWindows; var isLinux = OsInfo.IsLinux; var isOsx = OsInfo.IsOsx; + var isBsd = OsInfo.Os == Os.Bsd; RuntimeInformation.IsOSPlatform(OSPlatform.Windows).Should().Be(isWindows); - RuntimeInformation.IsOSPlatform(OSPlatform.Linux).Should().Be(isLinux && !isOsx); + RuntimeInformation.IsOSPlatform(OSPlatform.Linux).Should().Be(isLinux && !isOsx && !isBsd); RuntimeInformation.IsOSPlatform(OSPlatform.OSX).Should().Be(isOsx); + RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD).Should().Be(isBsd); } } } diff --git a/src/NzbDrone.Libraries.Test/Sonarr.Libraries.Test.csproj b/src/NzbDrone.Libraries.Test/Sonarr.Libraries.Test.csproj index 8a7864ca0..2c8b3456a 100644 --- a/src/NzbDrone.Libraries.Test/Sonarr.Libraries.Test.csproj +++ b/src/NzbDrone.Libraries.Test/Sonarr.Libraries.Test.csproj @@ -1,7 +1,6 @@  - net462 - x86 + net6.0 diff --git a/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs b/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs index e4dfdabf4..017de3bc7 100644 --- a/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs +++ b/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -8,20 +8,21 @@ using Mono.Unix.Native; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; +using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Test.DiskTests; using NzbDrone.Mono.Disk; namespace NzbDrone.Mono.Test.DiskProviderTests { [TestFixture] - [Platform("Mono")] + [Platform(Exclude = "Win")] public class DiskProviderFixture : DiskProviderFixtureBase { private string _tempPath; public DiskProviderFixture() { - MonoOnly(); + PosixOnly(); } [TearDown] @@ -81,7 +82,11 @@ namespace NzbDrone.Mono.Test.DiskProviderTests if (stat.st_mode != mode) { - Syscall.chmod(path, mode); + if (Syscall.chmod(path, mode) < 0) + { + var error = Stdlib.GetLastError(); + throw new LinuxPermissionsException("Error setting group: " + error); + } } } @@ -143,7 +148,8 @@ namespace NzbDrone.Mono.Test.DiskProviderTests Mocker.GetMock() .Setup(v => v.GetMounts()) - .Returns(new List { + .Returns(new List + { new ProcMount(DriveType.Fixed, rootDir, rootDir, "myfs", new MountOptions(new Dictionary())) }); } @@ -221,9 +227,13 @@ namespace NzbDrone.Mono.Test.DiskProviderTests Syscall.stat(tempFile, out fileStat); NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("0644"); - Subject.SetPermissions(tempFile, "1775", null); - Syscall.stat(tempFile, out fileStat); - NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("1664"); + if (OsInfo.Os != Os.Bsd) + { + // This is not allowed on BSD + Subject.SetPermissions(tempFile, "1775", null); + Syscall.stat(tempFile, out fileStat); + NativeConvert.ToOctalPermissionString(fileStat.st_mode).Should().Be("1664"); + } } [Test] diff --git a/src/NzbDrone.Mono.Test/DiskProviderTests/FreeSpaceFixture.cs b/src/NzbDrone.Mono.Test/DiskProviderTests/FreeSpaceFixture.cs index 7ba5d8414..b1c518c90 100644 --- a/src/NzbDrone.Mono.Test/DiskProviderTests/FreeSpaceFixture.cs +++ b/src/NzbDrone.Mono.Test/DiskProviderTests/FreeSpaceFixture.cs @@ -1,23 +1,15 @@ -using System.Collections.Generic; -using System.IO; using FluentAssertions; using Moq; using NUnit.Framework; -using NzbDrone.Common.Disk; using NzbDrone.Common.Test.DiskTests; using NzbDrone.Mono.Disk; namespace NzbDrone.Mono.Test.DiskProviderTests { [TestFixture] - [Platform("Mono")] + [Platform(Exclude = "Win")] public class FreeSpaceFixture : FreeSpaceFixtureBase { - public FreeSpaceFixture() - { - MonoOnly(); - } - [SetUp] public void Setup() { @@ -27,6 +19,7 @@ namespace NzbDrone.Mono.Test.DiskProviderTests .Returns(s => s); } + [Ignore("Docker")] [Test] public void should_be_able_to_check_space_on_ramdrive() { diff --git a/src/NzbDrone.Mono.Test/DiskProviderTests/SymlinkResolverFixture.cs b/src/NzbDrone.Mono.Test/DiskProviderTests/SymlinkResolverFixture.cs index d6d783556..1f3e9de71 100644 --- a/src/NzbDrone.Mono.Test/DiskProviderTests/SymlinkResolverFixture.cs +++ b/src/NzbDrone.Mono.Test/DiskProviderTests/SymlinkResolverFixture.cs @@ -1,11 +1,5 @@ -using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using FluentAssertions; -using Mono.Posix; using Mono.Unix; using NUnit.Framework; using NzbDrone.Mono.Disk; @@ -14,14 +8,9 @@ using NzbDrone.Test.Common; namespace NzbDrone.Mono.Test.DiskProviderTests { [TestFixture] - [Platform("Mono")] + [Platform(Exclude = "Win")] public class SymbolicLinkResolverFixture : TestBase { - public SymbolicLinkResolverFixture() - { - MonoOnly(); - } - [Test] public void should_follow_nested_symlinks() { diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/FreebsdVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/FreebsdVersionAdapterFixture.cs new file mode 100644 index 000000000..1376316a6 --- /dev/null +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/FreebsdVersionAdapterFixture.cs @@ -0,0 +1,34 @@ +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Processes; +using NzbDrone.Mono.EnvironmentInfo.VersionAdapters; +using NzbDrone.Test.Common; + +namespace NzbDrone.Mono.Test.EnvironmentInfo +{ + [TestFixture] + [Platform("Linux")] + public class FreebsdVersionAdapterFixture : TestBase + { + [SetUp] + public void Setup() + { + if (OsInfo.Os != Os.Bsd) + { + throw new IgnoreException("BSD Only"); + } + + Mocker.SetConstant(Mocker.Resolve()); + } + + [Test] + public void should_get_version_info() + { + var info = Subject.Read(); + info.FullName.Should().NotBeNullOrWhiteSpace(); + info.Name.Should().NotBeNullOrWhiteSpace(); + info.Version.Should().NotBeNullOrWhiteSpace(); + } + } +} diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/MonoPlatformInfoFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/MonoPlatformInfoFixture.cs index 2c15e1762..3db61732c 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/MonoPlatformInfoFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/MonoPlatformInfoFixture.cs @@ -1,5 +1,4 @@ -using System; -using FluentAssertions; +using FluentAssertions; using NUnit.Framework; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Test.Common; diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/ReleaseFileVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/ReleaseFileVersionAdapterFixture.cs index c2772e215..d33abb147 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/ReleaseFileVersionAdapterFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/ReleaseFileVersionAdapterFixture.cs @@ -8,12 +8,14 @@ using NzbDrone.Test.Common; namespace NzbDrone.Mono.Test.EnvironmentInfo { [TestFixture] - [Platform("Mono")] + [Platform("Linux")] public class ReleaseFileVersionAdapterFixture : TestBase { [SetUp] public void Setup() { + NotBsd(); + Mocker.SetConstant(Mocker.Resolve()); } @@ -26,4 +28,4 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo info.Version.Should().NotBeNullOrWhiteSpace(); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs index 6ca90eb90..460df24bc 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs @@ -1,5 +1,4 @@ -using System; -using System.IO; +using System.IO; using FluentAssertions; using Moq; using NUnit.Framework; @@ -74,4 +73,4 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters .Verify(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly), Times.Never()); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs index 2979b1544..e52ebafec 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using FluentAssertions; using Moq; using NUnit.Framework; @@ -15,9 +16,11 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters { [Test] [IntegrationTest] - [Platform("Mono")] + [Platform("Linux")] public void should_get_version_info_from_actual_linux() { + NotBsd(); + Mocker.SetConstant(Mocker.Resolve()); var info = Subject.Read(); info.FullName.Should().NotBeNullOrWhiteSpace(); @@ -45,7 +48,7 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters Subject.Read().Should().BeNull(); Mocker.GetMock() - .Setup(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly)).Returns(new string[0]); + .Setup(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly)).Returns(Array.Empty()); Subject.Read().Should().BeNull(); } @@ -79,4 +82,4 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Mono.Test/Sonarr.Mono.Test.csproj b/src/NzbDrone.Mono.Test/Sonarr.Mono.Test.csproj index f6a12231f..a41a96bd1 100644 --- a/src/NzbDrone.Mono.Test/Sonarr.Mono.Test.csproj +++ b/src/NzbDrone.Mono.Test/Sonarr.Mono.Test.csproj @@ -1,12 +1,18 @@  - net462 - x86 + net6.0 + + + + - + diff --git a/src/NzbDrone.Mono.Test/app.config b/src/NzbDrone.Mono.Test/app.config index d660afa84..85da475f2 100644 --- a/src/NzbDrone.Mono.Test/app.config +++ b/src/NzbDrone.Mono.Test/app.config @@ -5,4 +5,4 @@ - + \ No newline at end of file diff --git a/src/NzbDrone.Mono/Disk/DiskProvider.cs b/src/NzbDrone.Mono/Disk/DiskProvider.cs index afe3ced3f..c461deea3 100644 --- a/src/NzbDrone.Mono/Disk/DiskProvider.cs +++ b/src/NzbDrone.Mono/Disk/DiskProvider.cs @@ -9,23 +9,20 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.EnsureThat; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; -using NzbDrone.Common.Instrumentation; namespace NzbDrone.Mono.Disk { public class DiskProvider : DiskProviderBase { - private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(DiskProvider)); + // Mono supports sending -1 for a uint to indicate that the owner or group should not be set + // `unchecked((uint)-1)` and `uint.MaxValue` are the same thing. + private const uint UNCHANGED_ID = uint.MaxValue; private readonly Logger _logger; private readonly IProcMountProvider _procMountProvider; private readonly ISymbolicLinkResolver _symLinkResolver; private readonly ICreateRefLink _createRefLink; - // Mono supports sending -1 for a uint to indicate that the owner or group should not be set - // `unchecked((uint)-1)` and `uint.MaxValue` are the same thing. - private const uint UNCHANGED_ID = uint.MaxValue; - public DiskProvider(IProcMountProvider procMountProvider, ISymbolicLinkResolver symLinkResolver, ICreateRefLink createRefLink, Logger logger) { _procMountProvider = procMountProvider; @@ -49,7 +46,7 @@ namespace NzbDrone.Mono.Disk if (mount == null) { - Logger.Debug("Unable to get free space for '{0}', unable to find suitable drive", path); + _logger.Debug("Unable to get free space for '{0}', unable to find suitable drive", path); return null; } @@ -63,7 +60,6 @@ namespace NzbDrone.Mono.Disk public override void SetEveryonePermissions(string filename) { - } public override void SetFilePermissions(string path, string mask, string group) @@ -87,7 +83,7 @@ namespace NzbDrone.Mono.Disk protected void SetPermissions(string path, string mask, string group, FilePermissions permissions) { - Logger.Debug("Setting permissions: {0} on {1}", mask, path); + _logger.Debug("Setting permissions: {0} on {1}", mask, path); // Preserve non-access permissions if (Syscall.stat(path, out var curStat) < 0) @@ -167,7 +163,7 @@ namespace NzbDrone.Mono.Disk } catch (Exception ex) { - Logger.Debug(ex, "Failed to copy permissions from {0} to {1}", sourcePath, targetPath); + _logger.Debug(ex, "Failed to copy permissions from {0} to {1}", sourcePath, targetPath); } } @@ -252,7 +248,9 @@ namespace NzbDrone.Mono.Disk newFile.CreateSymbolicLinkTo(fullPath); } } - else if (PlatformInfo.GetVersion() > new Version(6, 0) && (!FileExists(destination) || overwrite)) + else if (((PlatformInfo.Platform == PlatformType.Mono && PlatformInfo.GetVersion() >= new Version(6, 0)) || + PlatformInfo.Platform == PlatformType.NetCore) && + (!FileExists(destination) || overwrite)) { TransferFilePatched(source, destination, overwrite, false); } @@ -297,7 +295,8 @@ namespace NzbDrone.Mono.Disk throw; } } - else if (PlatformInfo.GetVersion() > new Version(6, 0) && !FileExists(destination)) + else if ((PlatformInfo.Platform == PlatformType.Mono && PlatformInfo.GetVersion() >= new Version(6, 0)) || + PlatformInfo.Platform == PlatformType.NetCore) { TransferFilePatched(source, destination, false, true); } @@ -306,7 +305,7 @@ namespace NzbDrone.Mono.Disk base.MoveFileInternal(source, destination); } } - + private void TransferFilePatched(string source, string destination, bool overwrite, bool move) { // Mono 6.x throws errors if permissions or timestamps cannot be set @@ -315,7 +314,7 @@ namespace NzbDrone.Mono.Disk // Catch the exception and attempt to handle these edgecases // Mono 6.x till 6.10 doesn't properly try use rename first. - if (move && PlatformInfo.GetVersion() < new Version(6, 10)) + if (move && (PlatformInfo.Platform == PlatformType.NetCore)) { if (Syscall.lstat(source, out var sourcestat) == 0 && Syscall.lstat(destination, out var deststat) != 0 && @@ -334,7 +333,7 @@ namespace NzbDrone.Mono.Disk } else { - base.CopyFileInternal(source, destination, overwrite); + base.CopyFileInternal(source, destination); } } catch (UnauthorizedAccessException) @@ -343,30 +342,10 @@ namespace NzbDrone.Mono.Disk var dstInfo = new FileInfo(destination); var exists = dstInfo.Exists && srcInfo.Exists; - if (exists && dstInfo.Length == 0 && srcInfo.Length != 0) + if (PlatformInfo.Platform == PlatformType.NetCore && exists && dstInfo.Length == srcInfo.Length) { - // mono >=6.6 bug: zero length file since chmod happens at the start - _logger.Debug("Mono failed to {2} file likely due to known mono bug, attempting to {2} directly. '{0}' -> '{1}'", source, destination, move ? "move" : "copy"); - - try - { - _logger.Trace("Copying content from {0} to {1} ({2} bytes)", source, destination, srcInfo.Length); - using (var srcStream = new FileStream(source, FileMode.Open, FileAccess.Read)) - using (var dstStream = new FileStream(destination, FileMode.Create, FileAccess.Write)) - { - srcStream.CopyTo(dstStream); - } - } - catch - { - // If it fails again then bail - throw; - } - } - else if (exists && dstInfo.Length == srcInfo.Length) - { - // mono 6.0, 6.4 bug: full length file since utime and chmod happens at the end - _logger.Debug("Mono failed to {2} file likely due to known mono bug, attempting to {2} directly. '{0}' -> '{1}'", source, destination, move ? "move" : "copy"); + // mono 6.0, mono 6.4 and netcore 3.1 bug: full length file since utime and chmod happens at the end + _logger.Debug("{3} failed to {2} file likely due to known {3} bug, attempting to {2} directly. '{0}' -> '{1}'", source, destination, move ? "move" : "copy", PlatformInfo.PlatformName); // Check at least part of the file since UnauthorizedAccess can happen due to legitimate reasons too var checkLength = (int)Math.Min(64 * 1024, dstInfo.Length); @@ -437,7 +416,10 @@ namespace NzbDrone.Mono.Disk { var fileInfo = UnixFileSystemInfo.GetFileSystemEntry(source); - if (fileInfo.IsSymbolicLink) return false; + if (fileInfo.IsSymbolicLink) + { + return false; + } fileInfo.CreateLink(destination); return true; @@ -446,17 +428,17 @@ namespace NzbDrone.Mono.Disk { if (ex.ErrorCode == Errno.EXDEV) { - Logger.Trace("Hardlink '{0}' to '{1}' failed due to cross-device access.", source, destination); + _logger.Trace("Hardlink '{0}' to '{1}' failed due to cross-device access.", source, destination); } else { - Logger.Debug(ex, "Hardlink '{0}' to '{1}' failed.", source, destination); + _logger.Debug(ex, "Hardlink '{0}' to '{1}' failed.", source, destination); } return false; } catch (Exception ex) { - Logger.Debug(ex, "Hardlink '{0}' to '{1}' failed.", source, destination); + _logger.Debug(ex, "Hardlink '{0}' to '{1}' failed.", source, destination); return false; } } diff --git a/src/NzbDrone.Mono/Disk/FindDriveType.cs b/src/NzbDrone.Mono/Disk/FindDriveType.cs index a01c6c41f..d0481c3d4 100644 --- a/src/NzbDrone.Mono/Disk/FindDriveType.cs +++ b/src/NzbDrone.Mono/Disk/FindDriveType.cs @@ -12,6 +12,7 @@ namespace NzbDrone.Mono.Disk { "apfs", DriveType.Fixed }, { "fuse.mergerfs", DriveType.Fixed }, { "fuse.glusterfs", DriveType.Network }, + { "nullfs", DriveType.Fixed }, { "zfs", DriveType.Fixed } }; diff --git a/src/NzbDrone.Mono/Disk/LinuxPermissionsException.cs b/src/NzbDrone.Mono/Disk/LinuxPermissionsException.cs index 964eb3a08..488623093 100644 --- a/src/NzbDrone.Mono/Disk/LinuxPermissionsException.cs +++ b/src/NzbDrone.Mono/Disk/LinuxPermissionsException.cs @@ -4,11 +4,13 @@ namespace NzbDrone.Mono.Disk { public class LinuxPermissionsException : NzbDroneException { - public LinuxPermissionsException(string message, params object[] args) : base(message, args) + public LinuxPermissionsException(string message, params object[] args) + : base(message, args) { } - public LinuxPermissionsException(string message) : base(message) + public LinuxPermissionsException(string message) + : base(message) { } } diff --git a/src/NzbDrone.Mono/Disk/ProcMount.cs b/src/NzbDrone.Mono/Disk/ProcMount.cs index 154af2971..2b0b9e5db 100644 --- a/src/NzbDrone.Mono/Disk/ProcMount.cs +++ b/src/NzbDrone.Mono/Disk/ProcMount.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System.IO; +using System.IO; using Mono.Unix; using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; diff --git a/src/NzbDrone.Mono/Disk/ProcMountProvider.cs b/src/NzbDrone.Mono/Disk/ProcMountProvider.cs index 88e834d8a..f95f2a88c 100644 --- a/src/NzbDrone.Mono/Disk/ProcMountProvider.cs +++ b/src/NzbDrone.Mono/Disk/ProcMountProvider.cs @@ -16,17 +16,17 @@ namespace NzbDrone.Mono.Disk public class ProcMountProvider : IProcMountProvider { - private static string[] _fixedTypes = new [] { "ext3", "ext2", "ext4", "vfat", "fuseblk", "xfs", "jfs", "msdos", "ntfs", "minix", "hfs", "hfsplus", "qnx4", "ufs", "btrfs" }; - private static string[] _networkDriveTypes = new [] { "cifs", "nfs", "nfs4", "nfsd", "sshfs" }; - private static readonly Regex OctalRegex = new Regex(@"\\\d{3}", RegexOptions.Compiled); - private const string PROC_MOUNTS_FILENAME = @"/proc/mounts"; private const string PROC_FILESYSTEMS_FILENAME = @"/proc/filesystems"; - private static Dictionary _fileSystems; - + private static readonly Regex OctalRegex = new Regex(@"\\\d{3}", RegexOptions.Compiled); private readonly Logger _logger; + private static string[] _fixedTypes = new[] { "ext3", "ext2", "ext4", "vfat", "fuseblk", "xfs", "jfs", "msdos", "ntfs", "minix", "hfs", "hfsplus", "qnx4", "ufs", "btrfs" }; + private static string[] _networkDriveTypes = new[] { "cifs", "nfs", "nfs4", "nfsd", "sshfs" }; + + private static Dictionary _fileSystems; + public ProcMountProvider(Logger logger) { _logger = logger; diff --git a/src/NzbDrone.Mono/Disk/RefLinkCreator.cs b/src/NzbDrone.Mono/Disk/RefLinkCreator.cs index a4dbd218e..6352cc898 100644 --- a/src/NzbDrone.Mono/Disk/RefLinkCreator.cs +++ b/src/NzbDrone.Mono/Disk/RefLinkCreator.cs @@ -1,13 +1,9 @@ using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; +using Mono.Unix; +using Mono.Unix.Native; using NLog; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Mono.Interop; -using Mono.Unix.Native; -using Mono.Unix; namespace NzbDrone.Mono.Disk { diff --git a/src/NzbDrone.Mono/Disk/SymbolicLinkResolver.cs b/src/NzbDrone.Mono/Disk/SymbolicLinkResolver.cs index 6077fafa1..09a932135 100644 --- a/src/NzbDrone.Mono/Disk/SymbolicLinkResolver.cs +++ b/src/NzbDrone.Mono/Disk/SymbolicLinkResolver.cs @@ -1,7 +1,4 @@ using System; -using System.Drawing; -using System.Net; -using System.Text; using Mono.Unix; using Mono.Unix.Native; using NLog; @@ -24,7 +21,10 @@ namespace NzbDrone.Mono.Disk public string GetCompleteRealPath(string path) { - if (path == null) return null; + if (path == null) + { + return null; + } try { @@ -55,7 +55,7 @@ namespace NzbDrone.Mono.Disk var target = 0; for (var i = 0; i < dirs.Length; ++i) { - if (dirs[i] == "." || dirs[i] == string.Empty) + if (dirs[i] == "." || string.IsNullOrEmpty(dirs[i])) { continue; } diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/FreebsdVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/FreebsdVersionAdapter.cs new file mode 100644 index 000000000..416bfd18c --- /dev/null +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/FreebsdVersionAdapter.cs @@ -0,0 +1,27 @@ +using System.Linq; +using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Processes; + +namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters +{ + public class FreebsdVersionAdapter : IOsVersionAdapter + { + private readonly IProcessProvider _processProvider; + + public FreebsdVersionAdapter(IProcessProvider processProvider) + { + _processProvider = processProvider; + } + + public OsVersionModel Read() + { + var output = _processProvider.StartAndCapture("freebsd-version"); + + var version = output.Standard.First().Content; + + return new OsVersionModel("FreeBSD", version, $"FreeBSD {version}"); + } + + public bool Enabled => OsInfo.Os == Os.Bsd; + } +} diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs index 4ba15f7eb..321a8c12e 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs @@ -34,7 +34,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters // Ubuntu 14.04.5 LTS \n \l // Ubuntu 16.04.1 LTS \n \l - // Fedora/Centos + // Fedora/Centos // Kernel \r on an \m (\l) // Arch Linux \r (\l) @@ -49,4 +49,4 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters public bool Enabled => OsInfo.IsLinux; } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs index 301cf2734..3a7e77fd8 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs @@ -9,13 +9,10 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters { public class MacOsVersionAdapter : IOsVersionAdapter { - private static readonly Regex DarwinVersionRegex = new Regex("(?10\\.\\d{1,2}\\.?\\d{0,2}?)<\\/string>", - RegexOptions.Compiled | - RegexOptions.IgnoreCase - ); - private const string PLIST_DIR = "/System/Library/CoreServices/"; + private static readonly Regex DarwinVersionRegex = new Regex("(?10\\.\\d{1,2}\\.?\\d{0,2}?)<\\/string>", + RegexOptions.Compiled | RegexOptions.IgnoreCase); private readonly IDiskProvider _diskProvider; private readonly Logger _logger; @@ -40,8 +37,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters var versionFile = allFiles.SingleOrDefault(c => c.EndsWith("/SystemVersion.plist") || - c.EndsWith("/ServerVersion.plist") - ); + c.EndsWith("/ServerVersion.plist")); if (string.IsNullOrWhiteSpace(versionFile)) { @@ -66,4 +62,4 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters public bool Enabled => OsInfo.IsOsx; } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs index 80b05c148..5e50ea3d5 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs @@ -33,7 +33,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters foreach (var releaseFile in releaseFiles) { var fileContent = _diskProvider.ReadAllText(releaseFile); - var lines = Regex.Split(fileContent, "\r\n|\r|\n"); ; + var lines = Regex.Split(fileContent, "\r\n|\r|\n"); foreach (var line in lines) { @@ -76,4 +76,4 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters public bool Enabled => OsInfo.IsLinux; } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs index 02bba34b1..994867527 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs @@ -8,10 +8,9 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters { public class SynologyVersionAdapter : IOsVersionAdapter { - private readonly IDiskProvider _diskProvider; private const string NAME = "DSM"; private const string FULL_NAME = "Synology DSM"; - + private readonly IDiskProvider _diskProvider; public SynologyVersionAdapter(IDiskProvider diskProvider) { @@ -37,7 +36,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters var minor = "0"; var fileContent = _diskProvider.ReadAllText(versionFile); - var lines = Regex.Split(fileContent, "\r\n|\r|\n"); ; + var lines = Regex.Split(fileContent, "\r\n|\r|\n"); foreach (var line in lines) { diff --git a/src/NzbDrone.Mono/Interop/NativeMethods.cs b/src/NzbDrone.Mono/Interop/NativeMethods.cs index 78a075061..50ab6574c 100644 --- a/src/NzbDrone.Mono/Interop/NativeMethods.cs +++ b/src/NzbDrone.Mono/Interop/NativeMethods.cs @@ -1,7 +1,4 @@ -using System; -using System.Runtime.ConstrainedExecution; -using System.Runtime.InteropServices; -using System.Text; +using System.Runtime.InteropServices; using Mono.Unix.Native; namespace NzbDrone.Mono.Interop @@ -12,7 +9,7 @@ namespace NzbDrone.Mono.Interop // #define FICLONE _IOW(0x94, 9, int) FICLONE = 0x40049409 } - + internal static class NativeMethods { [DllImport("libc", EntryPoint = "ioctl", SetLastError = true)] diff --git a/src/NzbDrone.Mono/Interop/SafeUnixHandle.cs b/src/NzbDrone.Mono/Interop/SafeUnixHandle.cs index bad088ec5..dc87b226c 100644 --- a/src/NzbDrone.Mono/Interop/SafeUnixHandle.cs +++ b/src/NzbDrone.Mono/Interop/SafeUnixHandle.cs @@ -1,22 +1,16 @@ using System; -using System.Runtime.ConstrainedExecution; using System.Runtime.InteropServices; -using System.Security.Permissions; using Mono.Unix.Native; namespace NzbDrone.Mono.Interop { - [SecurityPermission(SecurityAction.InheritanceDemand, UnmanagedCode = true)] - [SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)] internal sealed class SafeUnixHandle : SafeHandle { - [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] private SafeUnixHandle() : base(new IntPtr(-1), true) { } - [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] public SafeUnixHandle(int fd) : base(new IntPtr(-1), true) { @@ -25,13 +19,12 @@ namespace NzbDrone.Mono.Interop public override bool IsInvalid { - get { return this.handle == new IntPtr(-1); } + get { return handle == new IntPtr(-1); } } - [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] protected override bool ReleaseHandle() { - return Syscall.close(this.handle.ToInt32()) != -1; + return Syscall.close(handle.ToInt32()) != -1; } } } diff --git a/src/NzbDrone.Mono/Sonarr.Mono.csproj b/src/NzbDrone.Mono/Sonarr.Mono.csproj index 0e4555777..a93fda8a9 100644 --- a/src/NzbDrone.Mono/Sonarr.Mono.csproj +++ b/src/NzbDrone.Mono/Sonarr.Mono.csproj @@ -1,17 +1,17 @@  - net462 - x86 + net6.0 + true + - + + - - - ..\Libraries\Mono.Posix.dll - - diff --git a/src/NzbDrone.SignalR/Sonarr.SignalR.csproj b/src/NzbDrone.SignalR/Sonarr.SignalR.csproj index 772271e8d..19349baa6 100644 --- a/src/NzbDrone.SignalR/Sonarr.SignalR.csproj +++ b/src/NzbDrone.SignalR/Sonarr.SignalR.csproj @@ -1,11 +1,8 @@ - + - net462 - x86 + net6.0 + Library - - - diff --git a/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs b/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs index dc21c808e..2f3c10e52 100644 --- a/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs +++ b/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs @@ -9,6 +9,7 @@ using System.Runtime.CompilerServices; using Unity; using Moq; using Moq.Language.Flow; +using NzbDrone.Common.Composition; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Test.Common.AutoMoq.Unity; using Unity.Resolution; @@ -139,6 +140,7 @@ namespace NzbDrone.Test.Common.AutoMoq _registeredMocks = new Dictionary(); AddTheAutoMockingContainerExtensionToTheContainer(container); + ContainerBuilderBase.RegisterNativeResolver(new[] { "System.Data.SQLite", "Sonarr.Core" }); } private static void AddTheAutoMockingContainerExtensionToTheContainer(IUnityContainer container) diff --git a/src/NzbDrone.Test.Common/NzbDroneRunner.cs b/src/NzbDrone.Test.Common/NzbDroneRunner.cs index d564132ed..a31bbb3f4 100644 --- a/src/NzbDrone.Test.Common/NzbDroneRunner.cs +++ b/src/NzbDrone.Test.Common/NzbDroneRunner.cs @@ -6,6 +6,7 @@ using System.Xml.Linq; using NLog; using NUnit.Framework; using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Processes; using NzbDrone.Core.Configuration; using RestSharp; @@ -17,15 +18,17 @@ namespace NzbDrone.Test.Common private readonly IProcessProvider _processProvider; private readonly IRestClient _restClient; private Process _nzbDroneProcess; - private TextWriter _progressWriter; public string AppData { get; private set; } public string ApiKey { get; private set; } + public int Port { get; private set; } public NzbDroneRunner(Logger logger, int port = 8989) { _processProvider = new ProcessProvider(logger); - _restClient = new RestClient("http://localhost:8989/api"); + _restClient = new RestClient($"http://localhost:{port}/api/v3"); + + Port = port; } public void Start() @@ -33,19 +36,25 @@ namespace NzbDrone.Test.Common AppData = Path.Combine(TestContext.CurrentContext.TestDirectory, "_intg_" + TestBase.GetUID()); Directory.CreateDirectory(AppData); - GenerateApiKey(); - - var sonarrConsoleExe = OsInfo.IsWindows ? "Sonarr.Console.exe" : "Sonarr.exe"; + GenerateConfigFile(); - _progressWriter = TestContext.Progress; - - if (BuildInfo.IsDebug) + string consoleExe; + if (OsInfo.IsWindows) { - Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "_output", "Sonarr.Console.exe")); + consoleExe = "Sonarr.Console.exe"; } else { - Start(Path.Combine("bin", sonarrConsoleExe)); + consoleExe = "Sonarr"; + } + + if (BuildInfo.IsDebug) + { + Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "_output", "net6.0", consoleExe)); + } + else + { + Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "bin", consoleExe)); } while (true) @@ -54,9 +63,7 @@ namespace NzbDrone.Test.Common if (_nzbDroneProcess.HasExited) { - _progressWriter.WriteLine("NzbDrone has exited unexpectedly"); - Thread.Sleep(2000); - Assert.Fail("Process has exited: ExitCode={0}", _nzbDroneProcess.ExitCode); + Assert.Fail("Process has exited"); } var request = new RestRequest("system/status"); @@ -67,16 +74,41 @@ namespace NzbDrone.Test.Common if (statusCall.ResponseStatus == ResponseStatus.Completed) { - _progressWriter.WriteLine("NzbDrone is started. Running Tests"); + TestContext.Progress.WriteLine($"Sonarr {Port} is started. Running Tests"); return; } - _progressWriter.WriteLine("Waiting for NzbDrone to start. Response Status : {0} [{1}] {2}", statusCall.ResponseStatus, statusCall.StatusDescription, statusCall.ErrorException.Message); + TestContext.Progress.WriteLine("Waiting for Sonarr to start. Response Status : {0} [{1}] {2}", statusCall.ResponseStatus, statusCall.StatusDescription, statusCall.ErrorException.Message); Thread.Sleep(500); } } + public void Kill() + { + try + { + if (_nzbDroneProcess != null) + { + _nzbDroneProcess.Refresh(); + if (_nzbDroneProcess.HasExited) + { + var log = File.ReadAllLines(Path.Combine(AppData, "logs", "Sonarr.trace.txt")); + var output = log.Join(Environment.NewLine); + TestContext.Progress.WriteLine("Process has exited prematurely: ExitCode={0} Output:\n{1}", _nzbDroneProcess.ExitCode, output); + } + + _processProvider.Kill(_nzbDroneProcess.Id); + } + } + catch (InvalidOperationException) + { + // May happen if the process closes while being closed + } + + TestBase.DeleteTempFolder(AppData); + } + public void KillAll() { try @@ -98,18 +130,16 @@ namespace NzbDrone.Test.Common TestBase.DeleteTempFolder(AppData); } - private void Start(string outputNzbdroneConsoleExe) + private void Start(string outputSonarrConsoleExe) { - _progressWriter.WriteLine("Starting instance from {0}", outputNzbdroneConsoleExe); - - var args = "-nobrowser -data=\"" + AppData + "\""; - _nzbDroneProcess = _processProvider.Start(outputNzbdroneConsoleExe, args, null, OnOutputDataReceived, OnOutputDataReceived); - + TestContext.Progress.WriteLine("Starting instance from {0} on port {1}", outputSonarrConsoleExe, Port); + var args = "-nobrowser -nosingleinstancecheck -data=\"" + AppData + "\""; + _nzbDroneProcess = _processProvider.Start(outputSonarrConsoleExe, args, null, OnOutputDataReceived, OnOutputDataReceived); } private void OnOutputDataReceived(string data) { - _progressWriter.WriteLine(" : " + data); + TestContext.Progress.WriteLine($" [{Port}] > " + data); if (data.Contains("Press enter to exit")) { @@ -117,7 +147,7 @@ namespace NzbDrone.Test.Common } } - private void GenerateApiKey() + private void GenerateConfigFile() { var configFile = Path.Combine(AppData, "config.xml"); @@ -125,11 +155,12 @@ namespace NzbDrone.Test.Common var apiKey = Guid.NewGuid().ToString().Replace("-", ""); var xDoc = new XDocument( - new XDeclaration("1.0", "utf-8", "yes"), + new XDeclaration("1.0", "utf-8", "yes"), new XElement(ConfigFileProvider.CONFIG_ELEMENT_NAME, - new XElement(nameof(ConfigFileProvider.ApiKey), apiKey) - ) - ); + new XElement(nameof(ConfigFileProvider.ApiKey), apiKey), + new XElement(nameof(ConfigFileProvider.LogLevel), "trace"), + new XElement(nameof(ConfigFileProvider.AnalyticsEnabled), false), + new XElement(nameof(ConfigFileProvider.Port), Port))); var data = xDoc.ToString(); diff --git a/src/NzbDrone.Test.Common/Sonarr.Test.Common.csproj b/src/NzbDrone.Test.Common/Sonarr.Test.Common.csproj index f9db3e611..8b91d5fa9 100644 --- a/src/NzbDrone.Test.Common/Sonarr.Test.Common.csproj +++ b/src/NzbDrone.Test.Common/Sonarr.Test.Common.csproj @@ -1,17 +1,15 @@  - net462 - x86 + net6.0 - - - + + + - - + - + diff --git a/src/NzbDrone.Test.Common/TestBase.cs b/src/NzbDrone.Test.Common/TestBase.cs index 811756aa3..afdf97876 100644 --- a/src/NzbDrone.Test.Common/TestBase.cs +++ b/src/NzbDrone.Test.Common/TestBase.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics; using System.IO; using System.Threading; using FluentAssertions; @@ -9,12 +8,14 @@ using NUnit.Framework; using NzbDrone.Common.Cache; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Messaging; +using NzbDrone.Common.Processes; using NzbDrone.Core.Messaging.Events; using NzbDrone.Test.Common.AutoMoq; namespace NzbDrone.Test.Common { - public abstract class TestBase : TestBase where TSubject : class + public abstract class TestBase : TestBase + where TSubject : class { private TSubject _subject; @@ -56,7 +57,7 @@ namespace NzbDrone.Test.Common { _mocker = new AutoMoqer(); _mocker.SetConstant(new CacheManager()); - _mocker.SetConstant(new StartupContext(new string[0])); + _mocker.SetConstant(new StartupContext(Array.Empty())); _mocker.SetConstant(TestLogger); } @@ -79,7 +80,10 @@ namespace NzbDrone.Test.Common get { var virtualPath = Path.Combine(TempFolder, "VirtualNzbDrone"); - if (!Directory.Exists(virtualPath)) Directory.CreateDirectory(virtualPath); + if (!Directory.Exists(virtualPath)) + { + Directory.CreateDirectory(virtualPath); + } return virtualPath; } @@ -122,7 +126,7 @@ namespace NzbDrone.Test.Common public static string GetUID() { - return Process.GetCurrentProcess().Id + "_" + DateTime.Now.Ticks + "_" + Interlocked.Increment(ref _nextUid); + return ProcessProvider.GetCurrentProcessId() + "_" + DateTime.Now.Ticks + "_" + Interlocked.Increment(ref _nextUid); } public static void DeleteTempFolder(string folder) @@ -160,11 +164,19 @@ namespace NzbDrone.Test.Common } } - protected void MonoOnly() + protected void PosixOnly() { - if (!PlatformInfo.IsMono) + if (OsInfo.IsWindows) { - throw new IgnoreException("mono specific test"); + throw new IgnoreException("non windows specific test"); + } + } + + protected void NotBsd() + { + if (OsInfo.Os == Os.Bsd) + { + throw new IgnoreException("Ignored on BSD"); } } @@ -192,17 +204,20 @@ namespace NzbDrone.Test.Common return Path.Combine(TempFolder, Path.GetRandomFileName()); } - protected void VerifyEventPublished() where TEvent : class, IEvent + protected void VerifyEventPublished() + where TEvent : class, IEvent { VerifyEventPublished(Times.Once()); } - protected void VerifyEventPublished(Times times) where TEvent : class, IEvent + protected void VerifyEventPublished(Times times) + where TEvent : class, IEvent { Mocker.GetMock().Verify(c => c.PublishEvent(It.IsAny()), times); } - protected void VerifyEventNotPublished() where TEvent : class, IEvent + protected void VerifyEventNotPublished() + where TEvent : class, IEvent { Mocker.GetMock().Verify(c => c.PublishEvent(It.IsAny()), Times.Never()); } diff --git a/src/NzbDrone.Test.Dummy/Sonarr.Test.Dummy.csproj b/src/NzbDrone.Test.Dummy/Sonarr.Test.Dummy.csproj index 2da82570e..9d17bf8f8 100644 --- a/src/NzbDrone.Test.Dummy/Sonarr.Test.Dummy.csproj +++ b/src/NzbDrone.Test.Dummy/Sonarr.Test.Dummy.csproj @@ -1,7 +1,6 @@  Exe - net462 - x86 + net6.0 - + \ No newline at end of file diff --git a/src/NzbDrone.Update.Test/Sonarr.Update.Test.csproj b/src/NzbDrone.Update.Test/Sonarr.Update.Test.csproj index 69d6b7a5f..c56dc9b98 100644 --- a/src/NzbDrone.Update.Test/Sonarr.Update.Test.csproj +++ b/src/NzbDrone.Update.Test/Sonarr.Update.Test.csproj @@ -1,7 +1,6 @@  - net462 - x86 + net6.0 diff --git a/src/NzbDrone.Update.Test/StartNzbDroneService.cs b/src/NzbDrone.Update.Test/StartNzbDroneService.cs index e61ba0a73..515a1b1fa 100644 --- a/src/NzbDrone.Update.Test/StartNzbDroneService.cs +++ b/src/NzbDrone.Update.Test/StartNzbDroneService.cs @@ -3,6 +3,7 @@ using Moq; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Processes; using NzbDrone.Test.Common; using NzbDrone.Update.UpdateEngine; @@ -27,7 +28,7 @@ namespace NzbDrone.Update.Test public void should_start_console_if_app_type_was_service_but_start_failed_because_of_permissions() { string targetFolder = "c:\\Sonarr\\".AsOsAgnostic(); - string targetProcess = "c:\\Sonarr\\Sonarr.Console.exe".AsOsAgnostic(); + string targetProcess = "c:\\Sonarr\\Sonarr.Console".AsOsAgnostic().ProcessNameToExe(); Mocker.GetMock().Setup(c => c.Start(ServiceProvider.SERVICE_NAME)).Throws(new InvalidOperationException()); diff --git a/src/NzbDrone.Update/Sonarr.Update.csproj b/src/NzbDrone.Update/Sonarr.Update.csproj index badd294fb..c52c9e477 100644 --- a/src/NzbDrone.Update/Sonarr.Update.csproj +++ b/src/NzbDrone.Update/Sonarr.Update.csproj @@ -1,8 +1,7 @@  WinExe - net462 - x86 + net6.0 diff --git a/src/NzbDrone.Update/UpdateEngine/InstallUpdateService.cs b/src/NzbDrone.Update/UpdateEngine/InstallUpdateService.cs index c5dc7c746..260db29f0 100644 --- a/src/NzbDrone.Update/UpdateEngine/InstallUpdateService.cs +++ b/src/NzbDrone.Update/UpdateEngine/InstallUpdateService.cs @@ -119,24 +119,10 @@ namespace NzbDrone.Update.UpdateEngine _logger.Info("Copying new files to target folder"); _diskTransferService.MirrorFolder(_appFolderInfo.GetUpdatePackageFolder(), installationFolder); - // Handle OSX package update and set executable flag on Sonarr app - if (OsInfo.IsOsx) + // Set executable flag on app + if (OsInfo.IsOsx || (OsInfo.IsLinux && PlatformInfo.IsNetCore)) { - var shimPath = Path.Combine(installationFolder, "Sonarr"); - var realShimPath = Path.Combine(installationFolder, "../Sonarr"); - - if (installationFolder.EndsWith("/MacOS/bin") && _diskProvider.FileExists(realShimPath)) - { - // New MacOS App stores Sonarr binaries in MacOS/bin and has a shim in MacOS - // Delete the shim in the downloaded update, we shouldn't update the shim unnecessarily - _diskProvider.DeleteFile(shimPath); - } - else - { - // Old MacOS App stores Sonarr binaries in MacOS together with shell script - // Make shim executable - _diskProvider.SetFilePermissions(shimPath, "755", null); - } + _diskProvider.SetFilePermissions(Path.Combine(installationFolder, "Sonarr"), "755", null); } } catch (Exception e) diff --git a/src/NzbDrone.Update/UpdateEngine/StartNzbDrone.cs b/src/NzbDrone.Update/UpdateEngine/StartNzbDrone.cs index a60b3fa9d..d4eae8d8a 100644 --- a/src/NzbDrone.Update/UpdateEngine/StartNzbDrone.cs +++ b/src/NzbDrone.Update/UpdateEngine/StartNzbDrone.cs @@ -2,8 +2,8 @@ using System; using System.IO; using NLog; using NzbDrone.Common; -using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Processes; using IServiceProvider = NzbDrone.Common.IServiceProvider; @@ -19,15 +19,13 @@ namespace NzbDrone.Update.UpdateEngine private readonly IServiceProvider _serviceProvider; private readonly IProcessProvider _processProvider; private readonly IStartupContext _startupContext; - private readonly IDiskProvider _diskProvider; private readonly Logger _logger; - public StartNzbDrone(IServiceProvider serviceProvider, IProcessProvider processProvider, IStartupContext startupContext, IDiskProvider diskProvider, Logger logger) + public StartNzbDrone(IServiceProvider serviceProvider, IProcessProvider processProvider, IStartupContext startupContext, Logger logger) { _serviceProvider = serviceProvider; _processProvider = processProvider; _startupContext = startupContext; - _diskProvider = diskProvider; _logger = logger; } @@ -43,7 +41,7 @@ namespace NzbDrone.Update.UpdateEngine } catch (InvalidOperationException e) { - _logger.Warn(e, "Couldn't start Sonarr Service (Most likely due to permission issues). falling back to console."); + _logger.Warn("Couldn't start Sonarr Service (Most likely due to permission issues). falling back to console.", e); StartConsole(installationFolder); } } @@ -65,12 +63,12 @@ namespace NzbDrone.Update.UpdateEngine private void StartWinform(string installationFolder) { - Start(installationFolder, "Sonarr.exe"); + Start(installationFolder, "Sonarr".ProcessNameToExe()); } private void StartConsole(string installationFolder) { - Start(installationFolder, "Sonarr.Console.exe"); + Start(installationFolder, "Sonarr.Console".ProcessNameToExe()); } private void Start(string installationFolder, string fileName) @@ -83,25 +81,6 @@ namespace NzbDrone.Update.UpdateEngine _startupContext.Flags.Add(StartupContext.NO_BROWSER); } - if (OsInfo.IsOsx) - { - if (installationFolder.EndsWith(".app/Contents/MacOS/bin")) - { - // New MacOS App stores Sonarr binaries in MacOS/bin and has a shim in MacOS - // Run the app bundle instead - path = Path.GetDirectoryName(installationFolder); - path = Path.GetDirectoryName(path); - path = Path.GetDirectoryName(path); - } - else if (installationFolder.EndsWith(".app/Contents/MacOS")) - { - // Old MacOS App stores Sonarr binaries in MacOS together with shell script - // Run the app bundle instead - path = Path.GetDirectoryName(installationFolder); - path = Path.GetDirectoryName(path); - } - } - _processProvider.SpawnNewProcess(path, _startupContext.PreservedArguments); } } diff --git a/src/NzbDrone.Windows.Test/DiskProviderTests/DiskProviderFixture.cs b/src/NzbDrone.Windows.Test/DiskProviderTests/DiskProviderFixture.cs index 847e03b92..789d07e0a 100644 --- a/src/NzbDrone.Windows.Test/DiskProviderTests/DiskProviderFixture.cs +++ b/src/NzbDrone.Windows.Test/DiskProviderTests/DiskProviderFixture.cs @@ -1,4 +1,4 @@ -using System.IO; +using System.IO; using System.Security.AccessControl; using System.Security.Principal; using NUnit.Framework; @@ -25,15 +25,17 @@ namespace NzbDrone.Windows.Test.DiskProviderTests if (Directory.Exists(path)) { - var ds = Directory.GetAccessControl(path); + var directory = new DirectoryInfo(path); + var ds = directory.GetAccessControl(); ds.SetAccessRule(new FileSystemAccessRule(owner, FileSystemRights.Write, accessControlType)); - Directory.SetAccessControl(path, ds); + directory.SetAccessControl(ds); } else { - var fs = File.GetAccessControl(path); + var file = new FileInfo(path); + var fs = file.GetAccessControl(); fs.SetAccessRule(new FileSystemAccessRule(owner, FileSystemRights.Write, accessControlType)); - File.SetAccessControl(path, fs); + file.SetAccessControl(fs); } } } diff --git a/src/NzbDrone.Windows.Test/DiskProviderTests/FreeSpaceFixture.cs b/src/NzbDrone.Windows.Test/DiskProviderTests/FreeSpaceFixture.cs index 633877880..fdb0b0988 100644 --- a/src/NzbDrone.Windows.Test/DiskProviderTests/FreeSpaceFixture.cs +++ b/src/NzbDrone.Windows.Test/DiskProviderTests/FreeSpaceFixture.cs @@ -22,7 +22,9 @@ namespace NzbDrone.Windows.Test.DiskProviderTests for (char driveletter = 'Z'; driveletter > 'D'; driveletter--) { if (new DriveInfo(driveletter.ToString()).IsReady) + { continue; + } Assert.Throws(() => Subject.GetAvailableSpace(driveletter + @":\NOT_A_REAL_PATH\DOES_NOT_EXIST")); return; diff --git a/src/NzbDrone.Windows.Test/EnvironmentInfo/DotNetPlatformInfoFixture.cs b/src/NzbDrone.Windows.Test/EnvironmentInfo/DotNetPlatformInfoFixture.cs index 2d12a3f8f..f88119ad3 100644 --- a/src/NzbDrone.Windows.Test/EnvironmentInfo/DotNetPlatformInfoFixture.cs +++ b/src/NzbDrone.Windows.Test/EnvironmentInfo/DotNetPlatformInfoFixture.cs @@ -6,7 +6,7 @@ using NzbDrone.Test.Common; namespace NzbDrone.Windows.Test.EnvironmentInfo { [TestFixture] - [Platform("Win")] + [Platform("Net")] public class DotNetPlatformInfoFixture : TestBase { [Test] diff --git a/src/NzbDrone.Windows.Test/Sonarr.Windows.Test.csproj b/src/NzbDrone.Windows.Test/Sonarr.Windows.Test.csproj index b14d20354..522bcf4fc 100644 --- a/src/NzbDrone.Windows.Test/Sonarr.Windows.Test.csproj +++ b/src/NzbDrone.Windows.Test/Sonarr.Windows.Test.csproj @@ -1,7 +1,6 @@  - net462 - x86 + net6.0 diff --git a/src/NzbDrone.Windows.Test/app.config b/src/NzbDrone.Windows.Test/app.config index d660afa84..85da475f2 100644 --- a/src/NzbDrone.Windows.Test/app.config +++ b/src/NzbDrone.Windows.Test/app.config @@ -5,4 +5,4 @@ - + \ No newline at end of file diff --git a/src/NzbDrone.Windows/Sonarr.Windows.csproj b/src/NzbDrone.Windows/Sonarr.Windows.csproj index 74fd52378..96ab6ac02 100644 --- a/src/NzbDrone.Windows/Sonarr.Windows.csproj +++ b/src/NzbDrone.Windows/Sonarr.Windows.csproj @@ -1,10 +1,11 @@  - net462 - x86 + net6.0 + true + diff --git a/src/NzbDrone/Properties/Resources.Designer.cs b/src/NzbDrone/Properties/Resources.Designer.cs index 5c3223613..2ec0d4ab5 100644 --- a/src/NzbDrone/Properties/Resources.Designer.cs +++ b/src/NzbDrone/Properties/Resources.Designer.cs @@ -10,8 +10,8 @@ namespace NzbDrone.Properties { using System; - - + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -19,7 +19,7 @@ namespace NzbDrone.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -63,9 +63,11 @@ namespace NzbDrone.Properties { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon NzbDroneIcon { - get { - object obj = ResourceManager.GetObject("NzbDroneIcon", resourceCulture); + internal static System.Drawing.Icon Sonarr + { + get + { + object obj = ResourceManager.GetObject("Sonarr", resourceCulture); return ((System.Drawing.Icon)(obj)); } } diff --git a/src/NzbDrone/Properties/Resources.resx b/src/NzbDrone/Properties/Resources.resx index 7cab96d26..017b5d86c 100644 --- a/src/NzbDrone/Properties/Resources.resx +++ b/src/NzbDrone/Properties/Resources.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + ..\..\NzbDrone.Host\Sonarr.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/src/NzbDrone/Sonarr.csproj b/src/NzbDrone/Sonarr.csproj index aa68a32cc..992e8755b 100644 --- a/src/NzbDrone/Sonarr.csproj +++ b/src/NzbDrone/Sonarr.csproj @@ -1,17 +1,18 @@  WinExe - net462 - x86 - + net6.0-windows + win-x64;win-x86 + true ..\NzbDrone.Host\Sonarr.ico app.manifest + true - + - + diff --git a/src/NzbDrone/SysTray/SysTrayApp.cs b/src/NzbDrone/SysTray/SysTrayApp.cs index 6325593e1..32fb66d1a 100644 --- a/src/NzbDrone/SysTray/SysTrayApp.cs +++ b/src/NzbDrone/SysTray/SysTrayApp.cs @@ -20,7 +20,7 @@ namespace NzbDrone.SysTray private readonly IProcessProvider _processProvider; private readonly NotifyIcon _trayIcon = new NotifyIcon(); - private readonly ContextMenu _trayMenu = new ContextMenu(); + private readonly ContextMenuStrip _trayMenu = new ContextMenuStrip(); public SystemTrayApp(IBrowserService browserService, IRuntimeInfo runtimeInfo, IProcessProvider processProvider) { @@ -34,14 +34,14 @@ namespace NzbDrone.SysTray Application.ThreadException += OnThreadException; Application.ApplicationExit += OnApplicationExit; - _trayMenu.MenuItems.Add("Launch Browser", LaunchBrowser); - _trayMenu.MenuItems.Add("-"); - _trayMenu.MenuItems.Add("Exit", OnExit); + _trayMenu.Items.Add(new ToolStripMenuItem("Launch Browser", null, LaunchBrowser)); + _trayMenu.Items.Add(new ToolStripMenuItem("-")); + _trayMenu.Items.Add(new ToolStripMenuItem("Exit", null, OnExit)); _trayIcon.Text = string.Format("Sonarr - {0}", BuildInfo.Version); - _trayIcon.Icon = Properties.Resources.NzbDroneIcon; + _trayIcon.Icon = Properties.Resources.Sonarr; - _trayIcon.ContextMenu = _trayMenu; + _trayIcon.ContextMenuStrip = _trayMenu; _trayIcon.Visible = true; _trayIcon.DoubleClick += LaunchBrowser; @@ -76,7 +76,7 @@ namespace NzbDrone.SysTray if (InvokeRequired) { - base.Invoke(new MethodInvoker(() => Dispose(isDisposing))); + Invoke(new MethodInvoker(() => Dispose(isDisposing))); } else diff --git a/src/Runtimes/linux-x64/Sonarr.Core.dll.config b/src/Runtimes/linux-x64/Sonarr.Core.dll.config new file mode 100644 index 000000000..f40a271ce --- /dev/null +++ b/src/Runtimes/linux-x64/Sonarr.Core.dll.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/Libraries/MediaInfo/libmediainfo.0.dylib b/src/Runtimes/osx-x64/libmediainfo.dylib similarity index 100% rename from src/Libraries/MediaInfo/libmediainfo.0.dylib rename to src/Runtimes/osx-x64/libmediainfo.dylib diff --git a/src/Runtimes/win-x64/MediaInfo.dll b/src/Runtimes/win-x64/MediaInfo.dll new file mode 100644 index 000000000..a88193891 Binary files /dev/null and b/src/Runtimes/win-x64/MediaInfo.dll differ diff --git a/src/Libraries/MediaInfo/MediaInfo.dll b/src/Runtimes/win-x86/MediaInfo.dll similarity index 100% rename from src/Libraries/MediaInfo/MediaInfo.dll rename to src/Runtimes/win-x86/MediaInfo.dll diff --git a/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj b/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj index 2da82570e..967ce008c 100644 --- a/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj +++ b/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj @@ -1,7 +1,9 @@  - Exe - net462 - x86 + WinExe + net6.0 + + + diff --git a/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj b/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj index 2da82570e..967ce008c 100644 --- a/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj +++ b/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj @@ -1,7 +1,9 @@  - Exe - net462 - x86 + WinExe + net6.0 + + + diff --git a/src/Sonarr.Api.V3/Config/MediaManagementConfigModule.cs b/src/Sonarr.Api.V3/Config/MediaManagementConfigModule.cs index 566ea93eb..fbbe2459c 100644 --- a/src/Sonarr.Api.V3/Config/MediaManagementConfigModule.cs +++ b/src/Sonarr.Api.V3/Config/MediaManagementConfigModule.cs @@ -1,4 +1,4 @@ -using FluentValidation; +using FluentValidation; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Core.Configuration; using NzbDrone.Core.Validation; @@ -12,7 +12,7 @@ namespace Sonarr.Api.V3.Config : base(configService) { SharedValidator.RuleFor(c => c.RecycleBinCleanupDays).GreaterThanOrEqualTo(0); - SharedValidator.RuleFor(c => c.ChmodFolder).SetValidator(folderChmodValidator).When(c => !string.IsNullOrEmpty(c.ChmodFolder) && PlatformInfo.IsMono); + SharedValidator.RuleFor(c => c.ChmodFolder).SetValidator(folderChmodValidator).When(c => !string.IsNullOrEmpty(c.ChmodFolder) && OsInfo.IsNotWindows); SharedValidator.RuleFor(c => c.RecycleBin).IsValidPath().SetValidator(pathExistsValidator).When(c => !string.IsNullOrWhiteSpace(c.RecycleBin)); SharedValidator.RuleFor(c => c.MinimumFreeSpaceWhenImporting).GreaterThanOrEqualTo(100); } @@ -22,4 +22,4 @@ namespace Sonarr.Api.V3.Config return MediaManagementConfigResourceMapper.ToResource(model); } } -} \ No newline at end of file +} diff --git a/src/Sonarr.Api.V3/Sonarr.Api.V3.csproj b/src/Sonarr.Api.V3/Sonarr.Api.V3.csproj index 60c55fef2..8dfc9198e 100644 --- a/src/Sonarr.Api.V3/Sonarr.Api.V3.csproj +++ b/src/Sonarr.Api.V3/Sonarr.Api.V3.csproj @@ -1,15 +1,14 @@  - net462 - x86 + net6.0 - - + + - + diff --git a/src/Sonarr.Api.V3/System/SystemModule.cs b/src/Sonarr.Api.V3/System/SystemModule.cs index fd4968b16..80442129c 100644 --- a/src/Sonarr.Api.V3/System/SystemModule.cs +++ b/src/Sonarr.Api.V3/System/SystemModule.cs @@ -62,11 +62,11 @@ namespace Sonarr.Api.V3.System AppData = _appFolderInfo.GetAppDataPath(), OsName = _osInfo.Name, OsVersion = _osInfo.Version, - IsMonoRuntime = PlatformInfo.IsMono, - IsMono = PlatformInfo.IsMono, + IsNetCore = PlatformInfo.IsNetCore, IsLinux = OsInfo.IsLinux, IsOsx = OsInfo.IsOsx, IsWindows = OsInfo.IsWindows, + IsDocker = _osInfo.IsDocker, Mode = _runtimeInfo.Mode, Branch = _configFileProvider.Branch, Authentication = _configFileProvider.AuthenticationMethod, diff --git a/src/Sonarr.Http/ByteArrayResponse.cs b/src/Sonarr.Http/ByteArrayResponse.cs new file mode 100644 index 000000000..acfe36730 --- /dev/null +++ b/src/Sonarr.Http/ByteArrayResponse.cs @@ -0,0 +1,21 @@ +using System.IO; +using Nancy; + +namespace Sonarr.Http +{ + public class ByteArrayResponse : Response + { + public ByteArrayResponse(byte[] body, string contentType) + { + ContentType = contentType; + + Contents = stream => + { + using (var writer = new BinaryWriter(stream)) + { + writer.Write(body); + } + }; + } + } +} diff --git a/src/Sonarr.Http/Extensions/Pipelines/GZipPipeline.cs b/src/Sonarr.Http/Extensions/Pipelines/GZipPipeline.cs index 0554faf4b..839177ffb 100644 --- a/src/Sonarr.Http/Extensions/Pipelines/GZipPipeline.cs +++ b/src/Sonarr.Http/Extensions/Pipelines/GZipPipeline.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.IO.Compression; using System.Linq; @@ -23,7 +23,7 @@ namespace Sonarr.Http.Extensions.Pipelines _logger = logger; // On Mono GZipStream/DeflateStream leaks memory if an exception is thrown, use an intermediate buffer in that case. - _writeGZipStream = PlatformInfo.IsMono ? WriteGZipStreamMono : (Action, Stream>)WriteGZipStream; + _writeGZipStream = (Action, Stream>)WriteGZipStream; } public void Register(IPipelines pipelines) @@ -81,7 +81,7 @@ namespace Sonarr.Http.Extensions.Pipelines private static bool ContentLengthIsTooSmall(Response response) { - var contentLength = response.Headers.GetValueOrDefault("Content-Length"); + var contentLength = response.Headers.TryGetValue("Content-Length", out var value) ? value : null; if (contentLength != null && long.Parse(contentLength) < 1024) { @@ -93,7 +93,7 @@ namespace Sonarr.Http.Extensions.Pipelines private static bool AlreadyGzipEncoded(Response response) { - var contentEncoding = response.Headers.GetValueOrDefault("Content-Encoding"); + var contentEncoding = response.Headers.TryGetValue("Content-Encoding", out var value) ? value : null; if (contentEncoding == "gzip") { diff --git a/src/Sonarr.Http/Extensions/ReqResExtensions.cs b/src/Sonarr.Http/Extensions/ReqResExtensions.cs index a567f6973..1e854ab94 100644 --- a/src/Sonarr.Http/Extensions/ReqResExtensions.cs +++ b/src/Sonarr.Http/Extensions/ReqResExtensions.cs @@ -15,7 +15,8 @@ namespace Sonarr.Http.Extensions public static readonly string LastModified = BuildInfo.BuildDateTime.ToString("r"); - public static T FromJson(this Stream body) where T : class, new() + public static T FromJson(this Stream body) + where T : class, new() { return FromJson(body, typeof(T)); } diff --git a/src/Sonarr.Http/Extensions/RequestExtensions.cs b/src/Sonarr.Http/Extensions/RequestExtensions.cs index 95baa5821..7be0a7534 100644 --- a/src/Sonarr.Http/Extensions/RequestExtensions.cs +++ b/src/Sonarr.Http/Extensions/RequestExtensions.cs @@ -105,10 +105,23 @@ namespace Sonarr.Http.Extensions } var remoteAddress = context.Request.UserHostAddress; - IPAddress remoteIP; + + IPAddress.TryParse(remoteAddress, out IPAddress remoteIP); + + if (remoteIP == null) + { + return remoteAddress; + } + + if (remoteIP.IsIPv4MappedToIPv6) + { + remoteIP = remoteIP.MapToIPv4(); + } + + remoteAddress = remoteIP.ToString(); // Only check if forwarded by a local network reverse proxy - if (IPAddress.TryParse(remoteAddress, out remoteIP) && remoteIP.IsLocalAddress()) + if (remoteIP.IsLocalAddress()) { var realIPHeader = context.Request.Headers["X-Real-IP"]; if (realIPHeader.Any()) diff --git a/src/Sonarr.Http/Frontend/CacheableSpecification.cs b/src/Sonarr.Http/Frontend/CacheableSpecification.cs index 457ef8a50..ffee8cf82 100644 --- a/src/Sonarr.Http/Frontend/CacheableSpecification.cs +++ b/src/Sonarr.Http/Frontend/CacheableSpecification.cs @@ -19,19 +19,40 @@ namespace Sonarr.Http.Frontend return false; } - if (((DynamicDictionary)context.Request.Query).ContainsKey("h")) return true; + if (((DynamicDictionary)context.Request.Query).ContainsKey("h")) + { + return true; + } if (context.Request.Path.StartsWith("/api", StringComparison.CurrentCultureIgnoreCase)) { - if (context.Request.Path.ContainsIgnoreCase("/MediaCover")) return true; + if (context.Request.Path.ContainsIgnoreCase("/MediaCover")) + { + return true; + } return false; } - if (context.Request.Path.StartsWith("/signalr", StringComparison.CurrentCultureIgnoreCase)) return false; - if (context.Request.Path.EndsWith("index.js")) return false; - if (context.Request.Path.EndsWith("initialize.js")) return false; - if (context.Request.Path.StartsWith("/feed", StringComparison.CurrentCultureIgnoreCase)) return false; + if (context.Request.Path.StartsWith("/signalr", StringComparison.CurrentCultureIgnoreCase)) + { + return false; + } + + if (context.Request.Path.EndsWith("index.js")) + { + return false; + } + + if (context.Request.Path.EndsWith("initialize.js")) + { + return false; + } + + if (context.Request.Path.StartsWith("/feed", StringComparison.CurrentCultureIgnoreCase)) + { + return false; + } if (context.Request.Path.StartsWith("/log", StringComparison.CurrentCultureIgnoreCase) && context.Request.Path.EndsWith(".txt", StringComparison.CurrentCultureIgnoreCase)) @@ -41,7 +62,10 @@ namespace Sonarr.Http.Frontend if (context.Response != null) { - if (context.Response.ContentType.Contains("text/html")) return false; + if (context.Response.ContentType.Contains("text/html")) + { + return false; + } } return true; diff --git a/src/Sonarr.Http/Frontend/InitializeJsModule.cs b/src/Sonarr.Http/Frontend/InitializeJsModule.cs index 84bdbca6b..fe9d8e9e1 100644 --- a/src/Sonarr.Http/Frontend/InitializeJsModule.cs +++ b/src/Sonarr.Http/Frontend/InitializeJsModule.cs @@ -2,6 +2,7 @@ using System.IO; using System.Text; using Nancy; using Nancy.Responses; +using NzbDrone.Common; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Core.Analytics; using NzbDrone.Core.Configuration; @@ -26,7 +27,7 @@ namespace Sonarr.Http.Frontend _apiKey = configFileProvider.ApiKey; _urlBase = configFileProvider.UrlBase; - Get("/initialize.js", x => Index()); + Get("/initialize.js", x => Index()); } private Response Index() @@ -64,6 +65,7 @@ namespace Sonarr.Http.Frontend builder.AppendLine($" instanceName: '{_configFileProvider.InstanceName.ToString()}',"); builder.AppendLine($" branch: '{_configFileProvider.Branch.ToLower()}',"); builder.AppendLine($" analytics: {_analyticsService.IsEnabled.ToString().ToLowerInvariant()},"); + builder.AppendLine($" userHash: '{HashUtil.AnonymousToken()}',"); builder.AppendLine($" urlBase: '{_urlBase}',"); builder.AppendLine($" isProduction: {RuntimeInfo.IsProduction.ToString().ToLowerInvariant()}"); builder.AppendLine("};"); diff --git a/src/Sonarr.Http/Frontend/Mappers/CacheBreakerProvider.cs b/src/Sonarr.Http/Frontend/Mappers/CacheBreakerProvider.cs index ab7324124..448fd25d4 100644 --- a/src/Sonarr.Http/Frontend/Mappers/CacheBreakerProvider.cs +++ b/src/Sonarr.Http/Frontend/Mappers/CacheBreakerProvider.cs @@ -40,4 +40,4 @@ namespace Sonarr.Http.Frontend.Mappers return !path.EndsWith(".ics") && !path.EndsWith("main"); } } -} \ No newline at end of file +} diff --git a/src/Sonarr.Http/Frontend/Mappers/FaviconMapper.cs b/src/Sonarr.Http/Frontend/Mappers/FaviconMapper.cs index c007e0a89..ef5d8bb17 100644 --- a/src/Sonarr.Http/Frontend/Mappers/FaviconMapper.cs +++ b/src/Sonarr.Http/Frontend/Mappers/FaviconMapper.cs @@ -11,7 +11,7 @@ namespace Sonarr.Http.Frontend.Mappers private readonly IAppFolderInfo _appFolderInfo; private readonly IConfigFileProvider _configFileProvider; - public FaviconMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider,IConfigFileProvider configFileProvider, Logger logger) + public FaviconMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider, IConfigFileProvider configFileProvider, Logger logger) : base(diskProvider, logger) { _appFolderInfo = appFolderInfo; @@ -37,4 +37,4 @@ namespace Sonarr.Http.Frontend.Mappers return resourceUrl.Equals("/favicon.ico"); } } -} \ No newline at end of file +} diff --git a/src/Sonarr.Http/Frontend/Mappers/HtmlMapperBase.cs b/src/Sonarr.Http/Frontend/Mappers/HtmlMapperBase.cs index 55f5a551d..7863c1ca2 100644 --- a/src/Sonarr.Http/Frontend/Mappers/HtmlMapperBase.cs +++ b/src/Sonarr.Http/Frontend/Mappers/HtmlMapperBase.cs @@ -1,6 +1,7 @@ using System; -using System.IO; +using System.Text; using System.Text.RegularExpressions; +using System.Threading.Tasks; using Nancy; using NLog; using NzbDrone.Common.Disk; @@ -18,7 +19,8 @@ namespace Sonarr.Http.Frontend.Mappers protected HtmlMapperBase(IDiskProvider diskProvider, Func cacheBreakProviderFactory, - Logger logger) : base(diskProvider, logger) + Logger logger) + : base(diskProvider, logger) { _diskProvider = diskProvider; _cacheBreakProviderFactory = cacheBreakProviderFactory; @@ -27,21 +29,16 @@ namespace Sonarr.Http.Frontend.Mappers protected string HtmlPath; protected string UrlBase; - protected override Stream GetContentStream(string filePath) + protected override Task GetContent(string filePath) { var text = GetHtmlText(); - - var stream = new MemoryStream(); - var writer = new StreamWriter(stream); - writer.Write(text); - writer.Flush(); - stream.Position = 0; - return stream; + var data = Encoding.UTF8.GetBytes(text); + return Task.FromResult(data); } - public override Response GetResponse(string resourceUrl) + public async override Task GetResponse(string resourceUrl) { - var response = base.GetResponse(resourceUrl); + var response = await base.GetResponse(resourceUrl); response.Headers["X-UA-Compatible"] = "IE=edge"; return response; diff --git a/src/Sonarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs b/src/Sonarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs index 885d08a9e..86dad7188 100644 --- a/src/Sonarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs +++ b/src/Sonarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs @@ -1,4 +1,4 @@ - +using System.Threading.Tasks; using Nancy; namespace Sonarr.Http.Frontend.Mappers @@ -7,6 +7,6 @@ namespace Sonarr.Http.Frontend.Mappers { string Map(string resourceUrl); bool CanHandle(string resourceUrl); - Response GetResponse(string resourceUrl); + Task GetResponse(string resourceUrl); } } diff --git a/src/Sonarr.Http/Frontend/Mappers/LogFileMapper.cs b/src/Sonarr.Http/Frontend/Mappers/LogFileMapper.cs index 376b82581..2b418f981 100644 --- a/src/Sonarr.Http/Frontend/Mappers/LogFileMapper.cs +++ b/src/Sonarr.Http/Frontend/Mappers/LogFileMapper.cs @@ -29,4 +29,4 @@ namespace Sonarr.Http.Frontend.Mappers return resourceUrl.StartsWith("/updatelogfile/") && resourceUrl.EndsWith(".txt"); } } -} \ No newline at end of file +} diff --git a/src/Sonarr.Http/Frontend/Mappers/ManifestMapper.cs b/src/Sonarr.Http/Frontend/Mappers/ManifestMapper.cs index 266557e20..4af375b97 100644 --- a/src/Sonarr.Http/Frontend/Mappers/ManifestMapper.cs +++ b/src/Sonarr.Http/Frontend/Mappers/ManifestMapper.cs @@ -31,4 +31,4 @@ namespace Sonarr.Http.Frontend.Mappers return resourceUrl.StartsWith("/Content/Images/Icons/manifest"); } } -} \ No newline at end of file +} diff --git a/src/Sonarr.Http/Frontend/Mappers/MediaCoverProxyMapper.cs b/src/Sonarr.Http/Frontend/Mappers/MediaCoverProxyMapper.cs index 32be17548..89e557ec4 100644 --- a/src/Sonarr.Http/Frontend/Mappers/MediaCoverProxyMapper.cs +++ b/src/Sonarr.Http/Frontend/Mappers/MediaCoverProxyMapper.cs @@ -1,8 +1,7 @@ using System; -using System.IO; using System.Text.RegularExpressions; +using System.Threading.Tasks; using Nancy; -using Nancy.Responses; using NzbDrone.Core.MediaCover; namespace Sonarr.Http.Frontend.Mappers @@ -28,13 +27,13 @@ namespace Sonarr.Http.Frontend.Mappers return resourceUrl.StartsWith("/MediaCoverProxy/", StringComparison.InvariantCultureIgnoreCase); } - public Response GetResponse(string resourceUrl) + public Task GetResponse(string resourceUrl) { var match = _regex.Match(resourceUrl); if (!match.Success) { - return new NotFoundResponse(); + return Task.FromResult(new NotFoundResponse()); } var hash = match.Groups["hash"].Value; @@ -42,7 +41,7 @@ namespace Sonarr.Http.Frontend.Mappers var imageData = _mediaCoverProxy.GetImage(hash); - return new StreamResponse(() => new MemoryStream(imageData), MimeTypes.GetMimeType(filename)); + return Task.FromResult(new ByteArrayResponse(imageData, MimeTypes.GetMimeType(filename))); } } } diff --git a/src/Sonarr.Http/Frontend/Mappers/StaticResourceMapper.cs b/src/Sonarr.Http/Frontend/Mappers/StaticResourceMapper.cs index 8b3e0d4a6..4b13104fc 100644 --- a/src/Sonarr.Http/Frontend/Mappers/StaticResourceMapper.cs +++ b/src/Sonarr.Http/Frontend/Mappers/StaticResourceMapper.cs @@ -30,7 +30,7 @@ namespace Sonarr.Http.Frontend.Mappers public override bool CanHandle(string resourceUrl) { resourceUrl = resourceUrl.ToLowerInvariant(); - + if (resourceUrl.StartsWith("/content/images/icons/manifest") || resourceUrl.StartsWith("/content/images/icons/browserconfig")) { diff --git a/src/Sonarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs b/src/Sonarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs index a6cfe03e2..c004cfd94 100644 --- a/src/Sonarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs +++ b/src/Sonarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs @@ -1,7 +1,7 @@ using System; using System.IO; +using System.Threading.Tasks; using Nancy; -using Nancy.Responses; using NLog; using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; @@ -28,14 +28,15 @@ namespace Sonarr.Http.Frontend.Mappers public abstract bool CanHandle(string resourceUrl); - public virtual Response GetResponse(string resourceUrl) + public async virtual Task GetResponse(string resourceUrl) { var filePath = Map(resourceUrl); if (_diskProvider.FileExists(filePath, _caseSensitive)) { - var response = new StreamResponse(() => GetContentStream(filePath), MimeTypes.GetMimeType(filePath)); - return new MaterialisingResponse(response); + var data = await GetContent(filePath).ConfigureAwait(false); + + return new ByteArrayResponse(data, MimeTypes.GetMimeType(filePath)); } _logger.Warn("File {0} not found", filePath); @@ -43,9 +44,17 @@ namespace Sonarr.Http.Frontend.Mappers return NotFoundResponse; } - protected virtual Stream GetContentStream(string filePath) + protected async virtual Task GetContent(string filePath) { - return File.OpenRead(filePath); + using (var output = new MemoryStream()) + { + using (var file = File.OpenRead(filePath)) + { + await file.CopyToAsync(output).ConfigureAwait(false); + } + + return output.ToArray(); + } } } } diff --git a/src/Sonarr.Http/Frontend/Mappers/UpdateLogFileMapper.cs b/src/Sonarr.Http/Frontend/Mappers/UpdateLogFileMapper.cs index 95a352d47..269e0243d 100644 --- a/src/Sonarr.Http/Frontend/Mappers/UpdateLogFileMapper.cs +++ b/src/Sonarr.Http/Frontend/Mappers/UpdateLogFileMapper.cs @@ -29,4 +29,4 @@ namespace Sonarr.Http.Frontend.Mappers return resourceUrl.StartsWith("/logfile/") && resourceUrl.EndsWith(".txt"); } } -} \ No newline at end of file +} diff --git a/src/Sonarr.Http/Frontend/StaticResourceModule.cs b/src/Sonarr.Http/Frontend/StaticResourceModule.cs index 881049d52..66720f0b6 100644 --- a/src/Sonarr.Http/Frontend/StaticResourceModule.cs +++ b/src/Sonarr.Http/Frontend/StaticResourceModule.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Nancy; using NLog; using Sonarr.Http.Frontend.Mappers; @@ -18,11 +19,11 @@ namespace Sonarr.Http.Frontend _requestMappers = requestMappers; _logger = logger; - Get("/{resource*}", x => Index()); - Get("/", x => Index()); + Get("/{resource*}", async (x, ct) => await Index()); + Get("/", async (x, ct) => await Index()); } - private Response Index() + private async Task Index() { var path = Request.Url.Path; @@ -38,7 +39,7 @@ namespace Sonarr.Http.Frontend if (mapper != null) { - return mapper.GetResponse(path); + return await mapper.GetResponse(path); } _logger.Warn("Couldn't find handler for {0}", path); diff --git a/src/Sonarr.Http/Mapping/MappingValidation.cs b/src/Sonarr.Http/Mapping/MappingValidation.cs deleted file mode 100644 index 4b055c73f..000000000 --- a/src/Sonarr.Http/Mapping/MappingValidation.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Linq; -using System.Reflection; -using NzbDrone.Common.Reflection; -using Sonarr.Http.REST; - -namespace Sonarr.Http.Mapping -{ - public static class MappingValidation - { - public static void ValidateMapping(Type modelType, Type resourceType) - { - var errors = modelType.GetSimpleProperties().Where(c=>!c.GetGetMethod().IsStatic).Select(p => GetError(resourceType, p)).Where(c => c != null).ToList(); - - if (errors.Any()) - { - throw new ResourceMappingException(errors); - } - - PrintExtraProperties(modelType, resourceType); - } - - private static void PrintExtraProperties(Type modelType, Type resourceType) - { - var resourceBaseProperties = typeof(RestResource).GetProperties().Select(c => c.Name); - var resourceProperties = resourceType.GetProperties().Select(c => c.Name).Except(resourceBaseProperties); - var modelProperties = modelType.GetProperties().Select(c => c.Name); - - var extra = resourceProperties.Except(modelProperties); - - foreach (var extraProp in extra) - { - Console.WriteLine("Extra: [{0}]", extraProp); - } - } - - private static string GetError(Type resourceType, PropertyInfo modelProperty) - { - var resourceProperty = resourceType.GetProperties().FirstOrDefault(c => c.Name == modelProperty.Name); - - if (resourceProperty == null) - { - return string.Format("public {0} {1} {{ get; set; }}", modelProperty.PropertyType.Name, modelProperty.Name); - } - - if (resourceProperty.PropertyType != modelProperty.PropertyType && !typeof(RestResource).IsAssignableFrom(resourceProperty.PropertyType)) - { - return string.Format("Expected {0}.{1} to have type of {2} but found {3}", resourceType.Name, resourceProperty.Name, modelProperty.PropertyType, resourceProperty.PropertyType); - } - - return null; - } - } -} \ No newline at end of file diff --git a/src/Sonarr.Http/Mapping/ResourceMappingException.cs b/src/Sonarr.Http/Mapping/ResourceMappingException.cs deleted file mode 100644 index 42d564b37..000000000 --- a/src/Sonarr.Http/Mapping/ResourceMappingException.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Sonarr.Http.Mapping -{ - public class ResourceMappingException : ApplicationException - { - public ResourceMappingException(IEnumerable error) - : base(Environment.NewLine + string.Join(Environment.NewLine, error.OrderBy(c => c))) - { - - } - } -} \ No newline at end of file diff --git a/src/Sonarr.Http/Sonarr.Http.csproj b/src/Sonarr.Http/Sonarr.Http.csproj index ace43bbd1..a8ef43162 100644 --- a/src/Sonarr.Http/Sonarr.Http.csproj +++ b/src/Sonarr.Http/Sonarr.Http.csproj @@ -1,14 +1,13 @@  - net462 - x86 + net6.0 - + - + diff --git a/src/Sonarr.RuntimePatches/Sonarr.RuntimePatches.csproj b/src/Sonarr.RuntimePatches/Sonarr.RuntimePatches.csproj index 9f9e401af..7cf363008 100644 --- a/src/Sonarr.RuntimePatches/Sonarr.RuntimePatches.csproj +++ b/src/Sonarr.RuntimePatches/Sonarr.RuntimePatches.csproj @@ -1,7 +1,6 @@ - net462 - x86 + net6.0 diff --git a/src/Sonarr.sln b/src/Sonarr.sln index b3889eb42..35278eb5e 100644 --- a/src/Sonarr.sln +++ b/src/Sonarr.sln @@ -3,6 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29806.167 MinimumVisualStudioVersion = 10.0.40219.1 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32516.85 +MinimumVisualStudioVersion = 15.0.26124.0 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sonarr.Console", "NzbDrone.Console\Sonarr.Console.csproj", "{3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}" ProjectSection(ProjectDependencies) = postProject {7140FF1F-79BE-492F-9188-B21A050BF708} = {7140FF1F-79BE-492F-9188-B21A050BF708} @@ -47,11 +50,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sonarr.Update", "NzbDrone.U EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sonarr.Common", "NzbDrone.Common\Sonarr.Common.csproj", "{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1E6B3CBE-1578-41C1-9BF9-78D818740BE9}" - ProjectSection(SolutionItems) = preProject - .nuget\NuGet.exe = .nuget\NuGet.exe - EndProjectSection -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Host", "Host", "{486ADF86-DD89-4E19-B805-9D94F19800D9}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sonarr.Host", "NzbDrone.Host\Sonarr.Host.csproj", "{95C11A9E-56ED-456A-8447-2C89C1139266}" @@ -84,175 +82,249 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sonarr.Host.Test", "NzbDron EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sonarr.RuntimePatches", "Sonarr.RuntimePatches\Sonarr.RuntimePatches.csproj", "{F3F63718-63C6-432F-BDDC-C960AD95EC82}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0C7E5F5A-C4CC-4945-B399-1E1C9817CC45}" + ProjectSection(SolutionItems) = preProject + ..\.editorconfig = ..\.editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Mono|x86 = Mono|x86 - Release|x86 = Release|x86 + Debug|Posix = Debug|Posix + Debug|Windows = Debug|Windows + Release|Posix = Release|Posix + Release|Windows = Release|Windows EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Debug|x86.ActiveCfg = Debug|x86 - {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Debug|x86.Build.0 = Debug|x86 - {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Mono|x86.ActiveCfg = Release|x86 - {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Mono|x86.Build.0 = Release|x86 - {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Release|x86.ActiveCfg = Release|x86 - {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Release|x86.Build.0 = Release|x86 - {FAFB5948-A222-4CF6-AD14-026BE7564802}.Debug|x86.ActiveCfg = Debug|x86 - {FAFB5948-A222-4CF6-AD14-026BE7564802}.Debug|x86.Build.0 = Debug|x86 - {FAFB5948-A222-4CF6-AD14-026BE7564802}.Mono|x86.ActiveCfg = Release|x86 - {FAFB5948-A222-4CF6-AD14-026BE7564802}.Mono|x86.Build.0 = Release|x86 - {FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|x86.ActiveCfg = Release|x86 - {FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|x86.Build.0 = Release|x86 - {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x86.ActiveCfg = Debug|x86 - {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x86.Build.0 = Debug|x86 - {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Mono|x86.ActiveCfg = Release|x86 - {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Mono|x86.Build.0 = Release|x86 - {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|x86.ActiveCfg = Release|x86 - {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|x86.Build.0 = Release|x86 - {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.ActiveCfg = Debug|x86 - {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.Build.0 = Debug|x86 - {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Mono|x86.ActiveCfg = Release|x86 - {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Mono|x86.Build.0 = Release|x86 - {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|x86.ActiveCfg = Release|x86 - {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|x86.Build.0 = Release|x86 - {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|x86.ActiveCfg = Debug|x86 - {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|x86.Build.0 = Debug|x86 - {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Mono|x86.ActiveCfg = Release|x86 - {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Mono|x86.Build.0 = Release|x86 - {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|x86.ActiveCfg = Release|x86 - {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|x86.Build.0 = Release|x86 - {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x86.ActiveCfg = Debug|x86 - {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x86.Build.0 = Debug|x86 - {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Mono|x86.ActiveCfg = Release|x86 - {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Mono|x86.Build.0 = Release|x86 - {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|x86.ActiveCfg = Release|x86 - {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|x86.Build.0 = Release|x86 - {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Debug|x86.ActiveCfg = Debug|x86 - {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Debug|x86.Build.0 = Debug|x86 - {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Mono|x86.ActiveCfg = Release|x86 - {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Mono|x86.Build.0 = Release|x86 - {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Release|x86.ActiveCfg = Release|x86 - {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Release|x86.Build.0 = Release|x86 - {CBF6B8B0-A015-413A-8C86-01238BB45770}.Debug|x86.ActiveCfg = Debug|x86 - {CBF6B8B0-A015-413A-8C86-01238BB45770}.Debug|x86.Build.0 = Debug|x86 - {CBF6B8B0-A015-413A-8C86-01238BB45770}.Mono|x86.ActiveCfg = Release|x86 - {CBF6B8B0-A015-413A-8C86-01238BB45770}.Mono|x86.Build.0 = Release|x86 - {CBF6B8B0-A015-413A-8C86-01238BB45770}.Release|x86.ActiveCfg = Release|x86 - {CBF6B8B0-A015-413A-8C86-01238BB45770}.Release|x86.Build.0 = Release|x86 - {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Debug|x86.ActiveCfg = Debug|x86 - {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Debug|x86.Build.0 = Debug|x86 - {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Mono|x86.ActiveCfg = Release|x86 - {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Mono|x86.Build.0 = Release|x86 - {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Release|x86.ActiveCfg = Release|x86 - {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Release|x86.Build.0 = Release|x86 - {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Debug|x86.ActiveCfg = Debug|x86 - {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Debug|x86.Build.0 = Debug|x86 - {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Mono|x86.ActiveCfg = Release|x86 - {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Mono|x86.Build.0 = Release|x86 - {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Release|x86.ActiveCfg = Release|x86 - {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Release|x86.Build.0 = Release|x86 - {6BCE712F-846D-4846-9D1B-A66B858DA755}.Debug|x86.ActiveCfg = Debug|x86 - {6BCE712F-846D-4846-9D1B-A66B858DA755}.Debug|x86.Build.0 = Debug|x86 - {6BCE712F-846D-4846-9D1B-A66B858DA755}.Mono|x86.ActiveCfg = Release|x86 - {6BCE712F-846D-4846-9D1B-A66B858DA755}.Mono|x86.Build.0 = Release|x86 - {6BCE712F-846D-4846-9D1B-A66B858DA755}.Release|x86.ActiveCfg = Release|x86 - {6BCE712F-846D-4846-9D1B-A66B858DA755}.Release|x86.Build.0 = Release|x86 - {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Debug|x86.ActiveCfg = Debug|x86 - {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Debug|x86.Build.0 = Debug|x86 - {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Mono|x86.ActiveCfg = Release|x86 - {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Mono|x86.Build.0 = Release|x86 - {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Release|x86.ActiveCfg = Release|x86 - {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Release|x86.Build.0 = Release|x86 - {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Debug|x86.ActiveCfg = Debug|x86 - {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Debug|x86.Build.0 = Debug|x86 - {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Mono|x86.ActiveCfg = Release|x86 - {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Mono|x86.Build.0 = Release|x86 - {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|x86.ActiveCfg = Release|x86 - {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|x86.Build.0 = Release|x86 - {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|x86.ActiveCfg = Debug|x86 - {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|x86.Build.0 = Debug|x86 - {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Mono|x86.ActiveCfg = Release|x86 - {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Mono|x86.Build.0 = Release|x86 - {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|x86.ActiveCfg = Release|x86 - {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|x86.Build.0 = Release|x86 - {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.ActiveCfg = Debug|x86 - {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.Build.0 = Debug|x86 - {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Mono|x86.ActiveCfg = Release|x86 - {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Mono|x86.Build.0 = Release|x86 - {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|x86.ActiveCfg = Release|x86 - {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|x86.Build.0 = Release|x86 - {95C11A9E-56ED-456A-8447-2C89C1139266}.Debug|x86.ActiveCfg = Debug|x86 - {95C11A9E-56ED-456A-8447-2C89C1139266}.Debug|x86.Build.0 = Debug|x86 - {95C11A9E-56ED-456A-8447-2C89C1139266}.Mono|x86.ActiveCfg = Release|x86 - {95C11A9E-56ED-456A-8447-2C89C1139266}.Mono|x86.Build.0 = Release|x86 - {95C11A9E-56ED-456A-8447-2C89C1139266}.Release|x86.ActiveCfg = Release|x86 - {95C11A9E-56ED-456A-8447-2C89C1139266}.Release|x86.Build.0 = Release|x86 - {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|x86.ActiveCfg = Debug|x86 - {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|x86.Build.0 = Debug|x86 - {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Mono|x86.ActiveCfg = Release|x86 - {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Mono|x86.Build.0 = Release|x86 - {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Release|x86.ActiveCfg = Release|x86 - {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Release|x86.Build.0 = Release|x86 - {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Debug|x86.ActiveCfg = Debug|x86 - {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Debug|x86.Build.0 = Debug|x86 - {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Mono|x86.ActiveCfg = Release|x86 - {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Mono|x86.Build.0 = Release|x86 - {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Release|x86.ActiveCfg = Release|x86 - {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Release|x86.Build.0 = Release|x86 - {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Debug|x86.ActiveCfg = Debug|x86 - {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Debug|x86.Build.0 = Debug|x86 - {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Mono|x86.ActiveCfg = Release|x86 - {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Mono|x86.Build.0 = Release|x86 - {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Release|x86.ActiveCfg = Release|x86 - {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Release|x86.Build.0 = Release|x86 - {15AD7579-A314-4626-B556-663F51D97CD1}.Debug|x86.ActiveCfg = Debug|x86 - {15AD7579-A314-4626-B556-663F51D97CD1}.Debug|x86.Build.0 = Debug|x86 - {15AD7579-A314-4626-B556-663F51D97CD1}.Mono|x86.ActiveCfg = Release|x86 - {15AD7579-A314-4626-B556-663F51D97CD1}.Mono|x86.Build.0 = Release|x86 - {15AD7579-A314-4626-B556-663F51D97CD1}.Release|x86.ActiveCfg = Release|x86 - {15AD7579-A314-4626-B556-663F51D97CD1}.Release|x86.Build.0 = Release|x86 - {911284D3-F130-459E-836C-2430B6FBF21D}.Debug|x86.ActiveCfg = Debug|x86 - {911284D3-F130-459E-836C-2430B6FBF21D}.Debug|x86.Build.0 = Debug|x86 - {911284D3-F130-459E-836C-2430B6FBF21D}.Mono|x86.ActiveCfg = Release|x86 - {911284D3-F130-459E-836C-2430B6FBF21D}.Mono|x86.Build.0 = Release|x86 - {911284D3-F130-459E-836C-2430B6FBF21D}.Release|x86.ActiveCfg = Release|x86 - {911284D3-F130-459E-836C-2430B6FBF21D}.Release|x86.Build.0 = Release|x86 - {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Debug|x86.ActiveCfg = Debug|x86 - {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Debug|x86.Build.0 = Debug|x86 - {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Mono|x86.ActiveCfg = Release|x86 - {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Mono|x86.Build.0 = Release|x86 - {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Release|x86.ActiveCfg = Release|x86 - {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Release|x86.Build.0 = Release|x86 - {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Debug|x86.ActiveCfg = Debug|x86 - {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Debug|x86.Build.0 = Debug|x86 - {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Mono|x86.ActiveCfg = Release|x86 - {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Mono|x86.Build.0 = Release|x86 - {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Release|x86.ActiveCfg = Release|x86 - {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Release|x86.Build.0 = Release|x86 - {7140FF1F-79BE-492F-9188-B21A050BF708}.Debug|x86.ActiveCfg = Debug|x86 - {7140FF1F-79BE-492F-9188-B21A050BF708}.Debug|x86.Build.0 = Debug|x86 - {7140FF1F-79BE-492F-9188-B21A050BF708}.Mono|x86.ActiveCfg = Release|x86 - {7140FF1F-79BE-492F-9188-B21A050BF708}.Mono|x86.Build.0 = Release|x86 - {7140FF1F-79BE-492F-9188-B21A050BF708}.Release|x86.ActiveCfg = Release|x86 - {7140FF1F-79BE-492F-9188-B21A050BF708}.Release|x86.Build.0 = Release|x86 - {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Debug|x86.ActiveCfg = Debug|x86 - {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Debug|x86.Build.0 = Debug|x86 - {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Mono|x86.ActiveCfg = Release|x86 - {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Mono|x86.Build.0 = Release|x86 - {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Release|x86.ActiveCfg = Release|x86 - {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Release|x86.Build.0 = Release|x86 - {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.ActiveCfg = Debug|x86 - {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.Build.0 = Debug|x86 - {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Mono|x86.ActiveCfg = Release|x86 - {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Mono|x86.Build.0 = Release|x86 - {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|x86.ActiveCfg = Release|x86 - {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|x86.Build.0 = Release|x86 - {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Debug|x86.ActiveCfg = Debug|x86 - {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Debug|x86.Build.0 = Debug|x86 - {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Mono|x86.ActiveCfg = Release|x86 - {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Mono|x86.Build.0 = Release|x86 - {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Release|x86.ActiveCfg = Release|x86 - {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Release|x86.Build.0 = Release|x86 + {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Debug|Posix.ActiveCfg = Debug|Any CPU + {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Debug|Posix.Build.0 = Debug|Any CPU + {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Debug|Windows.ActiveCfg = Debug|Any CPU + {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Debug|Windows.Build.0 = Debug|Any CPU + {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Release|Posix.ActiveCfg = Release|Any CPU + {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Release|Posix.Build.0 = Release|Any CPU + {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Release|Windows.ActiveCfg = Release|Any CPU + {3DCA7B58-B8B3-49AC-9D9E-56F4A0460976}.Release|Windows.Build.0 = Release|Any CPU + {FAFB5948-A222-4CF6-AD14-026BE7564802}.Debug|Posix.ActiveCfg = Debug|Any CPU + {FAFB5948-A222-4CF6-AD14-026BE7564802}.Debug|Posix.Build.0 = Debug|Any CPU + {FAFB5948-A222-4CF6-AD14-026BE7564802}.Debug|Windows.ActiveCfg = Debug|Any CPU + {FAFB5948-A222-4CF6-AD14-026BE7564802}.Debug|Windows.Build.0 = Debug|Any CPU + {FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|Posix.ActiveCfg = Release|Any CPU + {FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|Posix.Build.0 = Release|Any CPU + {FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|Windows.ActiveCfg = Release|Any CPU + {FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|Windows.Build.0 = Release|Any CPU + {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|Posix.ActiveCfg = Debug|Any CPU + {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|Posix.Build.0 = Debug|Any CPU + {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|Windows.ActiveCfg = Debug|Any CPU + {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|Windows.Build.0 = Debug|Any CPU + {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|Posix.ActiveCfg = Release|Any CPU + {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|Posix.Build.0 = Release|Any CPU + {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|Windows.ActiveCfg = Release|Any CPU + {CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|Windows.Build.0 = Release|Any CPU + {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Posix.ActiveCfg = Debug|Any CPU + {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Posix.Build.0 = Debug|Any CPU + {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Windows.ActiveCfg = Debug|Any CPU + {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Windows.Build.0 = Debug|Any CPU + {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|Posix.ActiveCfg = Release|Any CPU + {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|Posix.Build.0 = Release|Any CPU + {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|Windows.ActiveCfg = Release|Any CPU + {193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|Windows.Build.0 = Release|Any CPU + {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|Posix.ActiveCfg = Debug|Any CPU + {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|Posix.Build.0 = Debug|Any CPU + {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|Windows.ActiveCfg = Debug|Any CPU + {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|Windows.Build.0 = Debug|Any CPU + {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|Posix.ActiveCfg = Release|Any CPU + {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|Posix.Build.0 = Release|Any CPU + {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|Windows.ActiveCfg = Release|Any CPU + {35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|Windows.Build.0 = Release|Any CPU + {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|Posix.ActiveCfg = Debug|Any CPU + {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|Posix.Build.0 = Debug|Any CPU + {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|Windows.ActiveCfg = Debug|Any CPU + {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|Windows.Build.0 = Debug|Any CPU + {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|Posix.ActiveCfg = Release|Any CPU + {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|Posix.Build.0 = Release|Any CPU + {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|Windows.ActiveCfg = Release|Any CPU + {BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|Windows.Build.0 = Release|Any CPU + {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Debug|Posix.ActiveCfg = Debug|Any CPU + {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Debug|Posix.Build.0 = Debug|Any CPU + {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Debug|Windows.ActiveCfg = Debug|Any CPU + {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Debug|Windows.Build.0 = Debug|Any CPU + {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Release|Posix.ActiveCfg = Release|Any CPU + {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Release|Posix.Build.0 = Release|Any CPU + {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Release|Windows.ActiveCfg = Release|Any CPU + {D18A5DEB-5102-4775-A1AF-B75DAAA8907B}.Release|Windows.Build.0 = Release|Any CPU + {CBF6B8B0-A015-413A-8C86-01238BB45770}.Debug|Posix.ActiveCfg = Debug|Any CPU + {CBF6B8B0-A015-413A-8C86-01238BB45770}.Debug|Posix.Build.0 = Debug|Any CPU + {CBF6B8B0-A015-413A-8C86-01238BB45770}.Debug|Windows.ActiveCfg = Debug|Any CPU + {CBF6B8B0-A015-413A-8C86-01238BB45770}.Debug|Windows.Build.0 = Debug|Any CPU + {CBF6B8B0-A015-413A-8C86-01238BB45770}.Release|Posix.ActiveCfg = Release|Any CPU + {CBF6B8B0-A015-413A-8C86-01238BB45770}.Release|Posix.Build.0 = Release|Any CPU + {CBF6B8B0-A015-413A-8C86-01238BB45770}.Release|Windows.ActiveCfg = Release|Any CPU + {CBF6B8B0-A015-413A-8C86-01238BB45770}.Release|Windows.Build.0 = Release|Any CPU + {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Debug|Posix.ActiveCfg = Debug|Any CPU + {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Debug|Posix.Build.0 = Debug|Any CPU + {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Debug|Windows.ActiveCfg = Debug|Any CPU + {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Debug|Windows.Build.0 = Debug|Any CPU + {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Release|Posix.ActiveCfg = Release|Any CPU + {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Release|Posix.Build.0 = Release|Any CPU + {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Release|Windows.ActiveCfg = Release|Any CPU + {8CEFECD0-A6C2-498F-98B1-3FBE5820F9AB}.Release|Windows.Build.0 = Release|Any CPU + {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Debug|Posix.ActiveCfg = Debug|Any CPU + {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Debug|Posix.Build.0 = Debug|Any CPU + {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Debug|Windows.ActiveCfg = Debug|Any CPU + {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Debug|Windows.Build.0 = Debug|Any CPU + {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Release|Posix.ActiveCfg = Release|Any CPU + {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Release|Posix.Build.0 = Release|Any CPU + {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Release|Windows.ActiveCfg = Release|Any CPU + {CC26800D-F67E-464B-88DE-8EB1A0C227A3}.Release|Windows.Build.0 = Release|Any CPU + {6BCE712F-846D-4846-9D1B-A66B858DA755}.Debug|Posix.ActiveCfg = Debug|Any CPU + {6BCE712F-846D-4846-9D1B-A66B858DA755}.Debug|Posix.Build.0 = Debug|Any CPU + {6BCE712F-846D-4846-9D1B-A66B858DA755}.Debug|Windows.ActiveCfg = Debug|Any CPU + {6BCE712F-846D-4846-9D1B-A66B858DA755}.Debug|Windows.Build.0 = Debug|Any CPU + {6BCE712F-846D-4846-9D1B-A66B858DA755}.Release|Posix.ActiveCfg = Release|Any CPU + {6BCE712F-846D-4846-9D1B-A66B858DA755}.Release|Posix.Build.0 = Release|Any CPU + {6BCE712F-846D-4846-9D1B-A66B858DA755}.Release|Windows.ActiveCfg = Release|Any CPU + {6BCE712F-846D-4846-9D1B-A66B858DA755}.Release|Windows.Build.0 = Release|Any CPU + {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Debug|Posix.ActiveCfg = Debug|Any CPU + {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Debug|Posix.Build.0 = Debug|Any CPU + {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Debug|Windows.ActiveCfg = Debug|Any CPU + {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Debug|Windows.Build.0 = Debug|Any CPU + {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Release|Posix.ActiveCfg = Release|Any CPU + {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Release|Posix.Build.0 = Release|Any CPU + {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Release|Windows.ActiveCfg = Release|Any CPU + {700D0B95-95CD-43F3-B6C9-FAA0FC1358D4}.Release|Windows.Build.0 = Release|Any CPU + {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Debug|Posix.ActiveCfg = Debug|Any CPU + {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Debug|Posix.Build.0 = Debug|Any CPU + {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Debug|Windows.ActiveCfg = Debug|Any CPU + {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Debug|Windows.Build.0 = Debug|Any CPU + {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|Posix.ActiveCfg = Release|Any CPU + {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|Posix.Build.0 = Release|Any CPU + {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|Windows.ActiveCfg = Release|Any CPU + {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|Windows.Build.0 = Release|Any CPU + {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|Posix.ActiveCfg = Debug|Any CPU + {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|Posix.Build.0 = Debug|Any CPU + {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|Windows.ActiveCfg = Debug|Any CPU + {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|Windows.Build.0 = Debug|Any CPU + {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|Posix.ActiveCfg = Release|Any CPU + {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|Posix.Build.0 = Release|Any CPU + {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|Windows.ActiveCfg = Release|Any CPU + {4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|Windows.Build.0 = Release|Any CPU + {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Posix.ActiveCfg = Debug|Any CPU + {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Posix.Build.0 = Debug|Any CPU + {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Windows.ActiveCfg = Debug|Any CPU + {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Windows.Build.0 = Debug|Any CPU + {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Posix.ActiveCfg = Release|Any CPU + {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Posix.Build.0 = Release|Any CPU + {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Windows.ActiveCfg = Release|Any CPU + {F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Windows.Build.0 = Release|Any CPU + {95C11A9E-56ED-456A-8447-2C89C1139266}.Debug|Posix.ActiveCfg = Debug|Any CPU + {95C11A9E-56ED-456A-8447-2C89C1139266}.Debug|Posix.Build.0 = Debug|Any CPU + {95C11A9E-56ED-456A-8447-2C89C1139266}.Debug|Windows.ActiveCfg = Debug|Any CPU + {95C11A9E-56ED-456A-8447-2C89C1139266}.Debug|Windows.Build.0 = Debug|Any CPU + {95C11A9E-56ED-456A-8447-2C89C1139266}.Release|Posix.ActiveCfg = Release|Any CPU + {95C11A9E-56ED-456A-8447-2C89C1139266}.Release|Posix.Build.0 = Release|Any CPU + {95C11A9E-56ED-456A-8447-2C89C1139266}.Release|Windows.ActiveCfg = Release|Any CPU + {95C11A9E-56ED-456A-8447-2C89C1139266}.Release|Windows.Build.0 = Release|Any CPU + {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|Posix.ActiveCfg = Debug|Any CPU + {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|Windows.ActiveCfg = Debug|Any CPU + {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Debug|Windows.Build.0 = Debug|Any CPU + {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Release|Posix.ActiveCfg = Release|Any CPU + {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Release|Windows.ActiveCfg = Release|Any CPU + {D12F7F2F-8A3C-415F-88FA-6DD061A84869}.Release|Windows.Build.0 = Release|Any CPU + {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Debug|Posix.ActiveCfg = Debug|Any CPU + {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Debug|Posix.Build.0 = Debug|Any CPU + {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Debug|Windows.ActiveCfg = Debug|Any CPU + {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Debug|Windows.Build.0 = Debug|Any CPU + {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Release|Posix.ActiveCfg = Release|Any CPU + {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Release|Posix.Build.0 = Release|Any CPU + {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Release|Windows.ActiveCfg = Release|Any CPU + {7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}.Release|Windows.Build.0 = Release|Any CPU + {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Debug|Posix.ActiveCfg = Debug|Any CPU + {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Debug|Posix.Build.0 = Debug|Any CPU + {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Debug|Windows.ActiveCfg = Debug|Any CPU + {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Debug|Windows.Build.0 = Debug|Any CPU + {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Release|Posix.ActiveCfg = Release|Any CPU + {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Release|Posix.Build.0 = Release|Any CPU + {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Release|Windows.ActiveCfg = Release|Any CPU + {F6FC6BE7-0847-4817-A1ED-223DC647C3D7}.Release|Windows.Build.0 = Release|Any CPU + {15AD7579-A314-4626-B556-663F51D97CD1}.Debug|Posix.ActiveCfg = Debug|Any CPU + {15AD7579-A314-4626-B556-663F51D97CD1}.Debug|Posix.Build.0 = Debug|Any CPU + {15AD7579-A314-4626-B556-663F51D97CD1}.Debug|Windows.ActiveCfg = Debug|Any CPU + {15AD7579-A314-4626-B556-663F51D97CD1}.Debug|Windows.Build.0 = Debug|Any CPU + {15AD7579-A314-4626-B556-663F51D97CD1}.Release|Posix.ActiveCfg = Release|Any CPU + {15AD7579-A314-4626-B556-663F51D97CD1}.Release|Posix.Build.0 = Release|Any CPU + {15AD7579-A314-4626-B556-663F51D97CD1}.Release|Windows.ActiveCfg = Release|Any CPU + {15AD7579-A314-4626-B556-663F51D97CD1}.Release|Windows.Build.0 = Release|Any CPU + {911284D3-F130-459E-836C-2430B6FBF21D}.Debug|Posix.ActiveCfg = Debug|Any CPU + {911284D3-F130-459E-836C-2430B6FBF21D}.Debug|Posix.Build.0 = Debug|Any CPU + {911284D3-F130-459E-836C-2430B6FBF21D}.Debug|Windows.ActiveCfg = Debug|Any CPU + {911284D3-F130-459E-836C-2430B6FBF21D}.Debug|Windows.Build.0 = Debug|Any CPU + {911284D3-F130-459E-836C-2430B6FBF21D}.Release|Posix.ActiveCfg = Release|Any CPU + {911284D3-F130-459E-836C-2430B6FBF21D}.Release|Posix.Build.0 = Release|Any CPU + {911284D3-F130-459E-836C-2430B6FBF21D}.Release|Windows.ActiveCfg = Release|Any CPU + {911284D3-F130-459E-836C-2430B6FBF21D}.Release|Windows.Build.0 = Release|Any CPU + {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Debug|Posix.ActiveCfg = Debug|Any CPU + {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Debug|Posix.Build.0 = Debug|Any CPU + {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Debug|Windows.ActiveCfg = Debug|Any CPU + {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Debug|Windows.Build.0 = Debug|Any CPU + {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Release|Posix.ActiveCfg = Release|Any CPU + {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Release|Posix.Build.0 = Release|Any CPU + {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Release|Windows.ActiveCfg = Release|Any CPU + {80B51429-7A0E-46D6-BEE3-C80DCB1C4EAA}.Release|Windows.Build.0 = Release|Any CPU + {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Debug|Posix.ActiveCfg = Debug|Any CPU + {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Debug|Posix.Build.0 = Debug|Any CPU + {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Debug|Windows.ActiveCfg = Debug|Any CPU + {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Debug|Windows.Build.0 = Debug|Any CPU + {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Release|Posix.ActiveCfg = Release|Any CPU + {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Release|Posix.Build.0 = Release|Any CPU + {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Release|Windows.ActiveCfg = Release|Any CPU + {40D72824-7D02-4A77-9106-8FE0EEA2B997}.Release|Windows.Build.0 = Release|Any CPU + {7140FF1F-79BE-492F-9188-B21A050BF708}.Debug|Posix.ActiveCfg = Debug|Any CPU + {7140FF1F-79BE-492F-9188-B21A050BF708}.Debug|Posix.Build.0 = Debug|Any CPU + {7140FF1F-79BE-492F-9188-B21A050BF708}.Debug|Windows.ActiveCfg = Debug|Any CPU + {7140FF1F-79BE-492F-9188-B21A050BF708}.Debug|Windows.Build.0 = Debug|Any CPU + {7140FF1F-79BE-492F-9188-B21A050BF708}.Release|Posix.ActiveCfg = Release|Any CPU + {7140FF1F-79BE-492F-9188-B21A050BF708}.Release|Posix.Build.0 = Release|Any CPU + {7140FF1F-79BE-492F-9188-B21A050BF708}.Release|Windows.ActiveCfg = Release|Any CPU + {7140FF1F-79BE-492F-9188-B21A050BF708}.Release|Windows.Build.0 = Release|Any CPU + {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Debug|Posix.ActiveCfg = Debug|Any CPU + {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Debug|Posix.Build.0 = Debug|Any CPU + {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Debug|Windows.ActiveCfg = Debug|Any CPU + {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Debug|Windows.Build.0 = Debug|Any CPU + {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Release|Posix.ActiveCfg = Release|Any CPU + {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Release|Posix.Build.0 = Release|Any CPU + {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Release|Windows.ActiveCfg = Release|Any CPU + {5370BFF7-1BD7-46BC-AF06-7D9EA5CDA1D6}.Release|Windows.Build.0 = Release|Any CPU + {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|Posix.ActiveCfg = Debug|Any CPU + {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|Posix.Build.0 = Debug|Any CPU + {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|Windows.ActiveCfg = Debug|Any CPU + {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|Windows.Build.0 = Debug|Any CPU + {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Posix.ActiveCfg = Release|Any CPU + {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Posix.Build.0 = Release|Any CPU + {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Windows.ActiveCfg = Release|Any CPU + {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Windows.Build.0 = Release|Any CPU + {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Debug|Posix.ActiveCfg = Debug|Any CPU + {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Debug|Posix.Build.0 = Debug|Any CPU + {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Debug|Windows.ActiveCfg = Debug|Any CPU + {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Debug|Windows.Build.0 = Debug|Any CPU + {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Release|Posix.ActiveCfg = Release|Any CPU + {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Release|Posix.Build.0 = Release|Any CPU + {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Release|Windows.ActiveCfg = Release|Any CPU + {F3F63718-63C6-432F-BDDC-C960AD95EC82}.Release|Windows.Build.0 = Release|Any CPU + {22F71728-AB73-4774-8DC2-6D2D7734AE0C}.Debug|Posix.ActiveCfg = Debug|Any CPU + {22F71728-AB73-4774-8DC2-6D2D7734AE0C}.Debug|Posix.Build.0 = Debug|Any CPU + {22F71728-AB73-4774-8DC2-6D2D7734AE0C}.Debug|Windows.ActiveCfg = Debug|Any CPU + {22F71728-AB73-4774-8DC2-6D2D7734AE0C}.Debug|Windows.Build.0 = Debug|Any CPU + {22F71728-AB73-4774-8DC2-6D2D7734AE0C}.Release|Posix.ActiveCfg = Release|Any CPU + {22F71728-AB73-4774-8DC2-6D2D7734AE0C}.Release|Posix.Build.0 = Release|Any CPU + {22F71728-AB73-4774-8DC2-6D2D7734AE0C}.Release|Windows.ActiveCfg = Release|Any CPU + {22F71728-AB73-4774-8DC2-6D2D7734AE0C}.Release|Windows.Build.0 = Release|Any CPU + {4AE3B731-442E-4AF0-88A5-9FABEB685A0D}.Debug|Posix.ActiveCfg = Debug|Any CPU + {4AE3B731-442E-4AF0-88A5-9FABEB685A0D}.Debug|Posix.Build.0 = Debug|Any CPU + {4AE3B731-442E-4AF0-88A5-9FABEB685A0D}.Debug|Windows.ActiveCfg = Debug|Any CPU + {4AE3B731-442E-4AF0-88A5-9FABEB685A0D}.Debug|Windows.Build.0 = Debug|Any CPU + {4AE3B731-442E-4AF0-88A5-9FABEB685A0D}.Release|Posix.ActiveCfg = Release|Any CPU + {4AE3B731-442E-4AF0-88A5-9FABEB685A0D}.Release|Posix.Build.0 = Release|Any CPU + {4AE3B731-442E-4AF0-88A5-9FABEB685A0D}.Release|Windows.ActiveCfg = Release|Any CPU + {4AE3B731-442E-4AF0-88A5-9FABEB685A0D}.Release|Windows.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Targets/CopyRuntimes.targets b/src/Targets/CopyRuntimes.targets new file mode 100644 index 000000000..f311ef3d7 --- /dev/null +++ b/src/Targets/CopyRuntimes.targets @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/Targets/PublishAllRids.targets b/src/Targets/PublishAllRids.targets new file mode 100644 index 000000000..98f1b2de9 --- /dev/null +++ b/src/Targets/PublishAllRids.targets @@ -0,0 +1,36 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + true + + + + + + + + %(Frameworks.Identity) + + + + %(Identity) + %(Framework) + + + + + RuntimeIdentifier=%(Renamed.Runtime);TargetFramework=%(Renamed.Framework) + + + + + + + diff --git a/src/coverlet.runsettings b/src/coverlet.runsettings new file mode 100644 index 000000000..b1cd873c1 --- /dev/null +++ b/src/coverlet.runsettings @@ -0,0 +1,21 @@ + + + + + + + opencover + [Sonarr.*.Test]*,[Sonarr.Test.*]*,[Sonarr.Api*]*,[Marr.Data]*,[MonoTorrent]* + + + + + + + + + + diff --git a/src/omnisharp.json b/src/omnisharp.json new file mode 100644 index 000000000..17481627d --- /dev/null +++ b/src/omnisharp.json @@ -0,0 +1,9 @@ +{ + "RoslynExtensionsOptions": { + "enableAnalyzersSupport": true, + "DocumentAnalysisTimeoutMs": 60000 + }, + "FormattingOptions": { + "enableEditorConfigSupport": true + } +} diff --git a/test.sh b/test.sh index 3d93e96aa..f2f376451 100644 --- a/test.sh +++ b/test.sh @@ -1,11 +1,18 @@ +#! /bin/bash PLATFORM=$1 TYPE=$2 -WHERE="cat != ManualTest" -TEST_DIR="." +COVERAGE=$3 +WHERE="Category!=ManualTest" TEST_PATTERN="*Test.dll" -ASSEMBLIES="" +FILES=( "Sonarr.Api.Test.dll" "Sonarr.Automation.Test.dll" "Sonarr.Common.Test.dll" "Sonarr.Core.Test.dll" "Sonarr.Host.Test.dll" "Sonarr.Integration.Test.dll" "Sonarr.Libraries.Test.dll" "Sonarr.Mono.Test.dll" "Sonarr.Update.Test.dll" "Sonarr.Windows.Test.dll" ) +ASSMEBLIES="" TEST_LOG_FILE="TestLog.txt" +echo "test dir: $TEST_DIR" +if [ -z "$TEST_DIR" ]; then + TEST_DIR="." +fi + if [ -d "$TEST_DIR/_tests" ]; then TEST_DIR="$TEST_DIR/_tests" fi @@ -13,42 +20,58 @@ fi rm -f "$TEST_LOG_FILE" # Uncomment to log test output to a file instead of the console -# export SONARR_TESTS_LOG_OUTPUT="File" +export SONARR_TESTS_LOG_OUTPUT="File" -NUNIT="$TEST_DIR/NUnit.ConsoleRunner.3.10.0/tools/nunit3-console.exe" -NUNIT_COMMAND="$NUNIT" -NUNIT_PARAMS="--teamcity --workers=1" +VSTEST_PARAMS="--logger:nunit;LogFilePath=TestResult.xml" + +if [ "$PLATFORM" = "Mac" ]; then + + export DYLD_FALLBACK_LIBRARY_PATH="$TEST_DIR:$MONOPREFIX/lib:/usr/local/lib:/lib:/usr/lib" + echo $DYLD_FALLBACK_LIBRARY_PATH + mono --version + + # To debug which libraries are being loaded: + # export DYLD_PRINT_LIBRARIES=YES +fi if [ "$PLATFORM" = "Windows" ]; then - WHERE="$WHERE && cat != LINUX" -elif [ "$PLATFORM" = "Linux" ]; then - WHERE="$WHERE && cat != WINDOWS" - NUNIT_COMMAND="mono --debug --runtime=v4.0 $NUNIT" -elif [ "$PLATFORM" = "Mac" ]; then - WHERE="$WHERE && cat != WINDOWS" - NUNIT_COMMAND="mono --debug --runtime=v4.0 $NUNIT" + mkdir -p "$ProgramData/Sonarr" + WHERE="$WHERE&Category!=LINUX" +elif [ "$PLATFORM" = "Linux" ] || [ "$PLATFORM" = "Mac" ] ; then + mkdir -p ~/.config/Sonarr + WHERE="$WHERE&Category!=WINDOWS" else echo "Platform must be provided as first arguement: Windows, Linux or Mac" exit 1 fi if [ "$TYPE" = "Unit" ]; then - WHERE="$WHERE && cat != IntegrationTest && cat != AutomationTest" + WHERE="$WHERE&Category!=IntegrationTest&Category!=AutomationTest" elif [ "$TYPE" = "Integration" ] || [ "$TYPE" = "int" ] ; then - WHERE="$WHERE && cat == IntegrationTest" + WHERE="$WHERE&Category=IntegrationTest" elif [ "$TYPE" = "Automation" ] ; then - WHERE="$WHERE && cat == AutomationTest" + WHERE="$WHERE&Category=AutomationTest" else echo "Type must be provided as second argument: Unit, Integration or Automation" exit 2 fi -for i in `find $TEST_DIR -name "$TEST_PATTERN"`; - do ASSEMBLIES="$ASSEMBLIES $i" +for i in "${FILES[@]}"; + do ASSEMBLIES="$ASSEMBLIES $TEST_DIR/$i" done -$NUNIT_COMMAND --where "$WHERE" $NUNIT_PARAMS $ASSEMBLIES; -EXIT_CODE=$? +DOTNET_PARAMS="$ASSEMBLIES --filter:$WHERE $VSTEST_PARAMS" + +if [ "$COVERAGE" = "Coverage" ]; then + dotnet test $DOTNET_PARAMS --settings:"src/coverlet.runsettings" --results-directory:./CoverageResults + EXIT_CODE=$? +elif [ "$COVERAGE" = "Test" ] ; then + dotnet test $DOTNET_PARAMS + EXIT_CODE=$? +else + echo "Run Type must be provided as third argument: Coverage or Test" + exit 3 +fi if [ "$EXIT_CODE" -ge 0 ]; then echo "Failed tests: $EXIT_CODE" diff --git a/tools/nuget/nuget.exe b/tools/nuget/nuget.exe deleted file mode 100644 index ea492dbc0..000000000 Binary files a/tools/nuget/nuget.exe and /dev/null differ diff --git a/tools/pdb2mdb/Mono.Cecil.Mdb.dll b/tools/pdb2mdb/Mono.Cecil.Mdb.dll deleted file mode 100644 index 5b119cb49..000000000 Binary files a/tools/pdb2mdb/Mono.Cecil.Mdb.dll and /dev/null differ diff --git a/tools/pdb2mdb/Mono.Cecil.dll b/tools/pdb2mdb/Mono.Cecil.dll deleted file mode 100644 index 4b5646655..000000000 Binary files a/tools/pdb2mdb/Mono.Cecil.dll and /dev/null differ diff --git a/tools/pdb2mdb/Mono.CompilerServices.SymbolWriter.dll b/tools/pdb2mdb/Mono.CompilerServices.SymbolWriter.dll deleted file mode 100644 index 2d20022ee..000000000 Binary files a/tools/pdb2mdb/Mono.CompilerServices.SymbolWriter.dll and /dev/null differ diff --git a/tools/pdb2mdb/pdb2mdb.exe b/tools/pdb2mdb/pdb2mdb.exe deleted file mode 100644 index 054648355..000000000 Binary files a/tools/pdb2mdb/pdb2mdb.exe and /dev/null differ diff --git a/tools/vswhere/vswhere.exe b/tools/vswhere/vswhere.exe deleted file mode 100644 index 1731aa6ed..000000000 Binary files a/tools/vswhere/vswhere.exe and /dev/null differ diff --git a/yarn.lock b/yarn.lock index cd5a244cd..5574df142 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,19 +9,19 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: - "@babel/highlight" "^7.12.13" + "@babel/highlight" "^7.16.7" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" - integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== -"@babel/core@7.13.16", "@babel/core@>=7.9.0": +"@babel/core@7.13.16": version "7.13.16" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a" integrity sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q== @@ -42,63 +42,86 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14" - integrity sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg== +"@babel/core@>=7.9.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" + integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== dependencies: - "@babel/types" "^7.13.16" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.7" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.13.16", "@babel/generator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.7.tgz#b42bf46a3079fa65e1544135f32e7958f048adbb" + integrity sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg== + dependencies: + "@babel/types" "^7.16.7" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" - integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.16.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" - integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" - integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.13.11": - version "7.13.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" - integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw== +"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.13.11", "@babel/helper-create-class-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz#9c5b34b53a01f2097daf10678d65135c1b9f84ba" + integrity sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.13.0" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" -"@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" - integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== +"@babel/helper-create-regexp-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" + integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.16.7" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" - integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== +"@babel/helper-define-polyfill-provider@^0.2.2", "@babel/helper-define-polyfill-provider@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz#8867aed79d3ea6cade40f801efb7ac5c66916b10" + integrity sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -109,179 +132,186 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.12.13": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" - integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/types" "^7.16.7" -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-hoist-variables@^7.13.0": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz#1b1651249e94b51f8f0d33439843e33e39775b30" - integrity sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg== +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== dependencies: - "@babel/traverse" "^7.13.15" - "@babel/types" "^7.13.16" + "@babel/types" "^7.16.7" -"@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.16.7" -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.14": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" - integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.13" - "@babel/types" "^7.13.14" + "@babel/types" "^7.16.7" -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== +"@babel/helper-module-transforms@^7.13.14", "@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" - integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== - -"@babel/helper-remap-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" - integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/types" "^7.16.7" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" - integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-remap-async-to-generator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.7.tgz#5ce2416990d55eb6e099128338848ae8ffa58a9a" + integrity sha512-C3o117GnP/j/N2OWo+oepeWbFEKRfNaay+F1Eo5Mj3A1SRjyx+qaFhm23nlipub7Cjv2azdUUiDH+VlpdwUFRg== dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.12" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== dependencies: - "@babel/types" "^7.13.12" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" - integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.16.7" -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1", "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.16.0" -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== - -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== - -"@babel/helper-wrap-function@^7.12.13", "@babel/helper-wrap-function@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" - integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/types" "^7.16.7" -"@babel/helpers@^7.13.16": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.17.tgz#b497c7a00e9719d5b613b8982bda6ed3ee94caf6" - integrity sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg== - dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.17" - "@babel/types" "^7.13.17" +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" - integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== +"@babel/helper-validator-option@^7.12.17", "@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.12.13", "@babel/helper-wrap-function@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.7.tgz#8ddf9eaa770ed43de4bc3687f3f3b0d6d5ecf014" + integrity sha512-7a9sABeVwcunnztZZ7WTgSw6jVYLzM1wua0Z4HIXm9S3/HC96WKQTkFgGEaj5W06SHHihPJ6Le6HzS5cGOQMNw== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helpers@^7.13.16", "@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" + integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.13", "@babel/parser@^7.13.16", "@babel/parser@^7.7.0": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" - integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw== +"@babel/parser@^7.13.16", "@babel/parser@^7.16.7", "@babel/parser@^7.7.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.7.tgz#d372dda9c89fcec340a82630a9f533f2fe15877e" + integrity sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA== "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" - integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" "@babel/plugin-proposal-async-generator-functions@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" - integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.7.tgz#739adc1212a9e4892de440cd7dfffb06172df78d" + integrity sha512-TTXBT3A5c11eqRzaC6beO6rlFT3Mo9C2e8eB44tTr52ESXSK2CIc2fOp1ynpAwQA8HhBMho+WXhMHWlAe3xkpw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.7" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@7.13.0", "@babel/plugin-proposal-class-properties@^7.13.0": +"@babel/plugin-proposal-class-properties@7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== @@ -289,6 +319,14 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-proposal-class-properties@^7.13.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-proposal-decorators@7.13.15": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz#e91ccfef2dc24dd5bd5dcc9fc9e2557c684ecfb8" @@ -299,11 +337,11 @@ "@babel/plugin-syntax-decorators" "^7.12.13" "@babel/plugin-proposal-dynamic-import@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" - integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-proposal-export-default-from@7.12.13": @@ -314,7 +352,7 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-default-from" "^7.12.13" -"@babel/plugin-proposal-export-namespace-from@7.12.13", "@babel/plugin-proposal-export-namespace-from@^7.12.13": +"@babel/plugin-proposal-export-namespace-from@7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== @@ -322,6 +360,14 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-proposal-function-sent@7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.12.13.tgz#553f47e4b7f7e9becb6b5013ed5c4dd72b72400e" @@ -332,22 +378,22 @@ "@babel/plugin-syntax-function-sent" "^7.12.13" "@babel/plugin-proposal-json-strings@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" - integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-logical-assignment-operators@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" - integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": +"@babel/plugin-proposal-nullish-coalescing-operator@7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== @@ -355,7 +401,15 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@7.12.13", "@babel/plugin-proposal-numeric-separator@^7.12.13": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== @@ -363,26 +417,34 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" - integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== +"@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.13.8": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.16.7" "@babel/plugin-proposal-optional-catch-binding@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" - integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@7.13.12", "@babel/plugin-proposal-optional-chaining@^7.13.12": +"@babel/plugin-proposal-optional-chaining@7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== @@ -391,13 +453,22 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" - integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.13.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz#e418e3aa6f86edd6d327ce84eff188e479f571e0" + integrity sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-proposal-throw-expressions@7.12.13": version "7.12.13" @@ -408,12 +479,12 @@ "@babel/plugin-syntax-throw-expressions" "^7.12.13" "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" - integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -430,11 +501,11 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-decorators@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" - integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz#f66a0199f16de7c1ef5192160ccf5d069739e3d3" + integrity sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import@7.8.3", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -444,11 +515,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-default-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.13.tgz#3c807d37efaf0a806f1deb556ccb3b2f562ae9c2" - integrity sha512-gVry0zqoums0hA+EniCYK3gABhjYSLX1dVuwYpPw9DrLNA4/GovXySHVg4FGRsZht09ON/5C2NVx3keq+qqVGQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.7.tgz#fa89cf13b60de2c3f79acdc2b52a21174c6de060" + integrity sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -458,11 +529,11 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-function-sent@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.12.13.tgz#60cb34f7395b0325ffbb5b0794cd5b88e23e1928" - integrity sha512-Uv9lAv+/vX8hmvC2rTUvywJacR517eRqTKfLZrtLAoMGUjfQSZ0nPEFJWmfJs1H54zBaIj15ATfUnkheZnSK9w== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.16.7.tgz#46ff4ac849881dbeaa5c5ab60cd1041ffc606095" + integrity sha512-W2fOJmlqHJ0kalyP8kAA0Jx5Hn87OX5qZwjtII3uqi+VpIdLTJLAHH8d4qIt5eqflLALFf6ehVT6+mnFJ2d7AA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -471,12 +542,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" - integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== +"@babel/plugin-syntax-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -521,299 +592,301 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-throw-expressions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.12.13.tgz#bb02bfbaf57d71ab69280ebf6a53aa45ad4c3f1a" - integrity sha512-vbpx/IxHR3qqWEfYeiVLq4+RFj2F4GjsMzoXEx/YU/pgmTA6o7T92DQHWIeetg7msKQFnyG1PwmPLWMlAn+Fmg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.16.7.tgz#5fd64f4d58d653499cc1077bb58594e18da5a514" + integrity sha512-6Kw78ssLHIADvVsqLOLLxuxH4SG55A2tqn0Og2tQQq6X/06HBWLClg6quL+oTfyeVEsPnFYTSECkajseotTnbA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-top-level-await@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" - integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-arrow-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" - integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" - integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.7.tgz#646e1262ac341b587ff5449844d4492dbb10ac4b" + integrity sha512-pFEfjnK4DfXCfAlA5I98BYdDJD8NltMzx19gt6DAmfE+2lXRfPUoa0/5SUjT4+TDE1W/rcxU/1lgN55vpAjjdg== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.7" "@babel/plugin-transform-block-scoped-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" - integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-block-scoping@^7.12.13": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.13.16.tgz#a9c0f10794855c63b1d629914c7dcfeddd185892" - integrity sha512-ad3PHUxGnfWF4Efd3qFuznEtZKoBp0spS+DgqzVzRPV7urEBvPLue3y2j80w4Jf2YLzZHj8TOv/Lmvdmh3b2xg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-classes@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" - integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" - integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-destructuring@^7.13.0": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" - integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" - integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-duplicate-keys@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" - integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-exponentiation-operator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" - integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-for-of@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" - integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" - integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" - integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-member-expression-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" - integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-modules-amd@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" - integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-commonjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" - integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.7.tgz#fd119e6a433c527d368425b45df361e1e95d3c1a" + integrity sha512-h2RP2kE7He1ZWKyAlanMZrAbdv+Acw1pA8dQZhE025WJZE2z0xzFADAinXA9fxd5bn7JnM+SdOGcndGx1ARs9w== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" - integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" + integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== dependencies: - "@babel/helper-hoist-variables" "^7.13.0" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-umd@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" - integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" - integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.7.tgz#749d90d94e73cf62c60a0cc8d6b94d29305a81f2" + integrity sha512-kFy35VwmwIQwCjwrAQhl3+c/kr292i4KdLPKp5lPH03Ltc51qnFlIADoyPxc/6Naz3ok3WdYKg+KK6AH+D4utg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/plugin-transform-new-target@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" - integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-object-super@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" - integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" -"@babel/plugin-transform-parameters@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" - integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== +"@babel/plugin-transform-parameters@^7.13.0", "@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-property-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" - integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-react-display-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" - integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-react-jsx-development@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" - integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== dependencies: - "@babel/plugin-transform-react-jsx" "^7.12.17" + "@babel/plugin-transform-react-jsx" "^7.16.7" -"@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz#1df5dfaf0f4b784b43e96da6f28d630e775f68b3" - integrity sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA== +"@babel/plugin-transform-react-jsx@^7.13.12", "@babel/plugin-transform-react-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" + integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/types" "^7.13.12" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.16.7" + "@babel/types" "^7.16.7" "@babel/plugin-transform-react-pure-annotations@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" - integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" + integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-regenerator@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" - integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== dependencies: regenerator-transform "^0.14.2" "@babel/plugin-transform-reserved-words@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" - integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-shorthand-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" - integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-spread@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" - integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-transform-sticky-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" - integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-template-literals@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" - integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-typeof-symbol@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" - integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-unicode-escapes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" - integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-unicode-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" - integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/preset-env@7.13.15": version "7.13.15" @@ -891,9 +964,9 @@ semver "^6.3.0" "@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -914,41 +987,43 @@ "@babel/plugin-transform-react-pure-annotations" "^7.12.1" "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.17.tgz#8966d1fc9593bf848602f0662d6b4d0069e3a7ec" - integrity sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== +"@babel/template@^7.12.13", "@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.13.17", "@babel/traverse@^7.7.0": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3" - integrity sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg== +"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.16.7", "@babel/traverse@^7.7.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.7.tgz#dac01236a72c2560073658dd1a285fe4e0865d76" + integrity sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ== dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.16" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.16" - "@babel/types" "^7.13.17" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.13.17", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4" - integrity sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA== +"@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.7.tgz#4ed19d51f840ed4bd5645be6ce40775fecf03159" + integrity sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" "@cnakazawa/watch@^1.0.3": @@ -960,19 +1035,19 @@ minimist "^1.2.0" "@discoveryjs/json-ext@^0.5.0": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" - integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== + version "0.5.6" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" + integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== "@eslint/eslintrc@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" - integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" debug "^4.1.1" espree "^7.3.0" - globals "^12.1.0" + globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" @@ -980,9 +1055,9 @@ strip-json-comments "^3.1.1" "@fortawesome/fontawesome-common-types@^0.2.35": - version "0.2.35" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz#01dd3d054da07a00b764d78748df20daf2b317e9" - integrity sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw== + version "0.2.36" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz#b44e52db3b6b20523e0c57ef8c42d315532cb903" + integrity sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg== "@fortawesome/fontawesome-free@5.15.3": version "5.15.3" @@ -1017,16 +1092,16 @@ dependencies: prop-types "^15.7.2" -"@microsoft/signalr@5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-5.0.5.tgz#817d577d76aab33548f1354c72d779a18cc770e2" - integrity sha512-1aIr9LfuVHkJA6YHvJ9+V2GPUOlVtH94babg4LmBHk3tO7bI9YDHz3axYsp/GI5MVMqCKg/7BzEorr6zs/w2XA== +"@microsoft/signalr@6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.3.tgz#9904efd48cd488e3c1c80930ff9fbb3c9f55895d" + integrity sha512-wWGVC2xi8OxNjyir8iQWuyxWHy3Dkakk2Q3VreCE7pDzFAgZ4pId6abJlRPMVIQxkUvUGc8knMW5l3sv2bJ/yw== dependencies: abort-controller "^3.0.0" eventsource "^1.0.7" - fetch-cookie "^0.7.3" - node-fetch "^2.6.0" - ws "^6.0.0" + fetch-cookie "^0.11.0" + node-fetch "^2.6.1" + ws "^7.4.5" "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -1036,18 +1111,18 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@nodelib/fs.scandir@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" - integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - "@nodelib/fs.stat" "2.0.4" + "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" - integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.stat@^1.1.2": version "1.1.3" @@ -1055,11 +1130,11 @@ integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== "@nodelib/fs.walk@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" - integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - "@nodelib/fs.scandir" "2.1.4" + "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" "@react-dnd/asap@^4.0.0": @@ -1155,46 +1230,51 @@ unist-util-find-all-after "^3.0.2" "@types/connect@^3.4.33": - version "3.4.34" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" - integrity sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ== + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" "@types/eslint-scope@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" - integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw== + version "3.7.2" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.2.tgz#11e96a868c67acf65bf6f11d10bb89ea71d5e473" + integrity sha512-TzgYCWoPiTeRg6RQYgtuW7iODtVoKu3RVL72k3WohqhjfaOLK5Mg2T4Tg1o2bSfu0vPkoI48wdQFv5b/Xe04wQ== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "7.2.10" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.10.tgz#4b7a9368d46c0f8cd5408c23288a59aa2394d917" - integrity sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ== + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.2.2.tgz#b64dbdb64b1957cfc8a698c68297fcf8983e94c7" + integrity sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.47": +"@types/estree@*": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/estree@^0.0.47": version "0.0.47" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== "@types/express-serve-static-core@^4.17.9": - version "4.17.19" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" - integrity sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA== + version "4.17.27" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz#7a776191e47295d2a05962ecbb3a4ce97e38b401" + integrity sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/glob@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" "@types/node" "*" @@ -1208,51 +1288,51 @@ hoist-non-react-statics "^3.3.0" "@types/html-minifier-terser@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" - integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" + integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/lodash@^4.14.159": - version "4.14.168" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" - integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== + version "4.14.178" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" + integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== "@types/mdast@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" - integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== dependencies: "@types/unist" "*" "@types/minimatch@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" - integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/minimist@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" - integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*": - version "14.14.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615" - integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g== + version "17.0.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" + integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== "@types/node@^12.12.54": - version "12.20.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.10.tgz#4dcb8a85a8f1211acafb88d72fafc7e3d2685583" - integrity sha512-TxCmnSSppKBBOzYzPR2BR25YlX5Oay8z2XGwFBInuA/Co0V9xJhLlW4kjbxKtgeNo3NOMbQP1A5Rc03y+XecPw== + version "12.20.41" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.41.tgz#81d7734c5257da9f04354bd9084a6ebbdd5198a5" + integrity sha512-f6xOqucbDirG7LOzedpvzjP3UTmHttRou3Mosx3vL9wr9AIQGhcPgVnqa8ihpZYnxyM1rxeNCvTyukPKZtq10Q== "@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1260,24 +1340,24 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prop-types@*": - version "15.7.3" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== "@types/qs@*": - version "6.9.6" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" - integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/range-parser@*": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" - integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-redux@^7.1.16": - version "7.1.16" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.16.tgz#0fbd04c2500c12105494c83d4a3e45c084e3cb21" - integrity sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw== + version "7.1.21" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.21.tgz#f32bbaf7cbc4b93f51e10d340aa54035c084b186" + integrity sha512-bLdglUiBSQNzWVVbmNPKGYYjrzp3/YDPwfOH3nLEz99I4awLlaRAPWjo6bZ2POpxztFWtDDXIPxBLVykXqBt+w== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" @@ -1285,23 +1365,30 @@ redux "^4.0.0" "@types/react@*": - version "17.0.3" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79" - integrity sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg== + version "17.0.38" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" + integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/scheduler@*": - version "0.16.1" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" - integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" - integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" "@webassemblyjs/ast@1.11.0": version "1.11.0" @@ -1425,21 +1512,21 @@ "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.2.tgz#2a20812bfb3a2ebb0b27ee26a52eeb3e3f000836" - integrity sha512-3OBzV2fBGZ5TBfdW50cha1lHDVf9vlvRXnjpVbJBa20pSZQaSkMJZiwA8V2vD9ogyeXn8nU5s5A6mHyf5jhMzA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043" + integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg== "@webpack-cli/info@^1.2.3": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.2.3.tgz#ef819d10ace2976b6d134c7c823a3e79ee31a92c" - integrity sha512-lLek3/T7u40lTqzCGpC6CAbY6+vXhdhmwFRxZLMnRm6/sIF/7qMpT8MocXCRQfz0JAh63wpbXLMnsQ5162WS7Q== + version "1.4.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223" + integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw== dependencies: envinfo "^7.7.3" "@webpack-cli/serve@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.3.1.tgz#911d1b3ff4a843304b9c3bacf67bb34672418441" - integrity sha512-0qXvpeYO6vaNoRBI52/UsbcaBydJCggoBBnIo/ovQQdn6fug0BgwsjorV1hVS7fMqGVTZGcVxv8334gjmbj5hw== + version "1.6.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2" + integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -1467,9 +1554,9 @@ abort-controller@^3.0.0: event-target-shim "^5.0.0" acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-to-esprima@^2.0.6, acorn-to-esprima@^2.0.8: version "2.0.8" @@ -1482,9 +1569,9 @@ acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.0.4: - version "8.2.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.1.tgz#0d36af126fb6755095879c1dc6fd7edf7d60a5fb" - integrity sha512-z716cpm5TX4uzOzILx8PavOE6C6DKshHDw1aQN52M/yNSqE9s5O8SMfyhCCfCJ3HmTL0NkVOi+8a/55T7YB3bg== + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== add-px-to-style@1.0.0: version "1.0.0" @@ -1499,11 +1586,25 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1514,10 +1615,10 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.1.0.tgz#45d5d3d36c7cdd808930cc3e603cf6200dbeb736" - integrity sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ== +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1534,10 +1635,10 @@ ansi-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^2.2.1: version "2.2.1" @@ -1625,16 +1726,16 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-includes@^3.1.2, array-includes@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" - integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== +array-includes@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" + es-abstract "^1.19.1" get-intrinsic "^1.1.1" - is-string "^1.0.5" + is-string "^1.0.7" array-union@^1.0.2: version "1.0.2" @@ -1659,14 +1760,13 @@ array-unique@^0.3.2: integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= array.prototype.flatmap@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" - integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== dependencies: call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.19.0" arrify@^1.0.1: version "1.0.1" @@ -1693,11 +1793,6 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -1706,9 +1801,9 @@ async@^2.6.2: lodash "^4.17.14" async@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.2.tgz#2eb7671034bb2194d45d30e31e24ec7e7f9670cd" + integrity sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g== atob@^2.1.2: version "2.1.2" @@ -1728,15 +1823,15 @@ autoprefixer@10.2.5: postcss-value-parser "^4.1.0" autoprefixer@^9.8.6: - version "9.8.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" - integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== dependencies: browserslist "^4.12.0" caniuse-lite "^1.0.30001109" - colorette "^1.2.1" normalize-range "^0.1.2" num2fraction "^1.2.2" + picocolors "^0.2.1" postcss "^7.0.32" postcss-value-parser "^4.1.0" @@ -1791,28 +1886,28 @@ babel-plugin-inline-classnames@2.0.1: integrity sha512-Pq/jJ6hTiGiqcMmy2d4CyJcfBDeUHOdQl1t1MDWNaSKR2RxDmShSAx4Zqz6NDmFaiinaRqF8eQoTVgSRGU+McQ== babel-plugin-polyfill-corejs2@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" - integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz#6ed8e30981b062f8fe6aca8873a37ebcc8cc1c0f" + integrity sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.4" semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" - integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== + version "0.2.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" + integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" - core-js-compat "^3.9.1" + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.16.2" babel-plugin-polyfill-regenerator@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" - integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz#2e9808f5027c4336c994992b48a4262580cb8d6d" + integrity sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.4" babel-plugin-transform-react-remove-prop-types@0.4.24: version "0.4.24" @@ -1919,7 +2014,7 @@ body@^5.1.0: raw-body "~1.1.0" safe-json-parse "~1.0.1" -boolbase@^1.0.0, boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= @@ -1955,16 +2050,16 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" -browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4.16.4: - version "4.16.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.5.tgz#952825440bca8913c62d0021334cbe928ef062ae" - integrity sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A== +browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4.17.5, browserslist@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== dependencies: - caniuse-lite "^1.0.30001214" - colorette "^1.2.2" - electron-to-chromium "^1.3.719" + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" escalade "^3.1.1" - node-releases "^1.1.71" + node-releases "^2.0.1" + picocolors "^1.0.0" bser@2.1.1: version "2.1.1" @@ -1979,9 +2074,9 @@ buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^5.5.0: version "5.7.1" @@ -2057,14 +2152,14 @@ camelcase@^5.3.1: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001196, caniuse-lite@^1.0.30001214: - version "1.0.30001214" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz#70f153c78223515c6d37a9fde6cd69250da9d872" - integrity sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg== +caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001196, caniuse-lite@^1.0.30001286: + version "1.0.30001298" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz#0e690039f62e91c3ea581673d716890512e7ec52" + integrity sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ== capture-exit@^2.0.0: version "2.0.0" @@ -2084,7 +2179,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2094,9 +2189,9 @@ chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: supports-color "^5.3.0" chalk@^4.0.0, chalk@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -2137,9 +2232,9 @@ classnames@2.3.1, classnames@^2.2.6: integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== clean-css@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" - integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + version "4.2.4" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" + integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== dependencies: source-map "~0.6.0" @@ -2241,9 +2336,9 @@ color@^0.11.0: color-string "^0.3.0" colorette@^1.2.1, colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== commander@^2.20.0, commander@^2.20.3, commander@^2.9.0: version "2.20.3" @@ -2271,12 +2366,12 @@ component-emitter@^1.2.1: integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== compress-commons@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.0.tgz#25ec7a4528852ccd1d441a7d4353cd0ece11371b" - integrity sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA== + version "4.1.1" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" + integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== dependencies: buffer-crc32 "^0.2.13" - crc32-stream "^4.0.1" + crc32-stream "^4.0.2" normalize-path "^3.0.0" readable-stream "^3.6.0" @@ -2302,9 +2397,9 @@ continuable-cache@^0.3.1: integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" @@ -2313,12 +2408,12 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.9.0, core-js-compat@^3.9.1: - version "3.11.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.11.0.tgz#635683f43480a0b41e3f6be3b1c648dadb8b4390" - integrity sha512-3wsN9YZJohOSDCjVB0GequOyHax8zFiogSX3XWLE28M1Ew7dTU57tgHjIylSBKSIouwmLBp3g61sKMz/q3xEGA== +core-js-compat@^3.16.2, core-js-compat@^3.9.0: + version "3.20.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.2.tgz#d1ff6936c7330959b46b2e08b122a8b14e26140b" + integrity sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg== dependencies: - browserslist "^4.16.4" + browserslist "^4.19.1" semver "7.0.0" core-js@3.11.0: @@ -2337,14 +2432,14 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -2385,7 +2480,7 @@ crc-32@^1.2.0: exit-on-epipe "~1.0.1" printj "~1.1.0" -crc32-stream@^4.0.1: +crc32-stream@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== @@ -2448,20 +2543,21 @@ css-loader@5.2.4: schema-utils "^3.0.0" semver "^7.3.5" -css-select@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== +css-select@^4.1.3: + version "4.2.1" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" + integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== dependencies: boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" + css-what "^5.1.0" + domhandler "^4.3.0" + domutils "^2.8.0" + nth-check "^2.0.1" -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== +css-what@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== cssesc@^3.0.0: version "3.0.0" @@ -2469,9 +2565,9 @@ cssesc@^3.0.0: integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" - integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== + version "3.0.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== cuint@^0.2.2: version "0.2.2" @@ -2493,9 +2589,9 @@ debug@^3.1.0, debug@^3.1.1: ms "^2.1.1" debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" @@ -2518,9 +2614,9 @@ decode-uri-component@^0.2.0: integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== define-properties@^1.1.3: version "1.1.3" @@ -2565,6 +2661,11 @@ del@^6.0.0: rimraf "^3.0.2" slash "^3.0.0" +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + delegate@^3.1.2: version "3.2.0" resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" @@ -2630,7 +2731,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-converter@^0.2: +dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== @@ -2661,12 +2762,21 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + domelementtype@1, domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@^2.0.1: +domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== @@ -2678,7 +2788,14 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -domutils@^1.5.1, domutils@^1.7.0: +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.5.1: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== @@ -2686,6 +2803,15 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -2694,10 +2820,10 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -electron-to-chromium@^1.3.719: - version "1.3.720" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz#f5d66df8754d993006b7b2ded15ff7738c58bd94" - integrity sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw== +electron-to-chromium@^1.4.17: + version "1.4.38" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.38.tgz#10ea58d73d36b13e78d5024f3b74a352d3958d01" + integrity sha512-WhHt3sZazKj0KK/UpgsbGQnUUoFeAHVishzHFExMxagpZgjiGYSC9S0ZlbhCfSH2L2i+2A1yyqOIliTctMx7KQ== element-class@0.2.2: version "0.2.2" @@ -2729,9 +2855,9 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: once "^1.4.0" enhanced-resolve@^5.8.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.0.tgz#d9deae58f9d3773b6a111a5a46831da5be5c9ac0" - integrity sha512-Sl3KRpJA8OpprrtaIswVki3cWPiPKxXuFxJXBp+zNb6s6VwNWwFRUdtmzd2ReUut8n+sCPx7QCtQ7w5wfJhSgQ== + version "5.8.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -2772,27 +2898,31 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: - version "1.18.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" - integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== +es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" has "^1.0.3" has-symbols "^1.0.2" - is-callable "^1.2.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" is-negative-zero "^2.0.1" - is-regex "^1.1.2" - is-string "^1.0.5" - object-inspect "^1.9.0" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" object-keys "^1.1.1" object.assign "^4.1.2" string.prototype.trimend "^1.0.4" string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.0" + unbox-primitive "^1.0.1" es-module-lexer@^0.4.0: version "0.4.1" @@ -2808,11 +2938,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-denodeify@^0.1.1: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-denodeify/-/es6-denodeify-0.1.5.tgz#31d4d5fe9c5503e125460439310e16a2a3f39c1f" - integrity sha1-MdTV/pxVA+ElRgQ5MQ4WoqPznB8= - es6-promise@^4.0.3, es6-promise@^4.2.8: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -2921,9 +3046,9 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3 integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint@7.25.0: version "7.25.0" @@ -3019,9 +3144,9 @@ estraverse@^4.1.1: integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" @@ -3064,9 +3189,9 @@ execa@^1.0.0: strip-eof "^1.0.0" execa@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" - integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" get-stream "^6.0.0" @@ -3159,17 +3284,16 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.1.1, fast-glob@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== +fast-glob@^3.2.5, fast-glob@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.9.tgz#8f55f664b68a236bd29fa165817fc44f2b11faba" + integrity sha512-MBwILhhD92sziIrMQwpqcuGERF+BH99ei2a3XsGJuqEKcSycAL+w0HWokFenZXona+kjFr82Lf71eTxNRC06XQ== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" + glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" + micromatch "^4.0.4" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -3187,9 +3311,9 @@ fastest-levenshtein@^1.0.12: integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== fastq@^1.6.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" - integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" @@ -3208,9 +3332,9 @@ fb-watchman@^2.0.0, fb-watchman@^2.0.1: bser "2.1.1" fbjs@^0.8.0: - version "0.8.17" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + version "0.8.18" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.18.tgz#9835e0addb9aca2eff53295cd79ca1cfc7c9662a" + integrity sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA== dependencies: core-js "^1.0.0" isomorphic-fetch "^2.1.1" @@ -3218,15 +3342,14 @@ fbjs@^0.8.0: object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" - ua-parser-js "^0.7.18" + ua-parser-js "^0.7.30" -fetch-cookie@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.7.3.tgz#b8d023f421dd2b2f4a0eca9cd7318a967ed4eed8" - integrity sha512-rZPkLnI8x5V+zYAiz8QonAHsTb4BY+iFowFBI1RFn0zrO343AVp9X7/yUj/9wL6Ef/8fLls8b/vGtzUvmyAUGA== +fetch-cookie@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.11.0.tgz#e046d2abadd0ded5804ce7e2cae06d4331c15407" + integrity sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA== dependencies: - es6-denodeify "^0.1.1" - tough-cookie "^2.3.3" + tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0" file-entry-cache@^6.0.1: version "6.0.1" @@ -3278,9 +3401,9 @@ fill-range@^7.0.1: to-regex-range "^5.0.1" find-cache-dir@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" make-dir "^3.0.2" @@ -3303,9 +3426,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== focus-lock@^0.8.1: version "0.8.1" @@ -3320,9 +3443,9 @@ for-in@^1.0.2: integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= fraction.js@^4.0.13: - version "4.0.13" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.0.13.tgz#3c1c315fa16b35c85fffa95725a36fa729c69dfe" - integrity sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" + integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== fragment-cache@^0.2.1: version "0.2.1" @@ -3406,6 +3529,14 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -3419,7 +3550,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3436,22 +3567,10 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.1.3, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - 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" - -glob@^7.1.4: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3481,17 +3600,10 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -globals@^13.6.0: - version "13.8.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" - integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== +globals@^13.6.0, globals@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== dependencies: type-fest "^0.20.2" @@ -3501,15 +3613,15 @@ globals@^9.18.0: integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@^11.0.1, globby@^11.0.2, globby@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" - integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" slash "^3.0.0" globby@^9.2.0: @@ -3546,9 +3658,9 @@ good-listener@^1.2.2: delegate "^3.1.2" graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== gud@^1.0.0: version "1.0.0" @@ -3594,6 +3706,13 @@ has-symbols@^1.0.1, has-symbols@^1.0.2: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -3674,9 +3793,9 @@ hosted-git-info@^2.1.4: integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hosted-git-info@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" - integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" @@ -3709,7 +3828,7 @@ html-webpack-plugin@5.3.1: pretty-error "^2.1.1" tapable "^2.0.0" -htmlparser2@^3.10.0, htmlparser2@^3.10.1: +htmlparser2@^3.10.0: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -3721,10 +3840,20 @@ htmlparser2@^3.10.0, htmlparser2@^3.10.1: inherits "^2.0.1" readable-stream "^3.1.1" +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + http-parser-js@>=0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" - integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + version "0.5.5" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" + integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== human-signals@^2.1.0: version "2.1.0" @@ -3732,9 +3861,9 @@ human-signals@^2.1.0: integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" @@ -3753,10 +3882,10 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.4, ignore@^5.1.8: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== immediate@~3.0.5: version "3.0.6" @@ -3764,9 +3893,9 @@ immediate@~3.0.5: integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= "immutable@^3.8.1 || ^4.0.0-rc.1": - version "4.0.0-rc.14" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.14.tgz#29ba96631ec10867d1348515ac4e6bdba462f071" - integrity sha512-pfkvmRKJSoW7JFx0QeYlAmT+kNYvn5j0u7bnpNq4N2RCvHSTlLT208G8jgaquNe+Q8kCPHKOSpxJkyvLDpYq0w== + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -3782,9 +3911,9 @@ import-lazy@^4.0.0: integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -3871,16 +4000,19 @@ is-arrayish@^0.2.1: integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-bigint@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" - integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-boolean-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" - integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-buffer@^1.1.5: version "1.1.6" @@ -3892,15 +4024,15 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.4, is-callable@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== +is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: has "^1.0.3" @@ -3919,9 +4051,11 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-decimal@^1.0.0: version "1.0.4" @@ -3976,9 +4110,9 @@ is-glob@^3.0.0, is-glob@^3.1.0: is-extglob "^2.1.0" is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -3988,14 +4122,16 @@ is-hexadecimal@^1.0.0: integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" @@ -4036,40 +4172,47 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" - has-symbols "^1.0.1" + has-tostringtag "^1.0.0" is-regexp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-typedarray@^1.0.0: version "1.0.0" @@ -4081,6 +4224,13 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -4126,22 +4276,31 @@ isomorphic-fetch@^2.1.1: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + jayson@^3.3.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.4.4.tgz#dcedffba0c02785c4aa22dbff8c28966cae59773" - integrity sha512-fgQflh+Qnhdv9fjxTnpTsa2WUG/dgyeKQzIh5MJ77Qv2sqFyyAZn7mTUYgPjJMFjsKfb4HNsSBh6ktJeeQiAGQ== + version "3.6.6" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.6.tgz#189984f624e398f831bd2be8e8c80eb3abf764a1" + integrity sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ== dependencies: "@types/connect" "^3.4.33" "@types/express-serve-static-core" "^4.17.9" "@types/lodash" "^4.14.159" "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" JSONStream "^1.3.5" commander "^2.20.3" + delay "^5.0.0" es6-promisify "^5.0.0" eyes "^0.1.8" + isomorphic-ws "^4.0.1" json-stringify-safe "^5.0.1" lodash "^4.17.20" - uuid "^3.4.0" + uuid "^8.3.2" + ws "^7.4.5" jdu@1.0.0: version "1.0.0" @@ -4157,6 +4316,15 @@ jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" +jest-worker@^27.4.1: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" + integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jquery@3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" @@ -4249,11 +4417,11 @@ jsonparse@^1.2.0: integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" - integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== dependencies: - array-includes "^3.1.2" + array-includes "^3.1.3" object.assign "^4.1.2" junk@^3.1.0: @@ -4262,9 +4430,9 @@ junk@^3.1.0: integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== just-curry-it@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/just-curry-it/-/just-curry-it-3.1.0.tgz#ab59daed308a58b847ada166edd0a2d40766fbc5" - integrity sha512-mjzgSOFzlrurlURaHVjnQodyPNvrHrf1TbQP2XU9NSqBtHQPuHZ+Eb6TAJP7ASeJN9h9K0KXoRTs8u6ouHBKvg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/just-curry-it/-/just-curry-it-3.2.1.tgz#7bb18284c8678ed816bfc5c19e44400605fbe461" + integrity sha512-Q8206k8pTY7krW32cdmPsP+DqqLgWx/hYPSj9/+7SYqSqz7UuwPbfSe07lQtvuuaVyiSJveXk0E5RydOuWwsEg== kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" @@ -4291,9 +4459,9 @@ kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== klona@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" - integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== known-css-properties@^0.21.0: version "0.21.0" @@ -4301,9 +4469,9 @@ known-css-properties@^0.21.0: integrity sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw== lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" + integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== dependencies: readable-stream "^2.0.5" @@ -4328,9 +4496,9 @@ linear-layout-vector@0.0.1: integrity sha1-OYEU1zA7bsx/1rJzr3uEAdi6nHA= lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== livereload-js@^2.3.0: version "2.4.0" @@ -4352,18 +4520,18 @@ loader-utils@^1.4.0: json5 "^1.0.1" loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" localforage@^1.8.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.9.0.tgz#f3e4d32a8300b362b4634cc4e066d9d00d2f09d1" - integrity sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g== + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== dependencies: lie "3.1.1" @@ -4379,11 +4547,6 @@ lodash.camelcase@4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -4485,12 +4648,12 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0, make-dir@~3.1.0: dependencies: semver "^6.0.0" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - tmpl "1.0.x" + tmpl "1.0.5" map-cache@^0.2.2: version "0.2.2" @@ -4503,9 +4666,9 @@ map-obj@^1.0.0: integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-obj@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" - integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== map-visit@^1.0.0: version "1.0.0" @@ -4570,7 +4733,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0: +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -4602,7 +4765,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== @@ -4610,17 +4773,17 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.47.0: - version "1.47.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" - integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@^2.1.27: - version "2.1.30" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" - integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "1.47.0" + mime-db "1.51.0" mime@~2.5.2: version "2.5.2" @@ -4711,9 +4874,9 @@ mout@^0.11.0: integrity sha1-ujYR318OWx/7/QEWa48C0fX6K5k= mout@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/mout/-/mout-1.2.2.tgz#c9b718a499806a0632cede178e80f436259e777d" - integrity sha512-w0OUxFEla6z3d7sVpMZGBCpQvYh8PHS1wZ6Wu9GNKHMpAHWJ0if0LsQZh3DlOqw55HlhJEOMLpFnwtxp99Y5GA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/mout/-/mout-1.2.3.tgz#bd1477d8c7f2db5fcf43c91de30b6cc746b78e10" + integrity sha512-vtE+eZcSj/sBkIp6gxB87MznryWP+gHIp0XX9SKrzA5TAkvz6y7VTuNruBjYdJozd8NY5i9XVIsn8cn3SwNjzg== ms@2.0.0: version "2.0.0" @@ -4730,10 +4893,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.1.22: - version "3.1.22" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844" - integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== +nanoid@^3.1.22, nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== nanomatch@^1.2.9: version "1.2.13" @@ -4788,20 +4951,22 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^2.6.1: + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== + dependencies: + whatwg-url "^5.0.0" node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-releases@^1.1.71: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== normalize-package-data@^2.5.0: version "2.5.0" @@ -4814,12 +4979,12 @@ normalize-package-data@^2.5.0: validate-npm-package-license "^3.0.1" normalize-package-data@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.2.tgz#cae5c410ae2434f9a6c1baa65d5bc3b9366c8699" - integrity sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: hosted-git-info "^4.0.1" - resolve "^1.20.0" + is-core-module "^2.5.0" semver "^7.3.4" validate-npm-package-license "^3.0.1" @@ -4890,12 +5055,12 @@ npm-which@^3.0.1: npm-path "^2.0.2" which "^1.2.10" -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== +nth-check@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== dependencies: - boolbase "~1.0.0" + boolbase "^1.0.0" num2fraction@^1.2.2: version "1.2.2" @@ -4921,10 +5086,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.9.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30" - integrity sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA== +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -4949,24 +5114,22 @@ object.assign@^4.1.0, object.assign@^4.1.2: object-keys "^1.1.1" object.entries@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" - integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" - -object.fromentries@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" - integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has "^1.0.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" object.pick@^1.3.0: version "1.3.0" @@ -4976,14 +5139,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" - integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has "^1.0.3" + es-abstract "^1.19.1" once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -5056,13 +5218,6 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -5176,10 +5331,10 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@^1.7.0: version "1.8.0" @@ -5205,10 +5360,20 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" - integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^3.0.0: version "3.0.0" @@ -5370,9 +5535,9 @@ postcss-scss@^2.1.1: postcss "^7.0.6" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz#042d74e137db83e6f294712096cb413f5aa612c4" - integrity sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg== + version "6.0.8" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz#f023ed7a9ea736cd7ef70342996e8e78645a7914" + integrity sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -5411,11 +5576,11 @@ postcss-value-parser@^3.3.1: integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.2.12, postcss@^8.1.6, postcss@^8.2.10: +postcss@8.2.12: version "8.2.12" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.12.tgz#81248a1a87e0f575cc594a99a08207fd1c4addc4" integrity sha512-BJnGT5+0q2tzvs6oQfnY2NpEJ7rIXNfBnZtQOKCIsweeWXBXeDd5k31UgTdS3d/c02ouspufn37mTaHWkJyzMQ== @@ -5434,13 +5599,21 @@ postcss@^6.0.23: supports-color "^5.4.0" postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.6: - version "7.0.35" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" - integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== dependencies: - chalk "^2.4.2" + picocolors "^0.2.1" source-map "^0.6.1" - supports-color "^6.1.0" + +postcss@^8.1.6, postcss@^8.2.10: + version "8.4.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" prefix-style@2.0.1: version "2.0.1" @@ -5482,7 +5655,7 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@15.7.2, prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -5491,12 +5664,21 @@ prop-types@15.7.2, prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.4, object-assign "^4.1.1" react-is "^16.8.1" +prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + protochain@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/protochain/-/protochain-1.0.5.tgz#991c407e99de264aadf8f81504b5e7faf7bfa260" integrity sha1-mRxAfpneJkqt+PgVBLXn+ve/omA= -psl@^1.1.28: +psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -5514,13 +5696,20 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.10.1, qs@^6.4.0: +qs@6.10.1: version "6.10.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== dependencies: side-channel "^1.0.4" +qs@^6.4.0: + version "6.10.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.2.tgz#c1431bea37fc5b24c5bdbafa20f16bdf2a4b9ffe" + integrity sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw== + dependencies: + side-channel "^1.0.4" + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -5870,9 +6059,9 @@ readdir-glob@^1.0.0: minimatch "^3.0.4" rechoir@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" - integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== dependencies: resolve "^1.9.0" @@ -5915,21 +6104,28 @@ redux-thunk@2.3.0: resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== -redux@4.1.0, redux@^4.0.0, redux@^4.0.5: +redux@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.0.tgz#eb049679f2f523c379f1aff345c8612f294c88d4" integrity sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g== dependencies: "@babel/runtime" "^7.9.2" -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== +redux@^4.0.0, redux@^4.0.5: + version "4.1.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.2.tgz#140f35426d99bb4729af760afcf79eaaac407104" + integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw== dependencies: - regenerate "^1.4.0" + "@babel/runtime" "^7.9.2" -regenerate@^1.4.0: +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== @@ -5940,9 +6136,9 @@ regenerator-runtime@^0.11.0: integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: version "0.14.5" @@ -5968,31 +6164,31 @@ regexp.prototype.flags@^1.3.1: define-properties "^1.1.3" regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" - integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" -regjsgen@^0.5.1: +regjsgen@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== -regjsparser@^0.6.4: - version "0.6.9" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" - integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== dependencies: jsesc "~0.5.0" @@ -6030,15 +6226,15 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= renderkid@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz#483b1ac59c6601ab30a7a596a5965cabccfdd0a5" - integrity sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ== + version "2.0.7" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== dependencies: - css-select "^2.0.2" - dom-converter "^0.2" - htmlparser2 "^3.10.1" - lodash "^4.17.20" - strip-ansi "^3.0.0" + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" repeat-element@^1.1.2: version "1.1.4" @@ -6112,13 +6308,14 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.20.0, resolve@^1.9.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.9.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" + integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.8.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.3: version "2.0.0-next.3" @@ -6256,14 +6453,15 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@>1.0.0, schema-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" - integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== +schema-utils@>1.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== dependencies: - "@types/json-schema" "^7.0.6" - ajv "^6.12.5" - ajv-keywords "^3.5.2" + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" schema-utils@^2.6.5: version "2.7.1" @@ -6274,6 +6472,15 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" +schema-utils@^3.0.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + seamless-immutable@^7.1.3: version "7.1.4" resolved "https://registry.yarnpkg.com/seamless-immutable/-/seamless-immutable-7.1.4.tgz#6e9536def083ddc4dea0207d722e0e80d0f372f8" @@ -6316,10 +6523,10 @@ semver@^7.2.1, semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" @@ -6396,9 +6603,9 @@ side-channel@^1.0.4: object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== slash@^2.0.0: version "2.0.0" @@ -6454,6 +6661,11 @@ source-list-map@^2.0.0, source-list-map@^2.0.1: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +source-map-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -6465,10 +6677,10 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@~0.5.12, source-map-support@~0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@~0.5.12, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -6515,9 +6727,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== specificity@^0.4.1: version "0.4.1" @@ -6554,24 +6766,25 @@ string-template@~0.2.1: resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" string.prototype.matchall@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" - integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== + version "4.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has-symbols "^1.0.1" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" internal-slot "^1.0.3" regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" @@ -6611,19 +6824,19 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0: +strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-eof@^1.0.0: version "1.0.0" @@ -6749,13 +6962,6 @@ supports-color@^5.3.0, supports-color@^5.4.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -6763,28 +6969,38 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + svg-tags@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= table@^6.0.4, table@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.5.1.tgz#930885a7430f15f8766b35cd1e36de40793db523" - integrity sha512-xGDXWTBJxahkzPQCsn1S9ESHEenU7TbMD5Iv4FeopXv/XwJyWatFjfbor+6ipI10/MNPXBYUamYukOrbPZ9L/w== + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: ajv "^8.0.1" - lodash.clonedeep "^4.5.0" - lodash.flatten "^4.4.0" lodash.truncate "^4.4.2" slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" - integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar-stream@^2.2.0: version "2.2.0" @@ -6798,16 +7014,15 @@ tar-stream@^2.2.0: readable-stream "^3.1.1" terser-webpack-plugin@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673" - integrity sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q== + version "5.3.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz#21641326486ecf91d8054161c816e464435bae9f" + integrity sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ== dependencies: - jest-worker "^26.6.2" - p-limit "^3.1.0" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" + jest-worker "^27.4.1" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" source-map "^0.6.1" - terser "^5.5.1" + terser "^5.7.2" terser@^4.6.3: version "4.8.0" @@ -6818,14 +7033,14 @@ terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.5.1: - version "5.6.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.1.tgz#a48eeac5300c0a09b36854bf90d9c26fb201973c" - integrity sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw== +terser@^5.7.2: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== dependencies: commander "^2.20.0" source-map "~0.7.2" - source-map-support "~0.5.19" + source-map-support "~0.5.20" text-table@^0.2.0: version "0.2.0" @@ -6843,9 +7058,9 @@ tiny-emitter@^2.0.0: integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== tiny-invariant@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" - integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" + integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== tiny-lr@^1.1.1: version "1.1.1" @@ -6864,10 +7079,10 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-camel-case@1.0.0, to-camel-case@^1.0.0: version "1.0.0" @@ -6930,18 +7145,24 @@ to-space-case@^1.0.0: dependencies: to-no-case "^1.0.0" -tough-cookie@^2.3.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: - psl "^1.1.28" + psl "^1.1.33" punycode "^2.1.1" + universalify "^0.1.2" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= trim-newlines@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" - integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== trough@^1.0.0: version "1.0.5" @@ -6954,9 +7175,9 @@ tslib@^1.9.3: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" - integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -6997,12 +7218,12 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -ua-parser-js@^0.7.18: - version "0.7.28" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" - integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== -unbox-primitive@^1.0.0: +unbox-primitive@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== @@ -7012,33 +7233,33 @@ unbox-primitive@^1.0.0: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== -unicode-property-aliases-ecmascript@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" - integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== unified@^9.1.0: - version "9.2.1" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" - integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -7084,6 +7305,11 @@ units-css@^0.4.0: isnumeric "^0.2.0" viewport-dimensions "^0.2.0" +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -7119,9 +7345,9 @@ url-loader@4.1.1: schema-utils "^3.0.0" url-parse@^1.4.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" - integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== + version "1.5.4" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.4.tgz#e4f645a7e2a0852cc8a66b14b292a3e9a11a97fd" + integrity sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -7161,10 +7387,10 @@ utila@~0.4: resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= -uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0, v8-compile-cache@^2.3.0: version "2.3.0" @@ -7213,11 +7439,11 @@ viewport-dimensions@^0.2.0: integrity sha1-3nQHR9tTh/0XJfUXXpG6x2r982w= walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: - makeerror "1.0.x" + makeerror "1.0.12" warning@^4.0.2: version "4.0.3" @@ -7227,13 +7453,18 @@ warning@^4.0.2: loose-envify "^1.0.0" watchpack@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" - integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== + version "2.3.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webpack-cli@4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.6.0.tgz#27ae86bfaec0cf393fcfd58abdc5a229ad32fd16" @@ -7265,9 +7496,9 @@ webpack-livereload-plugin@3.0.1: tiny-lr "^1.1.1" webpack-merge@^5.7.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" - integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== dependencies: clone-deep "^4.0.1" wildcard "^2.0.0" @@ -7281,9 +7512,9 @@ webpack-sources@^1.1.0: source-map "~0.6.1" webpack-sources@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac" - integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w== + version "2.3.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== dependencies: source-list-map "^2.0.1" source-map "^0.6.1" @@ -7336,6 +7567,14 @@ whatwg-fetch@>=0.10.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -7403,12 +7642,10 @@ write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@^6.0.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" +ws@^7.4.5: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== xxhashjs@~0.2.2: version "0.2.2" @@ -7433,9 +7670,9 @@ yaml@^1.10.0: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.7" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" - integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs@^16.2.0: version "16.2.0" @@ -7450,11 +7687,6 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - zip-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79"