From 35a3034266cebc12fab630fbd134b240c56c3240 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 20 Nov 2018 15:35:16 -0400 Subject: [PATCH 01/97] update documentation and README for Linux support --- .github/ISSUE_TEMPLATE/installation-issue.md | 21 +++ README.md | 99 ++++++------ docs/installation.md | 27 ++++ docs/process/publishing-linux-releases.md | 154 +++++++++++++++++++ 4 files changed, 249 insertions(+), 52 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/installation-issue.md create mode 100644 docs/process/publishing-linux-releases.md diff --git a/.github/ISSUE_TEMPLATE/installation-issue.md b/.github/ISSUE_TEMPLATE/installation-issue.md new file mode 100644 index 00000000000..0d2175f7faa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/installation-issue.md @@ -0,0 +1,21 @@ +--- +name: "\U0001F4BB Installation issue" +about: Report a problem when installing the application +title: '' +labels: '' +assignees: '' + +--- + +### Operating System/Distribution + +Which distribution of Linux are you using? + +### Installer + +Which version of the app? +Which installer type? + +### What happened? + +Provide as much detail as possible. Error messages or output are extremely useful. diff --git a/README.md b/README.md index 006b2c5f32d..1cb904c65f7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# [GitHub Desktop](https://desktop.github.com) +# [GitHub Desktop](https://desktop.github.com) - The Linux Fork + +[![Build Status](https://brendanforster.visualstudio.com/desktop-linux/_apis/build/status/Azure%20Pipelines%20Build?branchName=linux)](https://brendanforster.visualstudio.com/desktop-linux/_build/latest?definitionId=10&branchName=linux) [GitHub Desktop](https://desktop.github.com/) is an open source [Electron](https://www.electronjs.org/)-based GitHub app. It is written in [TypeScript](https://www.typescriptlang.org) and @@ -16,78 +18,71 @@ uses [React](https://reactjs.org/). /> -## Where can I get it? - -Download the official installer for your operating system: - - - [macOS](https://central.github.com/deployments/desktop/desktop/latest/darwin) - - [macOS (Apple silicon)](https://central.github.com/deployments/desktop/desktop/latest/darwin-arm64) - - [Windows](https://central.github.com/deployments/desktop/desktop/latest/win32) - - [Windows machine-wide install](https://central.github.com/deployments/desktop/desktop/latest/win32?format=msi) - -Linux is not officially supported; however, you can find installers created for Linux from a fork of GitHub Desktop in the [Community Releases](https://github.com/desktop/desktop#community-releases) section. - -### Beta Channel - -Want to test out new features and get fixes before everyone else? Install the -beta channel to get access to early builds of Desktop: +## What is this repository for? - - [macOS](https://central.github.com/deployments/desktop/desktop/latest/darwin?env=beta) - - [macOS (Apple silicon)](https://central.github.com/deployments/desktop/desktop/latest/darwin-arm64?env=beta) - - [Windows](https://central.github.com/deployments/desktop/desktop/latest/win32?env=beta) - - [Windows (ARM64)](https://central.github.com/deployments/desktop/desktop/latest/win32-arm64?env=beta) +This repository contains specific patches on top of the upstream +`desktop/desktop` repository to support Linux usage. -The release notes for the latest beta versions are available [here](https://desktop.github.com/release-notes/?env=beta). +It also hosts preview packages for various Linux distributions: -### Community Releases + - AppImage (`.AppImage`) + - Debian (`.deb`) + - RPM (`.rpm`) -There are several community-supported package managers that can be used to -install GitHub Desktop: - - Windows users can install using [winget](https://docs.microsoft.com/en-us/windows/package-manager/winget/) `c:\> winget install github-desktop` or [Chocolatey](https://chocolatey.org/) `c:\> choco install github-desktop` - - macOS users can install using [Homebrew](https://brew.sh/) package manager: - `$ brew install --cask github` +Check out the [latest releases](https://github.com/shiftkey/desktop/releases) to +help out with testing on your distribution. -Installers for various Linux distributions can be found on the -[`shiftkey/desktop`](https://github.com/shiftkey/desktop) fork. +## packagecloud -## Is GitHub Desktop right for me? What are the primary areas of focus? +We are trialing using [PackageCloud](https://packagecloud.io/) for distributing +the installers for Debian and RPM-based distributions. -[This document](https://github.com/desktop/desktop/blob/development/docs/process/what-is-desktop.md) describes the focus of GitHub Desktop and who the product is most useful for. +### Debian/Ubuntu distributions -## I have a problem with GitHub Desktop +To setup the package repository, run these commands: -Note: The [GitHub Desktop Code of Conduct](https://github.com/desktop/desktop/blob/development/CODE_OF_CONDUCT.md) applies in all interactions relating to the GitHub Desktop project. +``` +$ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo apt-key add - +$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftky-desktop.list' +$ sudo apt-get update +``` -First, please search the [open issues](https://github.com/desktop/desktop/issues?q=is%3Aopen) -and [closed issues](https://github.com/desktop/desktop/issues?q=is%3Aclosed) -to see if your issue hasn't already been reported (it may also be fixed). +Then install GitHub Desktop: -There is also a list of [known issues](https://github.com/desktop/desktop/blob/development/docs/known-issues.md) -that are being tracked against Desktop, and some of these issues have workarounds. +``` +$ sudo apt install github-desktop +``` -If you can't find an issue that matches what you're seeing, open a [new issue](https://github.com/desktop/desktop/issues/new/choose), -choose the right template and provide us with enough information to investigate -further. +### Red Hat/CentOS/Fedora distributions -## The issue I reported isn't fixed yet. What can I do? +To setup the package repository, run these commands: -If nobody has responded to your issue in a few days, you're welcome to respond to it with a friendly ping in the issue. Please do not respond more than a second time if nobody has responded. The GitHub Desktop maintainers are constrained in time and resources, and diagnosing individual configurations can be difficult and time consuming. While we'll try to at least get you pointed in the right direction, we can't guarantee we'll be able to dig too deeply into any one person's issue. +``` +$ sudo rpm --import https://packagecloud.io/shiftkey/desktop/gpgkey +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://packagecloud.io/shiftkey/desktop/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' +``` -## How can I contribute to GitHub Desktop? +Then install GitHub Desktop: -The [CONTRIBUTING.md](./.github/CONTRIBUTING.md) document will help you get setup and -familiar with the source. The [documentation](docs/) folder also contains more -resources relevant to the project. +``` +# if yum is your package manager +$ sudo yum install github-desktop +# if dnf is your package manager +$ sudo dnf install github-desktop +``` -If you're looking for something to work on, check out the [help wanted](https://github.com/desktop/desktop/issues?q=is%3Aissue+is%3Aopen+label%3A%22help%20wanted%22) label. +## Other Distributions -## Building Desktop +Arch Linux users can install GitHub Desktop from the +[AUR](https://aur.archlinux.org/packages/github-desktop-bin/). -To setup your development environment for building Desktop, check out: [`setup.md`](./docs/contributing/setup.md). +`gnome-keyring` is required and the daemon must be launched either at login or when the X server is started. Normally this is handled by a display manager, but in other cases following the instructions found on the [Arch Wiki](https://wiki.archlinux.org/index.php/GNOME/Keyring#Using_the_keyring_outside_GNOME) will fix the issue of not being able to save login credentials. -## More Resources +## More information -See [desktop.github.com](https://desktop.github.com) for more product-oriented +Please check out the [README](https://github.com/desktop/desktop#github-desktop) +on the upstream [GitHub Desktop project](https://github.com/desktop/desktop) and +[desktop.github.com](https://desktop.github.com) for more product-oriented information about GitHub Desktop. See our [getting started documentation](https://docs.github.com/en/desktop/installing-and-configuring-github-desktop/overview/getting-started-with-github-desktop) for more information on how to set up, authenticate, and configure GitHub Desktop. diff --git a/docs/installation.md b/docs/installation.md index 6681d22a00b..af08c517d13 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -13,6 +13,26 @@ On Windows you have two options: - Download the `GitHubDesktopSetup.exe` and run it to install it for the current user. - Download the `GitHubDesktopSetup.msi` and run it to install a machine-wide version of GitHub Desktop - each logged-in user will then be able to run GitHub Desktop from the program at `%PROGRAMFILES(x86)\GitHub Desktop Installer\desktop.exe`. +### Linux + +On Linux there are four different package formats available, depending on your +distribution: + + - AppImage (`.AppImage`) + - Debian (`.deb`) + - RPM (`.rpm`) + - Snap (`.snap`) - also available from [snapcraft.io](https://snapcraft.io/github-desktop) + +If you install the Snap package, ensure you also connect it to your password +manager: + +```shellsession +$ sudo snap connect github-desktop:password-manager-service +``` + +Without this, GitHub Desktop cannot store or retrieve account details it +requires in the user's keychain. + ## Data Directories GitHub Desktop will create directories to manage the files and data it needs to function. If you manage a network of computers and want to install GitHub Desktop, here is more information about how things work. @@ -25,6 +45,13 @@ GitHub Desktop will create directories to manage the files and data it needs to - `%LOCALAPPDATA%\GitHubDesktop\` - contains the latest versions of the app, and some older versions if the user has updated from a previous version. - `%APPDATA%\GitHub Desktop\` - this directory contains user-specific data which the application requires to run, and is created on launch if it doesn't exist. Log files are also stored in this location. +### Linux + +This varies based on the installer chosen: + + - AppImage, Debian and RPM: `~/.config/GitHub Desktop/` + - Snap: `~/snap/github-desktop/current/.config/GitHub Desktop/` + ## Log Files GitHub Desktop will generate logs as part of its normal usage, to assist with troubleshooting. They are located in the data directory that GitHub Desktop uses (see above) under a `logs` subdirectory, organized by date using the format `YYYY-MM-DD.desktop.production.log`, where `YYYY-MM-DD` is the day the log was created. diff --git a/docs/process/publishing-linux-releases.md b/docs/process/publishing-linux-releases.md new file mode 100644 index 00000000000..76a5648b68a --- /dev/null +++ b/docs/process/publishing-linux-releases.md @@ -0,0 +1,154 @@ +# Publishing Linux Releases + +This document outlines the steps I take once a release has been published from +the main GitHub Desktop project. + +This document assumes you have these remotes configured: + +``` +$ git remote -v +origin https://github.com/shiftkey/desktop (fetch) +origin https://github.com/shiftkey/desktop (push) +upstream https://github.com/desktop/desktop (fetch) +upstream https://github.com/desktop/desktop (push) +``` + +Ensure that `development` and `linux` are up-to-date: + +``` +$ git fetch --all +$ git checkout development +$ git reset upstream/development --hard +$ git push origin development +$ git checkout linux +$ git reset origin/linux --hard +$ git rebase development linux +``` + +We want to ensure our changes work against the current branch, so take some time +to rebase the changes and force push `linux` once you're done. + +``` +$ git push origin linux --force-with-lease +``` + +Wait for the continuous integration tests to pass. If `linux` is not passing the +continuous integration tests we need to investigate and identify why things are +no longer working. + +### 1. Create a branch from the release tag + +Each release tag from the upstream project matches the format `release-X.Y.Z` +where `X.Y.Z` are version numbers. We should create a corresponding branch in +this repository named `linux-release-X.Y.Z` as a starting point for the next +Linux release. + +On the command line, this looks like this (using the `2.1.3` release as an +example): + +``` +$ git checkout -b linux-release-2.1.3 release-2.1.3 +$ git push origin linux-release-2.1.3 -u +``` + +### 2. Open pull request to apply the necessary patches to the new branch + +The first step to cutting a release is to backport the latest fixes to the +release branch: + +``` +$ git checkout -b apply-changes-2.1.3 linux +$ git submodule update +$ git rebase --onto linux-release-2.1.3 development apply-changes-2.1.3 +``` + +Work through the conflicts reported until the branch is cleanly applied to the +previous release. + +When the branch is ready to go, push the branch to the remote: + +``` +$ git push origin apply-changes-2.1.3 -u +``` + +Open a pull request that targets `linux-release-2.1.3`. Review the changes and +ensure the tests pass. + +### 3. Approve and merge PR + +If we're satisifed with the pull request, we can merge the pull request to +update the release branch. + +Ensure **rebase and merge** is used here, as we want to preserve the commit +history as-is without introducing merge commits. + +If there are additional changes that need to go into the release, make sure to +include them + +### 4. Tag the release + +Ensure you are on the latest version that passes all tests: + +``` +$ git checkout linux-release-2.1.3 +$ git pull +``` + +We need to bump the version here to indicate this is not the exact same version +as the original release. The convention we follow is `release-X.Y.Z-linuxA` +where `A` is an auto-incrementing number (starting from 1). + +Update the `version` field in `app/package.json` to this new version. For +example, updating to the first release of `2.1.3` would look like this: + +```diff +diff --git a/app/package.json b/app/package.json +index fbbbb976f..3baaf9e33 100644 +--- a/app/package.json ++++ b/app/package.json +@@ -3,7 +3,7 @@ + "productName": "GitHub Desktop", + "bundleID": "com.github.GitHubClient", + "companyName": "GitHub, Inc.", +- "version": "2.1.0", ++ "version": "2.1.3-linux1", + "main": "./main.js", + "repository": { + "type": "git", +``` + +Commit and push this change to ensure we still pass the CI suite: + +``` +$ git commit -am "bump version for release" +$ git push +``` + +With this passing CI, we can tag this version to indicate this is what we are +releasing: + +``` +$ git tag release-2.1.3-linux1 +``` + +With those things in place, push the changes to the branch as well as the new +tag: + +``` +$ git push --follow-tags +``` + +### 5. Publish to GitHub + +After the tagged build completes, it will have the installers available as +artifacts. Over on Azure Pipelines - switch to the Releases tab and run "Publish +to Beta Channel" with the Snap release disabled +([**#204**](https://github.com/shiftkey/desktop/issues/202) is the tracking +issue for re-enabling that). + +When that is done, there should be a draft release available assigned to the tag +from earlier. Edit the release to add the release notes and checksums. + +**TODO:** it'd be great to have some sort of script to generate the release +notes from the changelog in this "markdown + sections" format, which would save +a lot of manual effort. From 0d0cbd728d6d9235f9979f645695c3e0bfaab363 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 1 Nov 2018 18:06:04 -0300 Subject: [PATCH 02/97] improvements to electron-builder config --- app/package.json | 2 +- package.json | 4 +- script/dist-info.ts | 2 +- script/electron-builder-linux.yml | 40 ++++++++++++++ script/package.ts | 86 +++++++++++++++++++++++++++++++ yarn.lock | 39 +++++++++++++- 6 files changed, 168 insertions(+), 5 deletions(-) create mode 100644 script/electron-builder-linux.yml diff --git a/app/package.json b/app/package.json index 2fcf06d4ba9..eaf5d6cca64 100644 --- a/app/package.json +++ b/app/package.json @@ -1,5 +1,5 @@ { - "name": "desktop", + "name": "github-desktop", "productName": "GitHub Desktop", "bundleID": "com.github.GitHubClient", "companyName": "GitHub, Inc.", diff --git a/package.json b/package.json index 91ec49fe380..1444ff23cdc 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,9 @@ "webpack-dev-middleware": "^5.3.1", "webpack-hot-middleware": "^2.25.1", "webpack-merge": "^5.8.0", - "xml2js": "^0.5.0" + "xml2js": "^0.5.0", + "xvfb-maybe": "^0.2.1", + "yaml": "^1.4.0" }, "devDependencies": { "@github/markdownlint-github": "^0.1.0", diff --git a/script/dist-info.ts b/script/dist-info.ts index e2ae688d55d..88a0bcbd4b4 100644 --- a/script/dist-info.ts +++ b/script/dist-info.ts @@ -25,7 +25,7 @@ export function getExecutableName() { if (process.platform === 'win32') { return `${getWindowsIdentifierName()}${suffix}` } else if (process.platform === 'linux') { - return 'desktop' + return `github-desktop${suffix}` } else { return productName } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml new file mode 100644 index 00000000000..cbf97eafa99 --- /dev/null +++ b/script/electron-builder-linux.yml @@ -0,0 +1,40 @@ +artifactName: 'GitHubDesktop-${os}-${version}.${ext}' +linux: + category: 'GNOME;GTK;Development' + packageCategory: 'GNOME;GTK;Development' + icon: 'app/static/logos' + mimeTypes: + - x-scheme-handler/x-github-client + - x-scheme-handler/x-github-desktop-auth + target: + - deb + - rpm + - AppImage + maintainer: 'GitHub, Inc ' +deb: + afterInstall: './script/linux-after-install.sh' + afterRemove: './script/linux-after-remove.sh' + depends: + # default Electron dependencies + - gconf2 + - gconf-service + - libnotify4 + - libappindicator1 + - libxtst6 + - libnss3 + # dugite-native dependencies + - libcurl3 | libcurl4 + # keytar dependencies + - libsecret-1-0 + - gnome-keyring +rpm: + depends: + # default Electron dependencies + - libXScrnSaver + - libappindicator + - libnotify + # dugite-native dependencies + - libcurl + # keytar dependencies + - libsecret + - gnome-keyring diff --git a/script/package.ts b/script/package.ts index 23093146bd6..5017f9a06c2 100644 --- a/script/package.ts +++ b/script/package.ts @@ -1,8 +1,14 @@ /* eslint-disable no-sync */ import * as cp from 'child_process' +import { createReadStream } from 'fs' +import { writeFile } from 'fs/promises' import * as path from 'path' import * as electronInstaller from 'electron-winstaller' +import * as crypto from 'crypto' + +import glob = require('glob') + import { getProductName, getCompanyName } from '../app/package-info' import { getDistPath, @@ -39,6 +45,8 @@ if (process.platform === 'darwin') { packageOSX() } else if (process.platform === 'win32') { packageWindows() +} else if (process.platform === 'linux') { + packageLinux() } else { console.error(`I don't know how to package for ${process.platform} :(`) process.exit(1) @@ -158,3 +166,81 @@ function packageWindows() { process.exit(1) }) } + +function getSha256Checksum(fullPath: string): Promise { + return new Promise((resolve, reject) => { + const algo = 'sha256' + const shasum = crypto.createHash(algo) + + const s = createReadStream(fullPath) + s.on('data', function (d) { + shasum.update(d) + }) + s.on('error', err => { + reject(err) + }) + s.on('end', function () { + const d = shasum.digest('hex') + resolve(d) + }) + }) +} + +function generateChecksums() { + const distRoot = getDistRoot() + + const installersPath = `${distRoot}/GitHubDesktop-linux-*` + + glob(installersPath, async (error, files) => { + if (error != null) { + throw error + } + + const checksums = new Map() + + for (const f of files) { + const checksum = await getSha256Checksum(f) + checksums.set(f, checksum) + } + + let checksumsText = `Checksums: \n` + + for (const [fullPath, checksum] of checksums) { + const fileName = path.basename(fullPath) + checksumsText += `${checksum} - ${fileName}\n` + } + + const checksumFile = path.join(distRoot, 'checksums.txt') + + await writeFile(checksumFile, checksumsText) + }) +} + +function packageLinux() { + const electronBuilder = path.resolve( + __dirname, + '..', + 'node_modules', + '.bin', + 'electron-builder' + ) + + const configPath = path.resolve(__dirname, 'electron-builder-linux.yml') + + const args = [ + 'build', + '--prepackaged', + distPath, + '--x64', + '--config', + configPath, + ] + + const { error } = cp.spawnSync(electronBuilder, args, { stdio: 'inherit' }) + + if (error != null) { + throw error + } + + generateChecksums() +} diff --git a/yarn.lock b/yarn.lock index 798f59ba8ff..4602d399ceb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -442,6 +442,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.3.4": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" + integrity sha512-7Bl2rALb7HpvXFL7TETNzKSAeBVCPHELzc0C//9FCxN8nsiueWSJBqaF+2oIJScyILStASR/Cx5WMkXGYTiJFA== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -6276,7 +6283,15 @@ js-queue@2.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.10.0, js-yaml@^3.13.1: +js-yaml@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -7913,6 +7928,11 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + regenerator-runtime@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" @@ -9625,7 +9645,7 @@ which-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" -which@^1.2.9: +which@^1.2.4, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -9722,6 +9742,14 @@ xtend@^4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +xvfb-maybe@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/xvfb-maybe/-/xvfb-maybe-0.2.1.tgz#ed8cb132957b7848b439984c66f010ea7f24361b" + integrity sha1-7YyxMpV7eEi0OZhMZvAQ6n8kNhs= + dependencies: + debug "^2.2.0" + which "^1.2.4" + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -9742,6 +9770,13 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.4.0.tgz#b729a3ef7e35bdc5ece8f28900e20a9b41510fc3" + integrity sha512-rzU83hGJrNgyT7OE2mP/SILeZxEMRJ0mza0n4KFtkNL1aXUZ79ZgZ5pIH56yT6LiqujcAs/Rqzp0ApvvNYfUfw== + dependencies: + "@babel/runtime" "^7.3.4" + yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" From 546602b543468464fe83363e7fa3878dd0e3afb2 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 19 Apr 2019 10:05:03 -0300 Subject: [PATCH 03/97] redirect in-app menu for reporting an issue to the fork (#141) --- app/src/main-process/menu/build-default-menu.ts | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/app/src/main-process/menu/build-default-menu.ts b/app/src/main-process/menu/build-default-menu.ts index 037364a0c13..82117a3b579 100644 --- a/app/src/main-process/menu/build-default-menu.ts +++ b/app/src/main-process/menu/build-default-menu.ts @@ -1,4 +1,4 @@ -import { Menu, shell, app, BrowserWindow } from 'electron' +import { Menu, shell, BrowserWindow } from 'electron' import { ensureItemIds } from './ensure-item-ids' import { MenuEvent } from './menu-event' import { truncateWithEllipsis } from '../../lib/truncate-with-ellipsis' @@ -486,22 +486,11 @@ export function buildDefaultMenu({ label: __DARWIN__ ? 'Report Issue…' : 'Report issue…', click() { shell - .openExternal('https://github.com/desktop/desktop/issues/new/choose') + .openExternal('https://github.com/shiftkey/desktop/issues/new/choose') .catch(err => log.error('Failed opening issue creation page', err)) }, } - const contactSupportItem: Electron.MenuItemConstructorOptions = { - label: __DARWIN__ ? 'Contact GitHub Support…' : '&Contact GitHub support…', - click() { - shell - .openExternal( - `https://github.com/contact?from_desktop_app=1&app_version=${app.getVersion()}` - ) - .catch(err => log.error('Failed opening contact support page', err)) - }, - } - const showUserGuides: Electron.MenuItemConstructorOptions = { label: 'Show User Guides', click() { @@ -540,7 +529,6 @@ export function buildDefaultMenu({ const helpItems = [ submitIssueItem, - contactSupportItem, showUserGuides, showKeyboardShortcuts, showLogsItem, From 23530f3b9b2f79c88de513562dc01f81115404d7 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 30 May 2019 16:47:05 -0300 Subject: [PATCH 04/97] workaround for Linux users of the app to use it on very low resolution screens --- app/src/main-process/app-window.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main-process/app-window.ts b/app/src/main-process/app-window.ts index e321e5662ec..9f6137ab7e9 100644 --- a/app/src/main-process/app-window.ts +++ b/app/src/main-process/app-window.ts @@ -76,6 +76,12 @@ export class AppWindow { windowOptions.frame = false } else if (__LINUX__) { windowOptions.icon = path.join(__dirname, 'static', 'icon-logo.png') + + // relax restriction here for users trying to run app at a small + // resolution and any other side-effects of dropping this restriction are + // currently unsupported + delete windowOptions.minHeight + delete windowOptions.minWidth } this.window = new BrowserWindow(windowOptions) From 5e18f8cc63fccddcbe85fd55416c196b8223f17a Mon Sep 17 00:00:00 2001 From: jfgordon2 <55799997+jfgordon2@users.noreply.github.com> Date: Sun, 29 Mar 2020 16:01:51 -0500 Subject: [PATCH 05/97] add CLI support to Debian package, add Elementary OS shell and editor support (#231) --- app/static/linux/github | 28 ++++++++++++++++++++++++++++ script/linux-after-install.sh | 33 +++++++++++++++++++++++++++++++++ script/linux-after-remove.sh | 23 +++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 app/static/linux/github create mode 100644 script/linux-after-install.sh create mode 100644 script/linux-after-remove.sh diff --git a/app/static/linux/github b/app/static/linux/github new file mode 100644 index 00000000000..dfb32bf6ea4 --- /dev/null +++ b/app/static/linux/github @@ -0,0 +1,28 @@ +#!/bin/sh + +if [ ! -L "$0" ]; then + # if path is not a symlink, find relatively + GITHUB_PATH=$(dirname "$(dirname "$(dirname "$(dirname "$0")")")") +else + if command -v readlink >/dev/null; then + # if readlink exists, follow the symlink and then find relatively + SYMLINK=$(readlink -f "$0") + GITHUB_PATH=$(dirname "$(dirname "$(dirname "$(dirname "$SYMLINK")")")") + else + # else use the standard install location + GITHUB_PATH="/opt/GitHub Desktop" + fi +fi +# check if this is a dev install or standard +if [ -f "$GITHUB_PATH/github-desktop-dev" ]; then + BINARY_NAME="github-desktop-dev" +else + BINARY_NAME="github-desktop" +fi + +ELECTRON="$GITHUB_PATH/$BINARY_NAME" +CLI="$GITHUB_PATH/resources/app/cli.js" + +ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@" + +exit $? diff --git a/script/linux-after-install.sh b/script/linux-after-install.sh new file mode 100644 index 00000000000..204b930b83d --- /dev/null +++ b/script/linux-after-install.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -e + +PROFILE_D_FILE="/etc/profile.d/github-desktop.sh" +INSTALL_DIR="/opt/${productFilename}" +CLI_DIR="$INSTALL_DIR/resources/app/static" + +case "$1" in + configure) + # add executable permissions for CLI interface + chmod +x "$CLI_DIR"/github || : + # check if this is a dev install or standard + if [ -f "$INSTALL_DIR/github-desktop-dev" ]; then + BINARY_NAME="github-desktop-dev" + else + BINARY_NAME="github-desktop" + fi + # create symbolic links to /usr/bin directory + ln -f -s "$INSTALL_DIR"/$BINARY_NAME /usr/bin || : + ln -f -s "$CLI_DIR"/github /usr/bin || : + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +exit 0 \ No newline at end of file diff --git a/script/linux-after-remove.sh b/script/linux-after-remove.sh new file mode 100644 index 00000000000..64c0803dec3 --- /dev/null +++ b/script/linux-after-remove.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -e + +PROFILE_D_FILE="/etc/profile.d/github-desktop.sh" + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + echo "#!/bin/sh" > "${PROFILE_D_FILE}"; + . "${PROFILE_D_FILE}"; + rm "${PROFILE_D_FILE}"; + # remove symbolic links in /usr/bin directory + unlink /usr/bin/github-desktop || : + unlink /usr/bin/github-desktop-dev || : + unlink /usr/bin/github || : + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +exit 0 From 921d89534aa1a15079fe2dc54735eb76e2b50862 Mon Sep 17 00:00:00 2001 From: jfgordon2 <55799997+jfgordon2@users.noreply.github.com> Date: Mon, 30 Mar 2020 12:06:52 -0500 Subject: [PATCH 06/97] polish About modal for Linux build (#241) Updated the "About GitHub Desktop" model to remove the button to check for updates (since it didn't do anything on Linux) and replace with a link to the linux releases page --- app/src/ui/about/about.tsx | 20 ++++++++++++++++++-- app/src/ui/lib/releases.ts | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/src/ui/about/about.tsx b/app/src/ui/about/about.tsx index 4c3d6df132a..3da23954011 100644 --- a/app/src/ui/about/about.tsx +++ b/app/src/ui/about/about.tsx @@ -14,7 +14,7 @@ import { Disposable } from 'event-kit' import { Loading } from '../lib/loading' import { RelativeTime } from '../relative-time' import { assertNever } from '../../lib/fatal-error' -import { ReleaseNotesUri } from '../lib/releases' +import { ReleaseNotesUri, LinuxReleasesUri } from '../lib/releases' import { encodePathAsUrl } from '../../lib/path' import { isTopMostDialog } from '../dialog/is-top-most' import { isWindowsAndNoLongerSupportedByElectron } from '../../lib/get-os' @@ -137,6 +137,17 @@ export class About extends React.Component { return null } + if (__LINUX__) { + const linuxReleaseLink = ( + View Releases + ) + return ( + +

{linuxReleaseLink}

+
+ ) + } + const updateStatus = this.state.updateState.status switch (updateStatus) { @@ -229,7 +240,12 @@ export class About extends React.Component { private renderUpdateDetails() { if (__LINUX__) { - return null + return ( +

+ Please visit the GitHub Desktop for Linux release page for + Linux-specific release notes and to download the latest version. +

+ ) } if (__RELEASE_CHANNEL__ === 'development') { diff --git a/app/src/ui/lib/releases.ts b/app/src/ui/lib/releases.ts index 958ccad3722..ba088f73374 100644 --- a/app/src/ui/lib/releases.ts +++ b/app/src/ui/lib/releases.ts @@ -2,3 +2,5 @@ export const ReleaseNotesUri = __RELEASE_CHANNEL__ === 'beta' ? 'https://desktop.github.com/release-notes/?env=beta' : 'https://desktop.github.com/release-notes/' + +export const LinuxReleasesUri = 'https://github.com/shiftkey/desktop/releases/' From 3d34c07150e3bdbd0e6d00b693d76cbd6459b392 Mon Sep 17 00:00:00 2001 From: jfgordon2 <55799997+jfgordon2@users.noreply.github.com> Date: Mon, 30 Mar 2020 12:23:37 -0500 Subject: [PATCH 07/97] Detach CLI process from terminal (#239) --- app/static/linux/github | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/static/linux/github b/app/static/linux/github index dfb32bf6ea4..0f7513eb244 100644 --- a/app/static/linux/github +++ b/app/static/linux/github @@ -23,6 +23,13 @@ fi ELECTRON="$GITHUB_PATH/$BINARY_NAME" CLI="$GITHUB_PATH/resources/app/cli.js" -ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@" +case $1 in + # if help in the first variable, return contents to shell + *help*|*--help*) + ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@";; + # any other, redirect to /dev/null to detach from controlling terminal + *) + ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@" < /dev/null > /dev/null &;; +esac exit $? From a3004f06a7a1b1101f55e149550ab90f147407a1 Mon Sep 17 00:00:00 2001 From: Jeff Gordon Date: Tue, 14 Apr 2020 05:02:06 -0500 Subject: [PATCH 08/97] Added test for symlinks Reduce errors produced in terminal from debian package installations by testing for existence of symlink prior to executing unlink --- script/linux-after-remove.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/script/linux-after-remove.sh b/script/linux-after-remove.sh index 64c0803dec3..d85b3eb28e8 100644 --- a/script/linux-after-remove.sh +++ b/script/linux-after-remove.sh @@ -2,6 +2,7 @@ set -e PROFILE_D_FILE="/etc/profile.d/github-desktop.sh" +BASE_FILE="/usr/bin/github" case "$1" in purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) @@ -9,9 +10,9 @@ case "$1" in . "${PROFILE_D_FILE}"; rm "${PROFILE_D_FILE}"; # remove symbolic links in /usr/bin directory - unlink /usr/bin/github-desktop || : - unlink /usr/bin/github-desktop-dev || : - unlink /usr/bin/github || : + test -f ${BASE_FILE} && unlink ${BASE_FILE} + test -f ${BASE_FILE}-desktop && unlink ${BASE_FILE}-desktop + test -f ${BASE_FILE}-desktop-dev && unlink ${BASE_FILE}-desktop-dev ;; *) From 01a9a1d7e3f6661d1b3671575d65f8b9f6261380 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 16 Apr 2020 13:43:46 -0300 Subject: [PATCH 09/97] set filemode for chrome-sandbox to reflect the permissions it needs (#254) --- script/package.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/script/package.ts b/script/package.ts index 5017f9a06c2..767189415b7 100644 --- a/script/package.ts +++ b/script/package.ts @@ -1,7 +1,7 @@ /* eslint-disable no-sync */ import * as cp from 'child_process' -import { createReadStream } from 'fs' +import { chmodSync, createReadStream } from 'fs' import { writeFile } from 'fs/promises' import * as path from 'path' import * as electronInstaller from 'electron-winstaller' @@ -30,6 +30,7 @@ import { getVersion } from '../app/package-info' import { rename } from 'fs/promises' import { join } from 'path' import { assertNonNullable } from '../app/src/lib/fatal-error' +import { pathExistsSync } from 'fs-extra' const distPath = getDistPath() const productName = getProductName() @@ -217,6 +218,14 @@ function generateChecksums() { } function packageLinux() { + const helperPath = path.join(getDistPath(), 'chrome-sandbox') + const exists = pathExistsSync(helperPath) + + if (exists) { + console.log('Updating file mode for chrome-sandbox…') + chmodSync(helperPath, 0o4755) + } + const electronBuilder = path.resolve( __dirname, '..', From e9116348bca6614e6bdb869102e5c4ec829d74bf Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 23 Apr 2020 14:05:20 -0300 Subject: [PATCH 10/97] move debian packaging out to dedicated step (#263) --- package.json | 3 + script/electron-builder-linux.yml | 17 -- script/package-debian.ts | 105 ++++++++++ script/package-electron-builder.ts | 68 +++++++ script/package.ts | 78 +++----- .../deb/postinst.sh} | 4 +- .../deb/postrm.sh} | 0 yarn.lock | 185 +++++++++++++++++- 8 files changed, 385 insertions(+), 75 deletions(-) create mode 100644 script/package-debian.ts create mode 100644 script/package-electron-builder.ts rename script/{linux-after-install.sh => resources/deb/postinst.sh} (94%) mode change 100644 => 100755 rename script/{linux-after-remove.sh => resources/deb/postrm.sh} (100%) mode change 100644 => 100755 diff --git a/package.json b/package.json index 1444ff23cdc..5de0a137560 100644 --- a/package.json +++ b/package.json @@ -166,5 +166,8 @@ "markdownlint-cli": "^0.32.2", "reserved-words": "^0.1.2", "tsconfig-paths": "^3.9.0" + }, + "optionalDependencies": { + "electron-installer-debian": "3.0.0" } } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index cbf97eafa99..c034288add1 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -7,26 +7,9 @@ linux: - x-scheme-handler/x-github-client - x-scheme-handler/x-github-desktop-auth target: - - deb - rpm - AppImage maintainer: 'GitHub, Inc ' -deb: - afterInstall: './script/linux-after-install.sh' - afterRemove: './script/linux-after-remove.sh' - depends: - # default Electron dependencies - - gconf2 - - gconf-service - - libnotify4 - - libappindicator1 - - libxtst6 - - libnss3 - # dugite-native dependencies - - libcurl3 | libcurl4 - # keytar dependencies - - libsecret-1-0 - - gnome-keyring rpm: depends: # default Electron dependencies diff --git a/script/package-debian.ts b/script/package-debian.ts new file mode 100644 index 00000000000..b6df4eb96f3 --- /dev/null +++ b/script/package-debian.ts @@ -0,0 +1,105 @@ +import { promisify } from 'util' +import { join } from 'path' + +import glob = require('glob') +const globPromise = promisify(glob) + +import { rename } from 'fs-extra' + +import { getVersion } from '../app/package-info' +import { getDistPath, getDistRoot } from './dist-info' + +const distRoot = getDistRoot() + +// best guess based on documentation +type DebianOptions = { + // required + src: string + dest: string + arch: 'amd64' | 'i386' | 'arm64' + // optional + description?: string + productDescription?: string + categories?: Array + section?: string + priority?: 'required' | 'important' | 'standard' | 'optional' | 'extra' + homepage?: string + icon?: any + scripts?: { + preinst?: string + postinst?: string + prerm?: string + postrm?: string + } + mimeType?: Array + maintainer?: string + depends?: Array +} + +const options: DebianOptions = { + src: getDistPath(), + dest: distRoot, + arch: 'amd64', + description: 'Simple collaboration from your desktop', + productDescription: + 'This is the unofficial port of GitHub Desktop for Linux distributions', + section: 'GNOME;GTK;Development', + priority: 'extra', + homepage: 'https://github.com/shiftkey/desktop', + depends: [ + // additional core dependencies - are these still needed? + 'gconf2', + 'gconf-service', + 'libappindicator1', + // Desktop-specific dependencies + 'libcurl3 | libcurl4', + 'libsecret-1-0', + 'gnome-keyring', + ], + icon: { + '256x256': 'app/static/logos/256x256.png', + '512x512': 'app/static/logos/512x512.png', + '1024x1024': 'app/static/logos/1024x1024.png', + }, + scripts: { + postinst: 'script/resources/deb/postinst.sh', + postrm: 'script/resources/deb/postrm.sh', + }, + mimeType: [ + 'x-scheme-handler/x-github-client', + 'x-scheme-handler/x-github-desktop-auth', + // workaround for handling OAuth flow until we figure out what we're doing + // with the development OAuth details + // + // see https://github.com/shiftkey/desktop/issues/72 for more details + 'x-scheme-handler/x-github-desktop-dev-auth', + ], + maintainer: 'Brendan Forster ', +} + +export async function packageDebian(): Promise { + if (process.platform === 'win32') { + return Promise.reject('Windows is not supported') + } + + const installer = require('electron-installer-debian') + + await installer(options) + const installersPath = `${distRoot}/github-desktop*.deb` + + const files = await globPromise(installersPath) + + if (files.length !== 1) { + return Promise.reject( + `Expected one file but instead found '${files.join(', ')}' - exiting...` + ) + } + + const oldPath = files[0] + + const newFileName = `GitHubDesktop-linux-${getVersion()}.deb` + const newPath = join(distRoot, newFileName) + await rename(oldPath, newPath) + + return Promise.resolve(newPath) +} diff --git a/script/package-electron-builder.ts b/script/package-electron-builder.ts new file mode 100644 index 00000000000..daba1973377 --- /dev/null +++ b/script/package-electron-builder.ts @@ -0,0 +1,68 @@ +/* eslint-disable no-sync */ + +import * as path from 'path' +import * as cp from 'child_process' +import { promisify } from 'util' + +import glob = require('glob') +const globPromise = promisify(glob) + +import { getDistPath, getDistRoot } from './dist-info' + +export async function packageElectronBuilder(): Promise> { + const distPath = getDistPath() + const distRoot = getDistRoot() + + const electronBuilder = path.resolve( + __dirname, + '..', + 'node_modules', + '.bin', + 'electron-builder' + ) + + const configPath = path.resolve(__dirname, 'electron-builder-linux.yml') + + const args = [ + 'build', + '--prepackaged', + distPath, + '--x64', + '--config', + configPath, + ] + + const { error } = cp.spawnSync(electronBuilder, args, { stdio: 'inherit' }) + + if (error != null) { + return Promise.reject(error) + } + + const appImageInstaller = `${distRoot}/GitHubDesktop-linux-*.AppImage` + + let files = await globPromise(appImageInstaller) + if (files.length !== 1) { + return Promise.reject( + `Expected one AppImage installer but instead found '${files.join( + ', ' + )}' - exiting...` + ) + } + + const appImageInstallerPath = files[0] + + const rpmInstaller = `${distRoot}/GitHubDesktop-linux-*.rpm` + + files = await globPromise(rpmInstaller) + if (files.length !== 1) { + return Promise.reject( + `Expected one RPM installer but instead found '${files.join( + ', ' + )}' - exiting...` + ) + } + + const rpmInstallerPath = files[0] + + return Promise.resolve([appImageInstallerPath, rpmInstallerPath]) +} diff --git a/script/package.ts b/script/package.ts index 767189415b7..72cfadafa60 100644 --- a/script/package.ts +++ b/script/package.ts @@ -1,14 +1,13 @@ /* eslint-disable no-sync */ import * as cp from 'child_process' -import { chmodSync, createReadStream } from 'fs' +import { createReadStream } from 'fs' import { writeFile } from 'fs/promises' +import { pathExists, chmod } from 'fs-extra' import * as path from 'path' import * as electronInstaller from 'electron-winstaller' import * as crypto from 'crypto' -import glob = require('glob') - import { getProductName, getCompanyName } from '../app/package-info' import { getDistPath, @@ -30,7 +29,9 @@ import { getVersion } from '../app/package-info' import { rename } from 'fs/promises' import { join } from 'path' import { assertNonNullable } from '../app/src/lib/fatal-error' -import { pathExistsSync } from 'fs-extra' + +import { packageElectronBuilder } from './package-electron-builder' +import { packageDebian } from './package-debian' const distPath = getDistPath() const productName = getProductName() @@ -187,69 +188,46 @@ function getSha256Checksum(fullPath: string): Promise { }) } -function generateChecksums() { +async function generateChecksums(files: Array) { const distRoot = getDistRoot() - const installersPath = `${distRoot}/GitHubDesktop-linux-*` - - glob(installersPath, async (error, files) => { - if (error != null) { - throw error - } - - const checksums = new Map() + const checksums = new Map() - for (const f of files) { - const checksum = await getSha256Checksum(f) - checksums.set(f, checksum) - } + for (const f of files) { + const checksum = await getSha256Checksum(f) + checksums.set(f, checksum) + } - let checksumsText = `Checksums: \n` + let checksumsText = `Checksums: \n` - for (const [fullPath, checksum] of checksums) { - const fileName = path.basename(fullPath) - checksumsText += `${checksum} - ${fileName}\n` - } + for (const [fullPath, checksum] of checksums) { + const fileName = path.basename(fullPath) + checksumsText += `${checksum} - ${fileName}\n` + } - const checksumFile = path.join(distRoot, 'checksums.txt') + const checksumFile = path.join(distRoot, 'checksums.txt') - await writeFile(checksumFile, checksumsText) - }) + await writeFile(checksumFile, checksumsText) } -function packageLinux() { +async function packageLinux() { const helperPath = path.join(getDistPath(), 'chrome-sandbox') - const exists = pathExistsSync(helperPath) + const exists = await pathExists(helperPath) if (exists) { console.log('Updating file mode for chrome-sandbox…') - chmodSync(helperPath, 0o4755) + await chmod(helperPath, 0o4755) } - const electronBuilder = path.resolve( - __dirname, - '..', - 'node_modules', - '.bin', - 'electron-builder' - ) - - const configPath = path.resolve(__dirname, 'electron-builder-linux.yml') - - const args = [ - 'build', - '--prepackaged', - distPath, - '--x64', - '--config', - configPath, - ] + const files = await packageElectronBuilder() + const debianPackage = await packageDebian() - const { error } = cp.spawnSync(electronBuilder, args, { stdio: 'inherit' }) + const installers = [...files, debianPackage] - if (error != null) { - throw error + console.log(`Installers created:`) + for (const installer of installers) { + console.log(` - ${installer}`) } - generateChecksums() + generateChecksums(installers) } diff --git a/script/linux-after-install.sh b/script/resources/deb/postinst.sh old mode 100644 new mode 100755 similarity index 94% rename from script/linux-after-install.sh rename to script/resources/deb/postinst.sh index 204b930b83d..79081967042 --- a/script/linux-after-install.sh +++ b/script/resources/deb/postinst.sh @@ -3,7 +3,7 @@ set -e PROFILE_D_FILE="/etc/profile.d/github-desktop.sh" -INSTALL_DIR="/opt/${productFilename}" +INSTALL_DIR="/usr/lib/github-desktop" CLI_DIR="$INSTALL_DIR/resources/app/static" case "$1" in @@ -30,4 +30,4 @@ case "$1" in ;; esac -exit 0 \ No newline at end of file +exit 0 diff --git a/script/linux-after-remove.sh b/script/resources/deb/postrm.sh old mode 100644 new mode 100755 similarity index 100% rename from script/linux-after-remove.sh rename to script/resources/deb/postrm.sh diff --git a/yarn.lock b/yarn.lock index 4602d399ceb..abad00e1c6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -969,6 +969,13 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@malept/cross-spawn-promise@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.0.tgz#258fde4098f5004a56db67c35f33033af64810f6" + integrity sha512-GeIK5rfU1Yd7BZJQPTGZMMmcZy5nhRToPXZcjaDwQDRSewdhp648GT2E4dh+L7+Io7AOW6WQ+GR44QSzja4qxg== + dependencies: + cross-spawn "^7.0.1" + "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" @@ -2854,7 +2861,7 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -2975,6 +2982,15 @@ clean-css@^5.2.2: dependencies: source-map "~0.6.0" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -3175,7 +3191,16 @@ cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" + integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3286,6 +3311,11 @@ debuglog@^1.0.1: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" @@ -3564,6 +3594,34 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-installer-common@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.1.tgz#42738f140c15270758681ac3f32039430b9fc023" + integrity sha512-d9gEXhfSSyMn8mkFNdbUdkqdLkxVZ8nO3NDso3nuSnG1+wy7cJuuCjutwR4+zsXdQuNFC1n/DxpTk4pBLZSCTQ== + dependencies: + "@malept/cross-spawn-promise" "^1.0.0" + asar "^2.0.1" + debug "^4.1.1" + fs-extra "^8.0.1" + glob "^7.1.4" + lodash "^4.17.15" + parse-author "^2.0.0" + semver "^7.1.1" + tmp-promise "^2.0.1" + +electron-installer-debian@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.0.0.tgz#abd76db8e89bc1ba1e5366975a941461dda06e6d" + integrity sha512-91iiicfK5hq6D6Xit7SFCN2GpccFBQbZB1JpYaxFdaueEjM/1hSULtCPf4e5w/2vQKZ73AfBZrxxIJqO3DhGPw== + dependencies: + debug "^4.1.1" + electron-installer-common "^0.10.0" + fs-extra "^8.0.1" + get-folder-size "^2.0.1" + lodash "^4.17.4" + word-wrap "^1.2.3" + yargs "^15.0.1" + electron-packager@^17.1.1: version "17.1.1" resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-17.1.1.tgz#f156fc63d3a66f4e902e4b42992550a172982d59" @@ -4652,7 +4710,7 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^8.1.0: +fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -4744,16 +4802,29 @@ galactus@^0.2.1: flora-colossus "^1.0.0" fs-extra "^4.0.0" +gar@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" + integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.5: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-folder-size@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/get-folder-size/-/get-folder-size-2.0.1.tgz#3fe0524dd3bad05257ef1311331417bcd020a497" + integrity sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA== + dependencies: + gar "^1.0.4" + tiny-each-async "2.0.3" + get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" @@ -6703,11 +6774,16 @@ lodash.upperfirst@4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +lodash@^4.17.19: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -8014,6 +8090,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -8110,6 +8191,13 @@ rimraf@^2.5.2: dependencies: glob "^7.0.5" +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -8265,13 +8353,25 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.5.0: +semver@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" + integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== + +semver@^7.1.3, semver@^7.3.2, semver@^7.5.0: version "7.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" +semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" @@ -8322,6 +8422,11 @@ serve-static@1.14.2: parseurl "~1.3.3" send "0.17.2" +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + set-function-length@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" @@ -8931,6 +9036,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +tiny-each-async@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tiny-each-async/-/tiny-each-async-2.0.3.tgz#8ebbbfd6d6295f1370003fbb37162afe5a0a51d1" + integrity sha1-jru/1tYpXxNwAD+7NxYq/loKUdE= + titleize@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" @@ -8944,6 +9054,13 @@ tmp-promise@^1.0.5: bluebird "^3.5.0" tmp "0.0.33" +tmp-promise@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-2.0.2.tgz#ee605edb10f100954be5dd8b9dbe1bfd56194202" + integrity sha512-zl71nFWjPKW2KXs+73gEk8RmqvtAeXPxhWDkTUoa3MSMkjq3I+9OeknjF178MQoMYsdqL730hfzvNfEkePxq9Q== + dependencies: + tmp "0.1.0" + tmp@0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -8951,6 +9068,13 @@ tmp@0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -9623,6 +9747,11 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + which-typed-array@^1.1.11: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" @@ -9669,6 +9798,11 @@ window-location-origin@^0.1.0: resolved "https://registry.yarnpkg.com/window-location-origin/-/window-location-origin-0.1.0.tgz#e0a0b3cbe8802c4966b358f859315355d3a15e04" integrity sha1-4KCzy+iALElms1j4WTFTVdOhXgQ= +word-wrap@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + worker-farm@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.1.tgz#8e9f4a7da4f3c595aa600903051b969390423fa1" @@ -9677,6 +9811,15 @@ worker-farm@^1.3.1: errno "^0.1.4" xtend "^4.0.1" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -9750,6 +9893,11 @@ xvfb-maybe@^0.2.1: debug "^2.2.0" which "^1.2.4" +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -9777,11 +9925,36 @@ yaml@^1.4.0: dependencies: "@babel/runtime" "^7.3.4" +yargs-parser@^18.1.1: + version "18.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" + integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs@^15.0.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.1" + yargs@^17.3.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" From 5d6221900bdb4d76cf8a6cdd0aef2036802c8a0b Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 17 May 2020 14:42:40 -0300 Subject: [PATCH 11/97] move redhat packaging out to own step (#273) --- package.json | 3 +- script/electron-builder-linux.yml | 1 - script/package-electron-builder.ts | 17 +---- script/package-redhat.ts | 102 +++++++++++++++++++++++++++++ script/package.ts | 22 ++++--- script/resources/rpm/post.sh | 12 ++++ script/resources/rpm/preun.sh | 8 +++ yarn.lock | 29 ++++++++ 8 files changed, 169 insertions(+), 25 deletions(-) create mode 100644 script/package-redhat.ts create mode 100755 script/resources/rpm/post.sh create mode 100755 script/resources/rpm/preun.sh diff --git a/package.json b/package.json index 5de0a137560..84eb6a0946c 100644 --- a/package.json +++ b/package.json @@ -168,6 +168,7 @@ "tsconfig-paths": "^3.9.0" }, "optionalDependencies": { - "electron-installer-debian": "3.0.0" + "electron-installer-debian": "3.0.0", + "electron-installer-redhat": "3.0.0" } } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index c034288add1..4243b4961b3 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -7,7 +7,6 @@ linux: - x-scheme-handler/x-github-client - x-scheme-handler/x-github-desktop-auth target: - - rpm - AppImage maintainer: 'GitHub, Inc ' rpm: diff --git a/script/package-electron-builder.ts b/script/package-electron-builder.ts index daba1973377..7b26f48b2b5 100644 --- a/script/package-electron-builder.ts +++ b/script/package-electron-builder.ts @@ -40,7 +40,7 @@ export async function packageElectronBuilder(): Promise> { const appImageInstaller = `${distRoot}/GitHubDesktop-linux-*.AppImage` - let files = await globPromise(appImageInstaller) + const files = await globPromise(appImageInstaller) if (files.length !== 1) { return Promise.reject( `Expected one AppImage installer but instead found '${files.join( @@ -51,18 +51,5 @@ export async function packageElectronBuilder(): Promise> { const appImageInstallerPath = files[0] - const rpmInstaller = `${distRoot}/GitHubDesktop-linux-*.rpm` - - files = await globPromise(rpmInstaller) - if (files.length !== 1) { - return Promise.reject( - `Expected one RPM installer but instead found '${files.join( - ', ' - )}' - exiting...` - ) - } - - const rpmInstallerPath = files[0] - - return Promise.resolve([appImageInstallerPath, rpmInstallerPath]) + return Promise.resolve([appImageInstallerPath]) } diff --git a/script/package-redhat.ts b/script/package-redhat.ts new file mode 100644 index 00000000000..4903be3811d --- /dev/null +++ b/script/package-redhat.ts @@ -0,0 +1,102 @@ +import { promisify } from 'util' +import { join } from 'path' + +import glob = require('glob') +const globPromise = promisify(glob) + +import { rename } from 'fs-extra' + +import { getVersion } from '../app/package-info' +import { getDistPath, getDistRoot } from './dist-info' + +const distRoot = getDistRoot() + +// best guess based on documentation +type RedhatOptions = { + // required + src: string + dest: string + arch: 'x86_64' + // optional + description?: string + productDescription?: string + categories?: Array + icon?: any + scripts?: { + pre?: string + post?: string + preun?: string + postun?: string + } + homepage?: string + mimeType?: Array + requires?: Array +} + +const options: RedhatOptions = { + src: getDistPath(), + dest: distRoot, + arch: 'x86_64', + description: 'Simple collaboration from your desktop', + productDescription: + 'This is the unofficial port of GitHub Desktop for Linux distributions', + categories: ['GNOME', 'GTK', 'Development'], + requires: [ + // default Electron dependencies + 'libXScrnSaver', + 'libappindicator', + 'libX11-xcb', + 'alsa-lib', + // dugite-native dependencies + 'libcurl', + // keytar dependencies + 'libsecret', + 'gnome-keyring', + ], + icon: { + '256x256': 'app/static/logos/256x256.png', + '512x512': 'app/static/logos/512x512.png', + '1024x1024': 'app/static/logos/1024x1024.png', + }, + scripts: { + post: 'script/resources/rpm/post.sh', + preun: 'script/resources/rpm/preun.sh', + }, + homepage: 'https://github.com/shiftkey/desktop', + mimeType: [ + 'x-scheme-handler/x-github-client', + 'x-scheme-handler/x-github-desktop-auth', + // workaround for handling OAuth flow until we figure out what we're doing + // with the development OAuth details + // + // see https://github.com/shiftkey/desktop/issues/72 for more details + 'x-scheme-handler/x-github-desktop-dev-auth', + ], +} + +export async function packageRedhat(): Promise { + if (process.platform === 'win32') { + return Promise.reject('Windows is not supported') + } + + const installer = require('electron-installer-redhat') + + await installer(options) + const installersPath = `${distRoot}/github-desktop*.rpm` + + const files = await globPromise(installersPath) + + if (files.length !== 1) { + return Promise.reject( + `Expected one file but instead found '${files.join(', ')}' - exiting...` + ) + } + + const oldPath = files[0] + + const newFileName = `GitHubDesktop-linux-${getVersion()}.rpm` + const newPath = join(distRoot, newFileName) + await rename(oldPath, newPath) + + return Promise.resolve(newPath) +} diff --git a/script/package.ts b/script/package.ts index 72cfadafa60..26a54dd8484 100644 --- a/script/package.ts +++ b/script/package.ts @@ -32,6 +32,7 @@ import { assertNonNullable } from '../app/src/lib/fatal-error' import { packageElectronBuilder } from './package-electron-builder' import { packageDebian } from './package-debian' +import { packageRedhat } from './package-redhat' const distPath = getDistPath() const productName = getProductName() @@ -218,16 +219,21 @@ async function packageLinux() { console.log('Updating file mode for chrome-sandbox…') await chmod(helperPath, 0o4755) } + try { + const files = await packageElectronBuilder() + const debianPackage = await packageDebian() + const redhatPackage = await packageRedhat() - const files = await packageElectronBuilder() - const debianPackage = await packageDebian() + const installers = [...files, debianPackage, redhatPackage] - const installers = [...files, debianPackage] + console.log(`Installers created:`) + for (const installer of installers) { + console.log(` - ${installer}`) + } - console.log(`Installers created:`) - for (const installer of installers) { - console.log(` - ${installer}`) + generateChecksums(installers) + } catch (err) { + console.error('A problem occurred with the packaging step', err) + process.exit(1) } - - generateChecksums(installers) } diff --git a/script/resources/rpm/post.sh b/script/resources/rpm/post.sh new file mode 100755 index 00000000000..092c75b9d26 --- /dev/null +++ b/script/resources/rpm/post.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +INSTALL_DIR="/usr/lib/github-desktop" +CLI_DIR="$INSTALL_DIR/resources/app/static" + +# add executable permissions for CLI interface +chmod +x "$CLI_DIR"/github || : + +# create symbolic links to /usr/bin directory +ln -f -s "$CLI_DIR"/github /usr/bin || : + +exit 0 diff --git a/script/resources/rpm/preun.sh b/script/resources/rpm/preun.sh new file mode 100755 index 00000000000..fdb0a748a34 --- /dev/null +++ b/script/resources/rpm/preun.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +BASE_FILE="/usr/bin/github" + +# remove symbolic links in /usr/bin directory +test -f ${BASE_FILE} && unlink ${BASE_FILE} + +exit 0 diff --git a/yarn.lock b/yarn.lock index abad00e1c6b..ffc2be4ce9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3622,6 +3622,18 @@ electron-installer-debian@3.0.0: word-wrap "^1.2.3" yargs "^15.0.1" +electron-installer-redhat@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.0.0.tgz#0a066eb9f9b3e691d58c2b41eea1055e8d5ffa92" + integrity sha512-BtYh174AOIGq0iDges4/fihqJYw8WsWXRKuRpKvUlkqrwfeGMWqln28+kKV5IW6GPfHjRFeCO5dcMUioUDBo1A== + dependencies: + debug "^4.1.1" + electron-installer-common "^0.10.0" + fs-extra "^8.1.0" + lodash "^4.17.15" + word-wrap "^1.2.3" + yargs "^15.1.0" + electron-packager@^17.1.1: version "17.1.1" resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-17.1.1.tgz#f156fc63d3a66f4e902e4b42992550a172982d59" @@ -9955,6 +9967,23 @@ yargs@^15.0.1: y18n "^4.0.0" yargs-parser "^18.1.1" +yargs@^15.1.0: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + yargs@^17.3.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" From c93caef4088bd1c25224c937a7f428602956b097 Mon Sep 17 00:00:00 2001 From: Lukas Neubert <40118727+Serkonda@users.noreply.github.com> Date: Sat, 30 May 2020 22:14:50 +0200 Subject: [PATCH 12/97] readme: add language property to code blocks (#287) --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1cb904c65f7..355c3a1899b 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ the installers for Debian and RPM-based distributions. To setup the package repository, run these commands: -``` +```sh $ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo apt-key add - $ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftky-desktop.list' $ sudo apt-get update @@ -49,7 +49,7 @@ $ sudo apt-get update Then install GitHub Desktop: -``` +```sh $ sudo apt install github-desktop ``` @@ -57,16 +57,17 @@ $ sudo apt install github-desktop To setup the package repository, run these commands: -``` +```sh $ sudo rpm --import https://packagecloud.io/shiftkey/desktop/gpgkey $ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://packagecloud.io/shiftkey/desktop/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' ``` Then install GitHub Desktop: -``` +```sh # if yum is your package manager $ sudo yum install github-desktop + # if dnf is your package manager $ sudo dnf install github-desktop ``` From 2095d7aae18763943eaadc9daacacaaee8676330 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 31 May 2020 10:10:54 -0300 Subject: [PATCH 13/97] wire up sponsorship details for the repository --- .github/FUNDING.yml | 1 + README.md | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000000..6905d384f6a --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: shiftkey diff --git a/README.md b/README.md index 355c3a1899b..009033b41e5 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,10 @@ help out with testing on your distribution. ## packagecloud -We are trialing using [PackageCloud](https://packagecloud.io/) for distributing -the installers for Debian and RPM-based distributions. +We use [PackageCloud](https://packagecloud.io/) for distributing +the installers for Debian and RPM-based distributions. These are not free services, +so if you can afford to help with these costs please [**Sponsor**](https://github.com/sponsors/shiftkey) +the project using the link in the header. ### Debian/Ubuntu distributions From 04fc4213dac977afd533ab5b3599ed949a3717c4 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 24 Jun 2020 13:32:28 -0300 Subject: [PATCH 14/97] drop unnecessary libappindicator dependency for RPM package (#300) --- script/package-redhat.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 4903be3811d..fdf617d0a92 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -44,7 +44,6 @@ const options: RedhatOptions = { requires: [ // default Electron dependencies 'libXScrnSaver', - 'libappindicator', 'libX11-xcb', 'alsa-lib', // dugite-native dependencies From a6a8ca12bb56dee44815592dc2a301515c29c0b0 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 24 Jun 2020 13:51:38 -0300 Subject: [PATCH 15/97] run codeql on linux branch (#302) --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 3be1aff3bfc..7742c493b9b 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -2,7 +2,7 @@ name: 'Code scanning - action' on: push: - branches: ['development'] + branches: ['development', 'linux'] pull_request: branches: ['development'] schedule: From 6ace9371d16299a962b1a85f1acbb226de257842 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 27 Jul 2020 14:42:15 -0300 Subject: [PATCH 16/97] add in libcurl4 as optional dependency for RPM (#315) --- script/package-redhat.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/package-redhat.ts b/script/package-redhat.ts index fdf617d0a92..939e576acdf 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -47,7 +47,7 @@ const options: RedhatOptions = { 'libX11-xcb', 'alsa-lib', // dugite-native dependencies - 'libcurl', + '(libcurl or libcurl4)', // keytar dependencies 'libsecret', 'gnome-keyring', From d4a06f33e661d6feea0d468c63215ef0bd0fb4ad Mon Sep 17 00:00:00 2001 From: Dan McCarthy Date: Tue, 4 Aug 2020 07:00:32 -0500 Subject: [PATCH 17/97] allow tilde character when specifying a local repository (#316) There already exists a function that will convert a tilde path to an absolute path. It was originally used for this purpose, but the functionality was removed during a commit that changed which function was used to validate git repositories. This reinstates that functionality and allows us to type a ~/ tilde path to get our home directories when typing in a path. --- app/src/ui/add-repository/add-existing-repository.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/ui/add-repository/add-existing-repository.tsx b/app/src/ui/add-repository/add-existing-repository.tsx index 00ef8968bdc..2c97ae7e557 100644 --- a/app/src/ui/add-repository/add-existing-repository.tsx +++ b/app/src/ui/add-repository/add-existing-repository.tsx @@ -16,6 +16,7 @@ import { showOpenDialog } from '../main-process-proxy' import { Ref } from '../lib/ref' import { InputError } from '../lib/input-description/input-error' import { IAccessibleMessage } from '../../models/accessible-message' +import { isGitRepository } from './create-repository' interface IAddExistingRepositoryProps { readonly dispatcher: Dispatcher @@ -277,9 +278,9 @@ export class AddExistingRepository extends React.Component< } private onPathChanged = async (path: string) => { - if (this.state.path !== path) { - this.updatePath(path) - } + const isRepository = await isGitRepository(this.resolvedPath(path)) + + this.setState({ path, isRepository }) } private showFilePicker = async () => { From 25c4654f8a1b6eeef5dd0f9194401bdcd436c21a Mon Sep 17 00:00:00 2001 From: KrisAphalon Date: Sat, 24 Oct 2020 22:48:15 +0200 Subject: [PATCH 18/97] remove deprecated apt-key from installation setup (#354) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 009033b41e5..18226e8b4f0 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ the project using the link in the header. To setup the package repository, run these commands: ```sh -$ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo apt-key add - +$ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null $ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftky-desktop.list' $ sudo apt-get update ``` From e02616c494d1b70e2ef1a8e38c899a68ef4d6dae Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 5 Nov 2020 23:23:08 -0400 Subject: [PATCH 19/97] add optional x11 dependency for SUSE-based distributions (#369) --- script/package-redhat.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 939e576acdf..6afc79c6fec 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -44,7 +44,7 @@ const options: RedhatOptions = { requires: [ // default Electron dependencies 'libXScrnSaver', - 'libX11-xcb', + '(libX11-xcb or libX11-xcb1)', 'alsa-lib', // dugite-native dependencies '(libcurl or libcurl4)', From 22f0aa8e88c9c4e614ce3224034c0471dbfb8e2e Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 17 Dec 2020 15:03:36 -0400 Subject: [PATCH 20/97] align CI with the upstream settings for Actions (#393) --- .github/workflows/ci.yml | 83 +++++++--------------------------------- 1 file changed, 14 insertions(+), 69 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4fcb1410ddd..4156ab9cae1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,38 +4,14 @@ on: push: branches: - development + - linux + - 'linux-release-*' + tags: + - 'release-*.*.*-linux*' pull_request: - workflow_call: - inputs: - repository: - default: desktop/desktop - required: false - type: string - ref: - required: true - type: string - upload-artifacts: - default: false - required: false - type: boolean - environment: - type: string - required: true - sign: - type: boolean - default: true - required: false - secrets: - AZURE_CODE_SIGNING_TENANT_ID: - AZURE_CODE_SIGNING_CLIENT_ID: - AZURE_CODE_SIGNING_CLIENT_SECRET: - DESKTOP_OAUTH_CLIENT_ID: - DESKTOP_OAUTH_CLIENT_SECRET: - APPLE_ID: - APPLE_ID_PASSWORD: - APPLE_TEAM_ID: - APPLE_APPLICATION_CERT: - APPLE_APPLICATION_CERT_PASSWORD: + branches: + - linux + - 'linux-release-*' env: NODE_VERSION: 18.16.1 @@ -70,13 +46,18 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13-xl-arm64, windows-2019] + os: [macos-13, windows-2019, ubuntu-20.04] arch: [x64, arm64] include: - - os: macos-13-xl-arm64 + - os: macos-13 friendlyName: macOS - os: windows-2019 friendlyName: Windows + - os: ubuntu-20.04 + friendlyName: Ubuntu + exclude: + - os: ubuntu-20.04 + arch: arm64 timeout-minutes: 60 env: RELEASE_CHANNEL: ${{ inputs.environment }} @@ -109,14 +90,6 @@ jobs: - name: Build production app run: yarn build:prod env: - DESKTOP_OAUTH_CLIENT_ID: ${{ secrets.DESKTOP_OAUTH_CLIENT_ID }} - DESKTOP_OAUTH_CLIENT_SECRET: - ${{ secrets.DESKTOP_OAUTH_CLIENT_SECRET }} - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} - APPLE_APPLICATION_CERT: ${{ secrets.APPLE_APPLICATION_CERT }} - KEY_PASSWORD: ${{ secrets.APPLE_APPLICATION_CERT_PASSWORD }} npm_config_arch: ${{ matrix.arch }} TARGET_ARCH: ${{ matrix.arch }} - name: Prepare testing environment @@ -130,31 +103,3 @@ jobs: - name: Run script tests if: matrix.arch == 'x64' run: yarn test:script - - name: Install Azure Code Signing Client - if: ${{ runner.os == 'Windows' && inputs.sign }} - run: | - $acsZip = Join-Path $env:RUNNER_TEMP "acs.zip" - $acsDir = Join-Path $env:RUNNER_TEMP "acs" - Invoke-WebRequest -Uri https://www.nuget.org/api/v2/package/Azure.CodeSigning.Client/1.0.38 -OutFile $acsZip -Verbose - Expand-Archive $acsZip -Destination $acsDir -Force -Verbose - # Replace ancient signtool in electron-winstall with one that supports ACS - Copy-Item -Path "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\*" -Include signtool.exe,signtool.exe.manifest,Microsoft.Windows.Build.Signing.mssign32.dll.manifest,mssign32.dll,Microsoft.Windows.Build.Signing.wintrust.dll.manifest,wintrust.dll,Microsoft.Windows.Build.Appx.AppxSip.dll.manifest,AppxSip.dll,Microsoft.Windows.Build.Appx.AppxPackaging.dll.manifest,AppxPackaging.dll,Microsoft.Windows.Build.Appx.OpcServices.dll.manifest,OpcServices.dll -Destination "node_modules\electron-winstaller\vendor" -Verbose - - name: Package production app - run: yarn package - env: - npm_config_arch: ${{ matrix.arch }} - AZURE_TENANT_ID: ${{ secrets.AZURE_CODE_SIGNING_TENANT_ID }} - AZURE_CLIENT_ID: ${{ secrets.AZURE_CODE_SIGNING_CLIENT_ID }} - AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CODE_SIGNING_CLIENT_SECRET }} - - name: Upload artifacts - uses: actions/upload-artifact@v3 - if: ${{ inputs.upload-artifacts }} - with: - name: ${{matrix.friendlyName}}-${{matrix.arch}} - path: | - dist/GitHub Desktop-${{matrix.arch}}.zip - dist/GitHubDesktop-*.nupkg - dist/GitHubDesktopSetup-${{matrix.arch}}.exe - dist/GitHubDesktopSetup-${{matrix.arch}}.msi - dist/bundle-size.json - if-no-files-found: error From bf3b649d5a1d6278a3fb8b6ba1aad8a9dcda0712 Mon Sep 17 00:00:00 2001 From: Kevin Evans Date: Sun, 27 Dec 2020 07:23:30 -0800 Subject: [PATCH 21/97] Add smaller icons (#395) --- app/static/logos/128x128.png | Bin 0 -> 25377 bytes app/static/logos/32x32.png | Bin 0 -> 5333 bytes app/static/logos/64x64.png | Bin 0 -> 13966 bytes script/package-debian.ts | 3 +++ script/package-redhat.ts | 3 +++ 5 files changed, 6 insertions(+) create mode 100644 app/static/logos/128x128.png create mode 100644 app/static/logos/32x32.png create mode 100644 app/static/logos/64x64.png diff --git a/app/static/logos/128x128.png b/app/static/logos/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..97432b294a45b95a47ef38219a850bbf4ef01da9 GIT binary patch literal 25377 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 literal 0 HcmV?d00001 diff --git a/app/static/logos/64x64.png b/app/static/logos/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8d61b8efc7b6ece2b8333ef18cd631e75ef80f GIT binary patch literal 13966 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 literal 0 HcmV?d00001 diff --git a/script/package-debian.ts b/script/package-debian.ts index b6df4eb96f3..82f1bb775a8 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -57,6 +57,9 @@ const options: DebianOptions = { 'gnome-keyring', ], icon: { + '32x32': 'app/static/logos/32x32.png', + '64x64': 'app/static/logos/64x64.png', + '128x128': 'app/static/logos/128x128.png', '256x256': 'app/static/logos/256x256.png', '512x512': 'app/static/logos/512x512.png', '1024x1024': 'app/static/logos/1024x1024.png', diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 6afc79c6fec..405c435f924 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -53,6 +53,9 @@ const options: RedhatOptions = { 'gnome-keyring', ], icon: { + '32x32': 'app/static/logos/32x32.png', + '64x64': 'app/static/logos/64x64.png', + '128x128': 'app/static/logos/128x128.png', '256x256': 'app/static/logos/256x256.png', '512x512': 'app/static/logos/512x512.png', '1024x1024': 'app/static/logos/1024x1024.png', From d6f003ed6d8ed2eaf73e58458a70cf2618f2cc4e Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 24 Jan 2021 21:37:38 -0400 Subject: [PATCH 22/97] update tooling dependencies (#424) --- package.json | 4 +- script/electron-builder-linux.yml | 4 - script/package-debian.ts | 4 - script/package-redhat.ts | 4 - yarn.lock | 150 ++++++++++++++++++++++-------- 5 files changed, 111 insertions(+), 55 deletions(-) diff --git a/package.json b/package.json index 84eb6a0946c..d492989d86a 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,7 @@ "tsconfig-paths": "^3.9.0" }, "optionalDependencies": { - "electron-installer-debian": "3.0.0", - "electron-installer-redhat": "3.0.0" + "electron-installer-debian": "3.1.0", + "electron-installer-redhat": "3.2.0" } } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index 4243b4961b3..25d83af6cf4 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -11,10 +11,6 @@ linux: maintainer: 'GitHub, Inc ' rpm: depends: - # default Electron dependencies - - libXScrnSaver - - libappindicator - - libnotify # dugite-native dependencies - libcurl # keytar dependencies diff --git a/script/package-debian.ts b/script/package-debian.ts index 82f1bb775a8..35402cafaf2 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -47,10 +47,6 @@ const options: DebianOptions = { priority: 'extra', homepage: 'https://github.com/shiftkey/desktop', depends: [ - // additional core dependencies - are these still needed? - 'gconf2', - 'gconf-service', - 'libappindicator1', // Desktop-specific dependencies 'libcurl3 | libcurl4', 'libsecret-1-0', diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 405c435f924..3b5a55b8a25 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -42,10 +42,6 @@ const options: RedhatOptions = { 'This is the unofficial port of GitHub Desktop for Linux distributions', categories: ['GNOME', 'GTK', 'Development'], requires: [ - // default Electron dependencies - 'libXScrnSaver', - '(libX11-xcb or libX11-xcb1)', - 'alsa-lib', // dugite-native dependencies '(libcurl or libcurl4)', // keytar dependencies diff --git a/yarn.lock b/yarn.lock index ffc2be4ce9d..7af151ce2db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1236,6 +1236,13 @@ dependencies: "@types/node" "*" +"@types/fs-extra@^9.0.1": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + "@types/fuzzaldrin-plus@^0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@types/fuzzaldrin-plus/-/fuzzaldrin-plus-0.0.1.tgz#bfe5e25bc5b4066848171baf7a8aaf30e267d30a" @@ -1250,6 +1257,14 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/glob@^7.1.1": + 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" "*" + "@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" @@ -2492,6 +2507,18 @@ asar@^2.0.1: mkdirp "^0.5.1" tmp-promise "^1.0.5" +asar@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221" + integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -3292,7 +3319,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.3.1, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3306,6 +3333,27 @@ debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" + integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^4.3.2: + 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" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -3594,42 +3642,46 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-installer-common@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.1.tgz#42738f140c15270758681ac3f32039430b9fc023" - integrity sha512-d9gEXhfSSyMn8mkFNdbUdkqdLkxVZ8nO3NDso3nuSnG1+wy7cJuuCjutwR4+zsXdQuNFC1n/DxpTk4pBLZSCTQ== +electron-installer-common@^0.10.2: + version "0.10.3" + resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.3.tgz#40f9db644ca60eb28673d545b67ee0113aef4444" + integrity sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA== dependencies: "@malept/cross-spawn-promise" "^1.0.0" - asar "^2.0.1" + asar "^3.0.0" debug "^4.1.1" - fs-extra "^8.0.1" + fs-extra "^9.0.0" glob "^7.1.4" lodash "^4.17.15" parse-author "^2.0.0" semver "^7.1.1" - tmp-promise "^2.0.1" + tmp-promise "^3.0.2" + optionalDependencies: + "@types/fs-extra" "^9.0.1" -electron-installer-debian@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.0.0.tgz#abd76db8e89bc1ba1e5366975a941461dda06e6d" - integrity sha512-91iiicfK5hq6D6Xit7SFCN2GpccFBQbZB1JpYaxFdaueEjM/1hSULtCPf4e5w/2vQKZ73AfBZrxxIJqO3DhGPw== +electron-installer-debian@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.1.0.tgz#2f6107f559f6564c44e3832fb2942dd8de4d40cc" + integrity sha512-k6KChvx0Fw8XTlCqwwbBfh19yGQaKjGdbugokmr1IpzINOm4QFyACKMTHAYFHW5LCBUZQShZD96hwxUZ+8Kx+w== dependencies: + "@malept/cross-spawn-promise" "^1.0.0" debug "^4.1.1" - electron-installer-common "^0.10.0" - fs-extra "^8.0.1" + electron-installer-common "^0.10.2" + fs-extra "^9.0.0" get-folder-size "^2.0.1" lodash "^4.17.4" word-wrap "^1.2.3" yargs "^15.0.1" -electron-installer-redhat@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.0.0.tgz#0a066eb9f9b3e691d58c2b41eea1055e8d5ffa92" - integrity sha512-BtYh174AOIGq0iDges4/fihqJYw8WsWXRKuRpKvUlkqrwfeGMWqln28+kKV5IW6GPfHjRFeCO5dcMUioUDBo1A== +electron-installer-redhat@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.2.0.tgz#2c0f5da6f4a244453e4675ab1eca0877a66788c5" + integrity sha512-XMA+fQj3ULNVMl4eG+hIvrYITEqP1pfpERvx6kRwuPd06vdtB4KucL9241DAHT0NR5E9gnyJHM9Y6N24kk0mcA== dependencies: + "@malept/cross-spawn-promise" "^1.0.0" debug "^4.1.1" - electron-installer-common "^0.10.0" - fs-extra "^8.1.0" + electron-installer-common "^0.10.2" + fs-extra "^9.0.0" lodash "^4.17.15" word-wrap "^1.2.3" yargs "^15.1.0" @@ -4722,7 +4774,7 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^8.0.1, fs-extra@^8.1.0: +fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -4731,7 +4783,7 @@ fs-extra@^8.0.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.1: +fs-extra@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== @@ -4741,6 +4793,16 @@ fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^1.0.0" +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-monkey@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" @@ -8203,14 +8265,7 @@ rimraf@^2.5.2: dependencies: glob "^7.0.5" -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -8350,7 +8405,12 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@^5.7.2: +"semver@2 || 3 || 4 || 5": + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== + +semver@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -9066,12 +9126,12 @@ tmp-promise@^1.0.5: bluebird "^3.5.0" tmp "0.0.33" -tmp-promise@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-2.0.2.tgz#ee605edb10f100954be5dd8b9dbe1bfd56194202" - integrity sha512-zl71nFWjPKW2KXs+73gEk8RmqvtAeXPxhWDkTUoa3MSMkjq3I+9OeknjF178MQoMYsdqL730hfzvNfEkePxq9Q== +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== dependencies: - tmp "0.1.0" + tmp "^0.2.0" tmp@0.0.33: version "0.0.33" @@ -9080,12 +9140,12 @@ tmp@0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== dependencies: - rimraf "^2.6.3" + rimraf "^3.0.0" tmpl@1.0.5: version "1.0.5" @@ -9945,6 +10005,14 @@ yargs-parser@^18.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" From e8d755b388f7494f0299a183072b5633451602d9 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 15 Feb 2021 10:46:08 -0400 Subject: [PATCH 23/97] run packaging step on Linux builds if all other CI steps pass (#435) --- .github/workflows/ci.yml | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4156ab9cae1..2fb62b7e5c7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,17 +46,17 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-2019, ubuntu-20.04] + os: [macos-13, windows-2019, ubuntu-18.04] arch: [x64, arm64] include: - os: macos-13 friendlyName: macOS - os: windows-2019 friendlyName: Windows - - os: ubuntu-20.04 + - os: ubuntu-18.04 friendlyName: Ubuntu exclude: - - os: ubuntu-20.04 + - os: ubuntu-18.04 arch: arm64 timeout-minutes: 60 env: @@ -103,3 +103,21 @@ jobs: - name: Run script tests if: matrix.arch == 'x64' run: yarn test:script + - name: Package application + run: yarn run package + if: ${{ matrix.os == 'ubuntu-18.04' && matrix.arch == 'x64' }} + - name: Create Release + uses: softprops/action-gh-release@v1 + if: + ${{ matrix.os == 'ubuntu-18.04' && startsWith(github.ref, + 'refs/tags/') }} + with: + files: | + dist/*.AppImage + dist/*.deb + dist/*.rpm + dist/*.txt + draft: true + prerelease: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From f99def56d6fe59bbd1d36594959c6ca382e82897 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 15 Feb 2021 15:11:16 -0400 Subject: [PATCH 24/97] enable dependabot monitoring for specific dependencies in project (#440) --- .github/dependabot.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ca79ca5b4d5..0b10093544d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,3 +4,13 @@ updates: directory: / schedule: interval: weekly + + - package-ecosystem: 'npm' + directory: '/' + open-pull-requests-limit: 5 + schedule: + interval: 'weekly' + allow: + - dependency-name: 'electron-builder' + - dependency-name: 'electron-packager' + - dependency-name: 'electron-installer-*' From adeb09e26cf91d3a43ab61f339e3c38c6fd074dd Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 15 Feb 2021 15:22:09 -0400 Subject: [PATCH 25/97] bump electron-installer-redhat to latest version (#438) --- package.json | 2 +- yarn.lock | 52 +++++++++++++++++++++++++++------------------------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index d492989d86a..46348b289c1 100644 --- a/package.json +++ b/package.json @@ -169,6 +169,6 @@ }, "optionalDependencies": { "electron-installer-debian": "3.1.0", - "electron-installer-redhat": "3.2.0" + "electron-installer-redhat": "3.3.0" } } diff --git a/yarn.lock b/yarn.lock index 7af151ce2db..0685260c7b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3018,6 +3018,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -3673,10 +3682,10 @@ electron-installer-debian@3.1.0: word-wrap "^1.2.3" yargs "^15.0.1" -electron-installer-redhat@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.2.0.tgz#2c0f5da6f4a244453e4675ab1eca0877a66788c5" - integrity sha512-XMA+fQj3ULNVMl4eG+hIvrYITEqP1pfpERvx6kRwuPd06vdtB4KucL9241DAHT0NR5E9gnyJHM9Y6N24kk0mcA== +electron-installer-redhat@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.3.0.tgz#acdb59d13d738c55debc5214114d36096eda1aed" + integrity sha512-hXIXB3uQXmXZy/v3MpbwWN4Of28ALpPt9ZyUDNEoSe0w7QZceL9IqI2K6Q6imiBJCLRC0hmT94WhlKj1RyGOWg== dependencies: "@malept/cross-spawn-promise" "^1.0.0" debug "^4.1.1" @@ -3684,7 +3693,7 @@ electron-installer-redhat@3.2.0: fs-extra "^9.0.0" lodash "^4.17.15" word-wrap "^1.2.3" - yargs "^15.1.0" + yargs "^16.0.2" electron-packager@^17.1.1: version "17.1.1" @@ -10005,13 +10014,10 @@ yargs-parser@^18.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@^20.2.2: + 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-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" @@ -10035,22 +10041,18 @@ yargs@^15.0.1: y18n "^4.0.0" yargs-parser "^18.1.1" -yargs@^15.1.0: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== +yargs@^16.0.2: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" + y18n "^5.0.5" + yargs-parser "^20.2.2" yargs@^17.3.1: version "17.7.2" From cdbf0cb73c7e17310aa73e33c4d29297c8e22846 Mon Sep 17 00:00:00 2001 From: Mrlinkwii Date: Sat, 8 May 2021 22:41:34 +0100 Subject: [PATCH 26/97] add missing MIME type to AppImage package (#496) --- script/electron-builder-linux.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index 25d83af6cf4..a7a35c6f34d 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -6,6 +6,10 @@ linux: mimeTypes: - x-scheme-handler/x-github-client - x-scheme-handler/x-github-desktop-auth + # workaround for handling OAuth flow until we figure out what we're doing + # With the development OAuth details + # see https://github.com/shiftkey/desktop/issues/72 for more details + - x-scheme-handler/x-github-desktop-dev-auth target: - AppImage maintainer: 'GitHub, Inc ' From 9d2478e755259fef7e1a8d3c0153e628266df498 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 22 Jun 2021 14:26:24 -0300 Subject: [PATCH 27/97] add section about known issues and add to Linux section (#537) --- README.md | 5 +++++ docs/known-issues.md | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/README.md b/README.md index 18226e8b4f0..5f84b021e2b 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,11 @@ Arch Linux users can install GitHub Desktop from the `gnome-keyring` is required and the daemon must be launched either at login or when the X server is started. Normally this is handled by a display manager, but in other cases following the instructions found on the [Arch Wiki](https://wiki.archlinux.org/index.php/GNOME/Keyring#Using_the_keyring_outside_GNOME) will fix the issue of not being able to save login credentials. +## Known issues + +If you're having troubles with Desktop, please refer to the [Known issues](docs/known-issues.md#linux) +document for guidance and workarounds for common limitations. + ## More information Please check out the [README](https://github.com/desktop/desktop#github-desktop) diff --git a/docs/known-issues.md b/docs/known-issues.md index 2a8d7b89cbe..6a0eb7938a0 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -11,6 +11,8 @@ - [I get a black screen when launching Desktop](#i-get-a-black-screen-when-launching-desktop) - [Failed to open CA file after an update](#failed-to-open-ca-file-after-an-update) - [Authentication errors due to modified registry entries](#authentication-errors-due-to-modified-registry-entries) +- [Linux](#linux) + - [I get a white screen when launching Desktop](#i-get-a-white-screen-when-launching-desktop) # Known Issues @@ -225,3 +227,11 @@ Related issue: [#15217](https://github.com/desktop/desktop/issues/15217) If you see an error that says "Not enough resources are available to process this command" when signing in to GitHub Desktop, it's likely that you have too many credentials stored in Windows Credentials Manager. **Workaround:** open the Credential Manager application, click on Windows Credentials and go through the list to see if there are some you can delete. + +## Linux + +### I get a white screen when launching Desktop + +Electron enables hardware accelerated graphics by default, but some graphics cards have issues with hardware acceleration which means the application will launch successfully but it will be a white screen. If you are running GitHub Desktop within virtualization software like Parallels Desktop, hardware accelerated graphics may not be available. + +**Workaround:** if you set the `GITHUB_DESKTOP_DISABLE_HARDWARE_ACCELERATION` environment variable to any value and launch Desktop again it will disable hardware acceleration on launch, so the application is usable. From 16ce500e9452f9ed98dba5caa85c61ac07eb56c2 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 6 Jul 2021 16:06:28 -0300 Subject: [PATCH 28/97] drop prerelease: true from release step in workflow (#551) --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2fb62b7e5c7..0a731a0c68d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -118,6 +118,5 @@ jobs: dist/*.rpm dist/*.txt draft: true - prerelease: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 0c655b87ec70ab5aefb011c66c32556ab640483b Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 6 Jul 2021 16:24:46 -0300 Subject: [PATCH 29/97] refresh smaller icons to use new theme (#530) * drop explicit window icon on Linux * drop old icon used in app window * regenerate smaller icons from new 256px source --- app/src/main-process/app-window.ts | 3 --- app/static/linux/icon-logo.png | Bin 118370 -> 0 bytes app/static/logos/128x128.png | Bin 25377 -> 12473 bytes app/static/logos/32x32.png | Bin 5333 -> 1851 bytes app/static/logos/64x64.png | Bin 13966 -> 4779 bytes 5 files changed, 3 deletions(-) delete mode 100644 app/static/linux/icon-logo.png diff --git a/app/src/main-process/app-window.ts b/app/src/main-process/app-window.ts index 9f6137ab7e9..4466a45ca86 100644 --- a/app/src/main-process/app-window.ts +++ b/app/src/main-process/app-window.ts @@ -17,7 +17,6 @@ import { URLActionType } from '../lib/parse-app-url' import { ILaunchStats } from '../lib/stats' import { menuFromElectronMenu } from '../models/app-menu' import { now } from './now' -import * as path from 'path' import windowStateKeeper from 'electron-window-state' import * as ipcMain from './ipc-main' import * as ipcWebContents from './ipc-webcontents' @@ -75,8 +74,6 @@ export class AppWindow { } else if (__WIN32__) { windowOptions.frame = false } else if (__LINUX__) { - windowOptions.icon = path.join(__dirname, 'static', 'icon-logo.png') - // relax restriction here for users trying to run app at a small // resolution and any other side-effects of dropping this restriction are // currently unsupported diff --git a/app/static/linux/icon-logo.png b/app/static/linux/icon-logo.png deleted file mode 100644 index 7e598fe01189e9dc3d1c34bee0d850c54eb71c1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118370 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

dd`1+QBLhMR9?LkaCHw)NK&N^%gW$tI% z9QPWSoqno~eAU8v&EsP2CH4lb>j+^*gFJ=QX-M(uo#POz4fHq?&`4z`=M4M^q)MNZ z22*r1m-F8nzaGXg$3U@vojjF>X8_74to!&A&#T|h3&?+O>0;%{N#1-3xs~_97QWNG zquFY4zu}(x28x`MXQTfPvxABp#>{SGsAsd!kEa91Xy*w<=L{cSz*Rey=7i1Y1bn|8 zbIUon^Rf1CoK*K;iVg+hQXm!i8S_>GV5z@N!x59wFvq>__*R{V--RtjQhw1(eHF#` z%zh`UxZQjurxPX4*j-D?pYZNJddr*hWTAKeWVbfj!hmI?eL+1%;`y`P%IVyApC|1v zzRh3Y?s{~`LY5GXSB}E+{^jGf&F3fj>fuMhOmgQ;au~DVJ;L(PCz^B>#v=s);~?a9TDVqzT;zrmd7|lg&+{E6qFtyU6>}6Kl)cyU%g9X#b$H;_U#B{n9IG|e z`c7)$&{b52GK2C_r_kMVdeC8(gd2#-Kk2^K@!G|n_6X+XKN7QQ^=dM^Ip^~i&n4CU z{2VgRUF*^9y}hd2&sRAE!;ykyaW_veGqcAnIZ6i-(ocls*PCmkIzF@h1jY*xq8xA@ z@@|l)hfX6@bkAo~aogueewpl~k<%zcg1kHS*#To`fN^iny7Rmp6~J{mTbY|(>JRp- z$QsYMoGgFTxpZf4`>g-@yiSl&>nr^{r>OQ>lG}Gh^~mCAkM`I`jpe78a?8!L{#7zk zr%=Zh6ML$oteW4g8p$=Bmt>+Tzt4Pl3*J$~TlR22QDB4(>6D}9?O$d*+ zuy`*d%n5TRURqIn7Q#Up^TL!&(U|;8ryFVk!RrtfKW|cl66NBzPr`(3E; zURC9qpWg~f-?z*clDbx2B?Dapiww_4181LAL<=!7IbY~Ozm-Ng>7^Mk z{ql(JVaZ#0zZ{L$V)53?#(0j=#|W$}tOWFmQ7O;Pi>QY%JY}ucYI!cw zck{MCd6$wreekW(sEwd^Hon&PM|YF8zyhlSE#?5kj=#YtdK})S!^V}9@qcQ1YV@x= z8UE0rp4xWptA5J_@b)je>8oYYmY|rg5}slA&ybnNQnu#zw@~cfzT9A8Bf5jNRaW1X z87dAT$o+!ioc}Md(YRLk0x>e|T~w&OLwy(7?MtrUVg2RXF`Pn$k!kGYzOYgJ8FFQx zBJ@^T$N8h%_uGIG6mW|b1zmjA1jFM0gJv#o(`jeRC~#oAZ;4_yiQN&da|n8I)xbdH zk9MSW-#IZ6!tp}Y0{>G#lBITmj_^mxFCPG#x9L+m#;S7~en#v@B4!Z!Kifi5+$?PF z@;a4?#q>AM(|e8Kr6r&WOV}^oJbDFne^58|(e|)nai|H*7l{xA<5LV69?bW1$`NQs z%%s2^^Ty7poK<#``4&Z7bADwR`4>Xq&H0I0BBIpi{gc|(>f{Qe*_Q1U6)}o5$F9v| z2f}W^b&}jGr^vtf*Py$dMr3?cAqM#Z5bVAc;5dPBQ0ry zPb1m2)VNA)jskV4*H8-)(Ip?L_Wu9(SjKQKD3h8e2rw*(k_^SQ1) ztm9+$x-Z9GE+e+sZFomy8)NQ1i({u&&pw|T`#b%8VA46>q>6X`aYYw#xhcnU8k@|t zG1bziN&dNPcb3K6iNC_dYEiKvS?Gl|fYRr{-QuFKM;!Qq^2ZK<&OF1ezY!;&h@;yO zGbqKX1f%|PSm00a&YKnT#T)mB{KuI@JpOvSylZkQewixk*b zh1b4G3Hv>U+`hh@ROV{GaOssY?d~k_S1`uS@h6-cuwsV4IApbT)uF~+ik)?w!LBvo-ps+Mi=6y$xN=u z$1WoB(MRFES2sc#VE1n+6Q{)F>-m;#moIHP={V|%KqYu|3jX*Yl|>3zqd%~tVRw{i z{R4Cz5E97JGcSyFuzvMOo`+jOyhC%-cyDG3(!9k9x87Cf;mQm$@0VB5Z}t08qmy4f zc5ukDK|Z-QF(hPPI^WhMZARL}_c&lw4NvhcICld|m9P=5WoR=oR?f!chmzo!J5$zC zr^c&gEs3}HjSn`scg2nOxpIE%$KZ6pm6X$k|HspJhBeg%-JXO5Lg>8+B!JSJuOLWE z=!jB85b1~okQV9E5}G1NM^O=ifYOwrQlupyRaCGbAiXFENQY38oEyLI-uukI{K`Ii z&+Iibd)9h0sWb1jcK53^(QrJA_S2%9knmy!;#M$<3RQT$fO5NLT)YbQqj>^uq!MQ&kT9`y?E?;Wt8R|H6R@jkk;EJ*;WG8mqjM;c2(4 z#nAZBT95;l5HMiomOheP4BX~n$ROQ7>a}PYG*M9NBnSk}R@hMT_D`G3R-BMU*~{nQ z%4OQbx|A;kn>7nyY6|;* z0awBO+vgQpWBZ8p429lDn2#m5q?GhFPYpf_L=15zgZ&QIV%rB>zu$h6xUcvaB#rDg z27>yO<*nhhIsM(&^SxgIW2Tk6m#qOmlk;@{+gmKZ`cb*EjI3iIheV;qWszP$I@^IT zPc%F((oYQ@w~8e2%`l6??5|S~)@D_-*j3nUA^0gi_|oAX5#GCu-t`*#M|7GHTy6L( z-<=ylc=tXat9B3(e(y9@z7=eLo2M|EJ+Azm_x=y1dv4!@l7(6za?C2LhSFi@{#yH; zTm893uUHH;CT>#aYw@CoEG|{j_EvzpfZ7(<7vbm7==_-rKV^hDn~X0)f@@k$R*BJG zEtRL}6EkW80PVqex^h$X;zPfqBer!~LUVI7*mAWu{jXB#P40eu)^*)bFnFzXaKv0- zwaF8+q~^Xq!nKaCoZd!-(DEzz5cFg}*0eFmT;T`vh zNmf%C^!Y@_Bb$i`%>&}^oW|o^Km4tqAJ$T?>t8<5*4$A&$H6a0hE2JM zWk8!LxsFLzF2(m`tSn#@<5)_%3KD6cCAOM&G`_fbRdHK$pX&DVyxr3DOQ@HGTHH*> zXq-xK-nu-m&&fZ>?9L~4xku2p9MQ2l1sR66zgf4FOzlcSP?+s|w>4&U9Nv|!M-|%T z^5S2I);w7$Ia~=8I>Tt&Kj8`Y7A<-VHT@b_3P0xqtY-g!=1PM6?PS$G`c;M^;yURd zvlZ+UIrbg?@?@rj$SNDO>>sB6$!KuTByJ}id#LPWkXx!SKj=bWa7$=eeqpIz854XI zaHNyoapAeT_i&{>m-b?1otp9PT2Q{GU+C3#{qBPB@809vs@>>BdhgCiI{w0dyU9q7 zq9uGm8gc>d`*i#R8^MbE1=E&fWAt&tNd4dSyH(&Ab0VY(%if`ENx3pq>G!BILtW3q zkT9Me9^OoJZTX%Cy8jjSqw9+z&+dn1F9a$p6P|IkAR8RBiX>AIT?^HeXPT^NLFsTj z`%7%_fW_J!!M^P1VDn{efAg-LY)pG%v+8F#8@6-=5exHckTa0ZhD-j8;hfx{4RHp3U)sjvhjtS99p(-r=X#5m;X zBhH<=&N91&+uYG+@!3lVg(J2a)Eu#U-+-Eg6Vos99vRS&wVKK~-FEJ=`{Z#trd7@3 zE{F16{Qf~*DQM1Qp`E!6d6AdCEa4eerktj5XJP$fDs%AV+N*cecZj2yH)%I8kPL&> zP3NWQuWv2y4BaWa0QmDMiD4B0EA9YcxEWc%*rM`3`oyIgHyZk>jPT4jjN->e#gV`g zVPT@;W6i*+6R(T*d=Rh3J&p#_I4Dhc`gdHXn_PS8Mqq0u11jYlS<7BvLC8FjF!H$o ztOc;-Sx} z#>gQNxbfy$@$iuamdRRGt0Ja+L8KH+<|3--Z<1GqY$`%+(2l{uCCrVe?bThkj=7k< z=yo<0WD~A42t%GY_E(JM409K!MQQZ{^1zDeMD{~n^>Pv2=j0^=ET=BSu9VH^_I=^e z7a8LV>&!t*_aPUI&7C{0M)@bQkTki^D;R+57bFg+qB+6GJ^YVu&Kba&@To!yp~)hA z$mEl$3PTnnJuB}!XO8p1;Z_DNKHq1q2{4=PxZXL8DebO2(s{(fpZ=ffBNTP=qtIi` zw=4dk;SI_vzxgzOJKWjFoc0(PuN3-W!-D=pG7W=dappdp`D@Hl=c)i?&&{_|0vqHj zz2Bqr%{OLOtP z-SwBVYEA4`Y>`YmaodrfS>-0_zTAiFV839!+9t=DbhBid&Z6I72wcASj4S18%A#AWBHVc)KvLH{t5s#e zxX>X9>t%~l>o1aMW4RVMJZG^Nv6(XVyIZkCxZh}Fxxy$@^4&L0{o|q5GtlJ6gR##g zgcLi|6mE!qu7z8!!Ly0Kk6^-k1BZQsJN`kKWm$>@Er0R>lhee51gGcYb1=!KdlSLR zgPPmgn3@?1JZ1sRjz0p!7JI(vw;KdT?m4J2u?`JN2l77-rY{SRC zkY_+3rlv-f+bwS4o79TgmGWdo$v294o9V zj+JS8^NSR-0#Y~%QB_#p2dA?nM`4 z?jrtx48DS#`S!T}7W|!V9Kw*@ z;*x}fiZ$~I8kJ! zTI6=iFOZ9AUmq%A=evhu->s%d!+eZ?6pv-!& zaBwWlvb5o4)VRM(o1>KK3UYR1dnNB(OPTI!bKDL}LJB*-+q$1KD(yXV0{esi!M2LuX)-I$ZsH0i&}^{p5BhF;H!5 zgd0O)e)Hu|@V_c}tvDnEksDGTz?LX2htPHY2?Jdi?5Gtz5%2#AA_yS}Q@EmAb6F<< zdcw@MHaAm~`|E4{xwNB}iMv)BCz1;X!3h<4YLxG!pypPM%!U2MM%ulvIl8z7+9?s6 zJKAS?d4>Sahe+Vd@lULAzng@)aesNrAOK9lpGzGAT)zLf8E~f&e}kJ5NG6>7A}@6T zM{U-j>sIp*$Kd&({poS_s)4xe6Ux{}LR`av#}aGX7Fpk+nF+E7k%c-oIInB#+ndrX z277|lW*!DRnQX>)&2*_)yT6ng zurePLIsCzqs@XKm(n&jA-J#DY08$4NVu7g1QxuY15@DX(Ey#Go_-lMAOUYjX&ump& z#~Ls|ySrC$N)U4P?J3lubsN~DzRDG}5QylXE^2|yIRPkm5xTZ|=Kh6FaU4QE=jMIP z1aoiF(|_KGo6Gu512c*?0?B{Mi1g4iXYakh*gIZ6zu_#a5`@VtPJiaK??t1REyZCL z=#SaM=G=`G7*1z`1{SmnizJNLF9~s5(M#oQxLFBuNOWzcb1vsl??Vt}xJ^_8F^+=K zKEB_QctsrPLl#@E4=h)gOP1GbFhonX+JdUJoyTuYeks8c36X_47D@h3%9yXho|Fj9 zj2#=>j>^o%d=TD}%5#hQ8KOxe)&y$~gKx{5V-G6q1HL^`UYk@NpKNbCx<7YdY_SHZ zLj|Zk%S6K3xw@=*W+N~ zMn6eJmQ>LWLntM5%lnw=V}-hZn3S|2mykPhNJPs%RRLB^TUMEM+ znx%n`wI_dg#K7vxQmA9CJj>Na}{oInQhPGPQ~+V{~^ z%tf`-qx%Tp7YtB?c<^bWSk=0Y+zsk*gbMGP>Nw?gh6G-DwH-~>!{ANrE1>qdaDJV; zuMlr^uMlwQDzznU8a#@6jSOeQe&Qd{z4p`@gcT%~ zNPRvxKY4u&V_R5Fyj!}o_RH&%z~!t> z%zLE_O)nVvqaAw}xu@zC#Rm}UsH2rRGH@Warc;t&lz1-SIET%HO|SHhP@Kesmw)`M z@vlDV&Ld6u_kSPUv9GgwVyJYq1)p&={9d&=7=w9YD&+T9ZcF=p8zt}^UKI#2Tw18* zw&lDME8p#r!C7@#Srv$IHM)BCIM(9=0dPeUZp5)d2EaE(y+Smwtaiw8qq~!Mm;m=g zr1VeHHXDgGoX_k)+M8WS=3ZF8^|byUh~``O0-eQE(v$Cq;>wd9J^Wdvhk>6$*vuyX zNVFXIY?^9ry(!H6_~!0vmBH5DyMeR;)b_p?hE%M03zuB%QIi5q<+n*R&stD@PV7#r zr!-yS3C`p24p~I$nYQ;{*osLHTBL~13;vk+)9@0XKP|n?%?I+F1mjd;tyVqr)RLZD zB;?4dOJ53j$%#$|)XSjcr@ThO9Ul<{_JfsrUeeg0(Kh|f7v}`+NTe!2Zi>xTQ78s- zD)WcTkD;DkN zYL0vojcjw)1#kI0*^)W%aoe71(@5->w%+=)sQJmx=yVmi{XFJCjWBrEvtmRV8`IpGPO(-ybjd~*(CJt;YIcf z*ZNS$dh4N!rLBuxAA5fL;Uu0=Sax}Cav4M7#UX9?ps-JI`g(?1&)>JT`0F^!wdm15 z`e?1ceDhgbx*Wd5rYY(mL7xJ##^kME12vMWyd0N)6{ZW)^`dEfYb-gzly4^u`61AV^ypQ39Oymhb67z$k(CIL_4`tAuPyyf!BML)+Y;#~^7Ow+%BjJSZ zcno+-W37ReOY7O2HTx3|R(_kis5RO*h9c467}P?J)0!{7B5_rbc9b!(ImmZKX{|%j zjBU^7CwaYOwEn8*wC~*RN|Z#_Jjr48S9bnGo?pec_`{yna?N*H*{CK?dh52A*sA44>{4NAvSPmxfhy$jNCSAhfZ&H2H8;vh!B z)iy)q9M6dY16n^Jsjb`$V3&ts;e~kb#w}R_D0t}<{vAZw7j1JR z{8PkG!EXN*by`-;$ipMAjK#|r!sfXdikLwbw#D4GKJNP02#Abr*NMlr(F-?)Y(^V?H?B+!>4&Z&wv^+}$emy9zKevUQ3vkQbLMWGz@MOv zZZq)Q9kq4Tn4L8EU2w#!73^xbE9?OU0?FlvzGJ0QXdVFlie+OYj3ES{@Eha-=rA(m zxio?Gz;)EO^=*`^va?HAxEEECE9S+1NhDqX+OLo6UZ1B$^^gwNQEX5N%6-g;!S|4a z(N9-oUq=XxZ71YhUBJ zL({9JAppozK=Z!NkdQ~p8p8XziP}?WBck_h({7;O@qcUgvg(Y(Nj~+y0Iaa#w05Z& z?F~AM?!iJ%unl(76_`3A`G26Ty|i|fPxJ5jrgy&~U2F?$FB_%X24MeeCgl~)qSg#9 z$#Ys5WB>c|)y2+?(K>1cHj=r><|P0*(Le?XbV9KL0Ar&gD}2)AKuvsO`h0fFNxHqk z;1Q)2KX?Qxk}%MjSM|;lOEu@S{=O0`uv8^{y@XW-MAfw)3jmL6Ndl*%zG^=D#uq_D z^8y@Lf1j9T@5i)yU#8RAe21Ddi1^0<1Tf>4zjG?YjDS&TihJRMV|Ov48QZrrX>qIE zF9yuUMId+YQo!l>y}JokI)C2=nwyo@CoVMWe0kjE>)?;WXxCLN&`_!WZq5rqKlaUR zyr9@3B+f$$O3-7OV->tp@cNzH#p=@)7oS%dqD?}|GbK@QH8ejGLN@%NO!(Fc$nk@} zjGjz3kDUJR&M?Q7OY|eX_33RoNNhXB_4>8N;6DDbUGd}dTV}Z;cGp6#l^w<3sJ#Eg z?!$-E7v;0h+PfI=XZiCtKl{`6OaQ^&MtCCf^x8+i&$+*hOMda2NPfBYvfuN<$0j)Q z1AA@*K_S!1_Eu8V^tbiRr}{2GqkNW@2P?}0@RZYHt&2}7x2Jx!%A)X@yY2cIz)fF^FM#A9t&{R`bmlf1jgL`b z1%{Nk*M^)3_6#Ko!$gtlxZp}bIDu`}coD7WkbXyJcIep}4gX_+Hj;i!bIqE;*430y zIblK43IbcgR|kGuyS|vh>sWkRKkPm3w1!gq!t4ytp{zHVekRyq4Y^AdY%O8@go>$L zgh$Ef@47)-9>A#e>|cb3!yjI>KUCdJFz6dG?E3mD-T_8tc|RrmyYJ+Ek9sB9slgu; zhkyMZs<*xy5dt(6fLaGnqo8e(MoqYoDJcAoFv&R)CC!(})9xM|Gv&edYsG%a>JOy5#a_sH@ zr=0L#AIWJ7q~u}lNhvCf9z;$CemOD&&VTR0{HC?^aG~8`G62B@5;4dMB&hUU7Vhen z!w&nyrmRb$)MAku8Fc$aawpBr5+Ef2L;QqEXrC!jS(4O1TKY7lhcniVa{(6mPEujm z3Xw~cf{fT=k)f~pkf9Yez%SLBUdL1%HsJR-i)4D*;KSa*6vjM<^z8m3NgoZm73t38 z;JFCLQoMIXnK~q6`8^78A156e5Q|D5+NTe$4HpBrxr^3%!?VNC^YJ=&Bl%|<;qy-^ z7|*U`U&{J4>6IvyAgvVG)~=cFu!Nf;?NHZ^E3z8v&fysv8HNC?f*@*S$3;G>Z+kWe zGuUKZQvHvc2ZOMy^?!K%f&zBRnx9#PLJWPQ;s7CJ%a$%m0c_9N(7jGSO#m_dM{ESK zGj~qt%MC+z_~FT5;lsv{aBw|n9e(e4Qb%%bSL*4P}r9GFf6_Nzke zg#cNrrvMWz_+bB^CFtryfvx3&6HpJkv%vRVR=}S*QMvO4Lk|5b%bs8QNB;N!MOm6+ zV!EJc&cFGeevKWCwbHmxr@7>;Z9CUBaI;B63}Vsv)&>|J_{Lo z8X9c^BkQdH;`z5{;^%>v`7~AA$!d9k4^ZcNA8;k(V^8AeJ5rnn`HO?T=l2Eo))A@n zuM1osA#7rA=zgL38FG}s=ovO(s2EB>1eKUVW(3#Mfo7&ogHDr{0|`aJ0Ni}KxK3e$ zA{_qf^GVzvn;kkx-lqEssk%j1l|Q9aeYv0TIdp-3!6V}J_Cy-~s>6d$@bghP6fp5B ztx1(kfo&k?%n2q;*`4T16)7`a*yB)74L^apfbA|>rk(IkI)u3qB9iba4)D%RquoPb zF97_~z`L>s8N>_>dv6(w`QT(baCs~b>RqMbCA&v8up^5h0q)y0q+brY_8t%7=<3CJ z^D18ahwY3$40G#DDsUvyj)NBUr$8nx<8Yj(`5ButQ<|~}Wo*u@h1NHQe^msnaNnc` zKUa7ZU$n>Ibd9|Kf<@^kM9D8|Z;-Ygt>cW_4T_|<9MR?J^MbOuqA8zR@#IA4^vVbW z5#4hytBIcCGloVA?7dNLSD(v)ayCN<{z!KOBP7~5*_h`DLUgxpM_ti7_Lzeqi~bO^ z@`1B0Mi^qVc7z#cmPcV2hOg}fixTTk(cf7E-|qq5+&W)ezPUCF)S5~IHyqfrq>IC3 z4d_>%yfJ!Kh%YWzO?fMm?1r(9piBO=1j=(3b4cw!v#_a9#Q)P9>M)7I*Au_l2@L9q zy$fCW(K~Zq6^VPU!7M5|1+GUf(tXP;^G(O66V&z0mA;>f1+QLkvJMIS7$70}0CZ6I z+TK}mpB#M+n(u4r5-LsRt*Dby}JZ>c>!@Aa=XRs~HBx~L^=+{q& zjjo&e#9s#b?(EqD^E#=}qS*{m2i&4q7b8q=weui<#k=drGK`MS;5tBI!layUe{0l& z4>>RmsrjVwvorXfYfrcH955Af+^G8auzLx(m4r{B3T#ICb6#3l)Co8{=lV_c&bf~-1Y2>a9=t-?JGVaZY1rP z=GXnQxuoI`!(U@f%VA^x6W^^?mEP%E zKy47RNSkr2Ku4E~mWdA2vVDgroRDzC<)_U;X~NO>$CVy*hzqM%q?qWeNdHC>+Exia%QHTqsNLE?s_OfOBL))zZw-hCy0Ii@ zO&*i!B=(R~Z8ZKA1XwuONs@m^+Dd`l{;e^JF5`pNHKNLpcIS0=a;yaqZ25rzN71(|cNk+{`52N~)TO3-P6UfZ z6k`h+_~*8`Sfz`$M1VMQ7UWr*z+5K9(x7^W;W8gIXx&AZGQ>VP(O)aJ(6SHx!s_+| z9Z&LKbZFjkcn`YLH%Yk&8|>;-l~XYRa|2I2NA^!$19f2k z50g8B~*W1DW*v|A|_41;r|I9#wn5;k2gur*n6pGD&9?Dysh}k}j>FNSK%;_n8GEZJ9?OQ!aICIIrh&h+hE@{XIY@7>a zK*6|qE?MA-I&#KcfSqMhd0Lz?qam&r&40!I3)R%UgZ(>m2E`-?Q^wo+JBS@koFJbapnwdm5B*?7uWA93DJ)(XR6!@ClPnyp4hQ=+T1P{jEEDlqc zm(CjA!z{4ObMgVWRQ&PG9&D#U zw$B5E3xyQ-mfPFES%!~l5GdN=`_%{F&%#es+pDLygXHPk>Ga`@`Z_4-m<08%OXRZNU|}O-5thQ>prx|Q5raB2YfUF%#Q|%u}2513l-KU zfXaLS?oby=B|=M3oCj!G|h&ELY9V>7(LCj$2$Mg;YOtK2pNZ z;nAsvW(O8hI$NS!j3qwZgUr!`!WQ&r1HgCaOvn!&xNu1~;VnyhbOr9aZE@w+WToXR zfI&l<0&LubsA#t9k?2Rt9TD~l7gd{=ijVEBO&%#|irY62ZQ7uG_Urhals??3yWHjs zBD&RWsAXrK2wDT`iaR2s$MX@%!|qOqM;{ghU^jDudR#YF!ygV82$gQo($K?ok{THjr4#nNi4uE zX$Kj41ufF#2C^pW1`W)q=;{rW+Cf4?BB17d!Tkx<;3H&Dj1`#Ys$$}X0E=Wj95+L3 zid9qN{RNzW{7Ooa1mo}`^W3<~6dJ7vzJt9Rpvl@ObZL3{iRv>jqkez=;=Iw89qDJ@ zr<@g`vJ9urn2!^OvU-nEXqb^)k3E>T1)hIsV1m_5E(SiGU;y^lQUC*G8)L;-htj&D zHl;K*#HKZX(eu|${{1uaL7@#6IfnNt@@v$h+09EnyN*E6d}2)1n4zKI1jy1U9w?7=vx1 zvtUlp%eluKgV#0FF3a^QKap$7d;^No%NS&K8Zv-PNQ`Zr2$kaBDShIR3c`;y_qhqg zb6={+GAkYS2w`rDK(1gNc{~i!u1vMYFtQX6z}6FLfh>}50e!i=%reA+d!+v*!Z0z% zqu!%fxy4Z)V88@;i3L1lTM=aK=@$`QC^o{L@H5wQQ8evKh^a;!P`hZ5SvuM;Lh8Bm zkChBPyoc`B=Z#EZ6jlOr8;anG)$&OYs;;^XxgSRdMDq;8MhE33hxAS8F9R;SGv0B+ z2@BOJP>(ayUUecv<1L&Pvlc2q(1I|t+PFe*r4G0!c{45rS`bU1BCwwfC3VD>Za8b5xWxeUwBQLR7;Fq+d{>| zhn=7;?pBRlb!0zD>2d9ov$$^j)bU*y6nz597= z^sVu8QV{x`d6DBKkY>pvDZn-4pm@@2vu{w(_CV*H0--T5CIL5GtC?~ph+W90qJ8}n z(^#h}h9FJQlVc^^I{_Io+;{(bE|*cawuXJ8l&uulxojZsQz3)>HhAjlYM9jepzkUz zJj!OyI*SxZC+|M?34(fbV)`fzNUQjKIp)Nw#5aQPU2&JYgW(JsT!WJ{Cl*tIeU1)c zdl?6|c52VDz}Cykkd2x6^)J4U=P;~w-1Nm&5XlBw=WdW#0U2|0=>sEk`V*no(Kfaw zJ&eA~A0*83O9S*A+vuFC@Sp9<4NYzmQ@lCBZ|FZL0rUP&fC3Wu!z`EjP#R-LpOQ=s z9mt5a8eaatt3>a+9}&gJT-|TJkbl$w3F9HC@Bue2ez-#&$4Ygnt~(!p>ye(pgI}Ui zE~{%?aZaOJ=TjI*SDLP7_;e0AF9?6iL{Z{lWG{kWg_kO=-pM@jB-@I5wBZ~yRux>D zgBL#w&0hL7`j1RgFC0o{raui|1iw4JxiJ~C(3dsO585|lrz2h0s5Sn1ohc`N9@M;N z18ZLJUX*zzoc?8qRH0sI5S%EHa4{lBJaVoxQ>Y`#b|b)hc}!)-|n8<@c>8>N)(_^}5IuwW^mVi)SJxwR)Vv z8!XYbB_=$ffGodCkPz(Ch;RJt%P8dEF=w!`Y;H-x1zFbl3ioo73m2e@@U+2+q;!QU z{e0_lG5mQqzBeiPa?zmQXf~})u0rQ|ZT!%OXhtS;Fwi|ef(9%WxE{$BFv|70Gcw;| z1kX3{U>KS8dB!_u3(d@AA#br}!{IwpypK*IDtGQ(~Fok_0T;ku3 zJ!PhGqbgvG9IkS^1M-Qd{PmR&|BD&!Z~mce_GP1lR9`>73)D&g2!b3uQwIOW>?ZN+ zLd_NY;FQS%SML5dD|@jYs^{o+X&36o08hCie6`Z4e z3WON5Hzu*@t+?pM%tAZ|*%0Z_qV>82&n5}czpPERG+yGRho>Iy*UdZjz6~8ymS$W^ z0>PVfADT`>#2(R0kmg(C+(1&H=N0R#X*#Uv2USwQen3CdTGY0Gv$E+O6C%q1`ZwdU zS)3>S+LQ-$gO=J}&ex0t^Og&1aqtL1t`$oZ@~-B)6rT613TfXGU6E`eqiv*htc~R=E)HKDi-c{++2@u6B_3 zSpQ%}5<^mtMYk$)@v$5MNvNJXOEBSc*b{($rg~o8`}*5GNERE)F-~6mm%L+8pi;)* zJtCu?Q}F4r9Ayk&@j$vmj6;Q$AgTu`dKOtHed8kk?}Pk2l*3MqgGbcI&wm!iM^Ko)lRJ9)7hmiK8VK}%UnJsVnVzNW#4Cdsq?N^NSGW^#=nW`HFZ-Hp zGvEnQNt$QUkTIMvf+`dn&VKPO%?x@I*3X@z- zr2yXFRl$u=i~YdE=jUFdsw19g1MMJ^-D!vF!|wXOh{{onn7Q*C)%xgD(W}EpVRcLe zS};$cOIJ};2_OzIkEHwL+vBX#o(&5D=nbmDxobvD`OYuM)} z!6g=eF|8ge3UD4-jq^n>3Vgy4J6_?GT&kWr|D(JMmIPui8gaur!Jmhe2RX9VdyVM9 zh-X0oTQluOW1TCPt~I(!d4U>K5*Ddc{&ry>CH`pt>oI!(Fr(KYfb*ALZt%y>nl)WM zw z@3*1-g9s&okC?vyadS-m{Je*r5(gnbXckju4ZP%q)b{)WKQWtJ!E+l+O3yh2$);q! z4K$@Xc?pbKV6sKS1C`wugh(T>uWpziZsovg)?v>Of`Z>w zZjFUMWp1=r2TK{bL6hKT`!#Vc2Jh&i6xDsD6HH4>3%5v~GwJ{YZ&1&dCn^dAO1w)( z+P^Dnwlq{2V11PfBUI7vQXx4(+B`G*r!*EVPcNDAynq8X8lvhs=4Mc8l3xu29f&3+ zju5#S+$g{g_Hsu!RuAf7_~$rT>78K2Ug8hGMb+uKXj~+n{Xvq}w?Xv(J?3d#tm30b zR+qxxSFWb3s(ku=|1X(`EXmzcdx!to&l8sRPxxj#L=WYj^)|@Yy1qJ_81}VqIui{h z<`FljSDkCrRBQ&PHj}`1h{PtGP{l;ZXUGX6Kl85L{B#3(x8pj7&njVD;W7U2k3&h9 zmFJL~GeY%hqK(GSNXXgM?z;6pK+!M&8 zRJbFC_G+=IOX?(EK%`vw&-B0aZ?G40Zr;ccY`f(gwzAZ{17LwBK0pj&42pJ@h~(*ru3Ev-Usy4g@Bb6i zC!hNOj5*G#5c=%sKVIhiMKunOVXzWQ--u^ZX$lyrb{$86cx@Bk<&gDbM{f>Blm-LZ zLh9^nPkRN|WNv`=f^=0Rp`8l;F#*=c79tV0kb83EKPK2TeZ{YA8YiHuV}=1fT}kTq zEQN(u_hW$38R9Bjt)b*Npi(igMmm`NN^K>o>kjXFf9>l9@q3^3%m1^_M%8Y7dXzcat4UCv`D*mk&;dIb)@~#?(=F};M#9b zVvNf!pn}Z%xWXi4hrKi3@c@_Q?t`o4d*8sMmkq-^4KcrOn?w&$#k0QSf3 zbqE=a2F6pHs4O+?$>&aD*TH|rG=X9M;d^Wf_svWtXgDuc!8RBkxW9e8-g;8F7^o+q0z!@mN6J;`IM(i6Efahaw*QWfpG5Hog4k zBpYOYQGD1agK4&!(yl0kx*^sEPJ(7f3z&BD&wAgQ4vh;t-9?_ZgK+S}d*lQ-ypQ)S zxeOXbMGUn=(Oe{b2Ht^{&JvEZXMSQ$9=C+E09?3N|} zgb6}cQ=;Z2l)w`~sr4|2V7%PDdzAi@K@R5txN z#U6jQkd1|~^Q+wCr=9UQrGOJ_jy^lw{nzb#9O*MEP-So$=Ux z)cv8&7@lDuKp7l7 zplIyJv+oG#%X>xBp&{5l(wmfIs&s@eN-l$Za>7i^sAV%#^hNNUOJPi8N1TwP9|x1& zIi|qqHT$OOq5b#u$4>i2@UL-n0%^EYVzldGwDHy9-b7Zup4Owa7UyA&xfzr+z-cv#MJL3sxg7q_|+}}()icnk08QFW!PVqvb6%GnFEJNX2eoUp9VfYn`JXr4MaasvTrX?gYf=#scEznUAvri=Ay#Y&B1# zm+0HjQA~8HLi+4X!+3zR@t^79rqwiKd$Fu>Pdr?k^S# zY+RHB=F|Yj`)bw^0nOJlE=>-%_t}3fNK+bt{TPFUa4?~aK^iF={n)c|$Efk(`N-tk zQ_YNpCM;GQF$#N)^otPkdoMJB(?b37M6VQj4|!P&ZEQjRSv^J2ed6zFYKXr1Ef3Ag zGFmSL-81Yigmn85g&=g3_sfeXWa?N(3d3nfqnHzfGWPuS!iWvW#R;!;SF!BA+e50E zCoIGWwT4(7Om#9XP3q9u)NNMgtO+^wnjRMR)>{s+zS1kd%vx)MHKwMV&*zCz0uEsn zz|w!$Ud9d$l+|}HaNXY#XyZA&=}1S{@5D`x4~{V>vyf$>ob`VRxX}}SEZ--AZ+F7q zhemiJ*?=a8421s0Hh=@C?$Sn@0P*Pk(*T~beEOJMm%hj@}i#giUQ@J)p z8C)Q_gRAnIx0iIoJ7!ewL(iaBw?1fp`E5dwbum9?ykc{cR-=A=#fca=aG8D~sJ`CB z92S>N5(%sT`l4cW47W6oF9hl``LPfnkfQ5xZ9)WHf@Er+Pr~?&R#P=jm{9N36n;uf z3_-}5^`2ji3kUH`EAFnG?;T!V{vzdmE&M{`NjNY4-Ww3J_w{GWq9dA=_S-GkE<6H9`$Ux{wRSAqp=lbl?7J3~*3*YN*+Zfrel z@Xd#zAms}`t|eHW);D_1QXo<mO*`d)S- z_o?qSns011)<1uUH?thTpYd;^whad^tiuVw=lGUrdvdD6ZD4ywYqnWYu9ux6u=ShF zU_f?x`7~Nvtc?UCkHFK)Ika<>5qL>wo^tvkiF>A5C6jw|bPzw^gZidWSI+5j;=y)q z8PQG|Jg0QxJYe_WR}IG(Z0M+$0>W?Od4YAlaCCehAGZP6<691rPZj2}>~$Rw^Z!DCNrKb55BW!lCgsBb$C0 zdbARW`aev4c|26@`~Q7r#=h@DOtK|~B$Al27L|R=8b!*M3R&h9l3n%?qt#BfY%$1^ z2qk14*|YEa%=h#>&*%60&H2wi&UNnVzVG+@THaUT$^f;rLq26wAmxS>4J}}uhKM(j z4ld1FDodK_djH^Np+*161k>KeriL#^<5NQ#e!6esu2b$(&KaLOyEf$6dHBvCpI~@g?2w#t6e05Vrcb+0X$Y&H=|`_@Pyu+I6_`l;shzmyyDdF%rke- z5jq20Ib^SDe(|O$zJare^1ETn({;yiD05C|l|_!6RLT9|;Ps#P&%)haRqO^lTvPj2 zIh?qjljmEL^0Jr{Ke+#cWKfe7(V^x6-RUDF?N`*RjGmP_kz9z zu~&!#SRInSm2`w-FuJww?A2wte*aQ2h6vVR6r#LIbO1JlzAfkEx zmHJt@>M$!Z&)JpxTi{+;MBON}qU%t_2SjH)PvD@Xc@QlQqL#nlZ97ur89WZJXq@86 z+YH*rEl$!76x7YWJyYiJ*2~yZG|72?lpXlO$MW=C9_#U{qZ2PE>azkdl&(lnTtmSX ztEa+1q>b~wDB-+5F)V0ijT9`GHF<6H=Nfsif2r>MkaPk5H`#NjOwP4_QhYm^&gk>^ zEPtE5rLPF;{z}GwJvfSzp=O0Bl{fP9IPy7Zzv~g%*&x&BEP8ZQ_eF$l6WH*H`#bFw z+ZQTK&WKkU?@K+&FG23HSNVP`N`gbVY`ne^h9_r(_wAW~E7hlwyh$=F0I|D@T+Xu? zh-QdHj)^}%b9rLX1jWMzf=Dd2~-`4GB zG~p|jPIz9&1MUvLFg${P;rDyDB_Sk5^_nF`PRnv^#C!6D$IgN<+0_0!SFzb2^NPQ; z1Ni{e2lkBGy5@{kE<#lrqtzz8&M@5WJ9++;bE#@BZeyE2-Al0HeC_uZv%TEUTw3Y_W`{(OuZtRz1n_w@u&T ztlgy;(Ezpis4w9_?G)SHdozxF{FjGy?G&+^X)G}-tPbVX>e8k{&xV~@RkNB8w&Hi+ z_SU6oHzn4!*{OOCqd%%%?3MPYOPdyx3;316bLbzGUQ8)erzCP}TX)Gt*J%5*dYFb7 zqmrmMpqw3GaZ2$Br3daVlUia!AenP(Pt@ijC;c%D}OF(6J%yAwImSU|mc$wYtZ#DEw>HG<0ve`R&M_|Ka~xc@?oT zD-#|}8r5m83PN$~ow8JeOxt#gBlchAhy#cq8fds`gB;{yQyGu6=dgISsQn8bt0CuJ zrOBz8uo8_^Xb5(o9DO6=#FKGJO9jo#BU|)a^^Y|WL;Vo7rE?^QinIO9-ZMCQ_=4R& zCGoneIqC(ceyNb(cCD}H8n?n)XHtd7Xlz_|RMIwu^oLA26lp@KV_Gd#He$_|s=lUw zjx**G=e+S}6hT@V_1zEHqOj`1D3fMk;-cJNJ-!+C@!-5FviwRkM{U-k#`iC!stXVK z)BS%gjC^7+6&n9g$SV>4ZoUqAD98I%gDy(g&Q%XuP21$hys^6oF_>SI;#^)x52Kxt z>GPX-uG?G6xU&~j*U7JOnD}gT^!=UuBTUoHTfNk^T@q=>{h)d4FQ2$0-Wvfu7TXt3 zp#pfY6%Egkl*d%+4lf`03*Z^hLyzY2b(B@#`+%l#ium@ns@X@^VJli#m?KrqQ4qg; zOkr``BusCHOmRI=Hl@PFiGe?AF8s~%MIkSFASL$-S0mc?{NtS9)k~EAW>(qOTVeQG z$u}3_R9fxx7@wG7p<3HNCMC5Ed6Yv}UY+63EueV3`n_bfVQBQJk{r$e3o~5*mw1_$ z;)UpKKY4GbKX8pTDoh>1-jSnv!Y9uuGw&S1WFw+&n+amX4>+x|TZ~inf?197&%x8)lGH)wV>36X$h4M-UiV5NQOu2$l|C~V+_$tso z=cMZPVY_ohU*d9_KYgXseqL3+t`dDR@Yr4Hlchaw*Ms+S%_$;_?p-W#d2@xn`fCQu zyr^a}FH~_2D98IWD123| zV@|1mQ&c9O+M4vMIb?-q^>aq7sxlO>P@EVbjA0+=Tug}sPK@jjjr4bAn0c)B#iD8u zI-5q%VgJx^#hv9w7FGTzlLA-C6dKz-%EEF6o8dd%7b3naqb6#D~~j^^j5X&mlI#vSi#`|IhfUw+3vs6CGt*C6#qb za&2cB4*{Vqt;mng`FM7U-dxs0c1pm`X!Pr;aAZVF^oe&8d(y~5IXs)O@e*}G`ruYv z>Z5xPD7#JK23RK#Gf^2@DxjROvyqE_lZfvZ~PH^qH& zW)z9ffdR6|^q!wtJtIKu2m()(;c?Qk zFp6~NN#-8|-edA1lvSiG(?Y8~vo&dwG9SI$Tcuyj6MISi=Ca=vpbki6Ens_qlvt?? zW4UN9Z|X;g9Yvk8hUX`~ctZwnUcA@+qrCgu9Vfzk(R+)h7az0zo{N%2(r9;`Y@#&3 ziNVB0Gw%lHsfV)fVJ?R7vK3oXFw!8jDU*kg!s;Z9T}L@ErnU1Wm+jxNICy$`%EsP* zDP;db`u?4@XpaQtR5Rct2)hqY)UO5aDUom$MMVIPvkBOle2~V#Isp-fLx_`m$TgsL zp@auar+I#pI2*WqMNC7Vh4|gG(Cc-yQ#T67pbg?fN`gX4r)f!NHUK0uLlRZ&Np2FDMa!#{42PXyAzKYmq%o^xVCYgRbxO8}F?dkoB_d)?9 z3%hrDB*_Gu&zIvRJ}jN35n*-vwO^hpdm}Ve;>#To-fKVTA6tke%l}XZb7psU6c}EW zoz!3->@?rWrolRHIG(`ASdgElOBe56_=YuhIsvN#smI8LunHsvD(?S&;C{m{lNxbB z_p*Brafpo+5Y2R{-8heFmzb=jgKF3EB-+vtY1&b$ zIedRH;rFQUjr&}4_??NLi*eCs$MG!}>fi(k{a4->vDWZl;&5Y1BoF+=<Kb086af=9JA#?P(Tdb++dl1BK60tCzGjeKGCAEGwBeZZ%K3Hm`QpKb7P z9}bSC0b3p?iR&fY)qQ7bk2PClS{;1`Te;si;@&PoyfRCMjPJAZ%6~P3d;UfJfU-f^ zir~ll@ykDdD{)bjY;yukaDY%s3kr!enzz%@(5a6A4r-;MF_G3F^i+RP+mfJ+gLvMN z42~|rFjz(a>!gKQ-rDuQJ1Ep!_c=jCZ432*EG}PK-LixqSRmg`(hd8*D~)V7{i4WZ zOITsJbS!*Gqz0&QFaF|I%$=3I_&k6~UK&?bJ4uD(Q;K|kC;A4td%&f&`QV58s%3=D zlKtmbgkwRf9K<9{?-N`gQb`$zek+LMPc!Rhz_o5IRxer4?pRdrNsO=Uasd9G1b6Pg z^GX9!bih!#3x9v^Hs#YDLHE(P{+7?<1M*N&>cle{NRQ|dhR|s~(+@Om+8XfiR;oJf zY$_`&)g6w8+=e_E?emc5cxVcXP`^oIyAIpOouETYQ^G6F*C}#kBXu9iNl|s*7WSPS z&-da31Qu#X>d^m2%xSbKLF_B2yjikG6N8LT>%OxG_WUXD@@uqtF{-qECAIhSOZJ{^ z-&q*6VP01eL)y}S{4%HJe%`_DR>cRigXhhtFOt8oB1Ie(?F>LM%E3#K1u=N+qM}EL zyZ!T(kkr3&^LxrR$GsGKl4zZr$L5}hJrGS3rGjf;Q^E9CBqV{g+}bS#=Pun??8Ff% z?6HgGT1Fh;Cz^mFh)3t4ez*gtuuo7n&dHu#WCRomU+gXW{3g=)Rsc%;vH~}-=3Rfg z;1_+lsZP*m?DX2`bqZ5){>03gEmbe&w(u~WtaK_-7wM>fxhR@|AN>{u^Q8CBoOFs; ze$A0n3A}|?P(?@K2e+esnqLY{mzTP>@6(t)x?wzMz}qeELU_NMjl%gHxw0(hl)9ob zv+2gv?cl`FwR;xA3SQ5km1tTLqyH=3AUtH|kT*7k)IO`wm@+t0UflEIuw3-{BnT~Q zJ^8UNbm**ePu7Q}R?0IP*(00AA6y5kh9CHORr34yNX25G1#3SL(E+7=Knzrrhg1z= zaFVFIFxYyk*v!G?E_0#b68qKkyH|0FmjX8<_`f2h=v==Pqq+WnL5|HP9&B_DL?>K|dOpeq^Vsg{nODm*vQDBz^e)&s z2tCp>oQTZl%wD-gZS|~&Lts^-mEXj_*Y@+0YKPncood6p*m)MPt&SV3IhI1Js98~D zrRXu(dt##&bdngLz>acv0zeGs@2#e8pry>5cr4WS@~H?x_8xg@x_EA(x~BA=`tJ zk{Q#j0WyOG zp#DCL3PR-#i(R>OO5+F=qoWAP4_SD)JYH|oUmf)%u{g*2Q%;3`W>UB`^A^Id8y59GWtd%ROGCq=FALSFiq_Kp8Wkoayw8xY202s=(Xw zW`ad|bvg@0ph2P-BxNp8_5{}uTGG%-zRBbYzgtxOXGCF`9O<6oCw)jp{R*u;Jbz}L zBaCVN!s99&P+tCcyiud&8|!Gx278%`4TgBJl2=CxO(-khEmZ3ee<|>T;VufxhWe;D zkr5XBi%9*LDMk_^cDLF@m-1Kgr)eAaU0g<@#pq88<_Fhu-;z6$e%8GqTlu&tt}h;W z@*wIyOUg^V-Fp;IN+o58;#fraZT1FZ{m?IDk<lgmdU>EX^K6zGiqbJ5WaDXuzv0U7g<1s-?~uKSA4*ooD%lnLP< zd~J}idLlgFj3P}{Q4zQx+o^cwU^-NAD9m{^#delj^A@4?GOIacxfaW;{x~k+cXFYn z7tH+7->D5nD2d-yu)617_?=X@5~$Q@$g*$Q?isSGp0L+>Filo1CfC=i(KPJZxY8S1 zOo#FJ(W5(Jd_s3ZeRAebPj!?&a{hR3`j^L;-9J`APa9|5eQgdXb)vl4 zHiAbfCr4`i_vVcF{}g7^vrcp!Bz>~Wn}2e;vK&qFtE3GVp>n^S{Fq{c2InsGFqQU6 z-wLj5;sGxo$}xSQB_%%tUAgW*MFUT1aF*W4@Cw4ketU%$>S?EZ>e=sWP<@4!rRbbo zd=ppI*xs$vn0nnSX4h2KHbwL2!C$jIDH*@WCq!eeG$&r&F2C#a!#JMiWFBZYys3cO z_}yZ)<5?gfUE~MprI&JDg+Y^P^uq3cZs`sG9wD5Xd(U(u_kXdQP?Hz9~WTSyJ;EiDAGZQ{jH+ zyX8I`Yu4tBu1f%W2+)F@qaON2Am*gq@qlXY-djAs*dRd@P+ed9l}N3bDR4;dOqSmp zVW7xG?f+)<14&iVt&HnBxqL`ZuF=1GF62hMZ{gzv9LI4$Swp-Szlev|JN?$WMpZ>U zeYBD<%V3W^HsB!ii)8(n`g-5mb9G}U@70iNF1dd?t=>K#mHM%P$nE1_RL4X~ zD@n`OqpP4S+ANf<#0w+*5LQb7?TIBDP;47B69v$(<2)yVra7ak+>y?pN<#ATMMC z7>Pqv6g7vA2l0<-=S=?Hjn0bIX2j!3c*u1r7bs>*0E|h2rB4z)9AIC!O%bZyx`YC< z*EtR(^kWp*nGkG1&CCtBKoqS^y!6AsMEIm0mx3*d=tZYKgW^gAQIXHUZgGRELP&Ya zPM!4@rEo&2{NT&)<>ti0H+Hj`QX-IFv_RhJt))RB?#NGSL%@jI5~o*e1|_C&5l^9p ze4@5;zS!`XlG9RIRcA2FJNyybTtXvlHl2eEL>E3<2}Eb4{%@JLo|`kCi9+n5EwkW1EmOz3ma;Y5*10NCCc5 z3|tJlwqEh`jZWMzD|GoHd+07vC_Xq_k_)w4we{>GL7=_Ct!oDVr7~d%-%e4R4&SMh z8&WygGn%=0z_fko*wLfoW!YAAFYs#x(k1$MtzE}^`|rBd7-D~#F%k?P6r{q5Pt#I`20 zr{+Q7M|twaYu&lk^+P<-j|9Bnnxr91m)uf}gr66Dgs;^~^a#?s7AXz~3pW@fg{;7PuFKLMiJx6?ErFhLQ5%{|ZW5cW?2RPR1T=slLr|^|e zlUOo%&U~uS;IuzOaddF-tFhf1_&7Smr9{aKd4;=?V5ES{{fUv7(n|dScZ8PzQCMA) zWHmRozpr_VB4O1j8W4DbHIj$%CE>I5LKJwmb8PY?aqb=?@zj_~E)@`Oh%7;xJlk$b zRi)4^^9>=>){~-x2FJD~q2=l)KNu+W@y86`)o%1&_dS6oc(DH5{w}Q$l>Ppj{m;t- z=vkH?U~7;05}xM>oVekmD9*;mpJ)u&x)42`$BztOr{<%u!ajQuG}N|87c1Uqf>~w; z>lJ9xgSmxIrMaX)eokbQrAyEgnp0>6W(S3L z8sD~j)aiMYL<{?jUG4xCCQ``syo!PZhSCNu@UB$2%ld84{M70Ii3Y!|oe!Onuqw+z z^NZX7Txq*i_csdP;%^e2Rx*yQ5>|-*ULyyblrJ3mnwrhxPXd<3mdwl zIW-=iW+uGcDaX!b-IZPwbRkYP^|WWiQs|>_p>?tQhr?xx`pTDeo{cJMMt^x#dTqj{ z6NAWOm4Q}FGS(#igLr9Ug8Qu>Wqc%8q>D;v$od3`I-Ue-mumN17j*y$X-9$i!FIo@ z^5K)p?@s6{U)tAj0NW^>1};IAAkGd#X+btG5~5@TTjExRv@5Bk^|`o@sBt0bdZqqLJR+~>D7)_NB&4B1YnbK%Aqz|luuSP7|coc?V(J;+wE29VBk zp^mvy`9;;;>83R1Z>k!9%sTAvGiSL^nJ?-m61TO*!jQ{WbxRey*D@rvVm0{i>1K(W zSkmDw5%bGt$MeO&2k@k|B?J3Xq3ne921AbN0X2ToZTe}L#+$N@(CvgD^JOMzDNEo^ zc#E>WmZEIAlZl)d!b0j|k(VvCpxCsj@(gLaHE<=~n%5j0^dr&720iW8ukUQ`X@@ZhRL9)GkNtyH8uT@WDDU( z_eUv@7AUzoWXj23d-xXqbB*brd{g|1sro53-~K^K=rYQ1wFAxfK)a@d(VI5D9%xpY zqGk7AfNgB9Qb>#Id0jL6Y21GMT5m1V#4Z>qbYn!1_r1h4@dDkf)^ztP6DrsoB=%Ie z|KVW+cj-@aAbqE)Rg{KbZ%_r2-j-)Sy(Rg$ZBWkE({3E{yRy8IWE0?HB@7t-`LumU ze{oD%yI-%EpimL_4cG{&@J-15gRuHV;zx{`FUm!MYU{1_c}ZQafjQpZMQWOdZ^F2e zMX}D|7~IQ!{l@aOj2D#aNLcX0Dq&b@!TMMHIF^NgKS<3`%p0!zi}4Y31hy!Pdo+!z zo67AqZ)V|*6Hf+Psk53OiN|xwEzfsO(ErgfIXIK_PXFLol)&^&q^>@mgj5L03gh+4 zR!x5^tkO)O6g56lX@VXDXqr~*+mqwLa$9E}P{!sFjpV|>#)Pk0$3Nn~<$>(K-7&X= z0k5+6@(xlxIfAoz{KI4N?D3xbLRW^qDD(EGH2d1a)VxqpP`KVlFw-QPz}bQpIrik? zhlQtb{QTpxW0ndq6SLl=^yTlm@e@qknDG}Mv3`b4s}={8@1|pv>BkLq&FH7!$=xo; z>4>)%FBFh1e-gj`yO1^b{hzA76O|U0-zPFX-3^@ukd;a9Y%>8|5Xn6^;6Pa~Gv?i@ zPxxuuDRS~WSK6F@Xoh{&v!1QCH_R<&sdcN;ajMUxz*qC_u5g9-yh z&vQe+miAa28;9K$Eep~D_ym^d!1CaeLZ>dGY3I468alUDRbhI5Lo9WCdpPBjiY57N zrBOjH0~}|J+$yh`Alp6Aud#XpnnForwD6>qYyWB*?W?yBH9(1(r zJk3!Sg#qYaij%07eYLk3n41NFqXDXRXQLtc33TQEC&W3cRopBlXdG6tS|26$5 zWafDPQ;GpAZgUM47Z&XHLtpM|?|fj8fQiwj3@{ytdb)kFIT74OXVYdqq)BeDm)Ty{ zy?nb`oKdfY-iC3;w`!MWW4-QBJmn`K9)HRX`VWgSEie}<*S&yZ#dH2SY$&0dotGaB z=DGzPvUjEDpy^~byiSYB>q95&7t#<+;PhwvKhAbdwcTK&+CO`S3lQ#IEhGi=c3tJx0*%5D>rpP$Gr&6hjBDhIyX*bRPdxF| z+S1Q7fXh|A&}-zIafz8c>TNt-%%^wj#K32YYKec-6T$@Yv zTciJSv`R{m`YJ zqHwCQ)^Dc9;#2JH{NL2PcCO%s>dT#z);n{)k@R3{=Cb1FjPkcZ>F$vyG#xc=;WMgr z0ny(bYpE@Ztzd)P>p!?OyvQYedl$ry+;Z0?u|v!)dlz7FRw;tb_P|jjQ*{^_Pa$ZQ zEW2pE4Y+~%r^{@Fi=Z?MD84lS$zhk>o*qRFZ9k@G>&lh+X?BeI)lsKD`+JLw+x;}X z$gI8BQ7Kad2wOel5N7Y|ufbF8WK0w%b`c~G{uMF3-h2>_R>65-PX zJ=MNaQDRJv{vA29>%m`gofIHFPGA7ZC|FAJYYtT}wp|B3cbiPq+_A4iV|yRusQpXxDkPxMqI51xc8N zx*rvwGu^ye&A)i}Px@cysh@6J5Em^2>k|?e!l@b3sCx6vOLERaFqN&FnfvUh6Bn)x zq=E`f43Gs;z+DPDf2^G`j`)#p{U+`-7L~T?#CpA&d3(-b8U2kbk*sjz5KGKWpdHrH zKVHbd5}?zrMze)5D{+K<{D4rgriB(dAk_h-{f-BP`<+OO5s5UXg1|4jJB{$c%m7dcDT^@@a8ac^dv*fQS1&*ZRv!Dt%E13U^0>mW+s8%2q1at|1xKzwjH&dL5%F zv@28>Nb}wVWhN+Ma7V8kgjw8&jfhw39-Xi}d+#yAGPF>( z=I5CS+BBsJ_{-a~0@?1eO)-RF&&Iy8=Y>9hIPsr`S4^*$C#GE z_e850BS2y}W{yOh_}d*(e4G$AlCEpXth!zuZsOWTq*cT*0(WqC$>O_p%ak~X$W43$ zdVh|+Np!7zm#R1PpAGA@@Cp8pPs?R>8n!Q3IY?a^ifv!ZFCGnVx96tqH;lnwoDXaB z`Kc9s*naNhvw@+~m1nB+dj-Gh_?q4R5+l-S3@+S-7K2f+B)hDa9%qPm9KaJIsLtLSvna zv`lga%WK$_I%l895??w>s8u@SWkWJ0aukhXShZA*&IfwcL_&(!KX{C`Y09T8Dy{A(i{| zx0fqI@0q-(Qy}c)BiHhok{GM5K2cM;Nfi#vh|wo7;HK-b@K!3rOJWoZt9SHa$_ytzUDR>hP0*FnZVkWo8K2z{Inw=j`?SYXTTFV95gf_YvNl|0ogC z3US-1_}pxi%u<6Ja$q^2I8g*^b~8EXe(m~+S4@Ru$FoiTmaAU6WWibfU3D_fN2=I4 zse^(WK(hQ@wj-n-_WKDkQ7Ab^#Ay`G6Nw4yNadKB3?5EqF z7Qze<4==3Jka-{yV^*6dc`Y|!eQ9jpzJO~r#fk^06#*&En-!lQq7h+xMFkyD$o25? zg}0&vSqNwV1T{m%!(D?%xCgq-+hS!zZ>Tlig$QMPmH=fdA6SMH88Pu<+dPRT}}t6@5nj+XPH zUgk*cy=wWY%7}Ks|Cy{{oS6iW?eSQFp42fZ&1rCQfJu_vRx2wUwi}jeFl7Fb&uo&X>18 zNIQAn`{rivcJ(kFp8c)sjQOz}9jbR^IhX%=qbuuCpexYntTM+)sKleUt05tcUw_`h zEk8m78^qP*kpbHCaaZ7>hy%|ND)+5VolWk|0@SdZEGWG;)7a4x%DPI@KE;VMVCjqL zA!tWe$6sSSJ$_DVdSF4)zv7-O5IM^=^djrkQAmdikc6D-gRTG&k>4a+9w&a44V+$y zwj5Kc`)d&;4gbyN8)XlV=MbFPwZ_2biui56KCO6i48kd-7L1;`$1gccO^a2Lo+YeI zkIeh;vUqB;d4aoEhk=8S-_h4 znxh*r+rHeB+$=Z1Av#k?n;s%mT74D;PafePco_8K z{nZ~ODs!rM8!kT1wNHp)s)+BYildghV#UWb&v@A?5NSbbca$t>HNeHnWp{3FPRhBu zy}uk?XLMuxd%@tQ%|!krk6X89;T4+~_;_y)-@|C2%xbNjuB`^fk(@q(dg-$W@$w`K z%V^o1z5{0k;@8hxH+hKqw^_i~R3@oW}4Fgl1NM+m91K4-W zvmrkh+BoUIz4S;a4t>070YT4MPy;jhF^h%lq|rOTR*f;cgTUi*H)TV6;7HCzweHW; z0slH4vP??RgK0ik@F~2woe@oBUcKt=l<<#-#TAyc*g&0qK!#7~9W8OKQfVgRXZk>t&XP8C!w7tG+USj#5!ohs?!o0YJi{s zxu)%CD;@=1ceAb~|XH+{bjJ zKb7V};Iy&qa?956j#I^s&M<*5f?-VTw(fNRJi&ZmAQa{;pm9H4A3T3~Iyu6GapZFC zdzCfG%wWKPrU&=cvE(Z&wR5*<0UNv__nnm}ekI24?VR%De|y5{(NR($FG>OsFQVYh zUX?tj%K+<=A&<{$-~T#r<91>G${j#DOwR<|`SYgUYJ`q@pQoIhE#g-CU}A*`hip6- zPiFu>>Wl)t8q|&_{M`wH{#L;D?oq&-1i(PG*OHtl8~lC!n(Cf$zv46-3Kq3Hi3Xhz z@yhtrg$t`Vi-c|+sH;;HVEa5TRLWq3(kF=X5lr5A_gZWUHixRJ9o6+o&{S!M2Hx$cKzwVF7pU;vMDOLylZoRhc9if z+0EgctHx`dFO@H)dly3X84epLOh|*6+T8Ch7&rtxg$N-Kfq#UKCEtj=yo|)Xc4jB$ z=2yn~AfoY`!uJd|{u@81d4Zxz}r0XW#Wd|%^=|mPuCXtiyO6dd+Cc?4SYhP|h z%~pG&+Y(w!!$SZ!GaAQY0)38zqlC^shp@+w&l#|9`qyhBwVN?V05$9y1r%3xNADP3 zscye9-p9x3BZ#ei{5tDroOisR*7qH!^H&Q|PTipEu!+CtIi>Cd2p|V&NdLI_X%uYo z{pV~$pAG&%%bUwRL9cuEhhxL4s*rkc%uV=y-0efQ=UAXDn$OdcR#;s9V{xlzt0gR` zlVE0ygbFl!1V#>> zUvC#bD$U`oSYrv{a;ahI7%?6|>KySNkMuW&K;|FOzP>|X@e+Vjo340b2nFpUzHk+M z`3O;3j|XsyDq*oxHv8$-CGm2Xy1HdR&$#Nhi;u3Z9RjS7*~5cg_w~T&#$W%w>N8sd zZ_(w%L5f(ZEFg>*!@$;Kj=R+H)M!p#pBsdGQTK!Vdq|dS5i4h2)3g26m!g=MS_i=@ zOduKAWkJZU9D9oZjKBAjRfjc&iU}BM_q|~l^;_#O%|Q`cw4y@>%KR%3C=>&1iB=wKDJvN1H4r) zEe*X~u>xxrkFv&#(*ZmM5Yv=FQFC;8&!vzw!MeUVuZTJ^13`V~-B-dgY1ax>50pb8 z+Z(D+8^=PMXn}HEO^HzBr@zjS?)UP1z~y5=KWEW zM#D5velQO_j3RJvQKRd%+e!nwz(up^HamY7;u;oSQ%2=HmC2To+;)p{uEH%mYX*neP`WE zc|4@8d2zC&VGGgkc&T@qGULSv9;{x3;0neVh!9@0#_Jo+REnzOjQo9NEKW@mTYHs~BL_`}+XUOqzb(egq7%5_cN}U@|R`hrrL1yFl-*x9HcMUA>76FqG_~0OVNhDNSP!RrbWHl+ z2$`1wE&}L=0hq4iwkZ5(r~0|!ZPm!G>8n*+e6NtN_ zYjykh*CR%1*>^YJeb*5Ibqshd8Z@!N4w&)ZvZ<78zirMnqO|=`ac}n5E$yO5YIcQR z{{z|*nj)jVdx2f#mQQw5Gn2{~oXf!*MYnTq1GJX!&VrYQAQGHY#IvM4O*3fW9KXY4Gl@>8tW?A=0>{J>1d z*`A0UwKksk=i$*ag7{T2+3l1A>+bE!*Quw$QXowO0|b^eS6eYahZi6s))5u^V`Iy! zC}7!Wy~G0Hlrb_lE~@vV#(8*Kh#l=yv^Wf?`W4(ygDXdyuwuoeS=RbyOKCjY3c?vW7GfJ zYbAf$?U|PU`2$;0&aQc!LL;4>ubox33NjsC3c9j3~xDbd$s#UNLy0=+D z3yL`i06w+ha?j_?rVpr^r%XTu3^c6jibR;}lMw#@6{5=vur$=>{Mr$NT-&bY`7*OhKu$w{EeZ ziH}Z|UQt7YXFFg;RE&rkH2nm3oHC?Dn~lm=pbq+S(ZfI{ZHkG>jFsf{B+*Ej8j3|h zXT5N6Cl^&NBKUN8xk@Gp*zRVD+HLt$_yP`6ujR)0|D;C$??gln3;cGVkYUihV@i@U zMc8{^0DK8P_;9}9Qjg&lX~*$4L(}%#Mo~U(mokC;yS^iTw0%NK4`O>EQ5O9_GGk<= zO8_S#NV9ZZ-2(TQ?SZ0n$o9c{yQl(V5W<)<1vD+m%kJJjs}G_;1#mxXb2@U9Wn>!Q z47u+8vboEo&|TYH(p=E68B=jd7Zs7Y5Zq7wp)5lvOj(h3O6aW+R<$LZwq}?+ z+sm7s$FgAc_77V9^(qAt587?6&JH>DuZvrra_qHfZ5?%p;JF0Xj=Qu8`~JWX@6$0A9vZheLeEKlDc-wztf zM5eUCRN%Q05_4JK(`K$z>N)-#6cj0Az{R0hq{|b)>64pL2r81yy3rW>zjGr(JD`xV zclzP*m4%-38sOPNvJ|@K9g9bbJh|blR~v>K`NwA>dhdl?yT;wuEUj;^&0iNI_#U&t_-r)wyKAptMJq|&?EVVYcpEcT<)PLq%YZ|`D>*fVCaj$Jb1Zkv9gF{yBz7?{Tgh(;yWVPM#krFt8 zJ7e#uIAVoxI3vC0PgRPnx0bu*$wm8e6_c1vvO2oDLiKtMMz%g95eZ z$Dyhh7Ri?szc*JdGlL z#()P9Tx?wzwEr?Hv2QcyOqFrZ1!t%I722~?i-%ObjLdI;SITv*x$|LruoB2zK$y(4 zGXY{~TxSH$Sms}>T>uDg*+2yH;TWWAmZN!Y(Axf3IM;{_^T`EZ&dGm9bLjL_NQNO+ zC|NnJiC0LLrT+=6&hSRB)Q{Ho80~VRZ)*%}r2D$~88G5w>tX{Ch+r8D#(nI*#jm>8 z>DBNrmEke>W@CMrH&;`oT59z{83JO`JP>%vcY9jk$Fy~w{NAc{UEgERr@?Qhg+f5y zwbrdXqr!}i(TFYa(AjWrIxG^QVjKCJloVOopJQN${vtSDaeysE3;vBXlsI;d+R%dj z0rJO{Tds%YkU)SGVC;VW>og=HTZ7Onnruh$V>egze;#~334H!c$Zf0L)> z++xyG11rDoo}~e|y2bci>=W%ePRuNOj&3{LylG`=$4~mmQpdlzdr;Q%t&o&y4Txev zh&~#@>NvxeTEWhILO9Du(Qfuw})h{m%)57eP-p<&YQ)5;GhT zK~+23B}vQ|%O9*RF1u9+1huVHy7?6s7oRMUF+A8XWezF-@HHz?`0FPsusi;>L+Lzl zYS=y(zoYi{JpRWlqA)Pdv!NM~>ATXq-$eSgo!PAN)YDsN6TmzT9AlB5$SWzA996FQ zKbpS7pUVIJ|2~6r>^-t)RyNtrv7+os$V^0pgEBJCu}6teD61r*kgOu-5ZR*=Wgffi zJ&$w$PVdk6cmD_1<8|HFd|uDzvQ(&-2Y}12@W9=q{KRE#(zx6IlxPfc^g@@1rOH%9 zTLu8a+~+|B;H}W787?TxnyVUmLYqP;f^ZXL9ljn~h}x z7iFii%iLC0P!OlNeR0d5`#RMoxat&{{`BX)LPp=QzwTqTnM7mwgPc>`FIr{aa@BYF zueN8TV`6YTH}Jm}c!Q6~cCNq0&9jJtXIeSM-=vz0(E6q(7Yq5`L%)2KEJ;x_YJHi7 z>>VaQDP0OVa2)uekrx(m;PjV196UT~8RQy0_!zRW5i+2&G$G6_W(^cs?6z5nxtT7_ znS9=w#_PCfrW9JPmF{0TiENJS+p*Ny7W}QQWae5#u!`UyC*tpA$Q zw#Cz*AaPUHp?;!N8-UdUe~cSdHX#4hV?Ir70wkiAWfG9Y3uVduX)_PUHM3JDzentc z`sjgV;7``T9u<&@Dk|5#xCRjg?5v^Q1WoUsv=9!lq@d8JJBEq14*=pRkZu#O(U(~B zLoj47Y(-R9cn0KBFl+()*A&bQfvc7DJJ;sYt+qHQM_4+05t61A!2(VQ^{4o)zUxri zgnV%tZJtXDFT6;(>4SsO#7`*R8KwK(;}86%Bt<^5rAVQoFGn&kOhvH zs0b9c3|q9$;ick3Zm8?YqG!!FF7w2476{=4qHiV!Nl*wth+-trQ5 z;F8`9Q{6mD(@O?Ottt%h08uvjBPa0G+Um~Dzwda?wp}Ca{bUAwX1d!mUc--Qj(&uA{A}8JZ81~7Q&o4^ zv20rzRmemye;DA&(q^ggYh{TOctUx6WI7VSETT}2Flf*Miw8Z6TZYV@8>S;%heSvwcaVlKu~*Pp@i^Bc?JdjV z4fK^Qx?7F;?#QW(s8S&mbAoglj?3yLdzlRM?aR9Lb4M^5Xi@HvEZ~(|cAX;XavtM6 z5;6H~b+TdlN*yo(*}84P{^oQz${X)rKSK3_zK&cuyl!g_Cin<^;{APpmTsWILAN?+WNr-)MUBp zKt>o!I4YcYtg!Gcb>jtDLOm0!`d+1Y0MG7|h34keIpFy=y?kBMkqv zN?=?U4Ja9F$RpP;9uFkw3^r$^e!O#@;gJv^Y2+@&1@n#tk|;`{Zrg@TzdRse ze{o#yH{x;HSBAFu2(9|)R(CEtmZ5Vn>o*RZoR^T2T{yw9R$l1i=Vd9>7sY9C^40}^ zINtsK6&)m0nNE9n(NVvoprJDg{1;u`oa&D0(x-!@4u{{bmZ^Rp>d9V)Q;szr$_u;u z?s|1a>XQQm9tBm51>0s~gK+tCJ3E@#@(l`l0L3Q&wWTSwn+?$(kCOzJWxAT^AeehAJfIA^C-Ip@3%d&RlpzopXnOv`5#X;7w?M#QE3?2X_e*Um8!zP-9O)$EDE&k zRd5q4T}+WjA4hApYzLUe4W}$n>y-10I@`*&G*3wNh!YfP)fwo*P9JEYX=R98)(*Ld z8}xaMYi%clu<^QHVW5)kPrpI^nS++n#mP}${mqY5XNktm`<--#gH&=azjL${?Vhae zQG6OzH*GwQ&|90R*J_GK((QcD=P-Q;5E-W3D}yc;;w$b&DK@t+t5t@F6||V@Y2*&} zH~Ux7VTnI7@C$;A(lY`xG6}QFe7$GUA{5||!XsgT@T4K?jrj0=jo&|m$W$S*Us@N4 zcNh14a#v3Nst^WQ$=bBIl$4ZY1d~8SLq$c!U8-*6^5&C34%J}JcVwbVxnd71La!%>2F@GDpg4+l+wL_H`3y$+U$ z0oM#6%!^fL3)Jc$!}Q$3Lew0Yx>(J2!5dDe!M;;(_l%LPbX!_-rzWJB4;tN}HM06N zL}duhhY%mlw$bP&RSv|+Br9jfXjyx_?>xmW55J-3b9Qplv4#Wc0*?MG0EuzN^62%q z)8oCS1wu5;KTkJu%)iUnFY=GqNa$Mm>Y}Mh9Q0b}^V|p6W=G#&o6$90 zPdPlg(x2}=b?qrWBsJNgxkI1yhz@_n^@s*D_#s;6IR((2)Alc7DP(k7X)e^_?Vj-K z-eu<-nY3p)X}GxE3?UH>TsW3JXmXPt{hG>gIy`NlHc&|<(? z7i@^)%H*^~&k(0NvGAa2J?rEph{gZ^e@Arb(?mB~3j2?*OHjlD5eYQfS*=!YJRtw~!wI{IuV;`NijJ8+!8-%K*kPj3&8Bx`vmYqAZh@+uh1gZtbsz) zJeqZQ;(je9Tv58EaE)z^pcBmE@ihI!Ao$n#P`1q`3{oAkF_nLga@}jFC|7*C;v=^_ z#pHUK8R&fp;Gne7BE_uFYgt_4^52c4%#B>xpRN75hm(Nr3T0R_cnU#3M$$MEKT)cQ zJ1K>pG&oh0{CP7RH&R_Ioa`z8_1?=k%C|$sEx-szwgJvPU;Iu~3Sj)_H^(Pfl2T5G5NC*SJw&Z+17gSSy=qo$D;uHn%bI#om zh;wCO1!_I!xjZ}21YOh_aWSzxTN6OYBh0+$2$?{$DA9Li&&KCfU(=-u#%YiBE4@`L z`O;nT@*=wf@6U?3RQez#Ooj@$Gg=g-^stPMk6359-~$y8Ah`B;q9I09Jy0cJq2ZP` za{XKdmM}S}d$M}-@nG(FMJh!b35v~EU}d^9UcdH&(mq~>sJ$auhsXjwE`>-Y0&!u+ z*wTm(?ZFI$N>MknpQu6iXgMnL}_)wWr7}Ck2x>IoyrYLO8G} z(>H#D%kW?dw3Ia2GOTK3Qg!@Oz2K4S&j@w=&w+Y}}j}z1kz}&(jJm zVua$9A!h@GT<7X4tXa}yj4XD;9*9wDR1ys$OT;B`Jb}6PJdG4i7{G|rKam7-vOIKQ zwH?#*!#AuGm?J;!$WzX?eR!)qFHW;+q2?Sz=r0e9K{dDKu!}08fh?zkP(U2l0b^dC ze<=D0ZmWAAyz-e6D`w2dqPgRU>ky$_fXkQ(sCMtpSTGTnv;|g+G7>~j)I8?o3b}kB zL(dS}fG{;cSrN)36hw-w!ywv+`NL-(3)1V8IK3IV_TZb5``QnHm=Er*Kdj-TM5WVn zkm{#!0uL+T`{MhEI~?l#O&@m4Z-2)LAIDWRXnBc-hGxnC6eO%9rdM9rIgVfj9^A+o zB8fqT8h>lh;Zk{ou}626s%Dk-Nr!ohydKy1>|zIL0W=GW7?hHBTLb{+zWD*=>ZkJA z&``AiVRe=XB*nD#iTctz5MbT8Idm(fYpHLI%aj_&0TfD*?m0qplstO!m~;<`H_JW; zjwJ6}85KX5dwvn+=NEF8KwQ5LT=~<<3n38bK2+-y66L86^8~MQqw2J}tg|mXPC+U- zLwN0yf;dUWY_Wg_M>@6Hf;8pw-UK*Dv*M@bbSVH>0aZI7Vw9guEpPQ$a{ObYn)JwH z;qNK`{xv8Nb}9%(rvR$qL3~7R%buV9GwFD>DrMTY#}>VUj6A~ukS)5Ljb%!xa70?b z)gJMyt6>)Cv|OZQ8hOvaiGH)2A7>#zL+o56MS!!-_Gs~&+62a6^0BC~?tCBthZyFg z9(coka7s#D-S?Kppx=lHGbXP-SyF3vm7QsG9%sP;v%`{N_a z@;q>CSu!bZ=sibzBoucABFI?`+SRz$8X&@JFDjKdGNhRF!O{@xwwXXcA-|EDP zdBC)VOE6`~1)3#*Z1|!&F2U!T$42v>z*U#R1~XPxR$ZsOBHSDkO1nUor=dXUaU)!T z4%bLm#O+ewaw#)GkZ7CI`b5Id{Ft-DQK&hlJhEec5I)GaxWoMxixFr{qr$lZgyL}% zBixkMu5ROpa|ftKUOq-SPYXOXUlkRulKRjyj)gSTe{!&aWjKm^^j%VOQ3qmiOI8i5 zRq-*DnhIKQ1A}NVx~?t+)hrd>rwIU-PY;w*PP8appyiqiaqTAEb~R)uo2AZT1#|?E zJC~hIAaM;DR6y6Xcofy>ON8d?p1>y(uTIX2E)QQe-k7xY3`yZlC0=$1C?f7Oe7`jp z1w=M8J@!!Q6u3X5r<@?fZ`1~;0}knDmL&n4PWb++8)WEa-s>1@eg>wv-GqQV+R#p- zhl3Ngx<;dDM)2m%g&%o#CYe zX^bneErQn7b8cGrHQmOi2@!OYNSbn~3&W#PD4Gja-b06zD2&)AygGU`&KTnYHE?-?djP3Vri z9{1T`O6ZKEl(p`C-qSz zi$ZL~0a;TWW+Bc-eIqaoxj{qmYV@ zW`#3D&r9^eX_i67op;PhcE&@_IBrBb1zMjK!aEDZ@UGXl?s%;%L?WqI`)LSMwh`F> z1`~Mnxbf%54F~v4^D`~lO4^f@8D7a+2uk+{e0k1ff>XEI^%JX8cINiTPy!{-9x;s449qBegs|yYk-@0)+Ys z1|1DX9Xevb>GNezcEIeLx-lNTQn+(K&gQ}g+-@Bp>03ZG9IJ+;^s_UC>Hj``Vj!CY9qIJm_d6z{r*B z^R%-aCIrC|(HLPU(3*O0wAN$e^A{(3-J|7H__wT;Iq9)gTFLLDPy>iOn&o=f$>m;Q{ z{7c+-gKUn+-H3Y}%Khte_o=cmbbA2RM%Cu6Fty#$IG-!#LZMW)+hP^EuTwUcXDqpp?BZK9(Az+Lu291v2Auuj{nL@KxuMudS&Ci03U5_Fd?Q$x^Y?_Nj4Stxiz zVP4lh!tdXBo%d=de}=0vs51Y1w(#P}6mqG0Ww!psgLU&s>LrShM+NiEf2V8v*q#v2bWHUs>_zwrY5f7eT4jIrg^iPZQ zd*43L>=q^^;BbR^0(68h=ONZ%h&FC&iIJi2J zk@LBEKAJKt>{)I96GEl^Z8QypM8sfOad z`Q30L@BcPA9=o~O&Hf@yn1$a+PyA6u&l_7JC89KIFkjV(32M>P_~gHaGW=E~aooJ3 zMDaCkSBSK+*s zrsJ;-A7K;PbJ$+TVg%Kh9qkM@?rjUo4@^xQFgDhl(?e8JdnzBL-IBwXu|qZyaroIp ze;(b4!{IN9OnC5{v4>@BAX*Sar#3cSHh zeojBUE@P8mPB{?1C~Cu77p$x?ha4BawjQiJ!|x6vhL8Ld*C0 zX6K_x;vI}y&|yf<4`nJs;ieH*@9_Ne1p0T}oZ2_6(H9_*QSk0$?Y%XVOTp;hJlEiN zUaM!!LvVecKJuU;uksz>UScb%U*4ZnK$zLbBWeRx^{E5XUf`&X!yPCx9gs(H5KSq1 zA{W)m(^pbwForHluKs4!50jGqNbIvJB%W*94d&*I>K*I0nI-#In74y8XOAixBX1qm z1&+>@eWrf$81z`qD;N5pA+{IEJFoy>hcuXbLVy9-K{V_!8^U5WHvmy@|2m&@T7I4q zUV|v3)u6+M+#leu2}KhZazW1splqhwu808an`r~2MA45k>l>(t?g$Hb^HXmjt%<9g zzz=(%b|gzWvP|Pi4%rzV%?hFJIU@k+mdLpcO!GQJ43KsLIM(41Y5MA%tCXG^5;T#C ziV|3+OrvI_WbZrOLDdV6qo~IdwT^!-jW)e5Kk{3>9Ta=w;t4WkO3UybI(y96vR?Q( zU#PcFf0KNxp*f+OO}VDq<>@iiWo;@8Hpr0CU^UxB;vtF^hzum@phDUC?90H`Z^UK7 zc;AdC4~2CE;6|67eK;?8CUWER0hzak?!m}o-Ge_oq(L_YVHT@k>h_i{JN`Fgbif_} zF$I1NmCN$o>%PFP;*r2(Wq$+W(LZSNHD8(y8W`!MZzZWn2m@}|5SXbqopIt;f1|9E zA0?{=IZ9qvVqsx9igurU&N%_&QjO>8J{|1F{_vLcH=O{1!7%DAx)<1bpt`&U!w**a zZe=sDxZ0hJnY3F6T#}BK|H8axy~Hg7lsEl8ou(R?qr!1sp1RgFE#dida5P4g&KAH` zwEm`nSTR_r!Ew0=jJG5eJk%0r88bFSEAH?#*;|esJ6BU0 zIbO)z?1Wc#H_L@bS+HsvoJqvpM(<~0<4C1T8{Cwwa)#t7yH(af;|tgZO5HGScP-?+kzQs zpJ%?Er_g&UUX9xgV7Dx_BmGvq&%%T=I(#zNKQ@~k<`Sx(8Ko{=cA`pf(KVJq;xd-b zCxaollXN;`$52)A&I7BAi1+2P7-e-HM}~o0>n&FMK$iqS&cMilCUZr4v1ciCM|sbzIjBJkMqy954(wJ*Y&3CZ(G13|Lq^gw;JvhBw%C|&ku0nal zs5_vYm*9mji_^ZMEBILN;qlXm?-A|Cr5S6Y&>}uKE}`$HJ}IL11}k0_F+MaBkpWXF zEGzc48k?r`f6u}@0TRy#gC~cmMy3nZOKsSeWn~cbRnO9QIA&`3_gQF(?%s9#t-kp`jP`tyxL>E-h=q3 zKjq8X(X}Qzu~+6b-ygG;F*bp%$JxhNjEiW1P~)a&$SJKUz(r~8cAlyF6wpQVLy6}w zAFUzj_B0CT>}fF5kq49A$+%@fs~NOd!*|HRa`~R$F7bEe4UCpfT>LA!>GG8mN)jMLh>K8SwEB`FLbW$V~)ZaV`mtVyb` zyXh3t;;uD?lauRqFK_f}>2aTqZ;<~v>&+9F?fu6`_^rKnQQzvn3I|zVUo{0^AJ60E z8bL*{=Az~t`*M{_GiT|+n@nY^JHHk& zqx&I~C7$=b*APBDhU>jg?;yW83?!6ar zevd#`8lp*dUo@8Tlw+@*xnIcheYu^SD9xvRcgSh{E?Y3Q*vehq4*g1_FdC2Qa0r@d zC4orAEH2)2sU5dW$&EDKJ}<1wg>ntX(tYlB318gw^~P;a2c`zw|D-xNV-U{z&^=cO zZkP26P8b%YgN4cCY;*CA*n4(dXyK(e){V4-&J$2@3ZGUpG+KFmNv_fvz5X}2o~*?> zg8%onQnq;Jdj2M+3u(r`s}GF;$=M~JUxXUjFm$MXey;+L`E2&!ourYn96a$#H`WmZ zQyKrw1=TT6S8{5h59T?RQ5dCnBTWdt{&n!%1*oeWL?H>o*va~p^=p+2J_?q>@M?=h z09X0dwEu9yz0DRNW_wWAGs0_B%-c*}5W{HkZoz7;p=+Vt)8F*bi437uH44Z=BYNN~ zVDYhId42(Sn;ydnI5H6AG|F~vJF-w%v*V+{c$op2kNN(eVI{ZeUpclFA>IDVDA{i# z=aDm^PCK%G>^97;$AwA1P;DQ6=I7YDx>i$e2Rlf`nJ+nJBwje3#+;9Srd9_4?FK#> zjUL^~0S|ZuhYlKgLZq??deFr(4EqY6qBpL?3T~tyq5_C%_oGrK8ud?^ET$;1o%n{=dJtWX3_djMX@t+Lar1Ism3!_@^s{pl8Jb9(4V@w zp8=EkGZzK2o9+w5a0$`Bq|~2CLK7JqHTYq@skHCHB=-C90d;&jN`Cn3PMSwqT#(z} z1BH1_Bl7(z_~p@nljy@Ug?dA`{i~I>?*umBeJRMn(c#(Vwr`Ve3eBoAJQ=h--$~&;U+QSyXEGjU7FcT?X>jXxdrRaid-Ns4?^z@X7WP~D za&A>@q#jM{B4)V;E}nVWcCpQ&wnml?SIG<_Mx%GM56sEq9eyXT^G%x1QO=nAUqEph z;a-p6=%9YHFad%yJLFz#U#}dLOLFJ(IEB#EWq61|hyA zdaL>Cmj_B%wsTOV-96QLqaAy7_2O0EdcfpktsPJ;ls*{fOtzp1cASH5 z(w}Y<46OfobLHQL#AG3hr2jI`^qRy9xIciH=)%9=v$rTjR0#(rrJKfu!ADTSNZ?DX zeW^~)ol}_rR~9^jO^s*YoDx=sB4-xb%87V(2njfnI5II2T>7%4z!cJYe88txFb5J_ zjJV{DEgWCy!ntBITl-tBJO^}t+d&&=wSfr|M_U-*6>if9^k!2v9=+$!A+OF0MjjR$ ztPgxQ@H6a!spt1XSg46>(MCWPh4*Gs1P+ZOQPrUvmN(5hJeOF0>9<`Hqfg-|Gu&E! zr56^q4E+<1mRUAbrEDb1tq3BG`&}I&b>V-eZQB+?CYp3aMIME?KCb?Ww_EvotuE8y z(_}cEgs{{}(h4>=9p(BiLpnJUz5T3b5fz#5u|;=>$uFwH#o>fU6*?ohC@GA^br;To z1|6qNm2=0~JC7tNRW@6D2Sv_+H(*C>_D?|H&n3l>3US=dB7|Oybdwo~`$_?+p=?xG zn41JX?+*Jrop#%{s;1^3S*|M450$_H)K#cJ{rbbF?3X`6ZdIb`9*x{nJ(@MR&zv$| z&H){2wN+w^Mx`{EN10lq=IUOj8xO1XlcC_f$K>jI<(cwQ}b2V(=q7{RS zDu#|E2}oaT;@N?*f?ckSkKTcDeWH#h8%DVF`~2y(`%fgUJW^_qYV)_*agmZb?@qp2 zP4hWE?Y^_T1GOtB1$~{3O{s_=O()itGM9!OpgO@$t5dM+N@butxSd+e3cA#J|GYw6 z6asQSAb7UGi7=q<1v_)&TK)L7B1&Pqzl&lbR3WOzowk`q_r&w9%-XYIm$-4C0TE!n z6)IIlS+pKXRy%4hqKWt&=}Xa#i}rA@whc&4JiuJJ^OAs+A{sG3(LKuwNYFW7v7r`f_*g81E4i-Sb|jT^ps zZBQU@^~hct@LoN{lC^PHkj472%(Ldtz^U*J{tK%w?6`^54w`${#soq+KN>C;t3a8O zzW`2=3v6G%bZF>~iJ%kVhh>`A8Gtn!BK`xSn33sKJiv69{=Qzk{KLyXHC2Y5?L!aa z&{A}F^d)g4)ZBY@6%()qT{$0^7kb`u=`Q4HR$A0ucxV&{83!MOyz}{_q z5*WMlN$&Gx}aVS<$oH&|DNpNUcj1-@6+n(sM62JX;f`RBp359jSlS{j*xuA;bu9N zQAXrT0QVLa!_&wBEsCB6xe7w5_S-eCZ-EU-nWfbL_ZP=g8xBxj2q5QSf+;`Zg%l0# zWNpA&@`yubpDJ`M-h92uV6pL=;RQ@8QP^B0Bf}fur>>62-L-nkEXgQf$iXC@|| z)!+xu{kAERO!LS7$6rN45i{buBNR-bn!}O@>@=_8a(f{zu$%6o&ja4zGbEA9D0K7p z^RLA}fCfj?XQn9eMYO6{bv@O^pBnKJe>@2iT``L48p6N;wI_vl@xGo=H_Qv}_X;f1 zO`)Io{8_M3XCsPu{muSeF&1k{M4sdgfahU3Pf?(->%`3k#4kzMeuzdqQ1rpl$itT2 z6fjX@z-6nyWj3L7y+2+6(nqah8bYqnDK<*2q?>c&~#t= z$iRkqF*;dAuxJrmE&<9x9msV8DVs+*Y$alMMS{<7^*TC=1_cTaUj>qPc(vWz$ra)! zf-jz&4F+RZZhbF*E4cdiUO3&NiynY`0FzfX9=%Qna9o6wu8T0auKxK}?0IEvhCDSj zr44h+H>RI=S)5qAFqC4#K+z{R>t?1#Q71Ou!nVTRVEre2r zH<7i(9EdDD1|ZfD#ymnlZe`4Qbm|M*o#oC17<%m2D>qIJ6QOreoP~dC2LH7k?@x=T zbr()ngP5jIds`;$EPW0(K)Cy9__joqOjn^S$VqdBv-;39@NIwfafkjWvq6Q(P1zGo z{<*@}$tb=LNz)eO*ptE#kRl))*PJcim^}xE|9dKDj6$P23n)lcNx^8iK>>9LigN@; zyzrHYvT%p4(N(iJ<4AH+8rY-}H2LQjc>};ogE(=O8{GqmPSGNKVF&6ZgdE`WR{2Mt zA%XA8JkDZ;@SbRA?JX$tW`^aP^;g*i29PYKA%%G!wc}cibx&}MJ|i~8{(Of7;Xg0L zs*Fn%O$m<2SeC`|j&+`Hk%LCCo`nl8y_I0gTkIDZ`yOLb{ZD^x^Tm78xmqx)S<GpKXY<*#5rpWC&4fZgBt`rk{=uFd_)CP$sB@lJ?OFQY%Brb3zzE=-^( z944e_&gf@Y;QgVmlE00@+atc9YE`UdaS%HAt;;Ow2N3HspZAvn#g6U`-4T?=zuv~* z_LRN1v3@9eX@-u{JaX~T%iXdN_`;_%lmv1Oz{)NyLe4oiH$I$w^O3 zPlZ2Ta1S9Qvr?N-dcYE8X;vt1!z`K;vi)32ks!$|H#9@d0!RxRNx6kR{`EvYg{P3? zI@R+1+FlX#C76%?ZCAtt995Kg!lJ)iK$R}26$g7u?h9|hv$_BGE6QU8{!HRWeJ2|y zouZ?3GkWXpJJ1M)$z&aHo93r#@N^6l_w3&!vZAKHn4rjh3 zHuz1qL>{z6b|lSib|y{~A80Shkt%xMOBXT0RK&|6uP<>6?Ga^PX;nJVK-MuQ4c;^f zK-W982Lt3s#gKO*kD*TK+Y?R$-%K<+~=Ub_*%lI>G-Gi^`u>&Fmk7-hh(tN_5t&N6;vn|+kVV-fMxRpW5?xQ@nZ@} zTMuff2U;m@)Bx4N$nbD&f-Elgxn<2P_|K6yr`nbhw1KupE|-V^8wzQQvCt@h!nop3 zbk-O{1NiNWVo@^m7##uW8S3?{%epyJxLRY};6-B@s^69z<#9mkCjDle{YClh?}|Ot z8KZFufHTrwsOtf6k+xlICflop6q7N2_;o|dEc1trM=^f%e^DrJEtd4YZ(}xDEo|Fg zJF-&jG~hF;8D~ZYn!qdV{(Xu{;QYn*m1~7R>o{L5aRJ_B+n~sMv@>~(Qnp?4B0%%r z;B!!gwN$uW=fdYZO7D%H?Q{#K}AGF9zl>t(|z+O z`Nvz+t(Dkx{EgGnB$vX>qt3jFl%_Qq7P$WYMX__(wR%g|NCDj&e^%m2H0?ITbI$iC zo4~N0LVLf9JF<2V+vK`tU@0aX#`FQ;mRrZlP<)ggBRx~t_-$)%Z|_6M+Son7l$F!E zMKU>*I3h7YB_TquphgKd-8j-F-QB!5WJBbi6A#Q5u2&Sk9nM-42g6OD@4)?KAZ8oE zfoy7v8KamiBzLO_x((v;c0u%i1=vHgUhMaNcPrs4+NUTb^5fm5?!u{i+vUe^v6Rdw zHHuda*;Hhj2~oa$z^+i1RU&^e>OPt4yTmIK{3o|BigTX^FOlii!FZy|Y<=#!M2I$j z4|vRgSsTdLV#0<0J{IiFi}0>L!8Zbjv@;QpG#n$^Xe3nLIW(*@NM?x0F}zKxoq3`* znNuE23+oF=Wu+#%qtn?RKamCQ{8_1GPLCE25Wa0(d@YGRcI$zjnrN@bQ(W*2<<>D% zUs;06;?QNkQsq;*n<*IS)quV3YgD2q^zGX8@=sqaojoZx?q`PjtX=cNB1nk75L_YM zu%on>#hOq$_&brvRw$YRvp|;NlIVNf(TjRlFGN<_e8%_41uta%Of(RO>@|)w$Q?|C z>wG-8y0$SsJ!MmBt>KFE6FOck_7H(WnYo#N?36B94sNunQBah&mJ^-=xmb%h5?wCI z)T<@C;MQAgH|g~K7m=+Wxr9tl(!fd7`An3ZEusJL<}4~!L+nK+pA2w!e-KKj2gBRQ z5*8~LW!|>f)h0Z($8z00ZLKT(hHd{$_0PRcTl;C?=%GLY*mg1X_#X;!&Mt%bI`yy5 zJ`LrKvlc&ddw}2Wx%2hBFJ!ZHcW-k3RYIpaQ6qza`5ZwJX#3?^W8O-Ry`WwzAVf&w zPw5wjz2x#a58NRgH`=3D`IIOVafW)BB z&vF~#HIrHr1&GLS94HBU>sWJbp+J}KDNQz{i^@wr9Ev%Emh%Qk{e0gZ$Sq}1XljrU z(3PW|;cl1{aYZ7@c6@z_FJ2z&z<)=tiBHG^IDp^PdSmAF?MB(N^GB)^z0uU}($LGV z)cJnZc+eR(PF3Ap{2++VTe(L*yE8gJt>|`Q+$E@VEWCw{-Zx5qEQzaNd?= zDT$0DwVD$pk+>MI12Ff=A9CsXX>~#v=3FCZp6SH%LB5GId3gjflQUx|`wU+NeY%$K zSZ(R^m-INs?r$Az)vDD}Fv6wi5~xpnIHa9Q{UzpDPe`-6M1`myhn|3&)muMarEw*% zCE-{_p{}0y<_mE9*WrKoVNC_vR+CqbUX5+;T~OgaU5pJ#VV7kz z{8+2X*YZ8_ynHlVclvG>wRO2EboQXLHs=>tTIg&Q?D|7NLtvQaq%bOElGM2mTFusw z%NL(roX2eVvz`b#(hbxtgG;!~OnH!QnnPjyt-(+;`lB7b6Y@lif?&OYE4J^hsO?2sdE~3(+!kEZQHGj}Qj0Q+vU)sZ zI{*k+f6<<1H>#-dcc)mMOvQ?F<7yNZB1?#1e~=`!z~~Bs{T=Y;j$ojdF1(?&j>emt zsx!vNe3pTc@z<$*89gS?hPq3_^kwMp8V{Kp)^QOR@1$4z{iOc6gt|~J=dQN2IYKzv zEq->3F#E781^3kOLNk&%R06I3@-w_8nJ3J@8CiCdtLQyaa@c~9%I$nVWm z=+Cg9%kQ`ry;!P!n*?6<-wua@(<^_Ee(ZpngLo=2^m&DT<>3?m#t1&Gk_G04oa~&! zoKhidpF^KZP$G&qxGyQA5$(LAy7IAo<7@NgA(vn#!}Vuu?Z<=F&%m+Xe6YI0TX7P5 z!{GE*mUqlo>c)G2zn93g);&Efq>{7n0~4qDH@(`9UNZqH^G8dCSZXcycr*GkK09%> zgK!g>(mNu#1#8kJXB55!LXe4fzu~G!eV=!WQoEhN+h#1r)Pu=9_y~>>`@gTW5^n8e6As@krHpQi;inXhjvmYfA72E3{CTd>zjFTU$=;Wc2j& zz5ayxT-Y8ON9z2=K+$i+=oIFA1T#L?GVg7S{w)tD) zU`rX6*eN*OfKB^oq+l;;Fl6$Arj!r}xx^StXXTxKL-5PdTn}sjV5;tMo04HuzJ^3j zG~LD%hUs8o0my}o zYQNIxW6BwI@zna@&4ByS%_{ajtt5<-i0Ztc@8Jh3TzVsRs*Y z*}~4n+ps7>Fwfg5e7zMFaz)~@Rv%xz8nS};P%&_>LQUk+6Y(iRTk*HlJNY?!lA@lz zlS+zbO_zcV_7_|K32hJ3cuLUi-L<%?)f57{L}@X#!m4c%lySV0-d{Sxy|yUGaRFo6 z^ij-Mqktd41OKb(PlK$5Kx_;CWn!>b3sn=Pja{F~J%0N4>oz_{79{P9@}56b%*CFa zowYj)YDSyR>hBk|?8e>Rw=J%;P_duVNNNn{B2@qKnBr*Q_#}(*btnORfrxGbbN% zPagd)37DpOzzYOyJkXI7lPBWo(pcD)@BT=dipfsDZ50lbJhD<~(>Kv(Bwrld)I>sc z1?d2i@2zp7;&;9-afsdHu1gpLi8<=N0u7fnF_!Ac&U&#?)ZY`vv&{b)`#=MA|F+eN zi^55eYB@%G&w$}o$+uy)k`GZgkJ7SK$#8Sh8P&(H+5)I27ecq*6NJ|=N&POgq1_)X zl2BhBeNaE^HFGFmhlSQ)KkQTR8xy3EzwbwX(57+`JX)bFd9;41zrdxjee7ijbBj#T z9onp$*#eEsH4L4}g4W80wajxM^#J(6 zm5wd{E$_-L<2si5us&D-b$olQU{?mNVrSnCdj%f8aKH60BniG>n*QV~vl{g|8~oBh zHs3owxWW9xBxbjHnId^#dEm3X0zt$B1H z4OQF}9haOV?lfgiB3-a?rgiFb_|LAklVOkh&_B1(_N>Tl7A~Q{_sbEn?FTJ@*DNB` z%FcZn!d?8rcZc!ezTva;O7M7u!dI0Yg*y#JPiNRDybMCY8BK+c4~)->(XmkweD-jw zYa$i!w^KNo+q^SxGH;bJtf;xsWct&K^>@L$VWIcQyCmbjBkQxVlla_cBC4_C$xO9nD@6Htr|cS#K& zuqoqtr$IY{jkFA_H>(QD_BW=D*Owj@Z6W0HQCKn*Q{e%+3{0FfVNOsHs)XOKS(tMa zZnVM5?8OR%pmMO)D^-@y-)VkJqY?Qg2bcpN#Hy|6fB*=qlb6OiRscKke*XbaSE0=e zx4x>T0gd|;wnG-2+a3CexXyp)Z9p4A6zS**lsza+7ig0IIvZq&PPSnkf+DaR(M>el zk#Hh)txRcZY|q`D%k~YZ8!|W4AtG?noT#=!XBvK&^!JGA#}VXGaIjx#oM+R0?AK0j zyD2C4112k{>rBIPV;n5K(*wuiQf1-_xyMU*%U>UQjZM&hXmH{kQ{3K}cv)Amxe(nI zgWh&Z0HDb_T^U1pf~AiDW4+qjTl?o#Yc?bp>G-k4%b0Qxa49AT_6d9*p^A3UKMzJ9 zQ3zgxK~H!e(8{gQG#>{qLhdt4N{WZ014?36_8d0q@`;J5|SdF6BLkc1}vWap1)w% zb@sW>eeQG4`}Hm;of-H;KgC(g&>O7ajqv2o@>oJN{cRJQs4{-fd0)<lmL*f)$4fYh&au1x(q@$d`XGeV?GQ{OH|~h&g$Td@ z5_=trg)tn9u+;Og@I`8|l9A)~-k1^VD79qINI|E66rkjQ-lIq=;EmavyDYU(25Fc} z;(;VclekZ>0H7&vXFh;vM{yQngB}9UYbm0*(C1`MAAuS19iVJ)v?+S(^V-q2y*Q*v zh#CC*eF6Rd@`J+aCEv@|TR~%s)Lil1I0n8*`|X%tLw2P4QTSq1 zKeZx@9hJ#b@6k7p2v@s=Y)KMsUBzJu5-TgKC7n@f0_rX8dsx`{zO|vcE%F|i>%BdK z@jL@&MdyJ6w@a@h`(ML;PxMR^VREj#RrvWF$Om>v9_8bHkfJF zZ>Xk)gQ{i=2g9N0pbp6`{E335CqoQ&uLt$VG&5%(GMzJpJ0fYs+51|*Y1^Qecb_0E zRo^{tP0i5}E?@8v$>dSjq#f>jM7w(>a$jrl?)eD&>!%vNYWkuyI(oO3=xLLG&==+Ur^d1chkrIql$^X|NdNs#2ni zW}>^N0Ul`_(daI2O|M~>j^WY{hN52R*s1vP$?S%ZHLAnpY#$UuUkYlg%ug3 zguNxb$^Q8roAKj{++U7|O-+$I*qp39{IYH1U6?Zw9BMc~oY+?qhoAsPfk$BC$m>zi z=a1CZ*E?;-f(dfI+)O9&TXVK?Y0DCRKm9cj) z;c>|ZueVbR*jfE7Y?tU~%ntMnTN8XA4RWmo*GK+4D)(!MM9MmXaxu%Zm_RQ4g@U^G zAYLw(RnkzXvbm?vagzaFjNyWJT&{J?g*E^!j7K+96%`jRzf{he=-UL51{?t3ge)@Av^mWfIGfAgH8PA< z1h%jF_pppFogPI}<9DWA<0*yT6!8pc&oq}D5!sWc0xDH@Z^<1(-EY`|Al6G{@?M-q zembDWh$O>^w_Wl(Q%U6q<=d6QPU4E$F-4WU>zwOcQM3G!5}QXA1^q!9ncXh z*Hlz+>bY-}O(c2E?jKBls%ie5;qUFjRTX8ANPl*(Q22=e*z=7o4TJ`IaZ=406A{<_ zF>I%(qRoZr4noSd>*>jXmW_yn#7xivO1dNV0&tK9f`Lbd)ec=IH7SE?Raz?G<#^Gs zuTS|9&|ZF25DArLml$}?IsmNsr*-OlX&v$F?2&VdVP@ffU?8j!=sBf0b)OP@kZ=&a zLcSLifcy`*C^3G&BKj9!XBi-J)^>IFoV%~S!iuK!c~BVd&bjmoRBN-dA>QD=<^Aqq z@BWrPOrPT4d>&ce@7o8{n(o+VLa7YhSvxLDHLhLK&bn)*m{sa)6*R&e3A(wIdK z$Wd)0p13FKd}U-LuIi{WqLm!L7;s#!SG<}i=o>5ey%?mAF-<5-l%C;5sSS`_LD#gr zkX^nbQEnN0U%h%I^l|mWhWeYf9ALTZhw_b3R3BMJM?Ue59v+#*n^f{)_fC~)I{9che8Y)odHJOKaX9H8mUhcZ9!{jr{j3eLr%3Y9RB2YyXHw!K(wR zm#z|Txf!k-Q@$UNND?V{j)f*^lycfwQYLPCWetUJHotGK?Va&8O0@GDein{refE;b z5{CBZerO9*-q0w#^Sxmh;t|O%;f6O^mJAI4KR>SL&pCiOZH}`aAJ1-IB>lckeS0ww zM6p1MZfgz(TJ@z+o}dZ6;Fd&^wB={-+K#(DrWWpVnbBtz_USYIVgDrj=QSt@az1f8 zL7{B?{>M#g%Y@Q`n`vsrouGP`G+n@KJsyzkS)7j$bi&Ax2iw;gNvKP{73$~Y1K9b{ z=agSvZGek~nND!1DTpULa3j!wLrG`4qUk{JjK)i)V{84XJ8qV1jt6ErGvlktU}E?0 zG8KJtlKfK2LCV`{?+N$Mm!Zbf_8J`iN&WM%>4baTD#;p2+DUpN3KaK;&h?I!BP&}a ze?6@Cc=OlJIWRPUGqVwOF!vobc4!Ex)A_;CCCJEucz`>;d=}qbH=cWnec5-h_CRAM zb5IYM$gZ!?j|ZlN2JBPOynCc*8H5|fDGkjkU_c~p$cVn|<^5qoo@pul0Zaiw zMEve0VF$CY6pKTkNrkGj)hnO9_X!M2AW!XMcVs?yT8pNc4s41R2E^-G0Tin8gLe;} z7|J?x{J5*Nfd`*I(~1F86)&*X=8}~-17oP6r!09s6Fjr?Q&J(?Z~c79Px0G^>NtxC zV-QbrOsMP)s?*wlW^Y=7G~Z&w@zu#qg@gHi4)tV8uqTc-U==6%ztBoWN~Jg*IoolB z72GRmh_GDLYf2prqd8i<)BWLSIIp20^52(Wnb2`;!*Bn6=Z$)8Y$ON@uLN!$C9BPj_1{9u4=63uw+~WnCsZ3s2tLZip4tIGA$Zeuz1;PlyG!L#C@ZJqclO$;(to&QX0Mi{qy z6>dOl`@+ZnfJP`lSrkx6saS35xzSw7C*x2aE|JF#e31X*0XGI0Mrb#44}&D=yx{F& zCLjL98}V4@2MIr!YBd0g0#s;UoIsVU+kfBHsp6_{9JAu@A>&bSSvCM4GcI_b0~^u3 z<|azRG!18(ZW@UsK~?UPD|pePA4RC?B|( zrdK;ju?|@$T_@`s$H{;CupSu8Ld_mLP<-+0lW`d1gG>VKn7cHt8dEoGV(}KW zA7lrV2l{Kkuqb_qd2FcD92oJ2uYU5&O!SmI+cf_Uq;4)da`1v+s|OgztdZ^hGzb{u zO0<%eH#$zvs)vgt{xc=}S=HA9aAY2l8c zk*k*>>gb2*Y3olzjLviKcw1C%WlvFWMpiq##CpjWUDdej6ods@`ZWhdEA}3w9u>{{ z2M0HVr>Q4Pj-CGee((@0X8r#3sR`wgYy9F&9z%W28~9>;Y68C%=I0QGgy9A}_Y&)! zw7CG67YWJ0^(J&ZMfHk)kIH?SB+NV8u|V65Tc)mtxXK*AGfbuPzlKZ;z>^#UN`WVr{}S>79fOVHQc^W7+a@1C3Q)pkjfPu@*#D3X!|--{40wN z4GV|~b`-|N=ah%+cPb6>P~+k}Xg=jXB)t&h{b0ihNTF;wWruySgLhLoviXLjTG*u%ade)dF-Z z-E9XRmYA}<}E2sjN2n@*oMhk(oqtZ{d3MqB9`)H-m;_s4u{k{ViG_^!~asausD~kYpAV@~i z!7HZ=cXQY*?P4gu?1*wm;g2y<8=J}f7}k*B&wfwo%M${}KbL2^ezvU{u`IA0efj-Z zer})j_DwJ-+aC;K3&*XGpHQoJ*Bu_U^AA?zwmll1=iSfdu}_KPmd($%m>s7LwR~?|A9#vBE8dYzD%V0%68t(7JoVix%~gBu83A9i`A8>?3f>i%#=*!HaR z5-~SA8$R-c4d-nc^yR2C| z@Jtt0O@t4tzahuu5AY5^{p^4)c|o$*Lg3@E3M)y%nY|)t(18g~z@WqkcN;$bqeVQb z5BxFp1xdtKJcv}_Vc7h ziuKcw^(n76^gZH*J9&p!SB~^V>k#~VPDsE?S+s|f$}kL8ICUzn8l1u^6id&i8bLhaG#6Ki_9A%4xgTg zy=|fo!A3LpB%}3xh5Vn<`EQwn<_V9z$W&u}(>rC+n4@)(Vrza!b?H9R!oNNxh9b4p zW|4yuFvhe~#WY4g5Cv%p1$!(gdZAdt7RwuEbJPB5`d`9fYF%7UovYc>Q|V$l6T2&; zU|v43%;R)%K0eBpA}tC?ln#I4;iOEpKw^MEOXJ?;gtz#dMAh?O;oHHt3iRjDrk%KsiKm#9<8H+zP8P3Wew-|0@QGh^N+q zXe)yeXi-Rz87!?3B}&>>mv%)a%+P985xzh*bA9?^`XtNz_Caa-cG+Hy1sjio5$;jD z%-L3lP*&Yc?oO^QR4VmR`RQ@u`^2g518*4&&cZi8s9KyU2WD+YEU??r+p*d4+KH$% z%=!+k@P!M9@rBPNi$1XsmK7xt^hjxb!WRbR=(&Cx;Xp(J3T+k<+b4Ws+Ss+#7zz^X zQ>SO}sr~`Gc+5SOX$dkhYL6>V(RD2E`pZT)|Hjxl@%BtH0nqbI4~#^; zR=aSGJ2O>_F=FyAlMH^Eq%XtfcQQ^6bG4>A z;`(-xspd3zv)0qO%@D(XKvHihv|@tOpk|tfzc;?3vmjf|UmgzoG~$}24s9hg{Klzi zwh)X77%e>F-d5>3eacYTZZ|y-?0ki*;IlSicpi?xMPqvs(09|i16K(RyH#*;Apl6J zvqJDPh1!lHdT$oNx#eGFf#a9X3wL;qo6JEBMYgw5a*s%X(v-jK4quQMnll1DxKsp) zN!((*P6*sQ+GDL^Ug#$(wzR2NTE5@1V?=^6H_MQ_tDH9DK+?$C&43h=@gXK_#1o!B;Gk#VHu_~;(styUe8uLFGBBZcNLRS?xM_=ZE~ATbHz%#r5K~Ku zoJ*Wbo#y5$vG{(`Uz#`huHcZ?BHhAn3jVP}KEkc|>0le}8T?p@W88GAnt)kJcH|tw z+l~gh6PnEk^EN&6-KSniW`TLQq;HuEf$x~`bCv03N~2J%oPt8|NGvT^(@_y6X3brMWc-vhx9^_qTuQ>$ z`er_w4R9=S$6sDyyA_Ivb07+G;4D(^UtO^H}F2hGCpn*b^cm`}O9s{*mpL)1uXC}(tOpAUIT-Ej)^(#St$ zc4L?Y z_=qq@Id^r@=|P5d)gsz4Q}pH+!+o>g#Sj(V(e9kOE)N&(*ov!wb$q`w%J|dtMC`vJ z_q`s56zlipS0UH8bcNWq(e>J+Hu3hVAVYg+ZVrrX== zMj~rIGCwHs4s_s89$9}LoIEp3sH2{srT8OlE$&phJMb*3gietPlnJ3A5&R}ocp7-B z$ALcen|c`}9z&7F%mB>kA5q#=$sb)bJ488Fa1w2JYIC$BQSP+55;rv8-; zAUcKkL{wY_Rp>k$Z62t)J0pG@2yP)M2A8VFCksX}P~KW#e2R>0 zj%a&$Hb6hg3prE*b%(8)&N0*e)!9h82ANUSf<-97bLE3KALplHa&i?Fe|>c!!iQv3C2Z^eG>b{la0+EhxLm7~k-p?DlweiAZUXuuu|x=qfZ2JaN~rj{b%Mi zJ;?OkZpoJVr_TsSE|sI)Zp6xsnZCY{j~#2)8F2Y7t&G4OrE(ZZ!514UFw5Ql5?FN2M?=Fr&@4$$#Kg1 zMfiU3?KHyi&ZeU@;n*{_V)Bub7Bq@}PUf1k+wrI-`JuL%$>AR6BYW{l67L4#;V~wq zrir<+JV%A>#W}snt*wW~I7@gB?s<;*H92_{wrZbXx7wp2E)Ue+N1PM&^>yZ;{1P~2 zC^hy4dmN06nRxZ%kC0ruUfn20Uk)fp(*}P-idQX(n-zc^vvD<G3j9>Yq6m z{@jW`V5O-r^zagYz1Mp^>9k$PQrHl_XwIm#E162Zesg@wlQhDSihC{H6K@~00Kc1( zDxV5Co%DM>cb_&{um-(;Ksw=(ZwS zkYpV6X>P47Pjj6)ZYBJX~3<|2)|L6bvm{{#s;0+rA~dS9<+DjpHqNl77&z7(#Rq zGhr|b_e*|waz5bpj}nod6MFj!lppqoo}Jm1Rq-R>g0en@^hG-2$4s1{@ir6~S#Kwl z#$rutk7ju6rq(v0H{cvDdjLQ`#?~8Td0hQ$Y~7ub-u}4Skr2|W6q<|cSy$NUmO1Iouk{3K!RyUv_`_1{fd;$274VN# zv8Hx z{aekKKCjDhB{tf;@{jCQbHO4J-K2hGk2!p|0!Igrj=0BIaAILW2lv;>mdc|M_);)B z^mm(|Bv4((1N04^rz|VFvoIV8U=M3Dr3lO^M(mE91jTEgiXYqk-9yQ7&3@JprM}dcqC!(2_4?;=r)SJ%a|0#Ca9}J`(Q*BnZOf0L}A9Z*Tle3NSm$;xMR67PvFBZce93wp3tLk2 z)t`0ml!aZ81boR3d2-gbT>@l8!fhsZnL@tG!e`yu{z$I3|3FatZQog1&`^Q+8$)pl z2FM6yt4TFc^}GKdW6%J+Hl>`3I(eNL$RXm~t7`1@FApfX^ET{<=_ySr?xjq4lc~nh zz!ws);A2%3Ax6NzpY6E7)K+=s?F1f(xt_1NTaP@_ZQzC~Oq3ofvzjTXCZo zn7pN;3kKOxB0xFNLJPe@|4(WrWrcf(5roo{zi%wyYJ{hpJ}f*z()rh*!u-RIqZ!m1 z0$tvBE4h^B=-9u%`7Rc*6|8*+T2&6W(z(H!r~b9N>squJdxW1^8jBEg~KWdc3loRiWxR(8ci z45XiFaHvL>D_lDN>(0!^H{$-JUxl8?pL{@QwBiy|Ne7TSsF3sp_~Ohv-1U7xiLJ2D zsK1w911q|XiTiEFEpweiM}FlytvpTmLfIj1X1I_s`i<|8T>951G~)P>OV5)8D zpDDpt#|cQ%O`A&k6wyqs(qz|vYSg`G?s0eBk@(lUj?Etlj3-moHblN{QO@4-~3x(`>C z7!a9c?{VQ*&dNmd3GnX;q1?cP5g*u)V>1smx=Vu0)^oNv2LcKwxcz|fjhc$J>3PlD zk$;TNLOjqmLbrTmL4<_4%vfaI{LEsOU;$i^Og)HTk@2BX>?~bf#dpBf{|3+ZER4-W z8msTnQ@GRa*4f1sdJyt(>l9`ggo2Pm`Li>HxG(+P&pyDRL)XM89B9Akk)EYr?Szbe zDFz2LSs}RHTv$~qpAL@G&8u*P#~dO*SH;f5TL?ob2Pu;HANN`c1I{=5HGKP{-kW-a zt$A$|`BWw(&B%3Bp!GRC(r&L?z7h~&xN?#iDINKs5)3L9e?L;naF4+?)(1aqEsrfz z*lBZeG}U%W55mUwSrqxw%G~G|6{28Zl9As^$Vocc>H^WPoF%FAI_=yUzo5@kkZXtj z`XJ|d$3;qvLX3u}%GLxfEC!cAl-=-&&F}x}1yU*?2-&;hJt0Yh$PC<*m9Sss@K*$7 zTd%8PI)#!R)u%^l-|-~Z(^rjL((Z%dsPq3~5=jn;c z+=eYSdDUEQm87b_q4Ut3H0t4|`+8dU_c;XwnUOa4)e!_J~{f3V$@7 z+52N;iSrAO;M9+$#gmng+b&P$C=H-l#@Uq%<`?S|yaODNarg_DfeSo*a#-f?>yQ?2 zYk?i(PoM{$Z}z^u*`5zl<%q2Hp=c)TVutuMyF{xFpX5;Q_IKYDNwt=ga6slW4W9R$ z(@2n%As63a4d0)PB@W|dHAyidT0ZR(GH#QlD)*k@$T9-rdr=3xinYAUJz1k;lT4w! z!u7}x!iknntSCxw2B&um(tzh79aV+}F#J>TJirQH<-Q(kJjXe=OUKQmU;s*McXYg> z8+)jyfl%Uwx%NlrLO{)mnpWrzxmj#`fyN@#f_~&Z<2;pB^a0hG_ACKTn0mBbsZHKX z@t@uHSPCyal|#3M;Z6G#doHW1=+T9W0@m7%cpSy=_MqPJ-Wj-J{W^Kls^FlA{`>o! z1f%zXFXruz;nzJp=rrhc|3UO{MP=myaP+8=u!8Oy8N{!flB*_4Wr;lRlOEufT^m(c z4d?o4^Z5yEk5qn7-Y2r+>ccC`C70A|X!|Ge7fs8zxV=9g)r5Kc49a?)#M0+s09r0r z*N|+aXa^sv{j#J|^o5Nt*F4imJ$kP2O>x9tkRom2_FD_V-eaYoe@@u;MKR`4%nJXZ zTQ{m;Q`iAl#9Qq1ii$-$)7OUD?9#CUD)?acXUiY&RIe735rze`e7;f@?lm^dkGXqJ zi(1q05lX(|8`jI*!ujCPffX+y1KyS*_!vYkRU1Sa3|Z8evhwBdTVO@s*=Q+3cg*;0 zJ7Uzp3k)eDf8JA2ii(SWXnH!F9lhimsOZZHW*Z47(}`8v55I#5qB545clM+4BcqHW z!PbZ|3!B^Q;piFd#Pijqmm{j{?>rQ02EW75H|9CZMTe zt!I4itJCr&bpf2v7|#vS0s%urFjMjC-KSY?jcb~xnW$`;uKpD!)FWga?Ymr1Wy=M* zhgvaMAIAO+{(DD5B{HYK*|73e%IWGmtFzyw+ePj94P1n%JqB(v;)iMbKPi9%*Xnx$ zMwW_8=-CBx|XNMW4ji$VHPtdwf;e1m8!?X8==!$AW@(Xmb`YfYPFo zTXEv>)-KEff2EqZH++Ag^*(LqqiL^l%f%)iL&NM>769ktAo*Qu%j%pm2{#cumxD%g^Rx?gXV*t2xyhu^Sp=784Iv3TtCPD1kPW1Lsh@^A!I~hb* zwe}w);7P9DFFaxw^N-tckau<|17C&;ey>KjTFN}eH~+jdNhYX_IyV5Dg$(Et)*i z@S6yNzhC!3`j=7`shE-((1(hjBl?Y(2K=AR-G4^0{j#D;iv&J^e9CRsLl1M56oD0=5@Al;G{> z_$?T}1bLEW1m|Yjbk@+PQY|NWlth)Hf6nWIn#0S$XgWVS;g%N$Vv017PI_{>{Q+*s zoTF6zx(IKn5Sn^np^Xc?5 z1^6@)6Z)gtqJ)h?DkGxkJ`}9|Oiy5pG#mH?^t7u4{=7X5~G=hm%+5)z-@4U*DGpfD~-Dky#L=2oN zS*cLKzIFtUtIPXb@pI>aTDcpo#l%X;oa%lb^o1)UVUIImDB;b*%NLZZLJ{eZ_t@pj zJOmdZ&0o~!K#cHUZ>jNDU8O)C$aO#?=_q*5+YBD+mfW^`O7+EWpTrjo%;}qLaHLoT zg%^h4K7R36L8a;wf=$99l(gZTgIrC_F7U%t^ljhlH#j!ruU#&@O9Q-{Y9jVfTT8)^ zl-=*>J6q~%?PG1Voc~nWgwK_3ChJ54=wZpG3Pvk|sb<=23xqhc@}tFXAFE%o$l9^O zn9HibzWonBe#G1i*!i)^hC@<#=q3FYj<8>m4SQ7QG$Ee20po6aaoNf|Y76>8#(rNn zl%yDm7^x|tk$OgXVC9zj4UMP%&0RPpoxg>K5@O!I=LPpiVU(18TJY@^%y z+q9zH1K!=jz3)iEA_Sx;PJI%e;^A4M=?JT_NC|h zgC@s&TH4+-2~lO^d{}JL@cRx~(m@{Zs2%JEnN$!11WbJh|EW zO!X21@4Na<6e!!gRp(;CmysaTvns; zVL!)JwfdIIH|HpDr6sE3~K1=vPT45S=k|yozo_ zdYuQ#9DUnkarG6t-e~pw0#3B)^v#}rL+G9VXH*t%QDIS*D8cgDdnf395JZsmUM2(Q z@nhu@n2x#wvwA&35XA4t0*Ns(FMnDWbw;9V+vMCM-YB{Q4$>>KCWioyeM#d^wc(R z+bM$N@7I)1?Gg?t^GOe58Q*82l=#6a&3o3ee&^rhDHR=zAurxhpcgixDSVRw$gFK9 z$b@;W6e!lr(xHS(3h9*XB)=Xqa`c8;-tXA}bg={@;h=e(!a+i#U` zC7gfsOnVV9V5Mbz>%kY3@JY`Kd}qQfcXGr%l(5Rh_}sMYSDd}RX5m-T^S}JBf5zHY z5lzQ~52Eu{gBj#23&b)-Q)(MLEmBETO)UYmYw}BH zRJ$0>5qJET&c~lUNaLYJofvx%42{|GQ2b2>5LKr%BbpN#&PNhY^G*(QFPV>2%>Uud zYj$O=D1K)Ck3SWDJP69gukU1tw}{cx2o#6>S;$5q~lrESmf?shdl;_>=hHMd+mi zp>TEmL^OW+aLGE2XcuMWmV3+F7>Ejx^271Zq_hrOHUPJHK2m||f?I!JeQBf}l2FsA z)nV4!fs1dLgaD(vefLzUoQW6-?q0mzQ8S@XBR_JMP1()-56;-jN+@1^Oa|!_ zRTDRU;Sh$p>BLYwm|`YtZO=?aka@(Q2>i;zXuUUPj}nQkJRbvFb`nJqG3^Y;V&iaqpAeD`s}KW~I2|u13Xcg4>N(E6nbPvm%J1UxAXdPHK5DE;_FEJKA(fb3g$JLgaCw zUJl5OJDff#zbm){j|cPfuxi+rT8}uEHBFjm%=@}5=r@T6 zi8m@$p#iTpQ^2B05-n!LIm#{%Wx+q~g4U7`nNpY!@fJYP6r!L2Z7@g83>@-EYT(1kh7dWBzB&yX>>e>)9w}keJSH6t1i$_$)joU1 zf8BOVxidILo3O;cCxqg5qJM1m%~PKvHx^u}_1ken1QKO#Zz%JFsyV6p^XHeM?~U-{ z%nGd0+yEGezi;ShtzE6nboo+%1SE&v<7+5rqs(I3WMW(7Er;>$&m= z5*@&=dAhSsl3Wph_Cz4nsDV2qi+&U^&g;ahyc!%i&e4Q$8H~@ka6OzYH|xCj0M|f! zNKzY!!6e1tkxHnWT#5Qr>?IQP%mkTSD$MIZm&4>GN2UH4`_EwiPB;tfoAMxIguxlm z;D_&gPk*SZ29tkbw5#gQ5wr6(OKa(s_;?8oNzHc!shOQ7$c8@)Kv%OB)-aWSp^=ph zlRQ%3wsS0J^d&6^j}2JXjVY;4`hQTKK;Sv3LCSYuuBnyYFq`Ww!2P#Uc94LLR4oRx z!>I=;_rumr-&lU8F7(DFf4lqu@7&yxCtJyk~Y4h$*nXH2Q3TBA^BPPtP&k z8I>q5bB8%L#>0!m|Cw$VTPaDaM$84tRxn>rgtzLP4zmoKnSDG10&EP>B*gK2|Eh7( zII1pT=<)w4p63?S3!*H2;2 z4E^k-LJZNSW;Ai(FM9{#B!nh<)uIkZ&ewrwfE*3$tU4V^+p};W82T4@LW>~0g#mQ( z!uK!ZU)7S~>$xikM(JFEcTM|v*`x7ttDD|06}N}b1#wd%SGb?gjDG0{V}ILU zClQiLWwKqZmQa;=)U-?4c8`!t=}M2DI0IC9(Ki_!Qv9R)Q*TmsJ8wfG0uIVl5*L?G z2r?u+L_lwSYuTwEmf&h8Hro{begO!+sq?mD1y_OeWHm0Fq{Zi!JRzi`3va)Ch+{ZEIAOv?dyDFFj zI@BK7hcncQ#^4u&@1Sg2Cy(7TR4u82)_zX790>8huTBwpSHPjbcLmhO=(iI@ZJHxOhbY8RNhufc^vhqbF?!vud#_{8eW z)hj@dzVb&#fiwvANODoU>~PLnas(faG|wl;?YoY4*7@U?j^y<2D9!L`u#zTDNgq!i z&L1v!2zQk9pjey|dpP>@RQn5uk@t!=32UX`tF)yQF6VDDvd=~yXer>hzx6Pt2;g?G z4dvu8z9FOl^F)%F1de2-8aZIilS8cxWfxnd=@OO-u#(00fFhGNE@)20g9oB`nG_#|d;1`-0_sok62Y3?S=6>hJiqM^Ysf|<0B0{1D zbc-qj-qa6C?One*+mRNU2onKGpMWO3&u6kVDm#2^m{!#|H3y)g}35#DZn@ z$dzB0hS+V-!^CKKdP@PG*B%E8IQ+`aI1Lt*JvRsb@_3|`p9b41M+P|)Y#lWqU79Y@ zOYN(+Z$C#sFp4ZEvRwl#r1*`0v-fWpS8(0U1UE=G=O==xU)msfUZ!h-fOvxjiu19}=zHemT>f*|E&!jAEm zrhuK=f>!x&ImcSZ4rF9xEcEyHKl7%|;=0-JZbVhjkB@8w+INbHmMlW+L{}`|e1H&e zTh>P?zPrQ1$JPIQ&`FN+xm)^>FjJbYD|gn@>2msuh@?y~j=SMnb^rh48GFTN1iUVx zgw-)1plr5%sjZeK)GqxR;ng>T)we1rx9i#(L(S%Fk4No*ePS)lfueJYza_Idpygz| z{e@6_-7QD7)y-IX9OtnyUO=G!K^l=_my#MCg;p_p5Vbw|t4!m&{=;PsDQ>+*2N6No zaiWZP+D9+ixKj4JPl6$Z56Hf7T-HlkfGE#USt5r7sLuB9!pqkG{312Bh^ff{-p+(z z8hk~FoH#&e+>u_0qr{YaO85`|J50KYRV4YF$Vn~l>KS=A#U=L~lBc_esXv=bYwQ0= zx(bJ;-{=2c!01%E8w4pyg^dyrDN#Z?6s1uRscnFC3raT%2$F*IhLS2NDX~ci0@BT3 zzkR;He_*@2_jC8$J$Ltd5%1k4>rcn>H$PRR#Kszm+k#}d-x`2T9t8;n-hGp7Q%b(y z>>znp(j<*e>?_$vwOL23n#7D3 z?he&&sMw}Rn02wUpS@8qrMIkM8DBMC_WP0JpUlc?tyb_`7>`lQXXpbg9vb%IG@tYl zbuSbdqE*_4m*jma$ez5RDzCc-dQ)ycQs&aJN8scG5isA0+rM9`y+D$jqQL5+9Q4HP z&OIppw=@NUhXUO+JR{Zf$Rj7K9&=ETqr14aF?JT;qqKS9Jb+!WPe?-nMs#!@1p>5rPXJIqV&!F2#*y->7L<2(VO!82!nyUXUf*d0rqO?rWNhARJD zcqe@pQbD$2EKy@Gthw>{Ho$WIX7)^w2CIGm+OgdUno7eiNB^b3z&+)K6xtBnUD(V6 z49Ud5hmyD@Jul`_5zrHr7pVWDVL}<#fe^M>c%9`M*nt@>(4^~q-p~WlBMHm2Yj*2v zY17q{RqKw+*2C8A8@d1J3o1ivCRSF2u}}vsfmBO}$jk3+TI8?VQGJ!L=GV(Gb9elF zbKQ;afeP~;xvcn>C#CXOF0O<1R?qdOg{$k6?$-{&2a6)9YghCDDX-5uCd{C|=BlZ= zRr@`ESxFJl^~yiR2tV>GAps(dFt4e<=&!9Je0nKK(zT=SwfF#fT?TYZ6!3Dopl?IK z)(GXhK2#7oZk(HkdUsUu8Chx5QUCZ_$VZiVc|knABp?ECvJtiwrAT4hB8nuV8!bU1 z+Pzal?#B;uY+}z+Zz8ACb2Y>tJ?xCUs!-#LmB$JPImaVTc^<~p9+a33Jv2XvBa>F| zb0mL*ufCn(w11+kOe~b4?KX7j-GiK`x3RK*Fu%YZim^ZnYe*Vuiwe{I(kiyz}tXn2OXlgbU$bssem>Osc zVI#UeCxH(lirC*8ehd?%BEYo3nU9E}kq1+>24;VPKlSkiF#@^sqV*+huNFHa35WV@lxC8nC`$>0A@6;`5H>dx$i3fHf~oB zi<>zFCIdl_{*b%6x?1p(yoQaHEGX_1%!!SR<*(qeS~CAtMM``&T0+uK@?|s>&nSeY zd~?Y9jKRKpnlJK86D=iP59_C_dvQ$1-=wymR8V;w@Na?{LS(uJ)==dJmAmmTIiYIn ze$4VB3xo%cUr=6vFSmwpWW=``a8i|H?y9a9!SAtCH@3CPKj3nY_1VpMdf)c-&5uFo`Uv2|BVj>~2l0seJ9!;GjH~m9-P4Ju^kcR#h zqlb2mNhKdBh=0jl;QEX|YE_#w(X{&s`@5rTy{Y&0wne4C@r50?O3pd`Q~i>O z{UGp=@* z!N$VXDp|L*i1k#|R?<&w*~EnS42Af{cE;3_U*>h;lAzd=8oyi4x!vPO3 zHiK=5f;WjDCU2t1iGi_KKb$U$AF^W$f-l(TI?S4OPIoS_z_o2S3tN|^Z(#pd0;i1|J8J9*Qz{S z0*s~BMgF#*((_BL1}G51r~q&Or=S)Jsjjl{-$B8Kx0KZX)az$q{n(9T~ZK<<|FCmA&&C<-LW3AsQ1b37w6Gn^fPShCJXU4|ropqZ(V>B$$E#!8Udr9WJ5gWJ zC?l$q;dbXNRph~|vxMG{1#dLq&+M0~;VfncFnjNFWG}dFZQH$QZJRjV#)AJ4cf(fU zt(lp%`eREn5O=BGoImfoEt%q1u4sfMl%1?=hazw{PMeaS|C%)n`j+Rn=qvK-~ zasNh7F(RMdr=;7#4BBt4{)e>16ADw*)7FkkjHi`U+I#9tSVP5$TkS8C^F}0AdkM}> zv49Q*Wjq-fRJIh`AU{|%w!V6@(IPy7SBTlVI}|jnjg~*Ie`LDZWO405D3=qy-%%+% zfRzauia|yk)29MrY&$Rcz$Q!#fHEu3D8JCM_k;6>-ROw>Ck-=;J6+B)mp+9KwZ7c* z$L#DVpIgm5`4~q6?5oHc5@mldb!D5?ft74QNVdBi#x~y>dLBD5F`*zc_bG7Et9EC* zVX^ymZGGxM@PE`j2w4W)$Gpnib96~c?L<=- zh!+*h#i5F=Jg7C>H0p=V%_Be1H$TbgTDJkcjhc{d*L@X!W-t6$an7Zro9*ekq2 zVJJ5=Rm;p|{?~@p;Wk9*&dbLL1jPYj)}b;aHHv-y^Og9q&9XOaCqK_oU6P=?EZVTJ z5A4b=)Zr(uwnB15MRK}cI;<>W7E(m~?E-mt zQjGa?|4M%v*!16wsne?pD%~Wm(=`(Mo3Y7v%9KJ^=LkViS&wVIh(l19K)GEuo28zB zLp=*fl>>OT2+@g2VK_N=qYZue9Yi-XU+M-)5YSj>8BqX>v3NuuV3kz>apOV8wSavg zS#uUUHLD}*I>(9ao`QvQz45JI@oNB$RQ{t+z!$v9#dw$2kji6Z=nne&N!PIM4Y0dL zjDu|q(_wpnabCj1@tEU<3YHCvPN_dbmi%{m33q6=twbgzQOw2I!!yyNz#Kf`ENLSL z%=eG9X*Ja4$M-BENQvS2LdYK1m4()F4!rarFkaR1yYY5)JLID4H-4|Gs!G>TH(41Y z=z-2ZSdG8TUM!RA?v}`4pS3(`W~O{{efOO2H-?RH27p zj75t}g2jZ4HPQ50Up44YJKr#|#XvkHUWTTa-SKlni&CzaV-x9pT=1>nHzIoOdD3U! zWWSb-xyHO6-S4j9vErxQv|h}ULS31VyJxbWVO#9AjeNPdgXL!sN=h{uQD%aol5YjD zy@*pT?6cUs^h-V|Z@nGTyd>B%2_rQxwBM?=n3Et`ax-r&ip#bR)5z{LIgS47J6$|7 zFX=X}9$@-R*iqk2wxDHvfLTBjA=PWw7H2{!Q+~%)Dm`AjMWI?JM z?gy3sMX)K9Pu>Q|-EN6HBPc8!W?h@!fJrXdLv>*`Kp)K1WM=(XrMS2*0rT^)%#K*| zcrd&1N;{9(nStmKF}3Ezdm#;sa)?1IGGztvd@_%xW|6eKt~55qM9G+T(aBAz9D4RC zm+R#nj+(1uVx~f9ZQ%W0*H^`ONNkldhUGeVkr#gggY$v?w9%1Rz>K1lMB<09h44Kz zV-P!#)7BV%!92b_*EndIRS>Dnw=~Bj5az=Tbnz8XK82p;UrKTwz17pwD_Lj-dgA!F z60Y`SztY?%lGelnIMTv}?B`}4C#+3Bd-W1YB2o0>sch@o-?&*d40gZ>1Il2B@n1qn zWbrLj;`7kilZFUHF3<<$z88$3IESnHiqoGuE|DB=;NaGqz{$SH*%{H!+Yt)x}`J+BYmDP~D=(|lkVJlHv6x4m$2C8(zPpQXP^ z(0520zYYQ}1x{g-(E+dmXnL0eirWw|0U5(YI@@GS z7}2?%^23y9nwwyB2WcQ=ex!d=N$av{7v>t)hIQ;1W+(be{IXJMypwxEp!WSGceypi z%SB5fH|ESoDLOJJt50u{f=WAu%q(QqfJQM6{Cvm%!Gj5oIr(fI^v#iM@KQ1-MUkOT zk9-b3cJaj*nI|$2l@T(9O%!^KIsl~RZ^y}Y!S<>pkg18rl112D!-k{H$QYmqO!~mw z10N%-I-{hL7u3jLc1kbrdk%z#%rt^Sc6I^f3zTqmD{^dXf3J3uOL|sMTt%r=n4fDgCC~0uBT8a*WI`&Fz@F$89iD!rF6Pz+~%1(^v2);u1Tla-G}m_Q)St84SIfe4rYU(={sM%DlyI)>!gKCXkjz__GkO45#Y3M=J^=?i>g{sb;vCl>9L-CS- zo$xfO1`OlnJ%0snq7^#`HH%ftipr{Z6=ii(J7=G@R{xC!KsTos$9C}Z%jfe`-C}w0 zrTL<|6d3(o8gnavgw{c1YNS91O$Y$6cR_uki=CgI-T$r$EoboeW&!=eraC5ygFUno zYnFm3ilWrjt)P(rHXM-_wZ{Se;s69PCfwWKcx6|zZAnRcc}i2|Jt@WDTOkHOvB~_v zUUyt1Ney<8Nt>CTaEaIfKw`W9Lhlv3G z$BcAO8Sgf;%EdKpQ7eVn2yNhtTfg;j$%ta$=Z8?h#V_{87q!@zHJ*zx1snjFm>&tO z(l~2Vo>&Py`ScxNK|^wqKrj%A-~&vj|I@kV4^rK*14qbC{9l;!k1-RvNJ zIxj8`W9(Mll^U3JjF~2K911|@40S+ZgU~@tA_F;BWwYw@M8rcLio1DY9+%=i1 zdB5(!;xAMSzv@nnU{8`E78T-!ZKV*1F1Zc4QOUrE)Jfy8h^`(Hr42^R!pXUAx&WRf z_I%I}J7Hn3#=4-GCL?n9LTpXgrbi}I8Vi>D|Vg%@M{D zOxG}n;%c@f06HF%<3hI4{Z%1=N*rwBL5UWcChFHBzxHz|cWNp$2X2D7cF5Z{14aWT64Elqw8xRhhtIpl>+ z-00}!9N0&cq0U`lBj{yIxD9aEWm%UWpXn6j@G@{(cd}iuCK#jX+%a>XV1`%dkSDSdu)I8|i~&L{w663V z!U$&vzjOdTun!!H$WaCtwrrw;)!MA1JCJU>U)g0{A72R%zTb(`TYc)(*MwSfg6D6s z4j#HL5owjppLtgQK27Goepyzyx(&NH(H$3zFl6+(wvyAEnZsyS?$WtItaY5%DkN}> zk~Jvr>~xhZ{w72&9=&yzd1MgzJIK@)@F(>dX2n6bZ3NgUgm!)f!RZ`rKO9cD|C=wb z{c}a%i(Y{Nz+`;}fw6<6xo%R))pwW*p6+l@ZpPfCMlT2fFiGvk5;Q}Fxpnw z6HX~)`nIly99PP2glp`)!g1*-IZTch2Ae!py;UpT zz$*3d(;cs0HNwRL+5i=s0Jb>?uV3de6g0Zj>swBZxa3G1a_ILXVJ0%wMgnTl%u%PR z31}u^k@LeITevph;zNr*vsPCM=wJuw{b+d9Y=`>qATR*UQU^O;^l5+?4I@CBQJkHZ zS#=1yU`pQ}E)0QpGjq`rxcOhB#9hyLZ)zUz!Ykq~{BjD;N%o}=p*14=oZV}0aUQ(1 z&6{x#N>HQCWz*{Kx!sdj?n1GNY5_#9oA#dPJ|Ly0MiZ)nW?&5Npz~zrpPBz11kae} z784)8Lp)Gu^Hqc^KxVYNPsg5EtqjJ`luc%V`NB4?{#_-U8EufrfhMnl3;B$og@3nE zXQwZ!3libM7vicoV}8`~`HD|LryLH`wC;IDWa;ta)@gdXpwcPcIZ8URj9!_`uh@?N zLYQ0(I!8EaT@U@ga^(Bbzu5p5n4qr{b+j$l$-C(XW}>x%9MJECHTbbZOm4BhL zJF^ciX{j$92;$4|J9PKYcIb(8L;RP&oiJiGaOH;T>Mcp-^aND3BOyBc`F~F1!URGI z$_j~rzkU0bU;Xjp1-M8y;EVH`23zYeiyPPRR6cxPcqS==!B#yXOQ7AZIf7>^E<^Jv zhyug{GQUxHN{MEo01gB0*$w%(I1Qw^GlG2fE$3Fu&@04fSU^*ufi5-jyX}MARvo z{u@Q*E#**mxt?U<@A!x`|2!bXTATf6r)3gEa4z~vY*&{a;&^Mm%-q6a${|A6FslCz zKTWjO(zZMN&|(bI#d0 zq4~jkJO0sh+#;T{P5(O9-pH3hKdD*>zJlN6e|x{0S?y**v}uH|**Ck-)Q>Y8LCtDj zU!MT^EhL_j!jne9-4@gk3y>uX#eNaB+XEL4P@v}*7jAwb1K9PVL*MwF7tkUL`)e>q zXO4u5k>qwH!LyvUsq-7Ac+JYUaI2Q)l=%72)o~uvPI%A~#(!h-xGNR^4ZTYu%5h6P zKJ3N8Uq67(@uf1xK$mTNd#*Z9)z}k7uH0A|x^8&~5kT4A_U>WArka+Yb{L-aa1@8v9-CjmWWOgaRY3#;vyXC(g2tn1p{JJr^_Of}WN;;2x7jnmPw zZb&HIhbLfV#_jxS%aez7uYGM?l`)UPk=y8Mzuqhxz zJa*$FL;rm&2bRG&HIii30}2flKYDV3@U_I(PQ->OZ_dm6Y{;8a^ty$*ZImao8qYNDWso3AiUtyUJ&0a-lYQhRvb_c+R7r7S7enzxcvRo1 zl=L_zEJH#l6s|Yixj|ew0XMD+NBFja;zYPioIVQ0hQ>twzxa=}uQD@6=~f zjnx)|?n<(Vt1!HyE)wZfr$*P4Qq<;>nV<3&8i3HzaWc<;_YObcroJFdPW&Vk1&EE3 zhSr`DRj~RaV2=}FIkN~mIQ?PQ%r<$~HCj~AI&?Rur6!KK00qjg)x0#dN0A8FYl@4V zWCPCvqjq_9a%UvEPf(0;vub!FBxayqzWSQ=SYJ>3$=lH`o)-*#4%FJ=AezBx z&q}ubJqq_POp2@s^DHl)r-fHj-*Iws%trB*_*G8Rs>T!xoF}nqL&|?pEas}Xx^2}o z`+J=}=-eO5k=_RBPpBNP02k_do;&pJ^aiZCcLHnjgZlv}ySex{&C>f^VYfMu*glv|1Kz7Zc? z%&^c9J{sbqy`N7GHzHH!7CdiP;D*kbxmSbfW}|7<3qvRZ)fe~ay^kQ1p#9As1^-qP zQWL|n67r_b@!Ne0vYPtn+^Zv*pX+Hpv3bkd{rve;*HrKar_kpMX{$sgAk%T-aVlv6 z1(Cd@D>0EUYT)mU2na2}#(Z}})Jl&0VgP+4SAGX-@&Ot^X;O5xw}G*d(;haN-N0ub z_yOwo7wW1YADrl!KOA)*>=Q?U?G#*JFj_I9#PS297t(((r8}>wCrsIBJ%+%}?oa*3 zMG}Hfu%Z(~0Y^^3yhHT9^_SU~MA&=Ktb~NbB~?{JU2>fdpR=>`%#w5$PU-yASE}Hu zPbeN+_{XKCi3w}|$)PL!YI$N&4(1P9rd?y_i;mx!ok`9VG5Sm=S@#o1iobL0TMADF zzP2|aU_OwG4U11K+LCZL7Q@3TrWGcCIrSB{6!2rh5S?}d)c=PGP*+kdLLE*^2mqAn zz-wkafxx)hr-6VSalenK6JY?wbd@Ex_Jm&71YWPBMlbBcJ4pyYyE#>;*XEn`R$H*J z?SaNi9wk~`{M7N0G%Bd%Y<+I3|IAR1FA=GKLWI2q{X~0ev^&%Mcy!mp1%|@(;gWy7 zaKqD1hG}F?(uD~$vCWKFN-74B+BI(+mfADj5@Nq@%0oVxewH3b-}$wF6SXHXQ4&b$ z|Akdk0{W6o0V_^@uu_ly$;&5%ZG=Mnl@W0*=u@#-!QZ`BX@{zSljQr=0k2tes?Jd_2Ww$e?nN+BnYl_^7DdF{!ge7bTfp* z%C#N_5h|=DEp{BGW-0)_dyIFaWNeAySue?&~Qn9%%XX_(gul~X!7x{FMEe6 zq*MtpM5`S9C--6FleG0IM=r3y8?q=39#Nmv1_+=!$IDPn5ko1{3%d*Ir9kJ#fYD6R zhQJ>~JEP%u-;j2r1*pZb<^uR4AqpUo7go}M*5>PJkQ)r>^s@qYxzC1$zsrp9(ZfbA zEjU_2$~lQ3~#2;;K5E3p0WH2 z*yct*o4^RCcA)|@$bu0aDF)UDCS#z8JAl^2oWAsjhSgVq(2kA!-uZuDK$p^in6I^- zk7}aCPLndb_Usin|Aw7>{=4v3Qf)rJZ)NuyEgU1NyNyUeRC8r&VuAD+j&=0VZ ziI2QG;4n*9e^LrMOCXeg|4-z>Fm{)Kloe|s2R17WJG+G&ztkJ(XH+wTyMJ6;4qg#+ ze9F{bNKZa<)*CJHV%z2h6UgN*3Qb;MCr15>0W_oFFpybHVZ*;fj&%zLZo7eH+Cs9l z00Gy|SV$$w+QVNJv7w|_i*NwZ<3z^CDJ&TcluplKw_ONc_zcfbHPo%!sQjBB)h+^U zzfU}TeeSDpBJ8!-aFf7((~WSd^%V31APL{zBmFoW?);ENX2|WRa{Ke?>F;y!-RFe| zWS>?cvT^@jBfdt_>UJKC8E_is-#R6&re`!T2+9VULiiX}AA$Vnh`&##6#D(VZfMWv zvp2*7LVo<<<|nTLXb#9yx-u!SXYsai(;~RAz@~p9?L)0vTISrQh6Mv<#svzW;Vx=zbGq zy)E3*LSNH5411YcwVGT&dl#$-B54!$7-KK@{@v+gIDGw#qV3*E6v7_CS%0gI3tK}* zYI9MOxRFp)ZU`=)L~y(1G(f-lj352O>?g5s%j+gNz9j6>Xp0_UK6bP827q7|U>Flj z5sDMoCqrfsdXK;{VXB*wqv&=t)w#5Q-4<)D&Xkht$CQys%`+idQLTG6fi%Z)e zSPh!2N{_Dw-0ep_?7;XZx2}D==>InO+eyJoWCO+mO4HuUzz?%cikNI;y6jgrqD4Uy z3a~r+g|fKt2?L`auU}(7eqK;Tl3q7weVWNRplOi8F(C?>x&Z3JiYK^gLATp~@8yO1 z>2t<;yuuDJgx$MN+bs+hw}5JcC`1AIZ}|{VjCo~}7xFS@KLXgiSmsNe82g@B6()l1 ztPlcTU^5a5B06(+XTxxM7i(RA^X*Do-?4sJ1U(Rdsz3897`HK#N=js4efVn49JnJ$`%Ak z@#i~dD<(MJ3srboD5;23u_zWM|c*JKj;u z^nE_K{AjpcVrt?lI&UL@-{e>m)aL8?fM!5*Wlu4n^I1SILk^f8`2UGla+b|$uXfYAUpIfi$exkN+ciWsMSEP0?LA{MZS_BTrwiar;QHxYGMEZ_2poiw=Eu{ zh==K~PM{92M1bT(n@viDlnhjg0ln}!!3ivLhXUcQ1-$>#ZT#gzH0k%MvWNz*dOPir zbr>dtj&OUOw}%~0cG;_S|9W1}?q(G{n;fpvhI?~fr=GUQ6(){laiFOc;XCa^>n9jy zJ&rHH;kKiB73`VxmN*;8XZAR)`KzZ1Crio6JCx!2{D22wkwLK|tTipWv(EeZL-A$9 zxThg?r8w={zX%pawq(Rzasfmy$<|>N)u41i2_RF;)!}3BVgN~0ZA0!$&cjC&td0fn z2cRFryibuLKwAtj#}y4|n*o{)7oA3UX{9jU&fzfB-NrBsFSk7*XU2VERI9+zu;{qg z&RuMvh_1j79H~He7u1wVM?^2fV`Rk#4K7JXHxJq@3<}6V>?0x^64(PxZ{O~H;xWMA zi;SH>mmb4*=E2t)Pe}OAe@PUP_zaHi@7`d;{*g*e&cpDWg-5 z6o<=^D+II=boP$BNGIoYg8^S&m7vmmceon@iM(tl;ob0j(R{4H_bxH~9!GPz0i>p5 zFDY(i@WJOt42(~}0x~r0N?C@`PZD?rkSQ4g>R>hvMYDH%YBFFzwTW+?G!Sb60En%c z66;*zM~QV^n>rwjK}OCCZvUR6;`Z=&mdGghWPBl53HXB52~;9h>OU6Rq&0Xif9W>u zIjYkU-ia)U+H+Dqpy{@(G`hHHXcE8LS(U{7HUVd6Fo%z3;!=0Mmk+=EsM5zf4Wdb{ zvKK=2=F(yLa4V#fRB@fMnKnH1QBfQRy6v;Y$A^dCQU!Id`=psDoAghWplhC|Ft`|K zL4EiK>?N8i$6zewJW_X3c7aU((Cj@R>wt241(ZorPd^r@0e>r|Q3kwRpSG`1bwg(O z$0-GXQ@4e5);emwhrqM{PvyH$uf+m*Rs3aMU&Kqz-(e_?T@Xkn5v?iIV=RgBeHW^j z0=qezQAjVZVb5`nccvih$RG5t{cAXWWcXm1csBeEdg(onmF_zh`FCm%4X<_TiMv_@ z+yq;pWHH;E9tZocF}%pqdLg_b#p4uz;b5#6gUdB8(o`Z%Yu1L~0w!luQgT^aV@3hZ z)RpwHZQ@|mz_*aWEkB*|>PA9&v@H*I;{6%)ldsp$!UHM_Mg|``&wi#;`v`>#4==z& zLr%7WDeq@g`6}{IbRDFJR}mJ)o}LO0B^SQfT%%Mt*?Ouv{aAt5Ya8ltPi4S7eVVJF z&QLBC8hVnti3@5Vmwh@KFjR-w1 zv`LMN06td`kgG)xX*y-?)Y{qf=LcH1oNZ@w;5|$1`h-7h7DcWnCeHeo zY#!q_s*&X`{9*9GVVu`88EFugLhugy>Wh!K*6y;a&Iv!)R)tY;Li20d@M?|`t00I& zF}dH`h~wgaNWKh!!}mf^gkGcV<+%(#EK&lj+<9eeb%42`G9w>ls1|bU*Wbto;ZSa% zKq#;y0~4s+KE!!jFW$o-lIwhC07bt{0u7!}Rd#1#%5* z+9&#N2m7AUHE;$x)LD9{&o4A)tYA)FJD!|F(Rwdvr}5En)b{||T($i-LC;Aj@Cr?A zy3JsO)C24d+N9ff7CAJ{-4~3te?23e$eZ7B<_P~XO^FgePp&vh% zj7yN00?+Ww;Y@)rxJM{>U?#-^g zS3hCwzoxgTHS=@4zD#1gtD{f<-{tOd;8?8wEM8qp_KdP{ONR`QXusv2P zoB1yTT^e4sp8r<7PRCE~4_%5?06k`NNjFeZXV`ujS><09SQW}mn6E-HIN$!cUXR4B ztw!@&a8kz9kl$E6Z{}^vQnz+&d-3nve|rpBM;CU>^I%F)Vux_H8=*>W9G% z+yh)_0HZ@z_AoCgW6aLt6`lUAdF@x&ULr>*5mWI39+aX790sxJRP@lF-JPDcpLYE~ zfA-aX>BE-wfY^QdgP`2j)2Ye}?T6B9mv5pwDF2fNfZKf}{cTXq#672xLP!x|G54CgQ8 zrCKoE=3sVaug3{bnC@*%Sz$5=7duP8Od&31=v>Z}0T{(Rs|ondkE5>o`uei9v1Ca3 zRRJ-G$-Sq5hl}U?TYOgOH)t2P)n5ik=cRR;yV}oJL|_EZ$g=6=eOwum zM?+v}JL~oE_G-=VQ;ju*%WtJM7zMI117v%D~eAw!=G2kz=`{ecB4$YJ=?#7_y9B`N21k6nlJJGk7HEmv2k zy57ze{2@)n?vxz829B?2h*OuQHS%w0nVZluin)yz>&(0sHkcf-`z^siK3&c60C-$* z%_MM-dYyH;`t8_XH{%4`_aZFnmGVt{;jZI9e7}!>)2aCouyCfAciB$0+_m{N$}vf` zKx*o71aTU6&r$j^$+K-D&Q<9{pWZj#Kw`*)bR}zA&Knkq!Ub8joi-nlTMCWO&(%+0 z1Tw1he*v}EGXH)5h5gmd(etn;dj)F`Zg3$MS#Grd`I$J!duwpm^#XZf$~ggi*01Gv z1=wBS{G9j$m``3Usr|z2!@c(VYcz&@+DA=(f*h@*82wlxC9H6hN}T1jq<5P@n^><9 zsHVv!z93?=VhGl+YC`3pFd&??d5vPHmiLUhLo~8~SE2f!z3k$Xt+l@FZju~t4mZY6 zVLKedcmlaj(+9P4^bFP|Su$DQLX-1^tX3dn+tt5+~bOxAe&4!}Sq_*ws%$7a9gd zWN|c+AJB!4l-3M6mOXYtilApRt#=ruG!1`(;Y^1iW9;*l0e-9gnJ;56xc@TeJ8qu; znSZ_=&=kxQ`Q;PZfO`52?bLN2&H)Hf$Hm3R<9@XV?w{}Nq(pyoq2Mc^D*bik_nWLB z5WR>?yy2~qU3pla_r?MQ<-JWK3hULV34$g1>EB4>G^tHJVvu!wSjWYCyf4#UuMH_Zq_7F7u zVRgjXI=oX-%=isQiZ1=e6;_>RVV^x9+YKWlsaK0bn} zp7^`w7ibo_xItghhV6`Yc}O87SnkT6-XT=^gSDdR^4da9_Xe5P+XZue_q~tEo_?0`~NwBOj z*j2J&YLP%5LtB@K%D*HCiz;n_IuGLIg==ZW0EU5Tq8vSM^0hxi@G~lzBsNW7zyh*f z7w$*EhC#}T_D4dQ{{+A-Hhu;2xDSXT;p4{t8RXv}!%i~&AIkineTn8A^e~fc*YR>w z>d7jrhJTAa@d1oiM;?X|gG(Ni9-qGS2}vT}M@i4TV`>fg{UtJZ#B=Rsy_UU$)P0AK zYuN+)$@{4%Bx!>cp{?&^pwGx6AGY6^#~oaWbqNCUO-T*)F%qjRSK9tCQM>vI;^b4L zT1zu-^@Iz)axyTd4$Mc=Sy)&|M;Zk?UcNFWq<-nt)bOHO+`j!kLB|+mLZKe6U0fRQ zEbyId8(oH4vs0IBd;Z-3~N1HQ$ z+5)!KkBk^gmj)iuod>8OSJ`pPheh!t`fDP7;|A^%fxRD-pRKj8Bkc-njc*>eEQJV> zTzzjw9%>W+J3s6Ik(B@Rx@mIxH#X8xVxHpNT;*NvTbK8rRR(O&wd`vrfNqn=u%LxQ z*Esy>T4CI;u4{^V#^5ykgI=${M6HGJ{lLl3)Ms=X7n!K)Y4KajJQ;&rmyprhc~nz| z&~!`)BP~b|W#0(3pT6#7|8BY(#2}&5u@9v~{Yy z)Z2gjUETYN>-5hSIw|*azNjni6q$%|4>F9Xf^v8$w8{3!zLMFq{)q9Y?qypWduI@F zgX3X)(BXQ3ae;a$M7KI6=P>`zK#A)h@~rLOLV5 zCWS5I7G!V23}>YIss@LL3v4YcK70H}efQ2`BUym=Lq@dg$A%Y$X^iTBYzmsA&D(i3 zMGHAc7}w%l^)#b7z@_#Ts+Ps7Gonn30Sleq{{>J-p6U~>P(_-8q$ThLd=zYu$neF? zegp)0qEUv&mR-#ZCN|rl58NMQ z^j3J$#-t$4UmqC8*gro%I1;}?CH$`(p{&E;OtZXhT3Hl68eUQT+oW9sokm6qcDDa@ z5*0{0&+r)eg|&4NGN%GQ<0?}ygW>A~P3`H2(3yeWso-jt0-9B4FBx4q3nDi6zp)O! zKMc=fRcM(ybsE=yJXuRwzvo5sH-`b<5lR)QssEFqzn`u4X*idLy;{_vPS-0vze4_A zK42Y2&vWZ@aq;5n%b=WF&1+RJ(@}1ud$K$-azIaG?^Bpy>p_fk2adYrYhppw(6L(Z zT<{OjAMo?=mM$*GY8ltvS2Zi%vU7}u*>V6M6gbA zdHI^5UsMh$3a-C@|Nh@%R=#?`)?8ktMGX?IzDr?s)9JY>q@7+`DGIS<=X!>WPfp%0 zcMR6rd&zrDaZGhgb4+*aGnA`>c^iDDxb<=2SZqdA(}h3->*lYi8pS z^=VbvFayb3iauR)#&i}l(zFRCHsBl~081wIyvf5^bpZV@2IQ%a5&d0LvfI{T z6-(JZp3S{3MhgHj`X`H$_d*DIJ7N3!a4$SLI4pVnVL?lE>!{?ny8)jK1(#vXeWyG#W*kxttk1}4|w{r5-FWGCDqAu8!RnYSfV z{qmJKHnH`F`ufhB9@Dj_OMS^GYds$ojuGtsJZTWTDD?a&k2IDrZMYk=ZQB`gx-E7) zz5N*DC|QV?auX}vR}G!U^(pk%we~fO*l<=eP6h2P4{$ztAF++zuJ`%<#s9?XBuVgg zLT2*z=H7uuv3G)Ca9+gU_4(vc6^`=flcI=|RGZGA)6^05=l{t&=9mEDeQ}SNZF>V@x4AR)K~ibP20NCs|77>HOlw(Qz~l``%l>GHWsIGb1aj znPE3~ca)0vLi>ARgSP}P5_;fvwe{z%4$@+GXEN2xTk$-Oq`7XJTOlVq?*w&|Y*?HZ zvs3mDNs8lc`LExXM;DO&@2)cRVK3;}-Xul+AOB6NM0D>ek;2D0PcPPz%`E#5focl9 zbE}$iN@VIpEktymTe3^kNq^zbKUb=62X-i(?F+uV_**{=tDdAwo}(9B{L?f zRk98x5LxoDNroq;Mee4X31C)nF(w+uE0wyc`m_;L8iq6jJq$&G{}=B85dO+sZ5yCQ zVMtxk@YHZ&{|dcllk^@I>pd-Up1mV`MV2et(;R+)@IzicNuNTYP-qZ1gTST?w5ZTU z2|S~qcM8LxK=7PkgyyARQG%PQ>4cdn41`AWI#lIuKL<3#BK_Y@0I}C-KVPHYwOsH` zy$7%8JsF|*s2~N=_jY9Oyn9!)=R*1>|%V zcu_;#U)8p=Q098@6VqBY0ocbht=2BBe0#`ts3~= zSI;!|1l$B4RbU7{ZQOq1G>7>L=(q{4BjC%B*P!1vd$)VbvMlTWfq+nu zf`Qx?f7g>dnR1*t0XEC5fT6ZK$VsfQ~rp4|1}`|$Gs11IQ9|XjbtUo0Pi0?00*7d z^+!Oom(p?s0Fbf&YfylnnFIg;1wdL%MAdEO)Z0Bxcfk3)>WF1sNGQ^D#(WcFB@RP0 z&6`b@Vu{TyJe9Wwn{H~#VFzQU{}HQe@3K?yg!(R(H|A7O;L+P+A~MWG zwU3PM$z{PnTHNrN@kNJTx(TlE+d5v4dU0lDVsUlc;Gc>=@F47IZ}+pOE|jDYp^&yz zEgcX3bpwPcM)q&TUS|MtHc2cUOqY{94z1zaz|f?fFds)kD^}&u4OIF>%D0Y$`)um0n?~tK3M`^RQU_mSF z$zsh*yQnupvua{_PF7p{IY+Ebg+}f7=RpPi+3R9Tzt8$Bk=yp@YHjDYO^;_TWBKL^10c3CEf9pA@JB7ULue{T- z;o@>fk%ixXlOa2m9d{u0Z$n~{T%JGshxBz6}i#=gU^>YVDW67Fm=;wZmv zyxr$848%2%Hxx?VcRcylr|dLQP7k<9Wj=#gJnzjai3Oiwt6`fDY+~Qt%w}2T+kgzVp^j%+}(y40(bPbKaJWLQxJOFJe$ILlV<%b^ru2NKDN-pZ#BK*z0g3 z?XuTH51(7RxdaoIjz7HTf%?rY$5GhbLy$KI-NVk~&5(Q3cTJoy2;(G zuAc{Hk@0eEY>^AWTg+~vc=vz51_J2qY4BSL_>2k8NWUyH2`$~$Q4OE4(i;JRJ17yr zzMZrNTIZ?z*7w6e1#6F;ajfnp$YtH*q|&whU(HVrrhEJ%Pt1B!{@>3t18?mF@R8NW zmGbiKdmBbf<8>DUcxH?_yc>7dXfkhvL*w4`vnZ&yAN+kzUZw(huj;@AAyDvWlMjS* z_(Xq~*;{a|z*lxnXAlNT{`5rf(@d<9gU@LRZCe&`VXle^Sha^EAk7*-4x_hkbTd1a z`2EO8*M5$Xv$3S-MbnVLI{bBiORmFA&eLJv05QO8obKm8-&;|)$|`zxJSs*bl!?=5 zP4{IZ<}L>^By}S{xK{5DM*9Mr>lM}dD_|IC8{=;Q+{I-zxQWPA0PYLF)eis zbp=>NL}_SbTkF1La_!jV$d#lkGKnQcb~XnWeN)n}RP<6$zJ-x+ka4+qE)nI90|0zX z^j1roUeD!FNKZPHUOs2`TZ*1FdS}D|{>$;}`&K3<^ur4InrHmn_s)M&5gzg#+PBmO zQwPmwiTFm3!I6JPk<@8o)on9R@lkIruC7&d`7XZ9ccv3k!9r7QO~(|tT_Fo>-2e&3 zr^B{xumk2zC>kNMm2BSh(8;=m#z zT+0@&w#Y0o6%LMa-4}&6EjfI158%>my}YtxURz>QkK|IshN^F9Ff`t6D1X$viZ$7G zlIzrd3=m}QaOU2)ELrTft?t8};!~m3<2xlYizlEz3(A&hXRxG5O9@X-Wf|P+#|XKX z|A&x?7h}Rzm%~e1AlYQQu1yXdr@Zr$GNxYV@JzLr)mltm{fc{@5t#vTp=q|EUl`$f z&KUUq4TWCj=k8yWP;wdCociZETi!dA&NR&$2TTd10)iC*vLF5`T-byN^rwOk9?{KN+H zUZ2xwk)q_;4tqQq1EpBD0hT*`v0=M|n_VQfZ-h=lya1S#-pU+kOerXW>c4-lAAcID za512UqLD(INidBZRo+;d+j?IKR9UDqZSJwL>X{Q_Bzb=ZDq|GJ#bvAd!ihZO#8XQV zF7JrF$tu5eyhAfI)uK!yZ>Xd@-da6)!ydrhE1hiw7&|jl8^3W7p{(sRKN@S~UjH-= z6K0EQ%PCF}zMT4_*y*pfoKiWOy zL0PuOBXwK_y|3{}6{gSH(eK#$gS(-Cl=V|~1E{_on6c}ZSi+2{(To2^Z}{Q|_^NV% z22uXNcJ&E?=?6G>-g}|z>c0v5fVopoJdH-L_f{NO)`RVEgq+^0&Mq}lIzPuM-2i9& zoX~kIja+vZ?2~#pCd2M(-sYZN8IyQQ!s_GN(Of(gphlTbwD4V91Ssow>I|gcR7k zjW!rncHYok)#O7(O}b&Sm7T!T>(w}^3=lSL^N5!b>h}UldcxR^0d;p~)!!qwAs5=z zz-+256QL+nxvl*Pfr}Fuo$VMP!J62pIV?eWzP8wDAkGX|K&(@ZKH?Z4*1Y~5&wJFKxsUPPj$+F?{Oe4ij zL+NTuaZiZr;3xHXd`=2WD_2;7BWLRmb>uM{%%p4me8?i`yXm6)s)N5<+oTszd{>{) z;S(q379pP~d7K5{lY1|>}#TN&OTyM!QuTsgrvYQ~&!Ja^h zE(2F|7{MY5i^pFs{Dci(GUje)+HnYXR1-@(wcemz0A{Q@zVT-~D52UNnzqUC2R4bs z@Eako;1y_1pfWuSmJ%;yKsHko91z~z&qdyj0eP6;?Ii2&Hom+;PG;ZCe9kr z%9-|^p|KOOo{iK zu+bFETLN?Z*?U%CXGI1>ofc`hQgs ze|p}e!3uxE6sAp7!p8P3t6h^WGYn$-rt32HNFf38LKR}4%U>Z40$LU+MBMx`-@%ck z_N8&8pV-`@m9zK~hb$smqoJSiH%tLs&lzjvEgqT=*TWcaqd^%u!c4Fh1T`o5)IZam zfJso=*&g)=nDrvScrbcNs+HM|3jc|k#r>K82*kR z+SkPZ4f7Fv@2hJ`LsLbM+^_` zqrotW`@+M`txg=1n-T~Esmr#|c!~gIg+J2bRb`U*G%^|9Mwpm@6k$b&*0`hp-E{80 zQpv5dd!<+DMKSz-yYUMk8UoxS%C?c^Td7I#ifhRtYfMHDaE)dw_G5}_5}IkY{{UlM zqXMx$;g`O=99<2rG-v^B=eZ1ZQVA z|A`|&_a?__Ry(l-(Tz#c+#VXMs#DuX8utlI1yd*-Qpc&lhg#mkE;!vxPb)IdHLk^? zkU(bpuCDPVA6_XJh=q{ncp4T>PthTMlw6Gn4_RNLKq}K3aWzv+Gcl=)MVog!mhO zxwz^b0#fu-slqG35=xKqOt<8cqDKA(N@;ID!pvG(S(TGRec+lhBW9C#3{A&ZqltOs z&11EZHiCIr>e96)+sVGV*bYB`jiK%|C9I9lo4$wl^Imkxlcl$6GBTsu7=*oFTp=;N zg)rOni;gw)zwlB`86j@(WSH=hKI2d?Ndy^eSh?rEg zeKA|i%Rfa_$-2de>AOO*U*BBzP4`XXuWlt?5t-4@0@JITqYGA_YFvlF&2U{TMl}S& zHMU=r-uxjh$Qt9(H-Iu)4?p+ozw@zxh-J&t#{(FlqEJ3$0V8f-zDM+L=y9XY%t8V5 zKDOD4&Q z-An{Q@UZkHoR_*~FC_@$mddZDriPK30}Ft9{h4#Z62;*vN=YjZx7OQN82SzZ7W6-b zY?42|b0x{m2O+)=FjAK&ro-Zu*~>FJvZ$Ryu4DWyw@j=T%!b6G%VjyL_KEXqL9qw&Tbq{+?%-6Uc%6k*Em~+go=5g;P+%-Wu!6*i`IFEvGIgA)db0L^v^-(@?eeOr8yLJJkAGWG(mIShL}|T7_|$neoo$Qz z{W=gbzDQdl!j6%zTjjA~lzH5Zkx6vKJ`-rFafUg0R?4q2!mMV!SYV zvmaETj(rHtpybdOCk~~V8~N>BOKY1jUg2~;AlS~vrh*&__^G}4T z^ObLX2@r0CrfA~-M+b4-g#D9kwhW1|Qmcls?3Z9?=>e^8;?A#0X>84hL$56%c#Pkw z<`=w*ZWUA>;L1oftlp=`MJG{AI9lBN5mgoC#vJ@oLWa?W_u=5@1qceaB#Mri&fuuY zc|VZv@%F-w5>0;dEWV1vXlU^0rpn`O4AL=KO@j{KiL%anyw)&5D8>(@R2((x&vTrw z<1~aBPdjfg;vFp829tcFI-f7ig%$m3NaTK#R4bVU8-D-#`Ay!An(Dpq>3%mdYG8N8 z!^;y%sT-9n-S1N=-n~kBXN;x0l(s*2iqAE5Zr1xF+v!pTv<2NP8ygLUR)SX(~-p9aM?88=;bdh z)VDC|1Q%(|b`xD-k%w}8snmA~+AV-Hjh`1-f4&(BSLD;}PfMtpte|nBe@NqKsC)e^TIVk#gx%IDqkrU#-?iP@{i>)LWw}Kk-IRZxFy? zXfPR~MYD32afy2$FI6}@Qa!3UkXA`XCK*J0p_}IbEHkLUprxffIz}pH|7pdX2ZLhU z6AeWs18gPPey~-5Hhdes8{Q}y%`Ml~pBGW1bImG^K_<~H8e%X&AJeK<2fesn*4yHs3W)WXs_>%U#+E^`=esFcQUU@%eDR-ee_M|F>EjiclIGGvS2H7v z^{B_Ha)(R+qEO|7Xq0=CegO#dD`7)BDS7)cgX`imZA8%|jdDpaein0%m1Y)eKem-! zLYK9?gLssYn6+vs7>$&yDU}J)asy4M4NdF?8M$=igx{)_JNkOWaHs^c=Ec1-cOT;4 ze%Ydn1PUkDR=A<89YE9eeeY_4uSG&RijsV^JWK3_PLr)X5nj#InmJ-MdM`4fC929j zlCsn2ngTmTmOGJfq|1Gr136Px)0I1C1%jDy6 z#I3z}4^#c#e4-2Pk?QRBVsGFMy0beTa_8k=1tcxh-vMBvtiY=^d}3?(0)2H6>k77VXjXJk~L&2L!ZFqraKjzf1i>W%;1V3$fow7et|r zYi2pv6mtHuhL8A){5w30gfcEmk8jY1;==skhd?Heq@KPIdV)dT);sc83=lt=p06TK zp7Dzv46|-6L-76E?L3B$5v-bgw43qEa4uTDlfwjgIaVeY$a z$|A?|4~fj8Rrft=1}k6mD;KKNtz7IU(uAdzRn_;C@P^X;U*bZu&#*Bn|6oxnUd1Idy2A@Ki*A)Q z+4Vd7)=n-W^w;H5-y|3%3bS!c9V(~{N4GT%;$QSNBGATwsBzLR6gZ9&Qy3% zHW8hgO~J=#!{~5V5O%6jNt4pfTPWpHoNiHiNiF$o%xedGTD?_w4CJZwk_bTpz$N7n z5^k#NXFJ(8(XAs_Yq6nrt%v1JyO3cqajHq5j)z~lK^QEy&E7(l9?!uTiqBBL_R#Q* zUsXl?jz?-{sel?g4Os}HL8^-Lh3yCu-wG;8x-ZJrQ zDnb7`K;q>?50=LNI;b|16r(s~#UHrqq1oU-X!|_aR`WOOIzLFdYw#>x4TC`)Fh+&% z$YR+))b&W*{FD-nfw8@pTJE98a#t1EYj7(-h%g0dUkn{2R_h^yN-e|1QpZNP5M;&6 zE)`Sxpggve5L$vF2=*sgJSnw>Se zsq5Usy8Q*3TIZx1hk3V*C5}40{W#ZHglXeia&h%MT&W$gZ-t-lJ;}_QjUef!gt}GTO>JS_MezR1#)Nd~1+0Nn z=|?Xmcs(2mYN_A_@RprA;$Mumsw0t-kiZIrsyTOYKnn4y9JBD@U&YddJP%E8as+H+@BZ`jh7ILL&jnG-jLv)=06^bQ9W_l2oQQw^m$n&o z*HSmlW`>7_$}RYbB0SDD%Y4T;LkcR*NP$X-O56Qa)iP5f?jP6*Wk`=uV#O8-bJmdN zhW(zzT)kld;g`iw+})i^r|o3&qFdsNwko~1`bjbtHRvb#;3Iw|Ji3+#4&NU9(13=n z-@q~d<;sFBNFiD8_~VO)o@0zoAIlB@34{lcNzO;!%&=E7Q3M5L)q~0_2p#dAa`PDc zPrG<=7=GcdP4UODUG+0U-UgZ~yMr|vZiMKNu4gv6yVmOH4^@bX(!ird3y;_r1YaKCNaE}Y0fRt_IjB^WsCB~)$e-)z zuHgL~Y2eYU&wAot*FSg)4>ChPvQ&b7Q0Q&y@4k}Gt2T3UOW|H?;aThMyb5o(n;yFD z?`kb>hliE>JN1GA7+96NpHh|Dyf<&tCDjB)B3?IDF}9+Mlh`a{AfMNX;I;oLF)^Y6{Xi!12R`;M3|Q}?}Fc)UDR?+{!ywV9z! z-_F(r1dx1U1k|T}N^MKwBm!Up75U?3)s|fAMJ9y;7>rSQkngx{{c`r+Liho;i5aM) zaI#-Vn0RZ?otw3$=mN|`V}y+tUJ*sO&PjFd4SsNz(=w}Wlv&$^UM)`s2ns$gMN;HB zL})&=HrMhF;01Mpq*N&K9z}Y+F_Ew)3j;%aUzpM)D0LslH~*ytXry1Fzm>as18Bnw z$@&=(lR-kCM=z2^i0Sl5`(kX`w)TTe@dm}DhHwA?4Eg`O00XsjunX3j{<520Nbo#{ z#L`QqNRX$eK7v!?&_suA+?VSPgUA%~I(UXZd$Oq)Ypi;R!3Afg*;i_rjzfMLWCB4W zH7GY&BYx`FuC0|o#+2t)KIZLxLF>&{oD{GBEQ~8H>UUP;hMDiMiGft4u4a`v>M zz&6Vf^U@4MchEb5+#KU)AGD%WNU^mKx7OZmu!&LISD9mo1E*-&0~aJVu1YhzE9ps< zro+}~(wayfmTIv13Df-5@+#Cr@?zRG+aI^m$8qKU%roFf76AUMD;K%L@CWvf*cB|j z-Ht!G5R%z!paw>~TxB{n80CFyf|X#IC97M z9Q%(ej@U7dlz~DZX{hsCsOZ6n^yxT3rS)c^34F+tWJImUu8chjt0tZTL7r#f*~KMw zd;5T` z=r2QaX*|AYDV18kg|Qk}G^Kgwu?}H3p5mR|o&>6Tx70NsmJQ(H(M&Hc-poEFVW4U` zcUxF<6rt{noHCMrzh^|-!dbJ=INw>HUUpjY2_A7}C;I?912Fo&M5r#<%-McD%oVK` zpYLUZCnvu~MMeFQgx&kW*PIX1MwXJ9D7V7|5vRn9^?u#<)NdjGB1C1+P8L+P9xC#w z*k!%>@2Q=LM>Z;a_ZFTtRdC^QSkiJ((tH%W?5n(mZ=yPXZ59{YQDFkVCafb>gn%7L zyp?Lel3aXLuO9nnP~s)X$qRP#{c0+{n#h1~RzFDr1e4<^QQ|G3wXw07aiisl#oRWP;(z+ z$Lh?<#bhW)L{;Y?`fXbHTY_4i>oMgouLvO!u55!9*JkTqBH(~ctVWM6{1^SNg7oGY z+Qhf7#w&ZV=yE$}@6G6E1O~)D;+*o<@>#`|>#S6~dYxUBxT5M6+Hj#)#;vfq7X6F6 zrg^g`HdMj>Fo_S_P3J@X!g#jbh_Jz8TZrL}e03N2`j4Njy{53F5;}P=Uy*fj6O^?b zp+lW%I4bsxx>h`|G@XQ;>cTh4`ulSj#aA`wu*G^^OQx$1#6JXB*VAKkxCl1 z>fz|IT<9->Ly``^tB9G@SwbxcYk=BYM_kyn3;M0l#CBl(ta2hlPM88AK3>ASGIMv> zKnLcQb{M9rGz1PCgLXRd$bKcQ5(uvQtd?{p#2$VE+=O{xqYGtQrt2-VG6YSd654dA zv;4Gw9z?ZmA|!`qVt;;5*1etj91oh4B4E%AAypTPv?)+8{Uti%mLY8*<>Xyy;m`K4 zVpTOSiP(NKD|`8)-@`w{ zfQO*-T|bLP&_6RtYRa-(-0oYXY?VIxH7hEwd&4vS0g213@+6Mr){JM47}KxAi{EbNpw60i(d;LMdNNOG1}IBKuNE;w!J%}>lvJL1pG+@ z8gFl&y!CC!k8Jq1jZwiEorST(@nGIBvFqg?10q@twF9J)=c%}_pOx`jy5`JkVj=eb z=-0&)Z^1l2YFUts(PBrEy+-_#ara-K~*7iUK&a-`wCfotbZ( zI8=XW!1^VkQ^lSOb60p4&R&%(h4IE6|76l|J@kOxW)u$1z^9jM9!ABjcAr!Cx}Egg zigu));KVXT!c!Q`)eD*xf-SazCJGXahAghFoy=zeh=_>?gjl@{1+?_+D(D3nFTb(* zM&i%8ZgEmr6vx-kx$T`zJWMX0iEPG;>`8q4&Io^IEVL`-`xt0O5Vnt@T0dXn&?WLF zx`hm+ip!Hf@6s*Z!Gc5oI{3xskI4IR-^1IYZxlk;GfIMsw$9^7bAu>K3ABYt3W4Wc zH_TLeF~iYUfW|jxT$;p@sK9ZU23pHp8FpzY*boI+b*feul&zfiyNsn;3ntoU$KhB$ z`&z~rjI<~bcdaap<{mXZuKfHRTe_~CFr)^tS|R&?QVOEYZ~bOMdxN?r@IRKG%2O|b z1v>o$S+fQyT^K;CXtyM^0q(VD9HsX?LtLiFx zQ>H+AfTQ?9TENqKpl@;$!oA%_dy6TWLH2m}Z{3zzZ_DdgbT9k9vQXyw_6&I|zw!b* ztvJ=6WNu+_=B8sp8(aUz9U&I+?o@faAXZ|BL)Z-FM641q%*6ze3p783j=4D7p zYP}rn8E=k@u6iwp#Tjdrl`Ma!` z4+Y==UgC-Na`x}~((_TdR2uDUxI~=aY%4O>9!9qN$@i#Ryq5}71+Y7HfG_f%I2tjF zHry0$-WNK7gdr<|`&~MS7ck>&Gvu-p8p~9s!i{79`OZ6KN&yT~E0ykZjybsV`H^eC z*C6D1$4loJooKpA%wwB0b-s}#P~zBOq12arLcMGar-xxm#FXQY=>Ss+@A!i^cAb^1 zdoH%iuRYO!ST+hRYB%`6#o(M{$ZN4$OWCE-6zgKHeF%Y$jhzn|h=Ov5wq1npvW1}U z3lQKwmvmVQv?(;mKpHe9E(H~nZ=P>)egzBeMdjJO8BHzvIQ78cN0C5$GQTQ6WP1r5 zWIAGnqLYIU0*TKaLQc8$dt`e1=XD1L&Ww_r=Z{+MM0SeeK9ra4M3x|@7t#j6q#FTq zZ8Q#wEt8;#RA$3n)zfVuvgDrPMXkL!RDvMx>K445ZK-@=%c&i$jYWn!d-alSP6NcZ z)GW?ls+)_>1?;|8xjAu}=iRjKqVqN>aNbY24**XMt8dRw8B@e5*w;+1E zy9B#T86b7qJPfHO-#T4+rAqbgFK-tlw%KmFoZ#!Qc0TNE+pIQ@sHFF)aBp`$46x3Q zv3BV$&2=~nT9oKp$TWVN9Jb!>bdAI%WW~|;jz=BmT*78zcal+TmRm*D-35l6t8q5x ziIgrg+>vKhBX&7X|{w>?#7F35~1`#R@UCSoeYZkx%+na=}&U$Y;M&h%ctu|Pt zx|UtLj>29PkiP;yW;x^J^mO7>u-$z;Iry_pw4(-F8nUREE!(^Tu1L1!esvhY>9U&> z$3E&Z$MPNO)8nY_68^zTCGBt3B#nr_3$qZY0NuUir8Doosn_MZ4Sm}Th_8>Gt80@d zzgUC=Kg-o06@~4NbMLAT{eKx|$W^{`<^3cDu7U}fwr-JQ$5fL%mC=n;6K+1qNN*SE z(~JF>O$8b&QJYobjRp_7cd z#jXeluz6TXJw|YytMfIcr0vW{ktn!tEafw?*J9ho{<`=5dWn3gpbacWeJGhn7#f*i z+LUSCuH@5w)Cuw0OMpe10^JD?0Voz&`T)o}MItwAQ_|EKrb1x(PRst|Urhma8{~d3 z{`{qy)$!l_-Q8V5(}u_KgNlL>O^)YT%bfN1`BLwz#GL*>bg=o&-5vMdj}{k7%Y&#U z-Nt_%_?)YCthMfa+JURGC}|b`eI@nXeZFwe3@o5LNk$s#HN@D=Mbh|HjzhH0_PT?S zRJ!&zHcBEHYOF8F_$--TtE(HdoiF>Wi~DCs;8xjG7V(eLN9v~0pa{ipvj${I9*Syb>U{jtEQ+_oX(P+n;OHT=#YsR(XC z^>3%#=EW6=aDtS7AK(hu8&6#e$11Ql+Ph@_*1y&1|2Z& z__0P|@)_Lo&OVb%S1S!x_~4gq^tzD|X{wBgpD-{mh?Fu|@$zEafH8dO%&_L#b^@w= zc8k~Fg_Ne6IR+6y9X}3^a*j6@oKHBPW9=-)(?0C?Zc%KZZ0Z#Gy)Tc~$c;8__`3G~ z4<}|2S*wNLd{oyz)E|yv&;|V(tQL3fR_)BP54Qi!6#TBLifyYL!wQGxKnav)*v19~ zVF2HVLZIe2dkDU8XNXhAe-!AdZ3Hp_W3?ZJ;ZpYWAatSz8@FtPscVX&Ae+@U7IVv4 zp(z++l$hP_TIT&*jwF=>)n_|v>p~Ou@Qn>UOACunLk_>{>JkSB2hG=8ot;)~nr3h{ qbp0C}xyS!sv;P0t_z&&g$;t7uPtd>gn*a9)g0%Qou}V>cfd2tfLaIan literal 25377 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 diff --git a/app/static/logos/64x64.png b/app/static/logos/64x64.png index 2d8d61b8efc7b6ece2b8333ef18cd631e75ef80f..77fe2a72c18be8ac2d1de0140ae665f1e82346dc 100644 GIT binary patch literal 4779 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 FV1jxK_(=c& literal 13966 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 From 2b21cce1bef3fe32c282c8d6f1f23e4ae5b45b02 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 6 Jul 2021 17:57:09 -0300 Subject: [PATCH 30/97] [docs] add new section for org repos (#552) --- docs/known-issues.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/known-issues.md b/docs/known-issues.md index 6a0eb7938a0..e0cc67e722e 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -13,6 +13,7 @@ - [Authentication errors due to modified registry entries](#authentication-errors-due-to-modified-registry-entries) - [Linux](#linux) - [I get a white screen when launching Desktop](#i-get-a-white-screen-when-launching-desktop) + - [I cannot access repositories under my organization](#i-cannot-access-repositories-under-my-organization) # Known Issues @@ -235,3 +236,20 @@ If you see an error that says "Not enough resources are available to process thi Electron enables hardware accelerated graphics by default, but some graphics cards have issues with hardware acceleration which means the application will launch successfully but it will be a white screen. If you are running GitHub Desktop within virtualization software like Parallels Desktop, hardware accelerated graphics may not be available. **Workaround:** if you set the `GITHUB_DESKTOP_DISABLE_HARDWARE_ACCELERATION` environment variable to any value and launch Desktop again it will disable hardware acceleration on launch, so the application is usable. + +### I cannot access repositories under my organization + +The GitHub Desktop application is an OAuth application, but this fork does not +have the same permissions as the app does on Windows and macOS, which manifests +in a couple of different ways: + + - the "Clone a Repository" view does not show all organization repositories + - pushes to a repository owned by an organization may be rejected with a + generic error message + +The root cause of this is organizations by default will have "OAuth App access +restrictions" enabled, which blocks the GitHub Desktop development app that is +used by this fork. + +**Workaround:** ask your organization admin to [approve access](https://docs.github.com/en/organizations/restricting-access-to-your-organizations-data/approving-oauth-apps-for-your-organization) +to the GitHub Desktop development app. From 0fa549afbda0511c58b8597d1875d8e303f94f23 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 14 Jul 2021 11:53:03 -0300 Subject: [PATCH 31/97] introduce abstractions to make Flatpak integration easier (#555) Co-Authored-By: nullrequest <30698906+advaithm@users.noreply.github.com> --- app/src/lib/editors/launch.ts | 22 ++++++- app/src/lib/editors/linux.ts | 3 +- app/src/lib/helpers/linux.ts | 93 +++++++++++++++++++++++++++++ app/src/lib/shells/linux.ts | 26 ++++---- app/src/lib/shells/shared.ts | 20 ++++++- app/test/unit/helpers/linux-test.ts | 30 ++++++++++ 6 files changed, 180 insertions(+), 14 deletions(-) create mode 100644 app/src/lib/helpers/linux.ts create mode 100644 app/test/unit/helpers/linux-test.ts diff --git a/app/src/lib/editors/launch.ts b/app/src/lib/editors/launch.ts index 6e1f5ee73ff..ab0a1b14f5f 100644 --- a/app/src/lib/editors/launch.ts +++ b/app/src/lib/editors/launch.ts @@ -1,7 +1,25 @@ import { spawn, SpawnOptions } from 'child_process' -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists as pathExistsDefault } from '../../ui/lib/path-exists' +import { pathExists as pathExistsLinux, spawnEditor } from '../helpers/linux' import { ExternalEditorError, FoundEditor } from './shared' +/** + * Use a platform-specific pathExists based on the platform, to simplify changes + * to the application logic + * + * @param path the location of some program on disk + * + * @returns `true` if the path exists on disk, or `false` otherwise + * + */ +function pathExists(path: string) { + if (__LINUX__) { + return pathExistsLinux(path) + } else { + return pathExistsDefault(path) + } +} + /** * Open a given file or folder in the desired external editor. * @@ -35,6 +53,8 @@ export async function launchExternalEditor( // In macOS we can use `open`, which will open the right executable file // for us, we only need the path to the editor .app folder. spawn('open', ['-a', editorPath, fullPath], opts) + } else if (__LINUX__) { + spawnEditor(editorPath, fullPath, opts) } else { spawn(editorPath, [fullPath], opts) } diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index 025b6df0e6b..f8342446d49 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -1,4 +1,5 @@ -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists } from '../helpers/linux' + import { IFoundEditor } from './found-editor' /** Represents an external editor on Linux */ diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts new file mode 100644 index 00000000000..73fe58887fe --- /dev/null +++ b/app/src/lib/helpers/linux.ts @@ -0,0 +1,93 @@ +import { join } from 'path' +import { pathExists as pathExistsInternal } from 'fs-extra' +import { + ChildProcess, + spawn, + SpawnOptionsWithoutStdio, + SpawnOptions, +} from 'child_process' + +export function isFlatpakBuild() { + return __LINUX__ && process.env.FLATPAK_HOST === '1' +} + +/** + * Convert an executable path to be relative to the flatpak host + * + * @param path a path to an executable relative to the root of the filesystem + * + */ +export function convertToFlatpakPath(path: string) { + if (!__LINUX__) { + return path + } + + if (path.startsWith('/opt/')) { + return path + } + + return join('/var/run/host', path) +} + +/** + * Checks the file path on disk exists before attempting to launch a specific shell + * + * @param path + * + * @returns `true` if the path can be resolved, or `false` otherwise + */ +export async function pathExists(path: string): Promise { + if (isFlatpakBuild()) { + path = convertToFlatpakPath(path) + } + + try { + return await pathExistsInternal(path) + } catch { + return false + } +} + +/** + * Spawn a particular shell in a way that works for Flatpak-based usage + * + * @param path path to shell, relative to the root of the filesystem + * @param args arguments to provide to the shell + * @param options additional options to provide to spawn function + * + * @returns a child process to observe and monitor + */ +export function spawnShell( + path: string, + args: string[], + options?: SpawnOptionsWithoutStdio +): ChildProcess { + if (isFlatpakBuild()) { + return spawn('flatpak-spawn', ['--host', path, ...args], options) + } + + return spawn(path, args, options) +} + +/** + * Spawn a given editor in a way that works for Flatpak-based usage + * + * @param path path to editor, relative to the root of the filesystem + * @param workingDirectory working directory to open initially in editor + * @param options additional options to provide to spawn function + */ +export function spawnEditor( + path: string, + workingDirectory: string, + options: SpawnOptions +): ChildProcess { + if (isFlatpakBuild()) { + return spawn( + 'flatpak-spawn', + ['--host', path, `"${workingDirectory}"`], + options + ) + } else { + return spawn(path, [workingDirectory], options) + } +} diff --git a/app/src/lib/shells/linux.ts b/app/src/lib/shells/linux.ts index 7ab0a4a5e89..393e0bb7e30 100644 --- a/app/src/lib/shells/linux.ts +++ b/app/src/lib/shells/linux.ts @@ -1,8 +1,8 @@ -import { spawn, ChildProcess } from 'child_process' +import { ChildProcess } from 'child_process' import { assertNever } from '../fatal-error' import { IFoundShell } from './found-shell' import { parseEnumValue } from '../enum' -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists as pathExistsLinux, spawnShell } from '../helpers/linux' export enum Shell { Gnome = 'GNOME Terminal', @@ -27,7 +27,7 @@ export function parse(label: string): Shell { } async function getPathIfAvailable(path: string): Promise { - return (await pathExists(path)) ? path : null + return (await pathExistsLinux(path)) ? path : null } function getShellPath(shell: Shell): Promise { @@ -164,21 +164,25 @@ export function launch( case Shell.Terminator: case Shell.XFCE: case Shell.Alacritty: - return spawn(foundShell.path, ['--working-directory', path]) + return spawnShell(foundShell.path, ['--working-directory', path]) case Shell.Urxvt: - return spawn(foundShell.path, ['-cd', path]) + return spawnShell(foundShell.path, ['-cd', path]) case Shell.Konsole: - return spawn(foundShell.path, ['--workdir', path]) + return spawnShell(foundShell.path, ['--workdir', path]) case Shell.Xterm: - return spawn(foundShell.path, ['-e', '/bin/bash'], { cwd: path }) + return spawnShell(foundShell.path, ['-e', '/bin/bash'], { cwd: path }) case Shell.Terminology: - return spawn(foundShell.path, ['-d', path]) + return spawnShell(foundShell.path, ['-d', path]) case Shell.Deepin: - return spawn(foundShell.path, ['-w', path]) + return spawnShell(foundShell.path, ['-w', path]) case Shell.Elementary: - return spawn(foundShell.path, ['-w', path]) + return spawnShell(foundShell.path, ['-w', path]) case Shell.Kitty: - return spawn(foundShell.path, ['--single-instance', '--directory', path]) + return spawnShell(foundShell.path, [ + '--single-instance', + '--directory', + path, + ]) default: return assertNever(shell, `Unknown shell: ${shell}`) } diff --git a/app/src/lib/shells/shared.ts b/app/src/lib/shells/shared.ts index 2f8c8be10a8..c39e8d7dfe7 100644 --- a/app/src/lib/shells/shared.ts +++ b/app/src/lib/shells/shared.ts @@ -3,9 +3,10 @@ import { ChildProcess } from 'child_process' import * as Darwin from './darwin' import * as Win32 from './win32' import * as Linux from './linux' +import { pathExists as pathExistsLinux } from '../helpers/linux' import { IFoundShell } from './found-shell' import { ShellError } from './error' -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists as pathExistsDefault } from '../../ui/lib/path-exists' export type Shell = Darwin.Shell | Win32.Shell | Linux.Shell @@ -72,6 +73,23 @@ export async function findShellOrDefault(shell: Shell): Promise { } } +/** + * Use a platform-specific pathExists based on the platform, to simplify changes + * to the application logic + * + * @param path the location of some program on disk + * + * @returns `true` if the path exists on disk, or `false` otherwise + * + */ +function pathExists(path: string) { + if (__LINUX__) { + return pathExistsLinux(path) + } else { + return pathExistsDefault(path) + } +} + /** Launch the given shell at the path. */ export async function launchShell( shell: FoundShell, diff --git a/app/test/unit/helpers/linux-test.ts b/app/test/unit/helpers/linux-test.ts new file mode 100644 index 00000000000..df18564e441 --- /dev/null +++ b/app/test/unit/helpers/linux-test.ts @@ -0,0 +1,30 @@ +import { convertToFlatpakPath } from '../../../src/lib/helpers/linux' + +describe('convertToFlatpakPath()', () => { + if (__LINUX__) { + it('converts /usr paths', () => { + const path = '/usr/bin/subl' + const expectedPath = '/var/run/host/usr/bin/subl' + expect(convertToFlatpakPath(path)).toEqual(expectedPath) + }) + + it('preserves /opt paths', () => { + const path = '/opt/slickedit-pro2018/bin/vs' + expect(convertToFlatpakPath(path)).toEqual(path) + }) + } + + if (__WIN32__) { + it('returns same path', () => { + const path = 'C:\\Windows\\System32\\Notepad.exe' + expect(convertToFlatpakPath(path)).toEqual(path) + }) + } + + if (__DARWIN__) { + it('returns same path', () => { + const path = '/usr/local/bin/code' + expect(convertToFlatpakPath(path)).toEqual(path) + }) + } +}) From 07026fe60396b324e9c7020d37c8601cd927d4d8 Mon Sep 17 00:00:00 2001 From: nullrequest <30698906+advaithm@users.noreply.github.com> Date: Mon, 19 Jul 2021 17:49:26 +0530 Subject: [PATCH 32/97] escape paths with regex over quotes in flatpaks (#558) --- app/src/lib/helpers/linux.ts | 9 +++++++-- app/test/unit/helpers/linux-test.ts | 19 ++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts index 73fe58887fe..fbe3c7742e2 100644 --- a/app/src/lib/helpers/linux.ts +++ b/app/src/lib/helpers/linux.ts @@ -28,7 +28,9 @@ export function convertToFlatpakPath(path: string) { return join('/var/run/host', path) } - +export function formatWorkingDirectoryForFlatpak(path: string): string { + return path.replace(/(\s)/, ' ') +} /** * Checks the file path on disk exists before attempting to launch a specific shell * @@ -82,9 +84,12 @@ export function spawnEditor( options: SpawnOptions ): ChildProcess { if (isFlatpakBuild()) { + const EscapedworkingDirectory = formatWorkingDirectoryForFlatpak( + workingDirectory + ) return spawn( 'flatpak-spawn', - ['--host', path, `"${workingDirectory}"`], + ['--host', path, EscapedworkingDirectory], options ) } else { diff --git a/app/test/unit/helpers/linux-test.ts b/app/test/unit/helpers/linux-test.ts index df18564e441..52873f4e9d0 100644 --- a/app/test/unit/helpers/linux-test.ts +++ b/app/test/unit/helpers/linux-test.ts @@ -1,4 +1,7 @@ -import { convertToFlatpakPath } from '../../../src/lib/helpers/linux' +import { + convertToFlatpakPath, + formatWorkingDirectoryForFlatpak, +} from '../../../src/lib/helpers/linux' describe('convertToFlatpakPath()', () => { if (__LINUX__) { @@ -28,3 +31,17 @@ describe('convertToFlatpakPath()', () => { }) } }) + +describe('formatWorkingDirectoryForFlatpak()', () => { + if (__LINUX__) { + it('escapes string', () => { + const path = '/home/test/path with space' + const expectedPath = '/home/test/path with space' + expect(formatWorkingDirectoryForFlatpak(path)).toEqual(expectedPath) + }) + it('returns same path', () => { + const path = '/home/test/path_wthout_spaces' + expect(formatWorkingDirectoryForFlatpak(path)).toEqual(path) + }) + } +}) From 431739be259f6c8cfe12a212f391c942c7347290 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 19 Jul 2021 10:31:32 -0300 Subject: [PATCH 33/97] point window icon to new version (#561) --- app/src/main-process/app-window.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main-process/app-window.ts b/app/src/main-process/app-window.ts index 4466a45ca86..0fabf6c23b1 100644 --- a/app/src/main-process/app-window.ts +++ b/app/src/main-process/app-window.ts @@ -7,6 +7,7 @@ import { nativeTheme, } from 'electron' import { Emitter, Disposable } from 'event-kit' +import { join } from 'path' import { encodePathAsUrl } from '../lib/path' import { getWindowState, @@ -74,6 +75,8 @@ export class AppWindow { } else if (__WIN32__) { windowOptions.frame = false } else if (__LINUX__) { + windowOptions.icon = join(__dirname, 'static', 'logos', '512x512.png') + // relax restriction here for users trying to run app at a small // resolution and any other side-effects of dropping this restriction are // currently unsupported From 9b76e1f90f516d8b491d065affa34a963947f9bc Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 22 Jul 2021 12:21:27 -0300 Subject: [PATCH 34/97] detect and support running post-install script with offline yarn (#567) --- script/post-install.ts | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/script/post-install.ts b/script/post-install.ts index 4d35d219a80..3d7d3586ff0 100644 --- a/script/post-install.ts +++ b/script/post-install.ts @@ -13,6 +13,22 @@ const options: SpawnSyncOptions = { stdio: 'inherit', } +/** Check if the caller has set the OFFLINe environment variable */ +function isOffline() { + return process.env.OFFLINE === '1' +} + +/** Format the arguments to ensure these work offline */ +function getYarnArgs(baseArgs: Array): Array { + const args = baseArgs + + if (isOffline()) { + args.splice(1, 0, '--offline') + } + + return args +} + function findYarnVersion(callback: (path: string) => void) { glob('vendor/yarn-*.js', (error, files) => { if (error != null) { @@ -28,27 +44,27 @@ function findYarnVersion(callback: (path: string) => void) { } findYarnVersion(path => { - let result = spawnSync( - 'node', - [path, '--cwd', 'app', 'install', '--force'], - options - ) + const installArgs = getYarnArgs([path, '--cwd', 'app', 'install', '--force']) + + let result = spawnSync('node', installArgs, options) if (result.status !== 0) { process.exit(result.status || 1) } - result = spawnSync( - 'git', - ['submodule', 'update', '--recursive', '--init'], - options - ) + if (isOffline()) { + result = spawnSync( + 'git', + ['submodule', 'update', '--recursive', '--init'], + options + ) - if (result.status !== 0) { - process.exit(result.status || 1) + if (result.status !== 0) { + process.exit(result.status || 1) + } } - result = spawnSync('node', [path, 'compile:script'], options) + result = spawnSync('node', getYarnArgs([path, 'compile:script']), options) if (result.status !== 0) { process.exit(result.status || 1) From f957a1e30cb1ec4a2a4d6f1f196ae4e201bbbbc9 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 13 Aug 2021 13:49:01 -0300 Subject: [PATCH 35/97] assorted lint fixes not caught by CI From e0dcd74075004a484ed776605094fd0238696b08 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 30 Aug 2021 08:57:56 -0300 Subject: [PATCH 36/97] submodules should be updated if OFFLINE=1 is not set (#587) --- script/post-install.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/post-install.ts b/script/post-install.ts index 3d7d3586ff0..0665cc3bac8 100644 --- a/script/post-install.ts +++ b/script/post-install.ts @@ -52,7 +52,7 @@ findYarnVersion(path => { process.exit(result.status || 1) } - if (isOffline()) { + if (!isOffline()) { result = spawnSync( 'git', ['submodule', 'update', '--recursive', '--init'], From 74a2677079780489237871917084fcf211e418c3 Mon Sep 17 00:00:00 2001 From: Gagan Yadav Date: Sun, 5 Sep 2021 19:37:17 +0530 Subject: [PATCH 37/97] Add instructions for opensuse dist in README.md (#592) --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 5f84b021e2b..166d2fc9294 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,19 @@ $ sudo yum install github-desktop $ sudo dnf install github-desktop ``` +### OpenSUSE distribution +```sh +$ sudo rpm --import https://packagecloud.io/shiftkey/desktop/gpgkey +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://packagecloud.io/shiftkey/desktop/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' +``` + +Then install GitHub Desktop: + +```sh +# if zypper is your package manager +$ sudo zypper ref && sudo zypper in github-desktop +``` + ## Other Distributions Arch Linux users can install GitHub Desktop from the From 2452b1531675148d4b6d0ea77477dfcf61646b35 Mon Sep 17 00:00:00 2001 From: Luna <30698906+Lunarequest@users.noreply.github.com> Date: Thu, 30 Sep 2021 21:27:13 +0530 Subject: [PATCH 38/97] Flatpak: locate and launch flatpaked code editors (#602) --- app/src/lib/helpers/linux.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts index fbe3c7742e2..9a2f88c21f4 100644 --- a/app/src/lib/helpers/linux.ts +++ b/app/src/lib/helpers/linux.ts @@ -22,7 +22,7 @@ export function convertToFlatpakPath(path: string) { return path } - if (path.startsWith('/opt/')) { + if (path.startsWith('/opt/') || path.startsWith('/var/lib/flatpak')) { return path } @@ -31,6 +31,13 @@ export function convertToFlatpakPath(path: string) { export function formatWorkingDirectoryForFlatpak(path: string): string { return path.replace(/(\s)/, ' ') } + +export function formatPathForFlatpak(path: string): string { + if (path.startsWith('/var/lib/flatpak/app')) { + return path.replace('/var/lib/flatpak/app/', '') + } + return path +} /** * Checks the file path on disk exists before attempting to launch a specific shell * @@ -84,12 +91,13 @@ export function spawnEditor( options: SpawnOptions ): ChildProcess { if (isFlatpakBuild()) { + const actualpath = formatPathForFlatpak(path) const EscapedworkingDirectory = formatWorkingDirectoryForFlatpak( workingDirectory ) return spawn( 'flatpak-spawn', - ['--host', path, EscapedworkingDirectory], + ['--host', actualpath, EscapedworkingDirectory], options ) } else { From 5765fbe2474ba05949aeb3952ec599c2765e72ec Mon Sep 17 00:00:00 2001 From: Foxler2010 Date: Thu, 30 Sep 2021 19:15:38 +0000 Subject: [PATCH 39/97] fixed a typo in the README (#605) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 166d2fc9294..0f1476f185c 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ To setup the package repository, run these commands: ```sh $ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null -$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftky-desktop.list' +$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' $ sudo apt-get update ``` From 041ba1d6a5d9d0fa4dadbb7d87191bfeb22bd7a9 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 3 Oct 2021 18:49:32 -0300 Subject: [PATCH 40/97] move icons to correct location, update usages in tooling (#606) --- app/static/{ => linux}/logos/1024x1024.png | Bin app/static/{ => linux}/logos/128x128.png | Bin app/static/{ => linux}/logos/256x256.png | Bin app/static/{ => linux}/logos/32x32.png | Bin app/static/{ => linux}/logos/512x512.png | Bin app/static/{ => linux}/logos/64x64.png | Bin script/build.ts | 9 ++++++++- script/electron-builder-linux.yml | 2 +- script/package-debian.ts | 12 ++++++------ script/package-redhat.ts | 12 ++++++------ 10 files changed, 21 insertions(+), 14 deletions(-) rename app/static/{ => linux}/logos/1024x1024.png (100%) rename app/static/{ => linux}/logos/128x128.png (100%) rename app/static/{ => linux}/logos/256x256.png (100%) rename app/static/{ => linux}/logos/32x32.png (100%) rename app/static/{ => linux}/logos/512x512.png (100%) rename app/static/{ => linux}/logos/64x64.png (100%) diff --git a/app/static/logos/1024x1024.png b/app/static/linux/logos/1024x1024.png similarity index 100% rename from app/static/logos/1024x1024.png rename to app/static/linux/logos/1024x1024.png diff --git a/app/static/logos/128x128.png b/app/static/linux/logos/128x128.png similarity index 100% rename from app/static/logos/128x128.png rename to app/static/linux/logos/128x128.png diff --git a/app/static/logos/256x256.png b/app/static/linux/logos/256x256.png similarity index 100% rename from app/static/logos/256x256.png rename to app/static/linux/logos/256x256.png diff --git a/app/static/logos/32x32.png b/app/static/linux/logos/32x32.png similarity index 100% rename from app/static/logos/32x32.png rename to app/static/linux/logos/32x32.png diff --git a/app/static/logos/512x512.png b/app/static/linux/logos/512x512.png similarity index 100% rename from app/static/logos/512x512.png rename to app/static/linux/logos/512x512.png diff --git a/app/static/logos/64x64.png b/app/static/linux/logos/64x64.png similarity index 100% rename from app/static/logos/64x64.png rename to app/static/linux/logos/64x64.png diff --git a/script/build.ts b/script/build.ts index 165461fc510..03a68e34dd3 100755 --- a/script/build.ts +++ b/script/build.ts @@ -160,13 +160,20 @@ function packageApp() { ) } + // this setting only works for macOS and Windows, so let's clear it now to ensure + // the app is working as expected + const icon = + process.platform === 'linux' + ? undefined + : path.join(projectRoot, 'app', 'static', 'logos', getIconFileName()) + return packager({ name: getExecutableName(), platform: toPackagePlatform(process.platform), arch: toPackageArch(process.env.TARGET_ARCH), asar: false, // TODO: Probably wanna enable this down the road. out: getDistRoot(), - icon: path.join(projectRoot, 'app', 'static', 'logos', getIconFileName()), + icon, dir: outRoot, overwrite: true, tmpdir: false, diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index a7a35c6f34d..bcaae41ee82 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -2,7 +2,7 @@ artifactName: 'GitHubDesktop-${os}-${version}.${ext}' linux: category: 'GNOME;GTK;Development' packageCategory: 'GNOME;GTK;Development' - icon: 'app/static/logos' + icon: 'app/static/linux/logos' mimeTypes: - x-scheme-handler/x-github-client - x-scheme-handler/x-github-desktop-auth diff --git a/script/package-debian.ts b/script/package-debian.ts index 35402cafaf2..15314d519dd 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -53,12 +53,12 @@ const options: DebianOptions = { 'gnome-keyring', ], icon: { - '32x32': 'app/static/logos/32x32.png', - '64x64': 'app/static/logos/64x64.png', - '128x128': 'app/static/logos/128x128.png', - '256x256': 'app/static/logos/256x256.png', - '512x512': 'app/static/logos/512x512.png', - '1024x1024': 'app/static/logos/1024x1024.png', + '32x32': 'app/static/linux/logos/32x32.png', + '64x64': 'app/static/linux/logos/64x64.png', + '128x128': 'app/static/linux/logos/128x128.png', + '256x256': 'app/static/linux/logos/256x256.png', + '512x512': 'app/static/linux/logos/512x512.png', + '1024x1024': 'app/static/linux/logos/1024x1024.png', }, scripts: { postinst: 'script/resources/deb/postinst.sh', diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 3b5a55b8a25..66ef2f39f37 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -49,12 +49,12 @@ const options: RedhatOptions = { 'gnome-keyring', ], icon: { - '32x32': 'app/static/logos/32x32.png', - '64x64': 'app/static/logos/64x64.png', - '128x128': 'app/static/logos/128x128.png', - '256x256': 'app/static/logos/256x256.png', - '512x512': 'app/static/logos/512x512.png', - '1024x1024': 'app/static/logos/1024x1024.png', + '32x32': 'app/static/linux/logos/32x32.png', + '64x64': 'app/static/linux/logos/64x64.png', + '128x128': 'app/static/linux/logos/128x128.png', + '256x256': 'app/static/linux/logos/256x256.png', + '512x512': 'app/static/linux/logos/512x512.png', + '1024x1024': 'app/static/linux/logos/1024x1024.png', }, scripts: { post: 'script/resources/rpm/post.sh', From 69190fa3b7b499d29adfa32422e6c7f969650aa8 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 22 Oct 2021 13:53:49 -0300 Subject: [PATCH 41/97] enable release job to access contents --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a731a0c68d..27076ff7464 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,7 +42,7 @@ jobs: name: ${{ matrix.friendlyName }} ${{ matrix.arch }} runs-on: ${{ matrix.os }} permissions: - contents: read + contents: write strategy: fail-fast: false matrix: From a0d842d053f5b81fe7e87818326984016e0f7e72 Mon Sep 17 00:00:00 2001 From: Reinaldo Date: Sun, 13 Feb 2022 12:02:15 -0500 Subject: [PATCH 42/97] Changed apt-get to apt in the debian installation section of the readme file (#656) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f1476f185c..e585ba3bb9c 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ To setup the package repository, run these commands: ```sh $ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null $ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' -$ sudo apt-get update +$ sudo apt update ``` Then install GitHub Desktop: From de342d250f3dc4990c58e1a70067aa28e697e810 Mon Sep 17 00:00:00 2001 From: "Matthew W. Thomas" Date: Sat, 12 Mar 2022 12:08:56 -0600 Subject: [PATCH 43/97] Add mirror to README (#667) * Update README.md to add mirror I added `mirror.mwt.me` as a possible repo option. I tried to keep this stylistically consistent with the rest of the document. I also offloaded the GPG key download to keys.openpgp.org. This allows this step to work even if PackageCloud is out of bandwidth. It also has the advantage of putting the key id in the README and does not require users to trust me. * undo use of openpgp.org * Mention AppImage and Flatpak --- README.md | 68 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index e585ba3bb9c..c09be89ddc4 100644 --- a/README.md +++ b/README.md @@ -32,36 +32,61 @@ It also hosts preview packages for various Linux distributions: Check out the [latest releases](https://github.com/shiftkey/desktop/releases) to help out with testing on your distribution. -## packagecloud +## Repositories -We use [PackageCloud](https://packagecloud.io/) for distributing -the installers for Debian and RPM-based distributions. These are not free services, -so if you can afford to help with these costs please [**Sponsor**](https://github.com/sponsors/shiftkey) -the project using the link in the header. +You can use your operating system's package manager to install `github-desktop` and +keep it up to date on Debian/RPM based distributions. There are two options for this: + +* A [PackageCloud](https://packagecloud.io/) repository with excellent global connectivity + but very limited bandwidth. This option will stop working each month when the bandwidth + limit is reached. +* A [mirror](https://mattwthomas.com/mirrors/) in the US which has effectively infinite + bandwidth and performs well in most regions (especially the Americas and Europe). + +PackageCloud, which both options depend on, is not a free service. So, if you can afford to +help with these costs please [**Sponsor**](https://github.com/sponsors/shiftkey) the project +using the link in the header. ### Debian/Ubuntu distributions -To setup the package repository, run these commands: +First install our GPG certificate: + +```sh +$ wget -qO - https://mirror.mwt.me/ghd/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null +``` + +To setup the package repository, run one of these commands: ```sh -$ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null +# if you want to use packagecloud.io $ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' -$ sudo apt update + +# if you want to use the US mirror +$ sudo sh -c 'echo "deb [arch=amd64] https://mirror.mwt.me/ghd/deb/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' ``` Then install GitHub Desktop: ```sh -$ sudo apt install github-desktop +$ sudo apt update && sudo apt install github-desktop ``` ### Red Hat/CentOS/Fedora distributions -To setup the package repository, run these commands: +First install our GPG certificate: ```sh -$ sudo rpm --import https://packagecloud.io/shiftkey/desktop/gpgkey -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://packagecloud.io/shiftkey/desktop/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' +$ sudo rpm --import https://mirror.mwt.me/ghd/gpgkey +``` + +To setup the package repository, run one of these commands: + +```sh +# if you want to use packagecloud.io +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' + +# if you want to use the US mirror +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' ``` Then install GitHub Desktop: @@ -75,9 +100,22 @@ $ sudo dnf install github-desktop ``` ### OpenSUSE distribution + + +First install our GPG certificate: + +```sh +$ sudo rpm --import https://mirror.mwt.me/ghd/gpgkey +``` + +To setup the package repository, run one of these commands: + ```sh -$ sudo rpm --import https://packagecloud.io/shiftkey/desktop/gpgkey -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://packagecloud.io/shiftkey/desktop/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' +# if you want to use packagecloud.io +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' + +# if you want to use the US mirror +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' ``` Then install GitHub Desktop: @@ -94,6 +132,8 @@ Arch Linux users can install GitHub Desktop from the `gnome-keyring` is required and the daemon must be launched either at login or when the X server is started. Normally this is handled by a display manager, but in other cases following the instructions found on the [Arch Wiki](https://wiki.archlinux.org/index.php/GNOME/Keyring#Using_the_keyring_outside_GNOME) will fix the issue of not being able to save login credentials. +GitHub Desktop is also available cross-platform as a [Flatpak](https://github.com/flathub/io.github.shiftey.Desktop) and [AppImage](https://appimage.github.io/GitHubDesktop/). + ## Known issues If you're having troubles with Desktop, please refer to the [Known issues](docs/known-issues.md#linux) From 7f8aa9eab8c8301b93738f18796e7d6dc58812b3 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 3 Apr 2022 12:28:32 -0300 Subject: [PATCH 44/97] reformat helper file related to spawning flatpak --- app/src/lib/helpers/linux.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts index 9a2f88c21f4..5595d2a537e 100644 --- a/app/src/lib/helpers/linux.ts +++ b/app/src/lib/helpers/linux.ts @@ -92,9 +92,8 @@ export function spawnEditor( ): ChildProcess { if (isFlatpakBuild()) { const actualpath = formatPathForFlatpak(path) - const EscapedworkingDirectory = formatWorkingDirectoryForFlatpak( - workingDirectory - ) + const EscapedworkingDirectory = + formatWorkingDirectoryForFlatpak(workingDirectory) return spawn( 'flatpak-spawn', ['--host', actualpath, EscapedworkingDirectory], From 988b869541b6271c9c4a6e568c2293307ad18f44 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 3 Apr 2022 13:52:37 -0300 Subject: [PATCH 45/97] Add additional validation to find the app-specific argument we require (#687 #689) --- app/src/main-process/main.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main-process/main.ts b/app/src/main-process/main.ts index 71e4d9c9529..35b7f3bd1df 100644 --- a/app/src/main-process/main.ts +++ b/app/src/main-process/main.ts @@ -269,6 +269,16 @@ function handlePossibleProtocolLauncherArgs(args: ReadonlyArray) { } else { log.error(`Malformed launch arguments received: ${args}`) } + } else if (__LINUX__) { + // we expect this call to have several parameters before the URL we want, + // so we should filter out the program name as well as any parameters that + // look like arguments to Electron + const argsWithoutParameters = args.filter( + a => !a.endsWith('github-desktop') && !a.startsWith('--') + ) + if (argsWithoutParameters.length > 0) { + handleAppURL(argsWithoutParameters[0]) + } } else if (args.length > 1) { handleAppURL(args[1]) } From 2c4e2224a24b3665c8b364fe9f36e1368b677f4e Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 3 Apr 2022 17:51:22 -0300 Subject: [PATCH 46/97] update Actions CI status in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c09be89ddc4..82c5ad9d987 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # [GitHub Desktop](https://desktop.github.com) - The Linux Fork -[![Build Status](https://brendanforster.visualstudio.com/desktop-linux/_apis/build/status/Azure%20Pipelines%20Build?branchName=linux)](https://brendanforster.visualstudio.com/desktop-linux/_build/latest?definitionId=10&branchName=linux) +[![CI](https://github.com/shiftkey/desktop/actions/workflows/ci.yml/badge.svg)](https://github.com/shiftkey/desktop/actions/workflows/ci.yml) [GitHub Desktop](https://desktop.github.com/) is an open source [Electron](https://www.electronjs.org/)-based GitHub app. It is written in [TypeScript](https://www.typescriptlang.org) and From ea492a6a28c9ce3897af9f0d552db4bc5127ca17 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 15 Apr 2022 13:22:29 -0300 Subject: [PATCH 47/97] move electron-winstaller to optional dependency to not block arm32 usage --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 46348b289c1..e148de86592 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,6 @@ "@types/xml2js": "^0.4.11", "electron": "26.2.4", "electron-packager": "^17.1.1", - "electron-winstaller": "^5.0.0", "eslint-plugin-github": "^4.10.1", "markdownlint-cli": "^0.32.2", "reserved-words": "^0.1.2", @@ -169,6 +168,7 @@ }, "optionalDependencies": { "electron-installer-debian": "3.1.0", - "electron-installer-redhat": "3.3.0" + "electron-installer-redhat": "3.3.0", + "electron-winstaller": "^5.0.0" } } From 9cb6010c6536c26734abd7a12ba3b8316ed36c9b Mon Sep 17 00:00:00 2001 From: Etaash-mathamsetty <45927311+Etaash-mathamsetty@users.noreply.github.com> Date: Thu, 21 Apr 2022 17:10:20 +0000 Subject: [PATCH 48/97] Add support for GNOME console and newer GNOME editors (#700) * add support for gnome console * Delete configurationCache.log * Update linux.ts * fix cap of gnome * support new GNOME Text Editor * support GNOME builder --- app/src/lib/shells/linux.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/lib/shells/linux.ts b/app/src/lib/shells/linux.ts index 393e0bb7e30..28bdeb898b0 100644 --- a/app/src/lib/shells/linux.ts +++ b/app/src/lib/shells/linux.ts @@ -6,6 +6,7 @@ import { pathExists as pathExistsLinux, spawnShell } from '../helpers/linux' export enum Shell { Gnome = 'GNOME Terminal', + GnomeConsole = 'GNOME Console', Mate = 'MATE Terminal', Tilix = 'Tilix', Terminator = 'Terminator', @@ -34,6 +35,8 @@ function getShellPath(shell: Shell): Promise { switch (shell) { case Shell.Gnome: return getPathIfAvailable('/usr/bin/gnome-terminal') + case Shell.GnomeConsole: + return getPathIfAvailable('/usr/bin/kgx') case Shell.Mate: return getPathIfAvailable('/usr/bin/mate-terminal') case Shell.Tilix: @@ -68,6 +71,7 @@ export async function getAvailableShells(): Promise< > { const [ gnomeTerminalPath, + gnomeConsolePath, mateTerminalPath, tilixPath, terminatorPath, @@ -82,6 +86,7 @@ export async function getAvailableShells(): Promise< kittyPath, ] = await Promise.all([ getShellPath(Shell.Gnome), + getShellPath(Shell.GnomeConsole), getShellPath(Shell.Mate), getShellPath(Shell.Tilix), getShellPath(Shell.Terminator), @@ -101,6 +106,10 @@ export async function getAvailableShells(): Promise< shells.push({ shell: Shell.Gnome, path: gnomeTerminalPath }) } + if (gnomeConsolePath) { + shells.push({ shell: Shell.GnomeConsole, path: gnomeConsolePath }) + } + if (mateTerminalPath) { shells.push({ shell: Shell.Mate, path: mateTerminalPath }) } @@ -159,6 +168,7 @@ export function launch( const shell = foundShell.shell switch (shell) { case Shell.Gnome: + case Shell.GnomeConsole: case Shell.Mate: case Shell.Tilix: case Shell.Terminator: From ae4112f0cec26132d31fe22f428796d6d8baf7d8 Mon Sep 17 00:00:00 2001 From: theofficialgman <28281419+theofficialgman@users.noreply.github.com> Date: Sat, 7 May 2022 10:50:19 -0400 Subject: [PATCH 49/97] Adds LXTerminal to terminals and Geany and Mousepad to supported editors (#711) * add LXTerminal to supported terminals * add geany to supported editors list * Update linux.ts * add mousepad to supported editors * lint changed files Co-authored-by: Brendan Forster --- app/src/lib/shells/linux.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/lib/shells/linux.ts b/app/src/lib/shells/linux.ts index 28bdeb898b0..2eb1aa3b824 100644 --- a/app/src/lib/shells/linux.ts +++ b/app/src/lib/shells/linux.ts @@ -19,6 +19,7 @@ export enum Shell { XFCE = 'XFCE Terminal', Alacritty = 'Alacritty', Kitty = 'Kitty', + LXTerminal = 'LXDE Terminal', } export const Default = Shell.Gnome @@ -61,6 +62,8 @@ function getShellPath(shell: Shell): Promise { return getPathIfAvailable('/usr/bin/alacritty') case Shell.Kitty: return getPathIfAvailable('/usr/bin/kitty') + case Shell.LXTerminal: + return getPathIfAvailable('/usr/bin/lxterminal') default: return assertNever(shell, `Unknown shell: ${shell}`) } @@ -84,6 +87,7 @@ export async function getAvailableShells(): Promise< xfcePath, alacrittyPath, kittyPath, + lxterminalPath, ] = await Promise.all([ getShellPath(Shell.Gnome), getShellPath(Shell.GnomeConsole), @@ -99,6 +103,7 @@ export async function getAvailableShells(): Promise< getShellPath(Shell.XFCE), getShellPath(Shell.Alacritty), getShellPath(Shell.Kitty), + getShellPath(Shell.LXTerminal), ]) const shells: Array> = [] @@ -158,6 +163,10 @@ export async function getAvailableShells(): Promise< shells.push({ shell: Shell.Kitty, path: kittyPath }) } + if (lxterminalPath) { + shells.push({ shell: Shell.LXTerminal, path: lxterminalPath }) + } + return shells } @@ -193,6 +202,8 @@ export function launch( '--directory', path, ]) + case Shell.LXTerminal: + return spawnShell(foundShell.path, ['--working-directory=' + path]) default: return assertNever(shell, `Unknown shell: ${shell}`) } From 481ae0d4c580049beabb48cf3e00a476afcac9ae Mon Sep 17 00:00:00 2001 From: theofficialgman <28281419+theofficialgman@users.noreply.github.com> Date: Sat, 7 May 2022 14:04:01 -0400 Subject: [PATCH 50/97] add armv7l support to scripts (#712) * add armv7l support to scripts * lint fix new files Co-authored-by: Brendan Forster --- script/build.ts | 6 +++++- script/dist-info.ts | 8 ++++++-- script/package-debian.ts | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/script/build.ts b/script/build.ts index 03a68e34dd3..de2e6818688 100755 --- a/script/build.ts +++ b/script/build.ts @@ -136,7 +136,11 @@ function packageApp() { targetArch = os.arch() } - if (targetArch === 'arm64' || targetArch === 'x64') { + if ( + targetArch === 'arm64' || + targetArch === 'x64' || + targetArch === 'armv7l' + ) { return targetArch } diff --git a/script/dist-info.ts b/script/dist-info.ts index 88a0bcbd4b4..74c4301673c 100644 --- a/script/dist-info.ts +++ b/script/dist-info.ts @@ -112,11 +112,12 @@ export const isPublishable = () => export const getChannel = () => process.env.RELEASE_CHANNEL ?? process.env.NODE_ENV ?? 'development' -export function getDistArchitecture(): 'arm64' | 'x64' { +export function getDistArchitecture(): 'arm64' | 'x64' | 'armv7l' { // If a specific npm_config_arch is set, we use that one instead of the OS arch (to support cross compilation) if ( process.env.npm_config_arch === 'arm64' || - process.env.npm_config_arch === 'x64' + process.env.npm_config_arch === 'x64' || + process.env.npm_config_arch === 'armv7l' ) { return process.env.npm_config_arch } @@ -124,6 +125,9 @@ export function getDistArchitecture(): 'arm64' | 'x64' { if (process.arch === 'arm64') { return 'arm64' } + if (process.arch === 'armv7l') { + return 'armv7l' + } // TODO: Check if it's x64 running on an arm64 Windows with IsWow64Process2 // More info: https://www.rudyhuyn.com/blog/2017/12/13/how-to-detect-that-your-x86-application-runs-on-windows-on-arm/ diff --git a/script/package-debian.ts b/script/package-debian.ts index 15314d519dd..fc6ae2cf57c 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -16,7 +16,7 @@ type DebianOptions = { // required src: string dest: string - arch: 'amd64' | 'i386' | 'arm64' + arch: 'amd64' | 'i386' | 'arm64' | 'armhf' // optional description?: string productDescription?: string From f9e9dd40d5411922ab418e9f429732fc0e2df98f Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 20 Dec 2023 09:19:43 -0400 Subject: [PATCH 51/97] appease typechecker by detecting arm architecture when running Node 18 --- script/dist-info.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/dist-info.ts b/script/dist-info.ts index 74c4301673c..420444f7448 100644 --- a/script/dist-info.ts +++ b/script/dist-info.ts @@ -125,7 +125,7 @@ export function getDistArchitecture(): 'arm64' | 'x64' | 'armv7l' { if (process.arch === 'arm64') { return 'arm64' } - if (process.arch === 'armv7l') { + if (process.arch === 'arm') { return 'armv7l' } From bf113217eac63a63214ff10bda04e7db848257bd Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 7 Jul 2022 12:46:31 -0300 Subject: [PATCH 52/97] Linux build does not have the equivalent of beta channel --- app/src/ui/about/about.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/ui/about/about.tsx b/app/src/ui/about/about.tsx index 3da23954011..3c4abeeaf35 100644 --- a/app/src/ui/about/about.tsx +++ b/app/src/ui/about/about.tsx @@ -317,6 +317,10 @@ export class About extends React.Component { return } + if (__LINUX__) { + return + } + return (

Looking for the latest features?

From d554aeb09028c7c1e01eb61258f33e467afcc245 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sat, 15 Oct 2022 16:34:00 -0300 Subject: [PATCH 53/97] allow for packaging parameters to be derived from process.arch (#774) --- script/package-debian.ts | 13 ++++++++++++- script/package-electron-builder.ts | 13 ++++++++++++- script/package-redhat.ts | 15 +++++++++++++-- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/script/package-debian.ts b/script/package-debian.ts index fc6ae2cf57c..9a918473070 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -9,6 +9,17 @@ import { rename } from 'fs-extra' import { getVersion } from '../app/package-info' import { getDistPath, getDistRoot } from './dist-info' +function getArchitecture() { + switch (process.arch) { + case 'arm64': + return 'arm64' + case 'arm': + return 'armhf' + default: + return 'amd64' + } +} + const distRoot = getDistRoot() // best guess based on documentation @@ -39,7 +50,7 @@ type DebianOptions = { const options: DebianOptions = { src: getDistPath(), dest: distRoot, - arch: 'amd64', + arch: getArchitecture(), description: 'Simple collaboration from your desktop', productDescription: 'This is the unofficial port of GitHub Desktop for Linux distributions', diff --git a/script/package-electron-builder.ts b/script/package-electron-builder.ts index 7b26f48b2b5..6292c28b9f4 100644 --- a/script/package-electron-builder.ts +++ b/script/package-electron-builder.ts @@ -9,6 +9,17 @@ const globPromise = promisify(glob) import { getDistPath, getDistRoot } from './dist-info' +function getArchitecture() { + switch (process.arch) { + case 'arm64': + return '--arm64' + case 'arm': + return '--armv7l' + default: + return '--x64' + } +} + export async function packageElectronBuilder(): Promise> { const distPath = getDistPath() const distRoot = getDistRoot() @@ -27,7 +38,7 @@ export async function packageElectronBuilder(): Promise> { 'build', '--prepackaged', distPath, - '--x64', + getArchitecture(), '--config', configPath, ] diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 66ef2f39f37..37bd3819293 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -9,6 +9,17 @@ import { rename } from 'fs-extra' import { getVersion } from '../app/package-info' import { getDistPath, getDistRoot } from './dist-info' +function getArchitecture() { + switch (process.arch) { + case 'arm64': + return 'aarch64' + case 'arm': + return 'armv7l' + default: + return 'x86_64' + } +} + const distRoot = getDistRoot() // best guess based on documentation @@ -16,7 +27,7 @@ type RedhatOptions = { // required src: string dest: string - arch: 'x86_64' + arch: string // optional description?: string productDescription?: string @@ -36,7 +47,7 @@ type RedhatOptions = { const options: RedhatOptions = { src: getDistPath(), dest: distRoot, - arch: 'x86_64', + arch: getArchitecture(), description: 'Simple collaboration from your desktop', productDescription: 'This is the unofficial port of GitHub Desktop for Linux distributions', From f2aa406b3c4ddf88898a2253b181a15a42312a1e Mon Sep 17 00:00:00 2001 From: Sarim Khan Date: Fri, 17 Feb 2023 19:43:51 +0600 Subject: [PATCH 54/97] Fix args processing on first launch on linux (#793) --- app/src/main-process/main.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main-process/main.ts b/app/src/main-process/main.ts index 35b7f3bd1df..b484101b68c 100644 --- a/app/src/main-process/main.ts +++ b/app/src/main-process/main.ts @@ -151,6 +151,10 @@ if (__WIN32__ && process.argv.length > 1) { } } +if (__LINUX__ && process.argv.length > 1) { + handlePossibleProtocolLauncherArgs(process.argv) +} + initializeDesktopNotifications() function handleAppURL(url: string) { From f04f96b2fa1d7b665181e9a474760d1ad4d1c442 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 20 Feb 2023 15:38:16 -0400 Subject: [PATCH 55/97] refresh docs to move away from PackageCloud (#836) --- README.md | 113 ++++++++++++++++++------------------------- docs/known-issues.md | 18 +++++++ 2 files changed, 66 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index 82c5ad9d987..c2e6ccd7b68 100644 --- a/README.md +++ b/README.md @@ -23,122 +23,105 @@ uses [React](https://reactjs.org/). This repository contains specific patches on top of the upstream `desktop/desktop` repository to support Linux usage. -It also hosts preview packages for various Linux distributions: +It also publishes [releases](https://github.com/shiftkey/desktop/releases) for various Linux distributions: - AppImage (`.AppImage`) - Debian (`.deb`) - RPM (`.rpm`) -Check out the [latest releases](https://github.com/shiftkey/desktop/releases) to -help out with testing on your distribution. - -## Repositories +## Installation via package manager You can use your operating system's package manager to install `github-desktop` and -keep it up to date on Debian/RPM based distributions. There are two options for this: - -* A [PackageCloud](https://packagecloud.io/) repository with excellent global connectivity - but very limited bandwidth. This option will stop working each month when the bandwidth - limit is reached. -* A [mirror](https://mattwthomas.com/mirrors/) in the US which has effectively infinite - bandwidth and performs well in most regions (especially the Americas and Europe). +keep it up to date on Debian and RPM-based distributions. -PackageCloud, which both options depend on, is not a free service. So, if you can afford to -help with these costs please [**Sponsor**](https://github.com/sponsors/shiftkey) the project -using the link in the header. +### Debian/Ubuntu -### Debian/Ubuntu distributions +There are two APT package feeds available, both hosted in the US. You only need +to add one or the other here, as both of these are generated based on the +releases from this repository. -First install our GPG certificate: +#### [@shiftkey](https://github.com/shiftkey) package feed -```sh -$ wget -qO - https://mirror.mwt.me/ghd/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null ``` - -To setup the package repository, run one of these commands: - -```sh -# if you want to use packagecloud.io -$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' - -# if you want to use the US mirror -$ sudo sh -c 'echo "deb [arch=amd64] https://mirror.mwt.me/ghd/deb/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' +wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/shiftkey-packages.asc > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/shiftkey-packages.asc] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' ``` -Then install GitHub Desktop: +#### [@mwt](https://github.com/mwt) package feed ```sh -$ sudo apt update && sudo apt install github-desktop +wget -qO - https://mirror.mwt.me/ghd/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.asc > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.asc] https://mirror.mwt.me/ghd/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' ``` -### Red Hat/CentOS/Fedora distributions +#### Installation -First install our GPG certificate: +Once you have a feed configured, run this command to install the application: ```sh -$ sudo rpm --import https://mirror.mwt.me/ghd/gpgkey +sudo apt update && sudo apt install github-desktop ``` -To setup the package repository, run one of these commands: +### Red Hat/CentOS/Fedora/OpenSUSE -```sh -# if you want to use packagecloud.io -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' - -# if you want to use the US mirror -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' -``` +There are two RPM package feeds available, both hosted in the US. You only need +to add one or the other here, as both of these are generated based on the +releases from this repository. -Then install GitHub Desktop: +#### [@shiftkey](https://github.com/shiftkey) package feed -```sh -# if yum is your package manager -$ sudo yum install github-desktop - -# if dnf is your package manager -$ sudo dnf install github-desktop +``` +sudo rpm --import https://rpm.packages.shiftkey.dev/gpg.key +sudo sh -c 'echo -e "[shiftkey-packages]\nname=GitHub Desktop\nbaseurl=https://rpm.packages.shiftkey.dev/rpm/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://rpm.packages.shiftkey.dev/gpg.key" > /etc/yum.repos.d/shiftkey-packages.repo' ``` -### OpenSUSE distribution - - -First install our GPG certificate: +#### [@mwt](https://github.com/mwt) package feed ```sh -$ sudo rpm --import https://mirror.mwt.me/ghd/gpgkey +sudo rpm --import https://mirror.mwt.me/ghd/gpgkey +sudo sh -c 'echo -e "[mwt-packages]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/mwt-packages.repo' ``` -To setup the package repository, run one of these commands: +#### Installation -```sh -# if you want to use packagecloud.io -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' +Once you have a feed configured, run this command to install the application: -# if you want to use the US mirror -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' -``` +```sh +# if yum is your package manager +sudo yum install github-desktop -Then install GitHub Desktop: +# if dnf is your package manager +sudo dnf install github-desktop -```sh # if zypper is your package manager -$ sudo zypper ref && sudo zypper in github-desktop +sudo zypper ref && sudo zypper in github-desktop ``` ## Other Distributions -Arch Linux users can install GitHub Desktop from the -[AUR](https://aur.archlinux.org/packages/github-desktop-bin/). +### Arch Linux + +Arch Linux users can install GitHub Desktop from the [AUR](https://aur.archlinux.org/packages/github-desktop-bin/). `gnome-keyring` is required and the daemon must be launched either at login or when the X server is started. Normally this is handled by a display manager, but in other cases following the instructions found on the [Arch Wiki](https://wiki.archlinux.org/index.php/GNOME/Keyring#Using_the_keyring_outside_GNOME) will fix the issue of not being able to save login credentials. +### Cross-Distribution Packages + GitHub Desktop is also available cross-platform as a [Flatpak](https://github.com/flathub/io.github.shiftey.Desktop) and [AppImage](https://appimage.github.io/GitHubDesktop/). +### deb-get + +Debian/Ubuntu users can also install directly from this repository using [`deb-get`](https://github.com/wimpysworld/deb-get): `deb-get install github-desktop`. + ## Known issues If you're having troubles with Desktop, please refer to the [Known issues](docs/known-issues.md#linux) document for guidance and workarounds for common limitations. +If your package manager is still trying to reach PackageCloud, refer to the +[cleanup instructions](docs/known-issues.md#the-packagecloud-package-feed-is-no-longer-working) +for details about migrating away. + ## More information Please check out the [README](https://github.com/desktop/desktop#github-desktop) diff --git a/docs/known-issues.md b/docs/known-issues.md index e0cc67e722e..cbddf7f67ba 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -231,6 +231,24 @@ If you see an error that says "Not enough resources are available to process thi ## Linux +### The PackageCloud package feed is no longer working + +The PackageCloud feed has been closed down. If you are seeing errors about this you should remove the configuration for this feed and refer to the [README](https://github.com/shiftkey/desktop#repositories) +for the new settings. + +#### APT configuration + +``` +sudo rm /etc/apt/trusted.gpg.d/shiftkey-desktop.asc +sudo rm /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list +``` + +#### RPM configuration + +``` +sudo rm /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list +``` + ### I get a white screen when launching Desktop Electron enables hardware accelerated graphics by default, but some graphics cards have issues with hardware acceleration which means the application will launch successfully but it will be a white screen. If you are running GitHub Desktop within virtualization software like Parallels Desktop, hardware accelerated graphics may not be available. From 7d152f68d2645f2be76f56893cef262b4c02dafb Mon Sep 17 00:00:00 2001 From: "Matthew W. Thomas" Date: Mon, 20 Feb 2023 16:11:29 -0600 Subject: [PATCH 56/97] Update readme to use new mirror origin (#838) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c2e6ccd7b68..da50bdb43ba 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,8 @@ sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/shiftkey-packages. #### [@mwt](https://github.com/mwt) package feed ```sh -wget -qO - https://mirror.mwt.me/ghd/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.asc > /dev/null -sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.asc] https://mirror.mwt.me/ghd/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' +wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.asc > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.asc] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' ``` #### Installation @@ -78,8 +78,8 @@ sudo sh -c 'echo -e "[shiftkey-packages]\nname=GitHub Desktop\nbaseurl=https://r #### [@mwt](https://github.com/mwt) package feed ```sh -sudo rpm --import https://mirror.mwt.me/ghd/gpgkey -sudo sh -c 'echo -e "[mwt-packages]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/mwt-packages.repo' +sudo rpm --import https://mirror.mwt.me/shiftkey-desktop/gpgkey +sudo sh -c 'echo -e "[mwt-packages]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/shiftkey-desktop/rpm\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/shiftkey-desktop/gpgkey" > /etc/yum.repos.d/mwt-packages.repo' ``` #### Installation From dc95aa254c3d03b9ccb3e221350a9c3cd0026b36 Mon Sep 17 00:00:00 2001 From: Jumpei Ogawa Date: Wed, 22 Feb 2023 10:10:26 +0900 Subject: [PATCH 57/97] doc: rename GPG public key file to use .gpg extension (#839) See: https://github.com/shiftkey/desktop/issues/834#issuecomment-1439099319 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index da50bdb43ba..89d78570ff4 100644 --- a/README.md +++ b/README.md @@ -43,15 +43,15 @@ releases from this repository. #### [@shiftkey](https://github.com/shiftkey) package feed ``` -wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/shiftkey-packages.asc > /dev/null -sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/shiftkey-packages.asc] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' +wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/shiftkey-packages.gpg > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/shiftkey-packages.gpg] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' ``` #### [@mwt](https://github.com/mwt) package feed ```sh -wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.asc > /dev/null -sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.asc] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' +wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.gpg > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.gpg] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' ``` #### Installation From 6f123161ba4359c9928b85b867a82c43212b9a4e Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 26 Feb 2023 10:36:24 -0400 Subject: [PATCH 58/97] patch `electron-installer-redhat` to disable `.build-id` links in directory (#837) * add patch-package so we can patch a node_modules package * generate patch to disable build-id contents for RPM package * move patch-package command to post-install script * regenerate patch file --- package.json | 2 + patches/electron-installer-redhat+3.3.0.patch | 10 ++ script/post-install.ts | 8 ++ yarn.lock | 133 +++++++++++++++--- 4 files changed, 135 insertions(+), 18 deletions(-) create mode 100644 patches/electron-installer-redhat+3.3.0.patch diff --git a/package.json b/package.json index e148de86592..c16043792a0 100644 --- a/package.json +++ b/package.json @@ -163,6 +163,8 @@ "electron-packager": "^17.1.1", "eslint-plugin-github": "^4.10.1", "markdownlint-cli": "^0.32.2", + "patch-package": "^6.5.1", + "postinstall-postinstall": "^2.1.0", "reserved-words": "^0.1.2", "tsconfig-paths": "^3.9.0" }, diff --git a/patches/electron-installer-redhat+3.3.0.patch b/patches/electron-installer-redhat+3.3.0.patch new file mode 100644 index 00000000000..1c89e87c8fc --- /dev/null +++ b/patches/electron-installer-redhat+3.3.0.patch @@ -0,0 +1,10 @@ +diff --git a/node_modules/electron-installer-redhat/resources/spec.ejs b/node_modules/electron-installer-redhat/resources/spec.ejs +index 48f1dfd..360aec5 100644 +--- a/node_modules/electron-installer-redhat/resources/spec.ejs ++++ b/node_modules/electron-installer-redhat/resources/spec.ejs +@@ -1,4 +1,5 @@ + %define _binary_payload w<%= compressionLevel %>.xzdio ++%define _build_id_links none + + Name: <%= name %> + Version: <%= version %> diff --git a/script/post-install.ts b/script/post-install.ts index 0665cc3bac8..3f79a3d1f2d 100644 --- a/script/post-install.ts +++ b/script/post-install.ts @@ -69,4 +69,12 @@ findYarnVersion(path => { if (result.status !== 0) { process.exit(result.status || 1) } + + if (process.platform === 'linux') { + result = spawnSync('node', getYarnArgs([path, 'patch-package']), options) + + if (result.status !== 0) { + process.exit(result.status || 1) + } + } }) diff --git a/yarn.lock b/yarn.lock index 0685260c7b5..7856f2e3d60 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2079,6 +2079,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -2747,7 +2752,7 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -2928,15 +2933,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.2.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2976,6 +2973,11 @@ chromium-pickle-js@^0.2.0: resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -3227,6 +3229,17 @@ cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^7.0.1: version "7.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" @@ -4680,6 +4693,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat-cache@^3.0.4: version "3.2.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" @@ -5559,6 +5579,13 @@ is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-core-module@^2.13.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" @@ -5859,7 +5886,7 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -6670,6 +6697,13 @@ klaw-sync@^3.0.0: dependencies: graceful-fs "^4.1.11" +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -7059,6 +7093,14 @@ micromatch@^4.0.0, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" +micromatch@^4.0.2: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -7207,6 +7249,11 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -7470,6 +7517,14 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + open@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" @@ -7634,6 +7689,26 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +patch-package@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" + integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^1.10.2" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -7649,6 +7724,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -7701,7 +7781,7 @@ picomatch@^2.0.4, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== -picomatch@^2.2.3: +picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -7791,6 +7871,11 @@ postcss@^8.4.7: picocolors "^1.0.0" source-map-js "^1.0.2" +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -8274,6 +8359,13 @@ rimraf@^2.5.2: dependencies: glob "^7.0.5" +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -8414,12 +8506,12 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5": - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== +"semver@2 || 3 || 4 || 5", semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^5.7.2: +semver@^5.5.0, semver@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -9142,7 +9234,7 @@ tmp-promise@^3.0.2: dependencies: tmp "^0.2.0" -tmp@0.0.33: +tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== @@ -9999,6 +10091,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yaml@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.4.0.tgz#b729a3ef7e35bdc5ece8f28900e20a9b41510fc3" From 7414e7f70e0711e28c3e80ce6215e18105a4935f Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 26 Feb 2023 12:45:52 -0400 Subject: [PATCH 59/97] Delete FUNDING.yml --- .github/FUNDING.yml | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 6905d384f6a..00000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: shiftkey From 2113e7723289c4d2c36782351fb71acdba42b997 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 1 Mar 2023 13:31:39 -0400 Subject: [PATCH 60/97] change keyring path to more predictable directory (#843) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 89d78570ff4..d382f048941 100644 --- a/README.md +++ b/README.md @@ -43,15 +43,15 @@ releases from this repository. #### [@shiftkey](https://github.com/shiftkey) package feed ``` -wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/shiftkey-packages.gpg > /dev/null -sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/shiftkey-packages.gpg] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' +wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/shiftkey-packages.gpg > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/shiftkey-packages.gpg] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' ``` #### [@mwt](https://github.com/mwt) package feed ```sh -wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.gpg > /dev/null -sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.gpg] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' +wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/mwt-desktop.gpg > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/mwt-desktop.gpg] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' ``` #### Installation From 89a82497343a916012cd2d4d3d913ee1c80ae7eb Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 7 Apr 2023 12:05:58 -0300 Subject: [PATCH 61/97] upgrade to supported Ubuntu runner (#863) --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 27076ff7464..c4af25d754c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,17 +46,17 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-2019, ubuntu-18.04] + os: [macos-13, windows-2019, ubuntu-20.04] arch: [x64, arm64] include: - os: macos-13 friendlyName: macOS - os: windows-2019 friendlyName: Windows - - os: ubuntu-18.04 + - os: ubuntu-20.04 friendlyName: Ubuntu exclude: - - os: ubuntu-18.04 + - os: ubuntu-20.04 arch: arm64 timeout-minutes: 60 env: @@ -105,11 +105,11 @@ jobs: run: yarn test:script - name: Package application run: yarn run package - if: ${{ matrix.os == 'ubuntu-18.04' && matrix.arch == 'x64' }} + if: ${{ matrix.os == 'ubuntu-20.04' && matrix.arch == 'x64' }} - name: Create Release uses: softprops/action-gh-release@v1 if: - ${{ matrix.os == 'ubuntu-18.04' && startsWith(github.ref, + ${{ matrix.os == 'ubuntu-20.04' && startsWith(github.ref, 'refs/tags/') }} with: files: | From d00af01a52bf2179896429bf8cb103301d422320 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Apr 2023 15:24:34 +0000 Subject: [PATCH 62/97] Bump electron-installer-redhat from 3.3.0 to 3.4.0 (#848) * Bump electron-installer-redhat from 3.3.0 to 3.4.0 Dependabot couldn't find the original pull request head commit, 6b63cfc1af923f12c049530d60f311d5434c2e3f. * regenerate patch file --------- Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brendan Forster --- package.json | 2 +- ... => electron-installer-redhat+3.4.0.patch} | 6 ++-- yarn.lock | 36 ++++--------------- 3 files changed, 11 insertions(+), 33 deletions(-) rename patches/{electron-installer-redhat+3.3.0.patch => electron-installer-redhat+3.4.0.patch} (78%) diff --git a/package.json b/package.json index c16043792a0..e33b07d3db1 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,7 @@ }, "optionalDependencies": { "electron-installer-debian": "3.1.0", - "electron-installer-redhat": "3.3.0", + "electron-installer-redhat": "3.4.0", "electron-winstaller": "^5.0.0" } } diff --git a/patches/electron-installer-redhat+3.3.0.patch b/patches/electron-installer-redhat+3.4.0.patch similarity index 78% rename from patches/electron-installer-redhat+3.3.0.patch rename to patches/electron-installer-redhat+3.4.0.patch index 1c89e87c8fc..9f8d649ba51 100644 --- a/patches/electron-installer-redhat+3.3.0.patch +++ b/patches/electron-installer-redhat+3.4.0.patch @@ -1,10 +1,10 @@ diff --git a/node_modules/electron-installer-redhat/resources/spec.ejs b/node_modules/electron-installer-redhat/resources/spec.ejs -index 48f1dfd..360aec5 100644 +index e07a8a3..486f59e 100644 --- a/node_modules/electron-installer-redhat/resources/spec.ejs +++ b/node_modules/electron-installer-redhat/resources/spec.ejs @@ -1,4 +1,5 @@ %define _binary_payload w<%= compressionLevel %>.xzdio +%define _build_id_links none - Name: <%= name %> - Version: <%= version %> + %if "%{_host_cpu}" != "%{_target_cpu}" + %global __strip /bin/true diff --git a/yarn.lock b/yarn.lock index 7856f2e3d60..0c7f45aea42 100644 --- a/yarn.lock +++ b/yarn.lock @@ -969,14 +969,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@malept/cross-spawn-promise@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.0.tgz#258fde4098f5004a56db67c35f33033af64810f6" - integrity sha512-GeIK5rfU1Yd7BZJQPTGZMMmcZy5nhRToPXZcjaDwQDRSewdhp648GT2E4dh+L7+Io7AOW6WQ+GR44QSzja4qxg== - dependencies: - cross-spawn "^7.0.1" - -"@malept/cross-spawn-promise@^1.1.0": +"@malept/cross-spawn-promise@^1.0.0", "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== @@ -3695,10 +3688,10 @@ electron-installer-debian@3.1.0: word-wrap "^1.2.3" yargs "^15.0.1" -electron-installer-redhat@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.3.0.tgz#acdb59d13d738c55debc5214114d36096eda1aed" - integrity sha512-hXIXB3uQXmXZy/v3MpbwWN4Of28ALpPt9ZyUDNEoSe0w7QZceL9IqI2K6Q6imiBJCLRC0hmT94WhlKj1RyGOWg== +electron-installer-redhat@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz#4a7f8d67b48b7d5b23bd1eb074f4b684ae43b192" + integrity sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw== dependencies: "@malept/cross-spawn-promise" "^1.0.0" debug "^4.1.1" @@ -4812,17 +4805,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - -fs-extra@^9.0.1: +fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -6891,16 +6874,11 @@ lodash.upperfirst@4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -lodash@^4.17.19: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" From ff67ba9b2b0bb39f1c909eb720c2295110378f15 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 7 Apr 2023 17:09:47 -0300 Subject: [PATCH 63/97] moved OpenSUSE instructions to separate steps (#864) --- README.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d382f048941..ce8980a0c19 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Once you have a feed configured, run this command to install the application: sudo apt update && sudo apt install github-desktop ``` -### Red Hat/CentOS/Fedora/OpenSUSE +### Red Hat/CentOS/Fedora There are two RPM package feeds available, both hosted in the US. You only need to add one or the other here, as both of these are generated based on the @@ -97,6 +97,33 @@ sudo dnf install github-desktop sudo zypper ref && sudo zypper in github-desktop ``` +#### OpenSUSE + +There are two RPM package feeds available, both hosted in the US. You only need +to add one or the other here, as both of these are generated based on the +releases from this repository. + +#### [@shiftkey](https://github.com/shiftkey) package feed + +``` +sudo rpm --import https://rpm.packages.shiftkey.dev/gpg.key +sudo sh -c 'echo -e "[shiftkey-packages]\nname=GitHub Desktop\nbaseurl=https://rpm.packages.shiftkey.dev/rpm/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://rpm.packages.shiftkey.dev/gpg.key" > /etc/zypp/repos.d/shiftkey-packages.repo' +``` + +#### [@mwt](https://github.com/mwt) package feed + +```sh +sudo rpm --import https://mirror.mwt.me/shiftkey-desktop/gpgkey +sudo sh -c 'echo -e "[mwt-packages]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/shiftkey-desktop/rpm\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/shiftkey-desktop/gpgkey" > /etc/zypp/repos.d/mwt-packages.repo' +``` + +#### Installation + +```sh +sudo zypper ref && sudo zypper in github-desktop +``` + + ## Other Distributions ### Arch Linux From 7db5585ddeae40bdb5b9ab6682f48219f9b300e2 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 3 Jul 2023 12:46:46 -0300 Subject: [PATCH 64/97] reformat changed files --- app/src/lib/editors/launch.ts | 1 - app/src/lib/helpers/linux.ts | 1 - app/src/lib/shells/shared.ts | 1 - 3 files changed, 3 deletions(-) diff --git a/app/src/lib/editors/launch.ts b/app/src/lib/editors/launch.ts index ab0a1b14f5f..6a5a7afb1ff 100644 --- a/app/src/lib/editors/launch.ts +++ b/app/src/lib/editors/launch.ts @@ -10,7 +10,6 @@ import { ExternalEditorError, FoundEditor } from './shared' * @param path the location of some program on disk * * @returns `true` if the path exists on disk, or `false` otherwise - * */ function pathExists(path: string) { if (__LINUX__) { diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts index 5595d2a537e..f7c4ea64006 100644 --- a/app/src/lib/helpers/linux.ts +++ b/app/src/lib/helpers/linux.ts @@ -15,7 +15,6 @@ export function isFlatpakBuild() { * Convert an executable path to be relative to the flatpak host * * @param path a path to an executable relative to the root of the filesystem - * */ export function convertToFlatpakPath(path: string) { if (!__LINUX__) { diff --git a/app/src/lib/shells/shared.ts b/app/src/lib/shells/shared.ts index c39e8d7dfe7..f58de03507b 100644 --- a/app/src/lib/shells/shared.ts +++ b/app/src/lib/shells/shared.ts @@ -80,7 +80,6 @@ export async function findShellOrDefault(shell: Shell): Promise { * @param path the location of some program on disk * * @returns `true` if the path exists on disk, or `false` otherwise - * */ function pathExists(path: string) { if (__LINUX__) { From aaa08a994b6a5c81f55434efde97aa4c1e23e357 Mon Sep 17 00:00:00 2001 From: "Cayden R. Haun" Date: Mon, 3 Jul 2023 15:04:05 -0500 Subject: [PATCH 65/97] Add support for Flatpak installs of several editors (#887) * Update linux.ts Fix #885 for VSCode, VSCodium, and VSCode Insiders * Use full path for Flatpak binaries Adds full path, as previous method didn't function properly. --- app/src/lib/editors/linux.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index f8342446d49..071e13fbeb6 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -43,18 +43,26 @@ const editors: ILinuxExternalEditor[] = [ '/snap/bin/code', '/usr/bin/code', '/mnt/c/Program Files/Microsoft VS Code/bin/code', + '/var/lib/flatpak/app/com.visualstudio.code/current/active/export/bin/com.visualstudio.code', + '.local/share/flatpak/app/com.visualstudio.code/current/active/export/bin/com.visualstudio.code', ], }, { name: 'Visual Studio Code (Insiders)', - paths: ['/snap/bin/code-insiders', '/usr/bin/code-insiders'], + paths: [ + '/snap/bin/code-insiders', + '/usr/bin/code-insiders', + '/var/lib/flatpak/app/com.visualstudio.code.insiders/current/active/export/bin/com.visualstudio.code.insiders', + '.local/share/flatpak/app/com.visualstudio.code.insiders/current/active/export/bin/com.visualstudio.code.insiders', + ], }, { name: 'VSCodium', paths: [ '/usr/bin/codium', - '/var/lib/flatpak/app/com.vscodium.codium', + '/var/lib/flatpak/app/com.vscodium.codium/current/active/export/bin/com.vscodium.codium', '/usr/share/vscodium-bin/bin/codium', + '.local/share/flatpak/app/com.vscodium.codium/current/active/export/bin/com.vscodium.codium', ], }, { From f772584365e92b7da35bf801ed5ca5e4972cc6fd Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 3 Jul 2023 17:04:21 -0300 Subject: [PATCH 66/97] remove geany as supported editor because it doesn't work as expected (#894) --- app/src/lib/editors/linux.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index 071e13fbeb6..ba8f33a7d0a 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -148,10 +148,6 @@ const editors: ILinuxExternalEditor[] = [ name: 'Notepadqq', paths: ['/usr/bin/notepadqq'], }, - { - name: 'Geany', - paths: ['/usr/bin/geany'], - }, { name: 'Mousepad', paths: ['/usr/bin/mousepad'], From 5fb282c9f38b5376042d140c53d6c6d08a164026 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sat, 8 Jul 2023 10:35:26 -0300 Subject: [PATCH 67/97] bump dugite to v2.5.1 to get support for older glibc versions --- app/package.json | 2 +- app/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/package.json b/app/package.json index eaf5d6cca64..b5bef3005f9 100644 --- a/app/package.json +++ b/app/package.json @@ -31,7 +31,7 @@ "desktop-trampoline": "desktop/desktop-trampoline#v0.9.8", "dexie": "^3.2.2", "dompurify": "^2.3.3", - "dugite": "^2.5.0", + "dugite": "^2.5.1", "electron-window-state": "^5.0.3", "event-kit": "^2.0.0", "focus-trap-react": "^8.1.0", diff --git a/app/yarn.lock b/app/yarn.lock index d471c794a96..af790743da8 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -360,10 +360,10 @@ dompurify@^2.3.3: resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.3.tgz#c1af3eb88be47324432964d8abc75cf4b98d634c" integrity sha512-dqnqRkPMAjOZE0FogZ+ceJNM2dZ3V/yNOuFB7+39qpO93hHhfRpHw3heYQC7DPK9FqbQTfBKUJhiSfz4MvXYwg== -dugite@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/dugite/-/dugite-2.5.0.tgz#8b235564fdf8692688283c714149a59d9da79865" - integrity sha512-sYsSOqV7NidthDtMUPgKCvqMGqswKkcyAxOMhwEswlcGZ+kHadT2SEDFUJOy0AVR/yTJL6wBF7q1OiySfU0gGA== +dugite@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/dugite/-/dugite-2.5.1.tgz#6ab808ebf321809edf42d974e62eea9c9e256722" + integrity sha512-9OjUguynzq8v3GSmp01kbVcMmErc65ZZ0OssO/0PM2RyhD8Dzb8cCuy3z72+IxLwPwNi754jZ0FtMLAFA3D0qA== dependencies: progress "^2.0.3" tar "^6.1.11" From 4fae82b527d7532ab5e172b08ad69a116b18a9d1 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sat, 8 Jul 2023 11:01:23 -0300 Subject: [PATCH 68/97] restore missing electron-builder package --- package.json | 1 + yarn.lock | 1165 +++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 1099 insertions(+), 67 deletions(-) diff --git a/package.json b/package.json index e33b07d3db1..0de48579ea4 100644 --- a/package.json +++ b/package.json @@ -160,6 +160,7 @@ "@types/webpack-merge": "^5.0.0", "@types/xml2js": "^0.4.11", "electron": "26.2.4", + "electron-builder": "^24.4.0", "electron-packager": "^17.1.1", "eslint-plugin-github": "^4.10.1", "markdownlint-cli": "^0.32.2", diff --git a/yarn.lock b/yarn.lock index 0c7f45aea42..867aac55f2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"7zip-bin@~5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== + "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" @@ -515,6 +520,14 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + "@electron/asar@^3.2.1": version "3.2.4" resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.4.tgz#7e8635a3c4f6d8b3f8ae6efaf5ecb9fbf3bd9864" @@ -548,7 +561,7 @@ debug "^4.1.1" fs-extra "^9.0.1" -"@electron/osx-sign@^1.0.1": +"@electron/osx-sign@^1.0.1", "@electron/osx-sign@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.4.tgz#8e91442846471636ca0469426a82b253b9170151" integrity sha512-xfhdEcIOfAZg7scZ9RQPya1G1lWo8/zMCwUXAulq0SfY7ONIW+b9qGyKdMyuMctNYwllrIS+vmxfijSfjeh97g== @@ -560,7 +573,26 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/universal@^1.3.2": +"@electron/rebuild@^3.2.13": + version "3.2.13" + resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.2.13.tgz#98fbb98981b1a86162546a2ab91b2355569cca4c" + integrity sha512-DH9Ol4JCnHDYVOD0fKWq+Qqbn/0WU1O6QR0mIpMXEVU4YFM4PlaqNC9K36mGShNBxxGFotZCMDrB1wl/iHM12g== + dependencies: + "@malept/cross-spawn-promise" "^2.0.0" + chalk "^4.0.0" + debug "^4.1.1" + detect-libc "^2.0.1" + fs-extra "^10.0.0" + got "^11.7.0" + node-abi "^3.0.0" + node-api-version "^0.1.4" + node-gyp "^9.0.0" + ora "^5.1.0" + semver "^7.3.5" + tar "^6.0.5" + yargs "^17.0.1" + +"@electron/universal@1.3.4", "@electron/universal@^1.3.2": version "1.3.4" resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.3.4.tgz#bccd94b635d7c85eeed5eabba457eb4ed2be2777" integrity sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg== @@ -650,6 +682,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -976,6 +1020,23 @@ dependencies: cross-spawn "^7.0.1" +"@malept/cross-spawn-promise@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" + integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + "@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" @@ -997,11 +1058,23 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + "@opentelemetry/api@^1.0.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@pkgr/utils@^2.3.1": version "2.4.2" resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" @@ -1144,6 +1217,13 @@ dependencies: "@types/node" "*" +"@types/debug@^4.1.6": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" + integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== + dependencies: + "@types/ms" "*" + "@types/deep-equal@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03" @@ -1222,6 +1302,13 @@ dependencies: "@types/node" "*" +"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.1", "@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + "@types/fs-extra@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-7.0.0.tgz#9c4ad9e1339e7448a76698829def1f159c1b636c" @@ -1229,13 +1316,6 @@ dependencies: "@types/node" "*" -"@types/fs-extra@^9.0.1": - version "9.0.13" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" - integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== - dependencies: - "@types/node" "*" - "@types/fuzzaldrin-plus@^0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@types/fuzzaldrin-plus/-/fuzzaldrin-plus-0.0.1.tgz#bfe5e25bc5b4066848171baf7a8aaf30e267d30a" @@ -1393,6 +1473,11 @@ resolved "https://registry.yarnpkg.com/@types/mri/-/mri-1.1.0.tgz#66555e4d797713789ea0fefdae0898d8170bf5af" integrity sha512-fMl88ZoZXOB7VKazJ6wUMpZc9QIn+jcigSFRf2K/rrw4DcXn+/uGxlWX8DDlcE7JkwgIZ7BDH+JgxZPlc/Ap3g== +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + "@types/node-fetch@^2.5.0": version "2.6.3" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.3.tgz#175d977f5e24d93ad0f57602693c435c57ad7e80" @@ -1416,7 +1501,7 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.3.tgz#6bda7819aae6ea0b386ebc5b24bdf602f1b42b01" integrity sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q== -"@types/plist@^3.0.2": +"@types/plist@^3.0.1", "@types/plist@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== @@ -1646,6 +1731,11 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.9.tgz#fcf01997bbc9f7c09ae5f91383af076d466594e1" integrity sha512-XDwyIlt/47l2kWLTzw/mtrpLdB+GPSskR2n/PIcPn+VYhVO77rGhRncIR5GPU0KRzXuqkDO+J5qqrG0Y8P6jzQ== +"@types/verror@^1.10.3": + version "1.10.6" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.6.tgz#3e600c62d210c5826460858f84bcbb65805460bb" + integrity sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ== + "@types/webpack-bundle-analyzer@^4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.1.tgz#bcc2501be10c8cdd1d170bc6b7847b3321f20440" @@ -2082,6 +2172,11 @@ abab@^2.0.6: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -2128,13 +2223,30 @@ acorn@^8.1.0, acorn@^8.8.1, acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== -agent-base@6: +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" +agentkeepalive@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + dependencies: + debug "^4.1.0" + depd "^2.0.0" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + airbnb-browser-shims@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/airbnb-browser-shims/-/airbnb-browser-shims-3.0.0.tgz#7978e65fa106f7436a6ae2cad9ad871982e13c7d" @@ -2180,7 +2292,7 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^3.5.2: +ajv-keywords@^3.4.1, 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== @@ -2200,20 +2312,20 @@ ajv@^4.9.2: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^6.12.3: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== +ajv@^6.10.0, ajv@^6.12.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" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== +ajv@^6.12.3: + version "6.12.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" + integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -2267,6 +2379,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2299,6 +2416,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@^3.0.3, anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" @@ -2307,11 +2429,64 @@ anymatch@^3.0.3, anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.4.0.tgz#1606f94e99366eea9e7507228961b8396e40d546" + integrity sha512-EcdqtWvg1LAApKCfyRBukcVkmsa94s2e1VKHjZLpvA9/D14QEt8rHhffYeaA+cH/pVeoNVn2ob735KnfJKEEow== + dependencies: + "7zip-bin" "~5.1.1" + "@develar/schema-utils" "~2.6.5" + "@electron/notarize" "^1.2.3" + "@electron/osx-sign" "^1.0.4" + "@electron/rebuild" "^3.2.13" + "@electron/universal" "1.3.4" + "@malept/flatpak-bundler" "^0.4.0" + "@types/fs-extra" "9.0.13" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "24.4.0" + builder-util-runtime "9.2.1" + chromium-pickle-js "^0.2.0" + debug "^4.3.4" + ejs "^3.1.8" + electron-publish "24.4.0" + form-data "^4.0.0" + fs-extra "^10.1.0" + hosted-git-info "^4.1.0" + is-ci "^3.0.0" + isbinaryfile "^5.0.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^5.1.1" + read-config-file "6.3.2" + sanitize-filename "^1.6.3" + semver "^7.3.8" + tar "^6.1.12" + temp-file "^3.4.0" + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + are-docs-informative@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/are-docs-informative/-/are-docs-informative-0.0.2.tgz#387f0e93f5d45280373d387a59d34c96db321963" integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2517,6 +2692,11 @@ asar@^3.0.0: optionalDependencies: "@types/glob" "^7.1.1" +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -2527,6 +2707,21 @@ ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + asynciterator.prototype@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" @@ -2643,7 +2838,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.5.1: +base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -2676,11 +2871,32 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + bluebird@^3.0.6, bluebird@^3.1.1, bluebird@^3.5.0: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + body-parser@1.19.2: version "1.19.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" @@ -2806,6 +3022,44 @@ buffer-from@^1.1.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer@^5.1.0, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builder-util-runtime@9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz#3184dcdf7ed6c47afb8df733813224ced4f624fd" + integrity sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA== + dependencies: + debug "^4.3.4" + sax "^1.2.4" + +builder-util@24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.4.0.tgz#dbb201a118fd573180e6a1070cf4c0be6de80cd7" + integrity sha512-tONb/GIK1MKa1BcOPHE1naId3o5nj6gdka5kP7yUJh2DOfF+jMq3laiu+UOZH6A7ZtkMtnGNMYFKFTIv408n/A== + dependencies: + "7zip-bin" "~5.1.1" + "@types/debug" "^4.1.6" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.2.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + debug "^4.3.4" + fs-extra "^10.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -2823,6 +3077,24 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cacache@^17.0.0: + version "17.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" + integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -2926,7 +3198,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.2.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2954,6 +3226,11 @@ char-regex@^1.0.2: optionalDependencies: fsevents "~2.1.2" +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" @@ -2972,9 +3249,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: version "1.2.3" @@ -3004,6 +3281,31 @@ clean-css@^5.2.2: dependencies: source-map "~0.6.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -3047,6 +3349,11 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3089,6 +3396,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + colorette@^2.0.10: version "2.0.16" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" @@ -3146,6 +3458,19 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +config-file-ts@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.4.tgz#6c0741fbe118a7cf786c65f139030f0448a2cc99" + integrity sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ== + dependencies: + glob "^7.1.6" + typescript "^4.0.2" + +console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + console-polyfill@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/console-polyfill/-/console-polyfill-0.3.0.tgz#84900902a18c47a5eba932be75fa44d23e8af861" @@ -3183,6 +3508,18 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + create-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" @@ -3233,19 +3570,19 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" - integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" + integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -3334,7 +3671,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.3.1, debug@^4.3.4: +debug@4, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3434,6 +3771,13 @@ default-browser@^4.0.0: execa "^7.1.1" titleize "^3.0.0" +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + defer-to-connect@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" @@ -3513,6 +3857,16 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3528,6 +3882,11 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-libc@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -3576,6 +3935,34 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dmg-builder@24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.4.0.tgz#46c80f119465f6a7275766c72b4f3d514cc8013d" + integrity sha512-p5z9Cx539GSBYb+b09Z+hMhuBTh/BrI71VRg4rgF6f2xtIRK/YlTGVS/O08k5OojoyhZcpS7JXxDVSmQoWgiiQ== + dependencies: + app-builder-lib "24.4.0" + builder-util "24.4.0" + builder-util-runtime "9.2.1" + fs-extra "^10.1.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.11" + +dmg-license@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -3642,11 +4029,26 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + easy-stack@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.0.tgz#12c91b3085a37f0baa336e9486eac4bf94e3e788" @@ -3657,6 +4059,30 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +ejs@^3.1.8: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-builder@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.4.0.tgz#8846efa45bac8f6b9afc181abf71a4e12530f045" + integrity sha512-D5INxodxaUIJgEX6p/fqBd8wQNS8XRAToNIJ9SQC+taNS5D73ZsjLuXiRraFGCB0cVk9KeKhEkdEOH5AaVya4g== + dependencies: + app-builder-lib "24.4.0" + builder-util "24.4.0" + builder-util-runtime "9.2.1" + chalk "^4.1.2" + dmg-builder "24.4.0" + fs-extra "^10.1.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.3.2" + simple-update-notifier "^1.1.0" + yargs "^17.6.2" + electron-installer-common@^0.10.2: version "0.10.3" resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.3.tgz#40f9db644ca60eb28673d545b67ee0113aef4444" @@ -3726,6 +4152,19 @@ electron-packager@^17.1.1: semver "^7.1.3" yargs-parser "^21.1.1" +electron-publish@24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.4.0.tgz#a58f49ecd727620f65372881788ebb1a9b853284" + integrity sha512-U3mnVSxIfNrLW7ZnwiedFhcLf6ExPFXgAsx89WpfQFsV4gFAt/LG+H74p0m9NSvsLXiZuF82yXoxi7Ou8GHq4Q== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "24.4.0" + builder-util-runtime "9.2.1" + chalk "^4.1.2" + fs-extra "^10.1.0" + lazy-val "^1.0.5" + mime "^2.5.2" + electron-to-chromium@^1.4.202: version "1.4.233" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.233.tgz#aa142e45468bda111b88abc9cc59d573b75d6a60" @@ -3786,6 +4225,13 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -3821,6 +4267,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + errno@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" @@ -4468,6 +4919,11 @@ expect@^29.0.0, expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + express@^4.17.3: version "4.17.3" resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" @@ -4544,6 +5000,11 @@ extract-zip@^2.0.0, extract-zip@^2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fake-indexeddb@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/fake-indexeddb/-/fake-indexeddb-5.0.1.tgz#1111a2b6981eaaad03027d816a8536a940d36cee" @@ -4619,6 +5080,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + filename-reserved-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" @@ -4727,6 +5195,14 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -4815,6 +5291,20 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" + integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== + dependencies: + minipass "^5.0.0" + fs-monkey@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" @@ -4893,6 +5383,20 @@ gar@^1.0.4: resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w== +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -4999,6 +5503,17 @@ 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@^10.2.2: + version "10.3.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.2.tgz#04fe71118ec6d2f4cb761849acbacec14b06cb1e" + integrity sha512-vsuLzB3c/uyDLLEdBZtT8vGnN0z57rwOxHV2oYZib/7HWmBspUaja/McYIobBjC4qaUTuNpUyFO2IdqM4DZIJA== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -5103,7 +5618,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -got@^11.8.5: +got@^11.7.0, got@^11.8.5: version "11.8.6" resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== @@ -5125,6 +5640,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -5208,6 +5728,11 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -5270,6 +5795,13 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +hosted-git-info@^4.1.0: + 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" + html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -5321,7 +5853,7 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" -http-cache-semantics@^4.0.0: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -5354,7 +5886,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^5.0.1: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5372,6 +5904,21 @@ human-signals@^4.3.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5379,7 +5926,7 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.6.3: +iconv-lite@0.6.3, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -5391,6 +5938,11 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.0.5, ignore@^5.2.0, ignore@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" @@ -5427,6 +5979,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -5435,7 +5992,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5468,6 +6025,11 @@ interpret@^1.0.1: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" integrity sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA= +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -5569,6 +6131,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + is-core-module@^2.13.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" @@ -5701,6 +6270,16 @@ is-inside-container@^1.0.0: dependencies: is-docker "^3.0.0" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + is-map@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" @@ -5839,6 +6418,11 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: dependencies: which-typed-array "^1.1.11" +is-unicode-supported@^0.1.0: + version "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-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" @@ -5891,6 +6475,11 @@ isbinaryfile@^4.0.8: resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== +isbinaryfile@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.0.tgz#034b7e54989dab8986598cbcea41f66663c65234" + integrity sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -5977,6 +6566,25 @@ iterator.prototype@^1.1.2: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" +jackspeak@^2.0.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" + integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + jest-changed-files@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" @@ -6568,7 +7176,7 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" -json5@^2.2.3: +json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -6716,6 +7324,11 @@ lazy-cache@^2.0.2: dependencies: set-getter "^0.1.0" +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + legal-eagle@0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/legal-eagle/-/legal-eagle-0.16.0.tgz#bd3d136dd1b761a540bad898ace68f4009412575" @@ -6879,6 +7492,14 @@ lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -6920,6 +7541,16 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" + integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== + make-dir@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" @@ -6937,6 +7568,27 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" integrity sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y= +make-fetch-happen@^11.0.3: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -7096,6 +7748,11 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -7137,6 +7794,20 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^5.1.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" @@ -7154,6 +7825,70 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" + integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== + dependencies: + minipass "^5.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.1.tgz#dff63464407cd8b83d7f008c0f116fa8c9b77ebf" + integrity sha512-NQ8MCKimInjVlaIqx51RKJJB7mINVkLTJbsZKmto4UAAOC/CWXES8PGaOgoBZyqoUsUA/U3DToGK7GJkkHbjJw== + +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mixin-deep@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.2.0.tgz#d02b8c6f8b6d4b8f5982d3fd009c4919851c3fe2" @@ -7169,6 +7904,11 @@ mkdirp@^0.5.1: dependencies: minimist "0.0.8" +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mrmime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" @@ -7184,7 +7924,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -7217,7 +7957,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.3: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -7240,6 +7980,25 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-abi@^3.0.0: + version "3.45.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.45.0.tgz#f568f163a3bfca5aacfce1fbeee1fa2cc98441f5" + integrity sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ== + dependencies: + semver "^7.3.5" + +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-api-version@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.1.4.tgz#1ed46a485e462d55d66b5aa1fe2821720dedf080" + integrity sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g== + dependencies: + semver "^7.3.5" + node-fetch@^2.6.7, node-fetch@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" @@ -7247,6 +8006,23 @@ node-fetch@^2.6.7, node-fetch@^2.6.9: dependencies: whatwg-url "^5.0.0" +node-gyp@^9.0.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" + integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^11.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -7271,6 +8047,13 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + normalize-package-data@^2.0.0, normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -7305,6 +8088,16 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + nth-check@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" @@ -7481,7 +8274,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.2: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -7530,6 +8323,21 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" +ora@^5.1.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -7580,6 +8388,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-try@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" @@ -7722,6 +8537,14 @@ path-parse@^1.0.5, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -7921,6 +8744,14 @@ progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + promise.prototype.finally@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" @@ -8069,6 +8900,18 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +read-config-file@6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.3.2.tgz#556891aa6ffabced916ed57457cb192e61880411" + integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== + dependencies: + config-file-ts "^0.2.4" + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + read-installed@4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" @@ -8121,6 +8964,15 @@ readable-stream@^3.0.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" @@ -8315,11 +9167,24 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -8430,6 +9295,13 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + sass-loader@^10.0.3: version "10.0.3" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.0.3.tgz#9e2f1bfdd6355f2adde4e4835d838b020bf800b0" @@ -8448,7 +9320,7 @@ sass@^1.27.0: dependencies: chokidar ">=2.0.0 <4.0.0" -sax@>=0.6.0: +sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -8523,13 +9395,18 @@ semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: +semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" @@ -8669,11 +9546,23 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + +simple-update-notifier@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" + integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== + dependencies: + semver "~7.0.0" + sirv@^1.0.7: version "1.0.19" resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" @@ -8703,11 +9592,25 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slide@~1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= +smart-buffer@^4.0.2, smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + smoothscroll-polyfill@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/smoothscroll-polyfill/-/smoothscroll-polyfill-0.3.6.tgz#492be845195157cdc2fc529a95d89e7a71509172" @@ -8743,6 +9646,23 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^2.0.0" +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -8767,7 +9687,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.6, source-map-support@~0.5.20: +source-map-support@^0.5.19, source-map-support@^0.5.6, 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== @@ -8849,6 +9769,13 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +ssri@^10.0.0: + version "10.0.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" + integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== + dependencies: + minipass "^5.0.0" + stack-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" @@ -8861,6 +9788,11 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -8882,6 +9814,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", 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.1" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" @@ -8891,14 +9832,14 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -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== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" string.prototype.matchall@^3.0.0: version "3.0.0" @@ -9012,6 +9953,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", 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.1" + strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -9026,12 +9974,12 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.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== +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - ansi-regex "^5.0.1" + ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -9145,6 +10093,26 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + temp@^0.9.0: version "0.9.1" resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.1.tgz#2d666114fafa26966cd4065996d7ceedd4dd4697" @@ -9335,6 +10303,13 @@ trim-repeated@^1.0.0: dependencies: escape-string-regexp "^1.0.2" +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== + dependencies: + utf8-byte-length "^1.0.1" + ts-api-utils@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" @@ -9509,6 +10484,11 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +typescript@^4.0.2: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + typescript@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" @@ -9554,6 +10534,20 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -9637,6 +10631,11 @@ use@^2.0.0: isobject "^3.0.0" lazy-cache "^2.0.2" +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -9684,6 +10683,15 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + vscode-json-languageservice@^3.7.0: version "3.8.0" resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.8.0.tgz#c7e7283f993e3db39fa5501407b023ada6fd3ae3" @@ -9737,6 +10745,13 @@ watchpack@^2.4.0: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -9939,6 +10954,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + wildcard@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" @@ -9962,6 +10984,15 @@ worker-farm@^1.3.1: errno "^0.1.4" xtend "^4.0.1" +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -9971,14 +11002,14 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" @@ -10129,7 +11160,7 @@ yargs@^16.0.2: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.3.1: +yargs@^17.0.1, yargs@^17.3.1, yargs@^17.6.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From 6b37bfe07daacd96ca035b8768f84b700e86cfd5 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 9 Jul 2023 18:54:14 -0300 Subject: [PATCH 69/97] switch Linux build over to use configured docker image (#898) Co-authored-by: theofficialgman <28281419+theofficialgman@users.noreply.github.com> --- .github/workflows/ci.yml | 92 ++++++++++++++++++++++++++---- script/build.ts | 23 ++++---- script/dist-info.ts | 15 ++--- script/electron-builder-linux.yml | 2 +- script/package-debian.ts | 5 +- script/package-electron-builder.ts | 3 +- script/package-redhat.ts | 5 +- 7 files changed, 104 insertions(+), 41 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c4af25d754c..2abad64c84e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,6 +41,7 @@ jobs: build: name: ${{ matrix.friendlyName }} ${{ matrix.arch }} runs-on: ${{ matrix.os }} + container: ${{ matrix.image }} permissions: contents: write strategy: @@ -55,14 +56,61 @@ jobs: friendlyName: Windows - os: ubuntu-20.04 friendlyName: Ubuntu + image: ubuntu:18.04 + arch: x64 + environment: + AS: as + STRIP: strip + AR: ar + CC: gcc + CPP: cpp + CXX: g++ + LD: ld + FC: gfortran + PKG_CONFIG_PATH: /usr/lib/x86_64-linux-gnu/pkgconfig exclude: - os: ubuntu-20.04 arch: arm64 timeout-minutes: 60 env: RELEASE_CHANNEL: ${{ inputs.environment }} + AS: ${{ matrix.environment.AS }} + STRIP: ${{ matrix.environment.STRIP }} + AR: ${{ matrix.environment.AR }} + CC: ${{ matrix.environment.CC }} + CPP: ${{ matrix.environment.CPP }} + CXX: ${{ matrix.environment.CXX }} + LD: ${{ matrix.environment.LD }} + FC: ${{ matrix.environment.FC }} + PKG_CONFIG_PATH: ${{ matrix.environment.PKG_CONFIG_PATH }} + npm_config_arch: ${{ matrix.arch }} steps: - - uses: actions/checkout@v4 + - name: Install dependencies into dockerfile on Ubuntu + if: matrix.friendlyName == 'Ubuntu' + run: | + # ubuntu dockerfile is very minimal (only 122 packages are installed) + # add dependencies expected by scripts + apt update + apt install -y software-properties-common lsb-release \ + sudo wget curl build-essential jq autoconf automake \ + pkg-config ca-certificates rpm + # install new enough git to run actions/checkout + sudo add-apt-repository ppa:git-core/ppa -y + sudo apt update + sudo apt install -y git + # avoid "fatal: detected dubious ownership in repository at '/__w/shiftkey/desktop'" error + git config --global --add safe.directory '*' + - name: Add additional dependencies for Ubuntu x64 + if: ${{ matrix.friendlyName == 'Ubuntu' && matrix.arch == 'x64' }} + run: | + # add electron unit test dependencies + sudo apt install -y libasound2 libatk-bridge2.0-0 libatk1.0-0 \ + libatspi2.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libdrm2 \ + libexpat1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 \ + libnss3 libpango-1.0-0 libx11-6 libxcb1 libxcomposite1 \ + libxdamage1 libxext6 libxfixes3 libxkbcommon0 libxrandr2 \ + libsecret-1-0 + - uses: actions/checkout@v3 with: repository: ${{ inputs.repository || github.repository }} ref: ${{ inputs.ref }} @@ -71,27 +119,37 @@ jobs: with: python-version: '3.11' - name: Use Node.js ${{ env.NODE_VERSION }} + if: matrix.friendlyName != 'Ubuntu' uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: yarn - + - name: Install unofficial-builds Node.js ${{ matrix.node }} on Ubuntu + if: matrix.friendlyName == 'Ubuntu' + run: | + # This version supports older GLIBC (official builds required a minimum of GLIBC 2.28) + # this might break if you bump the `matrix.node` version - ensure you are on the latest version + # of which ever major/minor release which should have this variant available + # + # See https://github.com/nodejs/unofficial-builds/ for more information on these versions. + # + curl -sL 'https://unofficial-builds.nodejs.org/download/release/v${{ matrix.node }}/node-v${{ matrix.node }}-linux-x64-glibc-217.tar.xz' | xzcat | sudo tar -vx --strip-components=1 -C /usr/local/ + sudo npm install --global yarn # This step can be removed as soon as official Windows arm64 builds are published: # https://github.com/nodejs/build/issues/2450#issuecomment-705853342 + # + # This version is pinned to 18.16.0 as the later version does not have the required + # `win-arm64/node.lib` output that we can consume in this CI build. - name: Get NodeJS node-gyp lib for Windows arm64 if: ${{ matrix.os == 'windows-2019' && matrix.arch == 'arm64' }} - run: .\script\download-nodejs-win-arm64.ps1 ${{ env.NODE_VERSION }} - + run: .\script\download-nodejs-win-arm64.ps1 18.16.0 + - name: Get app version + id: version + run: echo version=$(jq -r ".version" app/package.json) >> $GITHUB_OUTPUT - name: Install and build dependencies run: yarn - env: - npm_config_arch: ${{ matrix.arch }} - TARGET_ARCH: ${{ matrix.arch }} - name: Build production app run: yarn build:prod - env: - npm_config_arch: ${{ matrix.arch }} - TARGET_ARCH: ${{ matrix.arch }} - name: Prepare testing environment if: matrix.arch == 'x64' run: yarn test:setup @@ -105,11 +163,11 @@ jobs: run: yarn test:script - name: Package application run: yarn run package - if: ${{ matrix.os == 'ubuntu-20.04' && matrix.arch == 'x64' }} + if: ${{ matrix.friendlyName == 'Ubuntu' }} - name: Create Release uses: softprops/action-gh-release@v1 if: - ${{ matrix.os == 'ubuntu-20.04' && startsWith(github.ref, + ${{ matrix.friendlyName == 'Ubuntu' && startsWith(github.ref, 'refs/tags/') }} with: files: | @@ -120,3 +178,13 @@ jobs: draft: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Upload output artifacts + uses: actions/upload-artifact@v3 + if: matrix.friendlyName == 'Ubuntu' + with: + name: ${{ matrix.friendlyName }}-${{ matrix.arch }}-artifacts + path: | + dist/*.AppImage + dist/*.deb + dist/*.rpm + retention-days: 5 diff --git a/script/build.ts b/script/build.ts index de2e6818688..7fbc21fe751 100755 --- a/script/build.ts +++ b/script/build.ts @@ -3,8 +3,7 @@ import * as path from 'path' import * as cp from 'child_process' -import * as os from 'os' -import packager, { OfficialArch, OsxNotarizeOptions } from 'electron-packager' +import packager, { OsxNotarizeOptions } from 'electron-packager' import frontMatter from 'front-matter' import { externals } from '../app/webpack.common' @@ -131,21 +130,19 @@ function packageApp() { ) } - const toPackageArch = (targetArch: string | undefined): OfficialArch => { - if (targetArch === undefined) { - targetArch = os.arch() + const getPackageArch = (): 'arm64' | 'x64' | 'armv7l' => { + const arch = process.env.npm_config_arch || process.arch + + if (arch === 'arm64' || arch === 'x64') { + return arch } - if ( - targetArch === 'arm64' || - targetArch === 'x64' || - targetArch === 'armv7l' - ) { - return targetArch + if (arch === 'arm') { + return 'armv7l' } throw new Error( - `Building Desktop for architecture '${targetArch}' is not supported` + `Building Desktop for architecture '${arch}' is not supported. Currently these architectures are supported: arm, arm64, x64` ) } @@ -174,7 +171,7 @@ function packageApp() { return packager({ name: getExecutableName(), platform: toPackagePlatform(process.platform), - arch: toPackageArch(process.env.TARGET_ARCH), + arch: getPackageArch(), asar: false, // TODO: Probably wanna enable this down the road. out: getDistRoot(), icon, diff --git a/script/dist-info.ts b/script/dist-info.ts index 420444f7448..459f01db905 100644 --- a/script/dist-info.ts +++ b/script/dist-info.ts @@ -114,18 +114,13 @@ export const getChannel = () => export function getDistArchitecture(): 'arm64' | 'x64' | 'armv7l' { // If a specific npm_config_arch is set, we use that one instead of the OS arch (to support cross compilation) - if ( - process.env.npm_config_arch === 'arm64' || - process.env.npm_config_arch === 'x64' || - process.env.npm_config_arch === 'armv7l' - ) { - return process.env.npm_config_arch - } + const arch = process.env.npm_config_arch || process.arch - if (process.arch === 'arm64') { - return 'arm64' + if (arch === 'arm64' || arch === 'x64' || arch === 'armv7l') { + return arch } - if (process.arch === 'arm') { + + if (arch === 'arm') { return 'armv7l' } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index bcaae41ee82..c40d57c7e98 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -1,4 +1,4 @@ -artifactName: 'GitHubDesktop-${os}-${version}.${ext}' +artifactName: 'GitHubDesktop-${os}-${arch}-${version}.${ext}' linux: category: 'GNOME;GTK;Development' packageCategory: 'GNOME;GTK;Development' diff --git a/script/package-debian.ts b/script/package-debian.ts index 9a918473070..b184481843d 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -10,7 +10,8 @@ import { getVersion } from '../app/package-info' import { getDistPath, getDistRoot } from './dist-info' function getArchitecture() { - switch (process.arch) { + const arch = process.env.npm_config_arch || process.arch + switch (arch) { case 'arm64': return 'arm64' case 'arm': @@ -107,7 +108,7 @@ export async function packageDebian(): Promise { const oldPath = files[0] - const newFileName = `GitHubDesktop-linux-${getVersion()}.deb` + const newFileName = `GitHubDesktop-linux-${getArchitecture()}-${getVersion()}.deb` const newPath = join(distRoot, newFileName) await rename(oldPath, newPath) diff --git a/script/package-electron-builder.ts b/script/package-electron-builder.ts index 6292c28b9f4..2f56e73fba5 100644 --- a/script/package-electron-builder.ts +++ b/script/package-electron-builder.ts @@ -10,7 +10,8 @@ const globPromise = promisify(glob) import { getDistPath, getDistRoot } from './dist-info' function getArchitecture() { - switch (process.arch) { + const arch = process.env.npm_config_arch || process.arch + switch (arch) { case 'arm64': return '--arm64' case 'arm': diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 37bd3819293..61fe4a1162e 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -10,7 +10,8 @@ import { getVersion } from '../app/package-info' import { getDistPath, getDistRoot } from './dist-info' function getArchitecture() { - switch (process.arch) { + const arch = process.env.npm_config_arch || process.arch + switch (arch) { case 'arm64': return 'aarch64' case 'arm': @@ -103,7 +104,7 @@ export async function packageRedhat(): Promise { const oldPath = files[0] - const newFileName = `GitHubDesktop-linux-${getVersion()}.rpm` + const newFileName = `GitHubDesktop-linux-${getArchitecture()}-${getVersion()}.rpm` const newPath = join(distRoot, newFileName) await rename(oldPath, newPath) From e3a588c578d5a5a1c4f66a83cf4fc9e230f4d11d Mon Sep 17 00:00:00 2001 From: theofficialgman <28281419+theofficialgman@users.noreply.github.com> Date: Sun, 9 Jul 2023 19:09:35 -0400 Subject: [PATCH 70/97] enable workflow for ARM32/ARM64 on Ubuntu (#897) --- .github/workflows/ci.yml | 43 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2abad64c84e..6d95f717962 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,9 +68,36 @@ jobs: LD: ld FC: gfortran PKG_CONFIG_PATH: /usr/lib/x86_64-linux-gnu/pkgconfig - exclude: - os: ubuntu-20.04 + friendlyName: Ubuntu + image: ubuntu:18.04 arch: arm64 + environment: + AS: aarch64-linux-gnu-as + STRIP: aarch64-linux-gnu-strip + AR: aarch64-linux-gnu-ar + CC: aarch64-linux-gnu-gcc + CPP: aarch64-linux-gnu-cpp + CXX: aarch64-linux-gnu-g++ + LD: aarch64-linux-gnu-ld + FC: aarch64-linux-gnu-gfortran + PKG_CONFIG_PATH: /usr/lib/aarch64-linux-gnu/pkgconfig + - os: ubuntu-20.04 + friendlyName: Ubuntu + image: ubuntu:18.04 + arch: arm + node: 18.16.1 + environment: + AS: arm-linux-gnueabihf-as + STRIP: arm-linux-gnueabihf-strip + AR: arm-linux-gnueabihf-ar + CC: arm-linux-gnueabihf-gcc + CPP: arm-linux-gnueabihf-cpp + CXX: arm-linux-gnueabihf-g++ + LD: arm-linux-gnueabihf-ld + FC: arm-linux-gnueabihf-gfortran + PKG_CONFIG_PATH: /usr/lib/arm-linux-gnueabihf/pkgconfig + timeout-minutes: 60 env: RELEASE_CHANNEL: ${{ inputs.environment }} @@ -110,6 +137,20 @@ jobs: libnss3 libpango-1.0-0 libx11-6 libxcb1 libxcomposite1 \ libxdamage1 libxext6 libxfixes3 libxkbcommon0 libxrandr2 \ libsecret-1-0 + - name: Add additional dependencies for Ubuntu arm64 + if: ${{ matrix.friendlyName == 'Ubuntu' && matrix.arch == 'arm64' }} + run: | + sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu + - name: Add additional dependencies for Ubuntu arm + if: ${{ matrix.friendlyName == 'Ubuntu' && matrix.arch == 'arm' }} + run: | + sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf binutils-arm-linux-gnueabihf pkg-config-arm-linux-gnueabihf + sudo sed -i "s/^deb/deb [arch=amd64,i386]/g" /etc/apt/sources.list + echo "deb [arch=arm64,armhf] http://ports.ubuntu.com/ $(lsb_release -s -c) main universe multiverse restricted" | sudo tee -a /etc/apt/sources.list + echo "deb [arch=arm64,armhf] http://ports.ubuntu.com/ $(lsb_release -s -c)-updates main universe multiverse restricted" | sudo tee -a /etc/apt/sources.list + sudo dpkg --add-architecture armhf + sudo apt-get update + sudo apt-get install -y libx11-dev:armhf libx11-xcb-dev:armhf libxkbfile-dev:armhf libsecret-1-dev:armhf - uses: actions/checkout@v3 with: repository: ${{ inputs.repository || github.repository }} From e11edac4ce83cf0db64f7a532c00bd5dcf47146a Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 10 Jul 2023 08:50:35 -0300 Subject: [PATCH 71/97] introduce separate publish step which runs after build (#899) --- .github/workflows/ci.yml | 73 ++++++++++++---- .gitignore | 1 + script/generate-release-notes.ts | 140 +++++++++++++++++++++++++++++++ script/package.ts | 3 + 4 files changed, 203 insertions(+), 14 deletions(-) create mode 100644 script/generate-release-notes.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6d95f717962..0a9e715c0c5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,7 @@ on: - 'linux-release-*' tags: - 'release-*.*.*-linux*' + - 'release-*.*.*-test*' pull_request: branches: - linux @@ -205,20 +206,6 @@ jobs: - name: Package application run: yarn run package if: ${{ matrix.friendlyName == 'Ubuntu' }} - - name: Create Release - uses: softprops/action-gh-release@v1 - if: - ${{ matrix.friendlyName == 'Ubuntu' && startsWith(github.ref, - 'refs/tags/') }} - with: - files: | - dist/*.AppImage - dist/*.deb - dist/*.rpm - dist/*.txt - draft: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload output artifacts uses: actions/upload-artifact@v3 if: matrix.friendlyName == 'Ubuntu' @@ -228,4 +215,62 @@ jobs: dist/*.AppImage dist/*.deb dist/*.rpm + dist/*.sha256 retention-days: 5 + + publish: + name: Create GitHub release + needs: [build, lint] + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/') + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + + - name: Download all artifacts + uses: actions/download-artifact@v2 + with: + path: './artifacts' + + - name: Display structure of downloaded files + run: ls -R + working-directory: './artifacts' + + - name: Get tag name without prefix + run: | + RELEASE_TAG=${GITHUB_REF/refs\/tags\//} + echo "RELEASE_TAG=${RELEASE_TAG}" >> $GITHUB_ENV + tagNameWithoutPrefix="${RELEASE_TAG:1}" + echo "RELEASE_TAG_WITHOUT_PREFIX=${tagNameWithoutPrefix}" >> $GITHUB_ENV + + # TODO: generate release notes + # - pull in default if version matches X.Y.Z-linux1 + # - otherwise stub template + + - name: Generate release notes + run: | + yarn + node -r ts-node/register script/generate-release-notes.ts "${{ github.workspace }}/artifacts" "${{ env.RELEASE_TAG_WITHOUT_PREFIX }}" + RELEASE_NOTES_FILE=script/release_notes.txt + if [[ ! -f "$RELEASE_NOTES_FILE" ]]; then + echo "$RELEASE_NOTES_FILE does not exist. Something might have gone wrong while generating the release notes." + exit 1 + fi + echo "Release notes:" + echo "---" + cat ${RELEASE_NOTES_FILE} + echo "---" + + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + name: GitHub Desktop for Linux ${{ env.RELEASE_TAG_WITHOUT_PREFIX }} + body_path: script/release_notes.txt + files: | + artifacts/*.AppImage + artifacts/*.deb + artifacts/*.rpm + draft: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 30a0037ef0b..4b8a3b69fe7 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ app/node_modules/ junit*.xml *.swp tslint-rules/ +script/release_notes.txt diff --git a/script/generate-release-notes.ts b/script/generate-release-notes.ts new file mode 100644 index 00000000000..b52d4f622a4 --- /dev/null +++ b/script/generate-release-notes.ts @@ -0,0 +1,140 @@ +/* eslint-disable no-sync */ + +const glob = require('glob') +const { basename } = require('path') +const fs = require('fs') + +type ChecksumEntry = { filename: string; checksum: string } + +type ChecksumGroups = Record<'x64' | 'arm' | 'arm64', Array> + +// 3 architectures * 3 package formats * 2 files (package + checksum file) +const SUCCESSFUL_RELEASE_FILE_COUNT = 3 * 3 * 2 + +const Glob = glob.GlobSync + +const args = process.argv.slice(2) +const artifactsDir = args[0] + +if (!artifactsDir) { + console.error( + `🔴 First parameter with artifacts directory not found. Aborting...` + ) + process.exit(1) +} + +const releaseTagWithoutPrefix = args[1] +if (!releaseTagWithoutPrefix) { + console.error(`🔴 Second parameter with release tag not found. Aborting...`) + process.exit(1) +} + +console.log( + `Preparing release notes for release tag ${releaseTagWithoutPrefix}` +) + +const files = new Glob(artifactsDir + '/**/*', { nodir: true }) + +let countFiles = 0 +const shaEntries = new Array() + +for (const file of files.found) { + if (file.endsWith('.sha256')) { + shaEntries.push(getShaContents(file)) + } + + countFiles++ +} + +if (SUCCESSFUL_RELEASE_FILE_COUNT !== countFiles) { + console.error( + `🔴 Artifacts folder has ${countFiles} assets, expecting ${SUCCESSFUL_RELEASE_FILE_COUNT}. Please check the GH Actions artifacts to see which are missing.` + ) + process.exit(1) +} + +const shaEntriesByArchitecture: ChecksumGroups = { + x64: shaEntries.filter( + e => + e.filename.includes('-linux-x86_64-') || + e.filename.includes('-linux-amd64-') + ), + arm: shaEntries.filter( + e => + e.filename.includes('-linux-armv7l-') || + e.filename.includes('-linux-armhf-') + ), + arm64: shaEntries.filter( + e => + e.filename.includes('-linux-aarch64-') || + e.filename.includes('-linux-arm64-') + ), +} + +console.log(`Found ${countFiles} files in artifacts directory`) +console.log(shaEntriesByArchitecture) + +const draftReleaseNotes = generateDraftReleaseNotes( + [], + shaEntriesByArchitecture +) +const releaseNotesPath = __dirname + '/release_notes.txt' + +fs.writeFileSync(releaseNotesPath, draftReleaseNotes, { encoding: 'utf8' }) + +console.log( + `✅ All done! The release notes have been written to ${releaseNotesPath}` +) + +/** + * Returns the filename (excluding .sha256) and its contents (a SHA256 checksum). + */ +function getShaContents(filePath: string): { + filename: string + checksum: string +} { + const filename = basename(filePath).slice(0, -7) + const checksum = fs.readFileSync(filePath, 'utf8') + + return { filename, checksum } +} + +function formatEntry(e: ChecksumEntry): string { + return `**${e.filename}**\n${e.checksum}\n` +} + +/** + * Takes the release notes entries and the SHA entries, then merges them into the full draft release notes ✨ + */ +function generateDraftReleaseNotes( + releaseNotesEntries: Array, + shaEntries: ChecksumGroups +): string { + const changelogText = releaseNotesEntries.join('\n') + + const x64Section = shaEntries.x64.map(formatEntry).join('\n') + const armSection = shaEntries.arm.map(formatEntry).join('\n') + const arm64Section = shaEntries.arm64.map(formatEntry).join('\n') + + const draftReleaseNotes = `${changelogText} + +## Fixes and improvements + +TODO + +## SHA-256 checksums + +### x64 + +${x64Section} + +### ARM64 + +${arm64Section} + +### ARM + +${armSection}` + + return draftReleaseNotes +} diff --git a/script/package.ts b/script/package.ts index 26a54dd8484..5ac81ba677f 100644 --- a/script/package.ts +++ b/script/package.ts @@ -204,6 +204,9 @@ async function generateChecksums(files: Array) { for (const [fullPath, checksum] of checksums) { const fileName = path.basename(fullPath) checksumsText += `${checksum} - ${fileName}\n` + + const checksumFilePath = `${fullPath}.sha256` + await writeFile(checksumFilePath, checksum) } const checksumFile = path.join(distRoot, 'checksums.txt') From b3eb4768ace1b9e68adff76399ae4343f260074a Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 10 Jul 2023 11:05:10 -0300 Subject: [PATCH 72/97] add support for generating release notes from upstream release (#900) --- script/generate-release-notes.ts | 209 +++++++++++++++++++++++++++---- 1 file changed, 184 insertions(+), 25 deletions(-) diff --git a/script/generate-release-notes.ts b/script/generate-release-notes.ts index b52d4f622a4..a299e3f860a 100644 --- a/script/generate-release-notes.ts +++ b/script/generate-release-notes.ts @@ -1,13 +1,23 @@ /* eslint-disable no-sync */ const glob = require('glob') -const { basename } = require('path') +const { basename, dirname, join } = require('path') const fs = require('fs') type ChecksumEntry = { filename: string; checksum: string } type ChecksumGroups = Record<'x64' | 'arm' | 'arm64', Array> +type ReleaseNotesGroupType = 'new' | 'added' | 'fixed' | 'improved' | 'removed' + +type ReleaseNotesGroups = Record> + +type ReleaseNoteEntry = { + text: string + ids: Array + contributor?: string +} + // 3 architectures * 3 package formats * 2 files (package + checksum file) const SUCCESSFUL_RELEASE_FILE_COUNT = 3 * 3 * 2 @@ -74,11 +84,13 @@ const shaEntriesByArchitecture: ChecksumGroups = { console.log(`Found ${countFiles} files in artifacts directory`) console.log(shaEntriesByArchitecture) +const releaseNotesByGroup = getReleaseGroups(releaseTagWithoutPrefix) + const draftReleaseNotes = generateDraftReleaseNotes( - [], + releaseNotesByGroup, shaEntriesByArchitecture ) -const releaseNotesPath = __dirname + '/release_notes.txt' +const releaseNotesPath = join(__dirname, 'release_notes.txt') fs.writeFileSync(releaseNotesPath, draftReleaseNotes, { encoding: 'utf8' }) @@ -99,42 +111,189 @@ function getShaContents(filePath: string): { return { filename, checksum } } -function formatEntry(e: ChecksumEntry): string { - return `**${e.filename}**\n${e.checksum}\n` +function extractIds(str: string): Array { + const idRegex = /#(\d+)/g + + const idArray = new Array() + let match + + while ((match = idRegex.exec(str))) { + const textValue = match[1].trim() + const numValue = parseInt(textValue, 10) + if (!isNaN(numValue)) { + idArray.push(numValue) + } + } + + return idArray } -/** - * Takes the release notes entries and the SHA entries, then merges them into the full draft release notes ✨ - */ -function generateDraftReleaseNotes( - releaseNotesEntries: Array, - shaEntries: ChecksumGroups +function parseCategory(str: string): ReleaseNotesGroupType | null { + const input = str.toLocaleLowerCase() + switch (input) { + case 'added': + case 'fixed': + case 'improved': + case 'new': + case 'removed': + return input + default: + return null + } +} + +function getReleaseGroups(version: string): ReleaseNotesGroups { + if (!version.endsWith('-linux1')) { + return { + new: [], + added: [], + fixed: [], + improved: [], + removed: [], + } + } + + const upstreamVersion = version.replace('-linux1', '') + const rootDir = dirname(__dirname) + const changelogFile = fs.readFileSync(join(rootDir, 'changelog.json')) + const changelogJson = JSON.parse(changelogFile) + const releases = changelogJson['releases'] + const changelogForVersion: Array | undefined = + releases[upstreamVersion] + + if (!changelogForVersion) { + console.error( + `🔴 Changelog version ${upstreamVersion} not found in changelog.json, which is required for publishing a release based off an upstream releease. Aborting...` + ) + process.exit(1) + } + + console.log(`found release notes`, changelogForVersion) + + const releaseNotesByGroup: ReleaseNotesGroups = { + new: [], + added: [], + fixed: [], + improved: [], + removed: [], + } + + const releaseEntryExternalContributor = /\[(.*)\](.*)- (.*)\. Thanks (.*)!/ + const releaseEntryRegex = /\[(.*)\](.*)- (.*)/ + + for (const entry of changelogForVersion) { + const externalMatch = releaseEntryExternalContributor.exec(entry) + if (externalMatch) { + const category = parseCategory(externalMatch[1]) + const text = externalMatch[2].trim() + const ids = extractIds(externalMatch[3]) + const contributor = externalMatch[4] + + if (!category) { + console.warn(`unable to identify category for '${entry}'`) + } else { + releaseNotesByGroup[category].push({ + text, + ids, + contributor, + }) + } + } else { + const match = releaseEntryRegex.exec(entry) + if (match) { + const category = parseCategory(match[1]) + const text = match[2].trim() + const ids = extractIds(match[3]) + if (!category) { + console.warn(`unable to identify category for '${entry}'`) + } else { + releaseNotesByGroup[category].push({ + text, + ids, + }) + } + } else { + console.warn(`release entry does not match any format: '${entry}'`) + } + } + } + + return releaseNotesByGroup +} + +function formatReleaseNote(note: ReleaseNoteEntry): string { + const idsAsUrls = note.ids + .map(id => `https://github.com/desktop/desktop/issues/${id}`) + .join(' ') + const contributorNote = note.contributor + ? `. Thanks ${note.contributor}!` + : '' + + const template = ` - ${note.text} - ${idsAsUrls}${contributorNote}` + + return template.trim() +} + +function renderSection( + name: string, + items: Array, + omitIfEmpty: boolean = true ): string { - const changelogText = releaseNotesEntries.join('\n') + if (items.length === 0 && omitIfEmpty) { + return '' + } - const x64Section = shaEntries.x64.map(formatEntry).join('\n') - const armSection = shaEntries.arm.map(formatEntry).join('\n') - const arm64Section = shaEntries.arm64.map(formatEntry).join('\n') + const itemsText = + items.length === 0 ? 'TODO' : items.map(formatReleaseNote).join('\n') - const draftReleaseNotes = `${changelogText} + return ` +## ${name} -## Fixes and improvements +${itemsText} + ` +} -TODO +function formatEntry(e: ChecksumEntry): string { + return `**${e.filename}**\n${e.checksum}\n` +} -## SHA-256 checksums +function renderArchitectureIfNotEmpty( + name: string, + items: Array +): string { + if (items.length === 0) { + return '' + } -### x64 + const itemsText = items.map(formatEntry).join('\n') -${x64Section} + return ` + +## ${name} -### ARM64 +${itemsText} + ` +} -${arm64Section} +/** + * Takes the release notes entries and the SHA entries, then merges them into the full draft release notes ✨ + */ +function generateDraftReleaseNotes( + releaseNotesGroups: ReleaseNotesGroups, + shaEntries: ChecksumGroups +): string { + const draftReleaseNotes = ` +${renderSection('New', releaseNotesGroups.new)} +${renderSection('Added', releaseNotesGroups.added)} +${renderSection('Fixed', releaseNotesGroups.fixed, false)} +${renderSection('Improved', releaseNotesGroups.improved, false)} +${renderSection('Removed', releaseNotesGroups.removed)} -### ARM +## SHA-256 checksums -${armSection}` +${renderArchitectureIfNotEmpty('x64', shaEntries.x64)} +${renderArchitectureIfNotEmpty('ARM64', shaEntries.arm64)} +${renderArchitectureIfNotEmpty('ARM', shaEntries.arm)}` return draftReleaseNotes } From 69d9220170e3592cacb819acad7435e8d1024705 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 11 Jul 2023 16:54:23 -0300 Subject: [PATCH 73/97] allow for -test1 versioning with release tag --- script/generate-release-notes.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/script/generate-release-notes.ts b/script/generate-release-notes.ts index a299e3f860a..d263954e079 100644 --- a/script/generate-release-notes.ts +++ b/script/generate-release-notes.ts @@ -142,8 +142,16 @@ function parseCategory(str: string): ReleaseNotesGroupType | null { } } +function isInitialTag(tag: string): boolean { + return tag.endsWith('-linux1') || tag.endsWith('-test1') +} + +function getVersionWithoutSuffix(tag: string): string { + return tag.replace('-linux1', '').replace('-test1', '') +} + function getReleaseGroups(version: string): ReleaseNotesGroups { - if (!version.endsWith('-linux1')) { + if (!isInitialTag(version)) { return { new: [], added: [], @@ -153,7 +161,7 @@ function getReleaseGroups(version: string): ReleaseNotesGroups { } } - const upstreamVersion = version.replace('-linux1', '') + const upstreamVersion = getVersionWithoutSuffix(version) const rootDir = dirname(__dirname) const changelogFile = fs.readFileSync(join(rootDir, 'changelog.json')) const changelogJson = JSON.parse(changelogFile) From 9bafea26759f9131f28f3d1f96da23c113ec2dd2 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 11 Jul 2023 16:56:11 -0300 Subject: [PATCH 74/97] tweak release notes output so that checksum is before file name --- script/generate-release-notes.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/script/generate-release-notes.ts b/script/generate-release-notes.ts index d263954e079..edbdce15954 100644 --- a/script/generate-release-notes.ts +++ b/script/generate-release-notes.ts @@ -262,7 +262,7 @@ ${itemsText} } function formatEntry(e: ChecksumEntry): string { - return `**${e.filename}**\n${e.checksum}\n` + return `${e.checksum} ${e.filename}` } function renderArchitectureIfNotEmpty( @@ -276,11 +276,9 @@ function renderArchitectureIfNotEmpty( const itemsText = items.map(formatEntry).join('\n') return ` - ## ${name} -${itemsText} - ` +${itemsText}` } /** @@ -298,7 +296,6 @@ ${renderSection('Improved', releaseNotesGroups.improved, false)} ${renderSection('Removed', releaseNotesGroups.removed)} ## SHA-256 checksums - ${renderArchitectureIfNotEmpty('x64', shaEntries.x64)} ${renderArchitectureIfNotEmpty('ARM64', shaEntries.arm64)} ${renderArchitectureIfNotEmpty('ARM', shaEntries.arm)}` From 6e898011d3c2ba2b9f033a1c9ce4fd964ccdde77 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 13 Jul 2023 13:37:56 -0300 Subject: [PATCH 75/97] backport some release fixes after initial testing (#905) * adjust release flow to skip the release- prefix * aupdate glob to look recursively for artifacts * fail when the files cannot be found --- .github/workflows/ci.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a9e715c0c5..53966bd08b0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -241,7 +241,7 @@ jobs: run: | RELEASE_TAG=${GITHUB_REF/refs\/tags\//} echo "RELEASE_TAG=${RELEASE_TAG}" >> $GITHUB_ENV - tagNameWithoutPrefix="${RELEASE_TAG:1}" + tagNameWithoutPrefix="${RELEASE_TAG:8}" echo "RELEASE_TAG_WITHOUT_PREFIX=${tagNameWithoutPrefix}" >> $GITHUB_ENV # TODO: generate release notes @@ -268,9 +268,10 @@ jobs: name: GitHub Desktop for Linux ${{ env.RELEASE_TAG_WITHOUT_PREFIX }} body_path: script/release_notes.txt files: | - artifacts/*.AppImage - artifacts/*.deb - artifacts/*.rpm + artifacts/**/*.AppImage + artifacts/**/*.deb + artifacts/**/*.rpm draft: true + fail_on_unmatched_files: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 2d20c7462b1a97ff40f0c772c23e0633e0c9a78b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 09:00:33 -0300 Subject: [PATCH 76/97] Bump actions/download-artifact from 2 to 3 (#907) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 2 to 3. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53966bd08b0..00af65b6a56 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -229,7 +229,7 @@ jobs: - uses: actions/checkout@v3 - name: Download all artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: path: './artifacts' From 4811c3f194d9f78ebc7d98f05321f5b2611139bb Mon Sep 17 00:00:00 2001 From: Ken Hawkins Date: Sat, 29 Jul 2023 21:29:58 +0200 Subject: [PATCH 77/97] Docs: add GNOME Terminal immutability to known issues. (#910) Addresses issue described at https://github.com/shiftkey/desktop/issues/344 --- docs/known-issues.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/known-issues.md b/docs/known-issues.md index cbddf7f67ba..b810f4ce792 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -14,6 +14,7 @@ - [Linux](#linux) - [I get a white screen when launching Desktop](#i-get-a-white-screen-when-launching-desktop) - [I cannot access repositories under my organization](#i-cannot-access-repositories-under-my-organization) + - [My shell/terminal is not detected and is stuck on "GNOME Terminal"](#my-shellterminal-is-not-detected-and-is-stuck-on-gnome-terminal) # Known Issues @@ -271,3 +272,16 @@ used by this fork. **Workaround:** ask your organization admin to [approve access](https://docs.github.com/en/organizations/restricting-access-to-your-organizations-data/approving-oauth-apps-for-your-organization) to the GitHub Desktop development app. + +### My shell/terminal is not detected and is stuck on GNOME Terminal + +On non-GNOME desktop's the GitHub Desktop application may not correctly set the +environment's shell, despite the shell being selected in the application settings. + +Attempting to launch the shell from the application will show the error +"cannot read property 'path' of undefined". + +**Workarounds:** + +- Option 1: install a second different terminal, switch to it, then switch to the terminal you want to use, and then uninstall the second terminal. +- Option 2: open the application's developer tools and step through the JS calls to correctly set the shell. Further details at https://github.com/shiftkey/desktop/issues/344#issuecomment-1001287110 From f36b22efcad0c2c5e32568274ae8451287aa0fd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 13:29:29 -0300 Subject: [PATCH 78/97] Bump electron-builder from 24.4.0 to 24.6.3 (#914) Bumps [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder) from 24.4.0 to 24.6.3. - [Release notes](https://github.com/electron-userland/electron-builder/releases) - [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md) - [Commits](https://github.com/electron-userland/electron-builder/commits/v24.6.3/packages/electron-builder) --- updated-dependencies: - dependency-name: electron-builder dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 743 ++++++--------------------------------------------- 2 files changed, 85 insertions(+), 660 deletions(-) diff --git a/package.json b/package.json index 0de48579ea4..c4df06fb03c 100644 --- a/package.json +++ b/package.json @@ -160,7 +160,7 @@ "@types/webpack-merge": "^5.0.0", "@types/xml2js": "^0.4.11", "electron": "26.2.4", - "electron-builder": "^24.4.0", + "electron-builder": "^24.6.3", "electron-packager": "^17.1.1", "eslint-plugin-github": "^4.10.1", "markdownlint-cli": "^0.32.2", diff --git a/yarn.lock b/yarn.lock index 867aac55f2a..f71e8d46921 100644 --- a/yarn.lock +++ b/yarn.lock @@ -573,25 +573,6 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/rebuild@^3.2.13": - version "3.2.13" - resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.2.13.tgz#98fbb98981b1a86162546a2ab91b2355569cca4c" - integrity sha512-DH9Ol4JCnHDYVOD0fKWq+Qqbn/0WU1O6QR0mIpMXEVU4YFM4PlaqNC9K36mGShNBxxGFotZCMDrB1wl/iHM12g== - dependencies: - "@malept/cross-spawn-promise" "^2.0.0" - chalk "^4.0.0" - debug "^4.1.1" - detect-libc "^2.0.1" - fs-extra "^10.0.0" - got "^11.7.0" - node-abi "^3.0.0" - node-api-version "^0.1.4" - node-gyp "^9.0.0" - ora "^5.1.0" - semver "^7.3.5" - tar "^6.0.5" - yargs "^17.0.1" - "@electron/universal@1.3.4", "@electron/universal@^1.3.2": version "1.3.4" resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.3.4.tgz#bccd94b635d7c85eeed5eabba457eb4ed2be2777" @@ -682,18 +663,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1020,13 +989,6 @@ dependencies: cross-spawn "^7.0.1" -"@malept/cross-spawn-promise@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" - integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== - dependencies: - cross-spawn "^7.0.1" - "@malept/flatpak-bundler@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" @@ -1058,23 +1020,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/fs@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" - integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== - dependencies: - semver "^7.3.5" - "@opentelemetry/api@^1.0.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - "@pkgr/utils@^2.3.1": version "2.4.2" resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" @@ -2172,11 +2122,6 @@ abab@^2.0.6: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -2223,30 +2168,13 @@ acorn@^8.1.0, acorn@^8.8.1, acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== -agent-base@6, agent-base@^6.0.2: +agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" -agentkeepalive@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== - dependencies: - debug "^4.1.0" - depd "^2.0.0" - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - airbnb-browser-shims@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/airbnb-browser-shims/-/airbnb-browser-shims-3.0.0.tgz#7978e65fa106f7436a6ae2cad9ad871982e13c7d" @@ -2379,11 +2307,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2416,11 +2339,6 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - anymatch@^3.0.3, anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" @@ -2434,27 +2352,26 @@ app-builder-bin@4.0.0: resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== -app-builder-lib@24.4.0: - version "24.4.0" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.4.0.tgz#1606f94e99366eea9e7507228961b8396e40d546" - integrity sha512-EcdqtWvg1LAApKCfyRBukcVkmsa94s2e1VKHjZLpvA9/D14QEt8rHhffYeaA+cH/pVeoNVn2ob735KnfJKEEow== +app-builder-lib@24.6.3: + version "24.6.3" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.6.3.tgz#5fe7027ec81ea35d5875a6e193c95cbb932eaa2e" + integrity sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg== dependencies: "7zip-bin" "~5.1.1" "@develar/schema-utils" "~2.6.5" "@electron/notarize" "^1.2.3" "@electron/osx-sign" "^1.0.4" - "@electron/rebuild" "^3.2.13" "@electron/universal" "1.3.4" "@malept/flatpak-bundler" "^0.4.0" "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "24.4.0" + builder-util "24.5.0" builder-util-runtime "9.2.1" chromium-pickle-js "^0.2.0" debug "^4.3.4" ejs "^3.1.8" - electron-publish "24.4.0" + electron-publish "24.5.0" form-data "^4.0.0" fs-extra "^10.1.0" hosted-git-info "^4.1.0" @@ -2469,24 +2386,11 @@ app-builder-lib@24.4.0: tar "^6.1.12" temp-file "^3.4.0" -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - are-docs-informative@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/are-docs-informative/-/are-docs-informative-0.0.2.tgz#387f0e93f5d45280373d387a59d34c96db321963" integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== -are-we-there-yet@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" - integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2871,15 +2775,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - bluebird-lst@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" @@ -3022,7 +2917,7 @@ buffer-from@^1.1.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -buffer@^5.1.0, buffer@^5.5.0: +buffer@^5.1.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3038,10 +2933,10 @@ builder-util-runtime@9.2.1: debug "^4.3.4" sax "^1.2.4" -builder-util@24.4.0: - version "24.4.0" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.4.0.tgz#dbb201a118fd573180e6a1070cf4c0be6de80cd7" - integrity sha512-tONb/GIK1MKa1BcOPHE1naId3o5nj6gdka5kP7yUJh2DOfF+jMq3laiu+UOZH6A7ZtkMtnGNMYFKFTIv408n/A== +builder-util@24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.5.0.tgz#8683c9a7a1c5c9f9a4c4d2789ecca0e47dddd3f9" + integrity sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ== dependencies: "7zip-bin" "~5.1.1" "@types/debug" "^4.1.6" @@ -3077,24 +2972,6 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacache@^17.0.0: - version "17.1.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" - integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^10.2.2" - lru-cache "^7.7.1" - minipass "^5.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -3281,23 +3158,6 @@ clean-css@^5.2.2: dependencies: source-map "~0.6.0" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.5.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" - integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== - cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -3349,11 +3209,6 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3396,11 +3251,6 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - colorette@^2.0.10: version "2.0.16" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" @@ -3466,11 +3316,6 @@ config-file-ts@^0.2.4: glob "^7.1.6" typescript "^4.0.2" -console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - console-polyfill@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/console-polyfill/-/console-polyfill-0.3.0.tgz#84900902a18c47a5eba932be75fa44d23e8af861" @@ -3570,19 +3415,19 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" + integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -cross-spawn@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" - integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -3671,7 +3516,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@^4.3.1, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3771,13 +3616,6 @@ default-browser@^4.0.0: execa "^7.1.1" titleize "^3.0.0" -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - defer-to-connect@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" @@ -3857,16 +3695,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -depd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3882,11 +3710,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-libc@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -3935,13 +3758,13 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@24.4.0: - version "24.4.0" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.4.0.tgz#46c80f119465f6a7275766c72b4f3d514cc8013d" - integrity sha512-p5z9Cx539GSBYb+b09Z+hMhuBTh/BrI71VRg4rgF6f2xtIRK/YlTGVS/O08k5OojoyhZcpS7JXxDVSmQoWgiiQ== +dmg-builder@24.6.3: + version "24.6.3" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.6.3.tgz#508a9516e30b294d18ec466ce3f61b496aa40c0b" + integrity sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg== dependencies: - app-builder-lib "24.4.0" - builder-util "24.4.0" + app-builder-lib "24.6.3" + builder-util "24.5.0" builder-util-runtime "9.2.1" fs-extra "^10.1.0" iconv-lite "^0.6.2" @@ -4044,11 +3867,6 @@ duplexer@^0.1.2: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - easy-stack@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.0.tgz#12c91b3085a37f0baa336e9486eac4bf94e3e788" @@ -4066,21 +3884,21 @@ ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@^24.4.0: - version "24.4.0" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.4.0.tgz#8846efa45bac8f6b9afc181abf71a4e12530f045" - integrity sha512-D5INxodxaUIJgEX6p/fqBd8wQNS8XRAToNIJ9SQC+taNS5D73ZsjLuXiRraFGCB0cVk9KeKhEkdEOH5AaVya4g== +electron-builder@^24.6.3: + version "24.6.3" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.6.3.tgz#f4f69dd4fae9f80bc9c1ec74d6fe47565ec50cd5" + integrity sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw== dependencies: - app-builder-lib "24.4.0" - builder-util "24.4.0" + app-builder-lib "24.6.3" + builder-util "24.5.0" builder-util-runtime "9.2.1" chalk "^4.1.2" - dmg-builder "24.4.0" + dmg-builder "24.6.3" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" read-config-file "6.3.2" - simple-update-notifier "^1.1.0" + simple-update-notifier "2.0.0" yargs "^17.6.2" electron-installer-common@^0.10.2: @@ -4152,13 +3970,13 @@ electron-packager@^17.1.1: semver "^7.1.3" yargs-parser "^21.1.1" -electron-publish@24.4.0: - version "24.4.0" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.4.0.tgz#a58f49ecd727620f65372881788ebb1a9b853284" - integrity sha512-U3mnVSxIfNrLW7ZnwiedFhcLf6ExPFXgAsx89WpfQFsV4gFAt/LG+H74p0m9NSvsLXiZuF82yXoxi7Ou8GHq4Q== +electron-publish@24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.5.0.tgz#492a4d7caa232e88ee3c18f5c3b4dc637e5e1b3a" + integrity sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "24.4.0" + builder-util "24.5.0" builder-util-runtime "9.2.1" chalk "^4.1.2" fs-extra "^10.1.0" @@ -4225,13 +4043,6 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -4267,11 +4078,6 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - errno@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" @@ -4919,11 +4725,6 @@ expect@^29.0.0, expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" -exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== - express@^4.17.3: version "4.17.3" resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" @@ -5195,14 +4996,6 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -5298,13 +5091,6 @@ fs-minipass@^2.0.0: dependencies: minipass "^3.0.0" -fs-minipass@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" - integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== - dependencies: - minipass "^5.0.0" - fs-monkey@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" @@ -5383,20 +5169,6 @@ gar@^1.0.4: resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w== -gauge@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" - integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.3" - console-control-strings "^1.1.0" - has-unicode "^2.0.1" - signal-exit "^3.0.7" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.5" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -5503,17 +5275,6 @@ 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@^10.2.2: - version "10.3.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.2.tgz#04fe71118ec6d2f4cb761849acbacec14b06cb1e" - integrity sha512-vsuLzB3c/uyDLLEdBZtT8vGnN0z57rwOxHV2oYZib/7HWmBspUaja/McYIobBjC4qaUTuNpUyFO2IdqM4DZIJA== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.0.3" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -5618,7 +5379,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -got@^11.7.0, got@^11.8.5: +got@^11.8.5: version "11.8.6" resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== @@ -5640,11 +5401,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== -graceful-fs@^4.2.6: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -5728,11 +5484,6 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -5853,7 +5604,7 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: +http-cache-semantics@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -5886,7 +5637,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: +https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5904,13 +5655,6 @@ human-signals@^4.3.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - iconv-corefoundation@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" @@ -5979,11 +5723,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -5992,7 +5731,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6025,11 +5764,6 @@ interpret@^1.0.1: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" integrity sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA= -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -6270,16 +6004,6 @@ is-inside-container@^1.0.0: dependencies: is-docker "^3.0.0" -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== - is-map@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" @@ -6418,11 +6142,6 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: dependencies: which-typed-array "^1.1.11" -is-unicode-supported@^0.1.0: - version "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-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" @@ -6566,15 +6285,6 @@ iterator.prototype@^1.1.2: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" -jackspeak@^2.0.3: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" - integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - jake@^10.8.5: version "10.8.7" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" @@ -7492,14 +7202,6 @@ lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -7541,16 +7243,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.7.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" - integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== - make-dir@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" @@ -7568,27 +7260,6 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" integrity sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y= -make-fetch-happen@^11.0.3: - version "11.1.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" - integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== - dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" - http-cache-semantics "^4.1.1" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^5.0.0" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^10.0.0" - makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -7801,13 +7472,6 @@ minimatch@^5.1.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimatch@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" @@ -7825,45 +7489,6 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" - integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== - dependencies: - minipass "^5.0.0" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - minipass@^3.0.0: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" @@ -7876,12 +7501,7 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.1.tgz#dff63464407cd8b83d7f008c0f116fa8c9b77ebf" - integrity sha512-NQ8MCKimInjVlaIqx51RKJJB7mINVkLTJbsZKmto4UAAOC/CWXES8PGaOgoBZyqoUsUA/U3DToGK7GJkkHbjJw== - -minizlib@^2.1.1, minizlib@^2.1.2: +minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -7924,7 +7544,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -7957,7 +7577,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.3, negotiator@^0.6.3: +negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -7980,25 +7600,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-abi@^3.0.0: - version "3.45.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.45.0.tgz#f568f163a3bfca5aacfce1fbeee1fa2cc98441f5" - integrity sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ== - dependencies: - semver "^7.3.5" - node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== -node-api-version@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.1.4.tgz#1ed46a485e462d55d66b5aa1fe2821720dedf080" - integrity sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g== - dependencies: - semver "^7.3.5" - node-fetch@^2.6.7, node-fetch@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" @@ -8006,23 +7612,6 @@ node-fetch@^2.6.7, node-fetch@^2.6.9: dependencies: whatwg-url "^5.0.0" -node-gyp@^9.0.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" - integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== - dependencies: - env-paths "^2.2.0" - exponential-backoff "^3.1.1" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^11.0.3" - nopt "^6.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -8047,13 +7636,6 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== - dependencies: - abbrev "^1.0.0" - normalize-package-data@^2.0.0, normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -8088,16 +7670,6 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" -npmlog@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" - integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== - dependencies: - are-we-there-yet "^3.0.0" - console-control-strings "^1.1.0" - gauge "^4.0.3" - set-blocking "^2.0.0" - nth-check@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" @@ -8274,7 +7846,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0, onetime@^5.1.2: +onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -8323,21 +7895,6 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" -ora@^5.1.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -8388,13 +7945,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - p-try@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" @@ -8537,14 +8087,6 @@ path-parse@^1.0.5, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== - dependencies: - lru-cache "^9.1.1 || ^10.0.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -8744,14 +8286,6 @@ progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - promise.prototype.finally@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" @@ -8964,15 +8498,6 @@ readable-stream@^3.0.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" @@ -9167,24 +8692,11 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -9402,11 +8914,6 @@ semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: dependencies: lru-cache "^6.0.0" -semver@~7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" @@ -9546,22 +9053,17 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" - integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== - -simple-update-notifier@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" - integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== +simple-update-notifier@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== dependencies: - semver "~7.0.0" + semver "^7.5.3" sirv@^1.0.7: version "1.0.19" @@ -9606,7 +9108,7 @@ slide@~1.1.3: resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= -smart-buffer@^4.0.2, smart-buffer@^4.2.0: +smart-buffer@^4.0.2: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== @@ -9646,23 +9148,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^2.0.0" -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - -socks@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== - dependencies: - ip "^2.0.0" - smart-buffer "^4.2.0" - source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -9769,13 +9254,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -ssri@^10.0.0: - version "10.0.4" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" - integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== - dependencies: - minipass "^5.0.0" - stack-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" @@ -9814,15 +9292,6 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", 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.1" - string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" @@ -9832,14 +9301,14 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== +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: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" string.prototype.matchall@^3.0.0: version "3.0.0" @@ -9953,13 +9422,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", 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.1" - strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -9974,12 +9436,12 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== +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 "^6.0.1" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -10093,7 +9555,7 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2: +tar@^6.1.12: version "6.1.15" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== @@ -10534,20 +9996,6 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" -unique-filename@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" - integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== - dependencies: - unique-slug "^4.0.0" - -unique-slug@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" - integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== - dependencies: - imurmurhash "^0.1.4" - universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -10745,13 +10193,6 @@ watchpack@^2.4.0: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10954,13 +10395,6 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - wildcard@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" @@ -10984,15 +10418,6 @@ worker-farm@^1.3.1: errno "^0.1.4" xtend "^4.0.1" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -11002,14 +10427,14 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" @@ -11112,10 +10537,10 @@ yaml@^1.4.0: dependencies: "@babel/runtime" "^7.3.4" -yargs-parser@^18.1.1: - version "18.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" - integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -11131,9 +10556,9 @@ yargs-parser@^21.0.1, yargs-parser@^21.1.1: integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^15.0.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" decamelize "^1.2.0" @@ -11145,7 +10570,7 @@ yargs@^15.0.1: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^18.1.1" + yargs-parser "^18.1.2" yargs@^16.0.2: version "16.2.0" @@ -11160,7 +10585,7 @@ yargs@^16.0.2: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.0.1, yargs@^17.3.1, yargs@^17.6.2: +yargs@^17.3.1, yargs@^17.6.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From 2e4e584d330c546fde2f52f0adfa84ab75be9465 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 6 Aug 2023 11:24:07 -0300 Subject: [PATCH 79/97] backport patches from previous release (#915) * remove rpm section as unnecessary * strip out checksum generation for release * include .sha256 artifacts in release * update electron to latest minor release * Apply suggestions from code review --- .github/workflows/ci.yml | 1 + docs/installation.md | 12 ---- script/electron-builder-linux.yml | 9 +-- script/generate-release-notes.ts | 94 ++++--------------------------- 4 files changed, 12 insertions(+), 104 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 00af65b6a56..1ccaec744ae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -271,6 +271,7 @@ jobs: artifacts/**/*.AppImage artifacts/**/*.deb artifacts/**/*.rpm + artifacts/**/*.sha256 draft: true fail_on_unmatched_files: true env: diff --git a/docs/installation.md b/docs/installation.md index af08c517d13..e931a69ab89 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -21,17 +21,6 @@ distribution: - AppImage (`.AppImage`) - Debian (`.deb`) - RPM (`.rpm`) - - Snap (`.snap`) - also available from [snapcraft.io](https://snapcraft.io/github-desktop) - -If you install the Snap package, ensure you also connect it to your password -manager: - -```shellsession -$ sudo snap connect github-desktop:password-manager-service -``` - -Without this, GitHub Desktop cannot store or retrieve account details it -requires in the user's keychain. ## Data Directories @@ -50,7 +39,6 @@ GitHub Desktop will create directories to manage the files and data it needs to This varies based on the installer chosen: - AppImage, Debian and RPM: `~/.config/GitHub Desktop/` - - Snap: `~/snap/github-desktop/current/.config/GitHub Desktop/` ## Log Files diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index c40d57c7e98..77203eb0b46 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -12,11 +12,4 @@ linux: - x-scheme-handler/x-github-desktop-dev-auth target: - AppImage - maintainer: 'GitHub, Inc ' -rpm: - depends: - # dugite-native dependencies - - libcurl - # keytar dependencies - - libsecret - - gnome-keyring + maintainer: 'Brendan Forster' diff --git a/script/generate-release-notes.ts b/script/generate-release-notes.ts index edbdce15954..31183e51bd1 100644 --- a/script/generate-release-notes.ts +++ b/script/generate-release-notes.ts @@ -1,13 +1,9 @@ /* eslint-disable no-sync */ const glob = require('glob') -const { basename, dirname, join } = require('path') +const { dirname, join } = require('path') const fs = require('fs') -type ChecksumEntry = { filename: string; checksum: string } - -type ChecksumGroups = Record<'x64' | 'arm' | 'arm64', Array> - type ReleaseNotesGroupType = 'new' | 'added' | 'fixed' | 'improved' | 'removed' type ReleaseNotesGroups = Record> @@ -45,51 +41,22 @@ console.log( const files = new Glob(artifactsDir + '/**/*', { nodir: true }) -let countFiles = 0 -const shaEntries = new Array() +const matches = files.found as Array -for (const file of files.found) { - if (file.endsWith('.sha256')) { - shaEntries.push(getShaContents(file)) - } +const fileCount = matches.length - countFiles++ -} - -if (SUCCESSFUL_RELEASE_FILE_COUNT !== countFiles) { +if (SUCCESSFUL_RELEASE_FILE_COUNT !== fileCount) { console.error( - `🔴 Artifacts folder has ${countFiles} assets, expecting ${SUCCESSFUL_RELEASE_FILE_COUNT}. Please check the GH Actions artifacts to see which are missing.` + `🔴 Artifacts folder has ${fileCount} assets, expecting ${SUCCESSFUL_RELEASE_FILE_COUNT}. Please check the GH Actions artifacts to see which are missing.` ) process.exit(1) } -const shaEntriesByArchitecture: ChecksumGroups = { - x64: shaEntries.filter( - e => - e.filename.includes('-linux-x86_64-') || - e.filename.includes('-linux-amd64-') - ), - arm: shaEntries.filter( - e => - e.filename.includes('-linux-armv7l-') || - e.filename.includes('-linux-armhf-') - ), - arm64: shaEntries.filter( - e => - e.filename.includes('-linux-aarch64-') || - e.filename.includes('-linux-arm64-') - ), -} - -console.log(`Found ${countFiles} files in artifacts directory`) -console.log(shaEntriesByArchitecture) +console.log(`Found ${fileCount} files in artifacts directory`) const releaseNotesByGroup = getReleaseGroups(releaseTagWithoutPrefix) -const draftReleaseNotes = generateDraftReleaseNotes( - releaseNotesByGroup, - shaEntriesByArchitecture -) +const draftReleaseNotes = generateDraftReleaseNotes(releaseNotesByGroup) const releaseNotesPath = join(__dirname, 'release_notes.txt') fs.writeFileSync(releaseNotesPath, draftReleaseNotes, { encoding: 'utf8' }) @@ -98,19 +65,6 @@ console.log( `✅ All done! The release notes have been written to ${releaseNotesPath}` ) -/** - * Returns the filename (excluding .sha256) and its contents (a SHA256 checksum). - */ -function getShaContents(filePath: string): { - filename: string - checksum: string -} { - const filename = basename(filePath).slice(0, -7) - const checksum = fs.readFileSync(filePath, 'utf8') - - return { filename, checksum } -} - function extractIds(str: string): Array { const idRegex = /#(\d+)/g @@ -261,44 +215,16 @@ ${itemsText} ` } -function formatEntry(e: ChecksumEntry): string { - return `${e.checksum} ${e.filename}` -} - -function renderArchitectureIfNotEmpty( - name: string, - items: Array -): string { - if (items.length === 0) { - return '' - } - - const itemsText = items.map(formatEntry).join('\n') - - return ` -## ${name} - -${itemsText}` -} - /** * Takes the release notes entries and the SHA entries, then merges them into the full draft release notes ✨ */ function generateDraftReleaseNotes( - releaseNotesGroups: ReleaseNotesGroups, - shaEntries: ChecksumGroups + releaseNotesGroups: ReleaseNotesGroups ): string { - const draftReleaseNotes = ` + return ` ${renderSection('New', releaseNotesGroups.new)} ${renderSection('Added', releaseNotesGroups.added)} ${renderSection('Fixed', releaseNotesGroups.fixed, false)} ${renderSection('Improved', releaseNotesGroups.improved, false)} -${renderSection('Removed', releaseNotesGroups.removed)} - -## SHA-256 checksums -${renderArchitectureIfNotEmpty('x64', shaEntries.x64)} -${renderArchitectureIfNotEmpty('ARM64', shaEntries.arm64)} -${renderArchitectureIfNotEmpty('ARM', shaEntries.arm)}` - - return draftReleaseNotes +${renderSection('Removed', releaseNotesGroups.removed)}` } From 867c239ceccd597fc78e6ad0ee850652f070e076 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 10:07:35 -0300 Subject: [PATCH 80/97] Bump electron-packager from 17.1.1 to 17.1.2 (#916) Bumps [electron-packager](https://github.com/electron/electron-packager) from 17.1.1 to 17.1.2. - [Release notes](https://github.com/electron/electron-packager/releases) - [Changelog](https://github.com/electron/electron-packager/blob/main/NEWS.md) - [Commits](https://github.com/electron/electron-packager/compare/v17.1.1...v17.1.2) --- updated-dependencies: - dependency-name: electron-packager dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 126 +++++++++++++++------------------------------------ 2 files changed, 38 insertions(+), 90 deletions(-) diff --git a/package.json b/package.json index c4df06fb03c..f1ea0f1fec0 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,7 @@ "@types/xml2js": "^0.4.11", "electron": "26.2.4", "electron-builder": "^24.6.3", - "electron-packager": "^17.1.1", + "electron-packager": "^17.1.2", "eslint-plugin-github": "^4.10.1", "markdownlint-cli": "^0.32.2", "patch-package": "^6.5.1", diff --git a/yarn.lock b/yarn.lock index f71e8d46921..d5f6f57e3fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -561,10 +561,10 @@ debug "^4.1.1" fs-extra "^9.0.1" -"@electron/osx-sign@^1.0.1", "@electron/osx-sign@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.4.tgz#8e91442846471636ca0469426a82b253b9170151" - integrity sha512-xfhdEcIOfAZg7scZ9RQPya1G1lWo8/zMCwUXAulq0SfY7ONIW+b9qGyKdMyuMctNYwllrIS+vmxfijSfjeh97g== +"@electron/osx-sign@^1.0.4", "@electron/osx-sign@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8" + integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== dependencies: compare-version "^0.1.2" debug "^4.3.4" @@ -3516,41 +3516,20 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.3.1, debug@^4.3.4: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.7: +debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" - integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -debug@^4.3.2: - 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" - debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -3945,22 +3924,22 @@ electron-installer-redhat@3.4.0: word-wrap "^1.2.3" yargs "^16.0.2" -electron-packager@^17.1.1: - version "17.1.1" - resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-17.1.1.tgz#f156fc63d3a66f4e902e4b42992550a172982d59" - integrity sha512-r1NDtlajsq7gf2EXgjRfblCVPquvD2yeg+6XGErOKblvxOpDi0iulZLVhgYDP4AEF1P5/HgbX/vwjlkEv7PEIQ== +electron-packager@^17.1.2: + version "17.1.2" + resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-17.1.2.tgz#18030b28024d242b706d0a8a67ed4cd1a57311aa" + integrity sha512-XofXdikjYI7MVBcnXeoOvRR+yFFFHOLs3J7PF5KYQweigtgLshcH4W660PsvHr4lYZ03JBpLyEcUB8DzHZ+BNw== dependencies: "@electron/asar" "^3.2.1" "@electron/get" "^2.0.0" "@electron/notarize" "^1.2.3" - "@electron/osx-sign" "^1.0.1" + "@electron/osx-sign" "^1.0.5" "@electron/universal" "^1.3.2" cross-spawn-windows-exe "^1.2.0" debug "^4.0.1" extract-zip "^2.0.0" filenamify "^4.1.0" - fs-extra "^10.1.0" - galactus "^0.2.1" + fs-extra "^11.1.0" + galactus "^1.0.0" get-package-info "^1.0.0" junk "^3.1.0" parse-author "^2.0.0" @@ -4976,13 +4955,13 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -flora-colossus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flora-colossus/-/flora-colossus-1.0.0.tgz#54729c361edecee014dd441679e1a37c1d773a45" - integrity sha1-VHKcNh7ezuAU3UQWeeGjfB13OkU= +flora-colossus@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flora-colossus/-/flora-colossus-2.0.0.tgz#af1e85db0a8256ef05f3fb531c1235236c97220a" + integrity sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA== dependencies: - debug "^3.1.0" - fs-extra "^4.0.0" + debug "^4.3.4" + fs-extra "^10.1.0" for-each@^0.3.3: version "0.3.3" @@ -5047,14 +5026,14 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== +fs-extra@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" fs-extra@^7.0.1: version "7.0.1" @@ -5155,14 +5134,14 @@ functions-have-names@^1.2.2, functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -galactus@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/galactus/-/galactus-0.2.1.tgz#cbed2d20a40c1f5679a35908e2b9415733e78db9" - integrity sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk= +galactus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/galactus/-/galactus-1.0.0.tgz#c2615182afa0c6d0859b92e56ae36d052827db7e" + integrity sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ== dependencies: - debug "^3.1.0" - flora-colossus "^1.0.0" - fs-extra "^4.0.0" + debug "^4.3.4" + flora-colossus "^2.0.0" + fs-extra "^10.1.0" gar@^1.0.4: version "1.0.4" @@ -8082,7 +8061,7 @@ path-key@^4.0.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== -path-parse@^1.0.5, path-parse@^1.0.7: +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== @@ -8660,14 +8639,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.6: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== - dependencies: - path-parse "^1.0.5" - -resolve@^1.20.0, resolve@^1.22.0: +resolve@^1.1.6, resolve@^1.20.0, resolve@^1.22.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -8868,12 +8840,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^5.5.0, semver@^5.7.2: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0, semver@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -8888,26 +8855,7 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" - integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== - -semver@^7.1.3, semver@^7.3.2, semver@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: +semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.0, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== From ff46c2fc06881ae25bb36f9a6d42df6d98b7bdd6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 26 Aug 2023 11:24:26 -0300 Subject: [PATCH 81/97] Bump electron-installer-debian from 3.1.0 to 3.2.0 (#917) Bumps [electron-installer-debian](https://github.com/electron-userland/electron-installer-debian) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/electron-userland/electron-installer-debian/releases) - [Changelog](https://github.com/electron-userland/electron-installer-debian/blob/main/NEWS.md) - [Commits](https://github.com/electron-userland/electron-installer-debian/compare/v3.1.0...v3.2.0) --- updated-dependencies: - dependency-name: electron-installer-debian dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 82 +++++----------------------------------------------- 2 files changed, 8 insertions(+), 76 deletions(-) diff --git a/package.json b/package.json index f1ea0f1fec0..2217c225f0d 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,7 @@ "tsconfig-paths": "^3.9.0" }, "optionalDependencies": { - "electron-installer-debian": "3.1.0", + "electron-installer-debian": "3.2.0", "electron-installer-redhat": "3.4.0", "electron-winstaller": "^5.0.0" } diff --git a/yarn.lock b/yarn.lock index d5f6f57e3fc..9768a436f9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3035,7 +3035,7 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -3166,15 +3166,6 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -3535,11 +3526,6 @@ debuglog@^1.0.1: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" @@ -3897,10 +3883,10 @@ electron-installer-common@^0.10.2: optionalDependencies: "@types/fs-extra" "^9.0.1" -electron-installer-debian@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.1.0.tgz#2f6107f559f6564c44e3832fb2942dd8de4d40cc" - integrity sha512-k6KChvx0Fw8XTlCqwwbBfh19yGQaKjGdbugokmr1IpzINOm4QFyACKMTHAYFHW5LCBUZQShZD96hwxUZ+8Kx+w== +electron-installer-debian@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz#2a9c8220f50a57807de8f93619a0d61ec41271e0" + integrity sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw== dependencies: "@malept/cross-spawn-promise" "^1.0.0" debug "^4.1.1" @@ -3909,7 +3895,7 @@ electron-installer-debian@3.1.0: get-folder-size "^2.0.1" lodash "^4.17.4" word-wrap "^1.2.3" - yargs "^15.0.1" + yargs "^16.0.2" electron-installer-redhat@3.4.0: version "3.4.0" @@ -5153,7 +5139,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -8592,11 +8578,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -8905,11 +8886,6 @@ serve-static@1.14.2: parseurl "~1.3.3" send "0.17.2" -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - set-function-length@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" @@ -10302,11 +10278,6 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - which-typed-array@^1.1.11: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" @@ -10366,15 +10337,6 @@ worker-farm@^1.3.1: errno "^0.1.4" xtend "^4.0.1" -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -10448,11 +10410,6 @@ xvfb-maybe@^0.2.1: debug "^2.2.0" which "^1.2.4" -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -10485,14 +10442,6 @@ yaml@^1.4.0: dependencies: "@babel/runtime" "^7.3.4" -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -10503,23 +10452,6 @@ yargs-parser@^21.0.1, yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^15.0.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - yargs@^16.0.2: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" From a3780696d260f089be6cdd65e1a80ca7e57964d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:58:52 -0300 Subject: [PATCH 82/97] Bump electron-builder from 24.6.3 to 24.6.4 (#926) Bumps [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder) from 24.6.3 to 24.6.4. - [Release notes](https://github.com/electron-userland/electron-builder/releases) - [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md) - [Commits](https://github.com/electron-userland/electron-builder/commits/v24.6.4/packages/electron-builder) --- updated-dependencies: - dependency-name: electron-builder dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 80 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 2217c225f0d..0f93caa85dc 100644 --- a/package.json +++ b/package.json @@ -160,7 +160,7 @@ "@types/webpack-merge": "^5.0.0", "@types/xml2js": "^0.4.11", "electron": "26.2.4", - "electron-builder": "^24.6.3", + "electron-builder": "^24.6.4", "electron-packager": "^17.1.2", "eslint-plugin-github": "^4.10.1", "markdownlint-cli": "^0.32.2", diff --git a/yarn.lock b/yarn.lock index 9768a436f9e..5d7a73cb5d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -553,6 +553,15 @@ optionalDependencies: global-agent "^3.0.0" +"@electron/notarize@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.1.0.tgz#76aaec10c8687225e8d0a427cc9df67611c46ff3" + integrity sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + promise-retry "^2.0.1" + "@electron/notarize@^1.2.3": version "1.2.3" resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-1.2.3.tgz#38056a629e5a0b5fd56c975c4828c0f74285b644" @@ -561,7 +570,7 @@ debug "^4.1.1" fs-extra "^9.0.1" -"@electron/osx-sign@^1.0.4", "@electron/osx-sign@^1.0.5": +"@electron/osx-sign@1.0.5", "@electron/osx-sign@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8" integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== @@ -573,7 +582,20 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/universal@1.3.4", "@electron/universal@^1.3.2": +"@electron/universal@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.4.1.tgz#3fbda2a5ed9ff9f3304c8e8316b94c1e3a7b3785" + integrity sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ== + dependencies: + "@electron/asar" "^3.2.1" + "@malept/cross-spawn-promise" "^1.1.0" + debug "^4.3.1" + dir-compare "^3.0.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + +"@electron/universal@^1.3.2": version "1.3.4" resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.3.4.tgz#bccd94b635d7c85eeed5eabba457eb4ed2be2777" integrity sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg== @@ -2352,16 +2374,16 @@ app-builder-bin@4.0.0: resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== -app-builder-lib@24.6.3: - version "24.6.3" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.6.3.tgz#5fe7027ec81ea35d5875a6e193c95cbb932eaa2e" - integrity sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg== +app-builder-lib@24.6.4: + version "24.6.4" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.6.4.tgz#5bf77dd89d3ee557bc615b9ddfaf383f3e51577b" + integrity sha512-m9931WXb83teb32N0rKg+ulbn6+Hl8NV5SUpVDOVz9MWOXfhV6AQtTdftf51zJJvCQnQugGtSqoLvgw6mdF/Rg== dependencies: "7zip-bin" "~5.1.1" "@develar/schema-utils" "~2.6.5" - "@electron/notarize" "^1.2.3" - "@electron/osx-sign" "^1.0.4" - "@electron/universal" "1.3.4" + "@electron/notarize" "2.1.0" + "@electron/osx-sign" "1.0.5" + "@electron/universal" "1.4.1" "@malept/flatpak-bundler" "^0.4.0" "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" @@ -3723,12 +3745,12 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@24.6.3: - version "24.6.3" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.6.3.tgz#508a9516e30b294d18ec466ce3f61b496aa40c0b" - integrity sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg== +dmg-builder@24.6.4: + version "24.6.4" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.6.4.tgz#e19b8305f7e1ea0b4faaa30382c81b9d6de39863" + integrity sha512-BNcHRc9CWEuI9qt0E655bUBU/j/3wUCYBVKGu1kVpbN5lcUdEJJJeiO0NHK3dgKmra6LUUZlo+mWqc+OCbi0zw== dependencies: - app-builder-lib "24.6.3" + app-builder-lib "24.6.4" builder-util "24.5.0" builder-util-runtime "9.2.1" fs-extra "^10.1.0" @@ -3849,16 +3871,16 @@ ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@^24.6.3: - version "24.6.3" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.6.3.tgz#f4f69dd4fae9f80bc9c1ec74d6fe47565ec50cd5" - integrity sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw== +electron-builder@^24.6.4: + version "24.6.4" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.6.4.tgz#c51271e49b9a02c9a3ec444f866b6008c4d98a1d" + integrity sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA== dependencies: - app-builder-lib "24.6.3" + app-builder-lib "24.6.4" builder-util "24.5.0" builder-util-runtime "9.2.1" chalk "^4.1.2" - dmg-builder "24.6.3" + dmg-builder "24.6.4" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" @@ -4043,6 +4065,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + errno@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" @@ -8251,6 +8278,14 @@ progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + promise.prototype.finally@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" @@ -8650,6 +8685,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" From afa95c7d965903d83b0d4399bb9eb9185c2cb84f Mon Sep 17 00:00:00 2001 From: mon-jai <91261297+mon-jai@users.noreply.github.com> Date: Sun, 8 Oct 2023 23:26:22 +0800 Subject: [PATCH 83/97] Add an option to use the Windows title bar (#912) Co-authored-by: Brendan Forster --- app/src/lib/app-state.ts | 4 ++ app/src/lib/get-title-bar-config.ts | 48 +++++++++++++++ app/src/lib/ipc-shared.ts | 4 ++ app/src/lib/stores/app-store.ts | 15 +++++ app/src/main-process/app-window.ts | 4 ++ app/src/main-process/main.ts | 19 ++++++ app/src/models/popup.ts | 2 + app/src/ui/app.tsx | 20 ++++--- app/src/ui/dispatcher/dispatcher.ts | 9 +++ app/src/ui/lib/title-bar-style.ts | 17 ++++++ app/src/ui/main-process-proxy.ts | 7 +++ app/src/ui/preferences/appearance.tsx | 69 ++++++++++++++++++---- app/src/ui/preferences/confirm-restart.tsx | 58 ++++++++++++++++++ app/src/ui/preferences/preferences.tsx | 11 ++++ app/src/ui/window/title-bar.tsx | 12 ++-- app/src/ui/window/window-controls.tsx | 5 -- app/styles/ui/window/_title-bar.scss | 10 +++- 17 files changed, 286 insertions(+), 28 deletions(-) create mode 100644 app/src/lib/get-title-bar-config.ts create mode 100644 app/src/ui/lib/title-bar-style.ts create mode 100644 app/src/ui/preferences/confirm-restart.tsx diff --git a/app/src/lib/app-state.ts b/app/src/lib/app-state.ts index 571b6d9397a..5a9a2a6e74f 100644 --- a/app/src/lib/app-state.ts +++ b/app/src/lib/app-state.ts @@ -32,6 +32,7 @@ import { WindowState } from './window-state' import { Shell } from './shells' import { ApplicableTheme, ApplicationTheme } from '../ui/lib/application-theme' +import { TitleBarStyle } from '../ui/lib/title-bar-style' import { IAccountRepositories } from './stores/api-repositories-store' import { ManualConflictResolution } from '../models/manual-conflict-resolution' import { Banner } from '../models/banner' @@ -278,6 +279,9 @@ export interface IAppState { /** The currently applied appearance (aka theme) */ readonly currentTheme: ApplicableTheme + /** The selected title bar style for the application */ + readonly titleBarStyle: TitleBarStyle + /** * A map keyed on a user account (GitHub.com or GitHub Enterprise) * containing an object with repositories that the authenticated diff --git a/app/src/lib/get-title-bar-config.ts b/app/src/lib/get-title-bar-config.ts new file mode 100644 index 00000000000..ced0aeddb2f --- /dev/null +++ b/app/src/lib/get-title-bar-config.ts @@ -0,0 +1,48 @@ +import { writeFile } from 'fs/promises' +import { existsSync, readFileSync } from 'fs' +import { join } from 'path' +import { app } from 'electron' +import { TitleBarStyle } from '../ui/lib/title-bar-style' + +export type TitleBarConfig = { + titleBarStyle: TitleBarStyle +} + +let cachedTitleBarConfig: TitleBarConfig | null = null + +// The function has to be synchronous, +// since we need its return value to create electron BrowserWindow +export function readTitleBarConfigFileSync(): TitleBarConfig { + if (cachedTitleBarConfig) { + return cachedTitleBarConfig + } + + const titleBarConfigPath = getTitleBarConfigPath() + + if (existsSync(titleBarConfigPath)) { + const storedTitleBarConfig = JSON.parse( + readFileSync(titleBarConfigPath, 'utf8') + ) + + if ( + storedTitleBarConfig.titleBarStyle === 'native' || + storedTitleBarConfig.titleBarStyle === 'custom' + ) { + cachedTitleBarConfig = storedTitleBarConfig + } + } + + // Cache the default value if the config file is not found, or if it contains an invalid value. + if (cachedTitleBarConfig == null) { + cachedTitleBarConfig = { titleBarStyle: 'native' } + } + + return cachedTitleBarConfig +} + +export function saveTitleBarConfigFile(config: TitleBarConfig) { + return writeFile(getTitleBarConfigPath(), JSON.stringify(config), 'utf8') +} + +const getTitleBarConfigPath = () => + join(app.getPath('userData'), '.title-bar-config') diff --git a/app/src/lib/ipc-shared.ts b/app/src/lib/ipc-shared.ts index a8d4b3328a9..9bcbb072b62 100644 --- a/app/src/lib/ipc-shared.ts +++ b/app/src/lib/ipc-shared.ts @@ -13,6 +13,7 @@ import { Architecture } from './get-architecture' import { EndpointToken } from './endpoint-token' import { PathType } from '../ui/lib/app-proxy' import { ThemeSource } from '../ui/lib/theme-source' +import { TitleBarStyle } from '../ui/lib/title-bar-style' import { DesktopNotificationPermission } from 'desktop-notifications/dist/notification-permission' import { NotificationCallback } from 'desktop-notifications/dist/notification-callback' import { DesktopAliveEvent } from './stores/alive-store' @@ -65,6 +66,7 @@ export type RequestChannels = { blur: () => void 'update-accounts': (accounts: ReadonlyArray) => void 'quit-and-install-updates': () => void + 'restart-app': () => void 'quit-app': () => void 'minimize-window': () => void 'maximize-window': () => void @@ -121,6 +123,8 @@ export type RequestResponseChannels = { 'should-use-dark-colors': () => Promise 'save-guid': (guid: string) => Promise 'get-guid': () => Promise + 'save-title-bar-style': (titleBarStyle: TitleBarStyle) => Promise + 'get-title-bar-style': () => Promise 'show-notification': ( title: string, body: string, diff --git a/app/src/lib/stores/app-store.ts b/app/src/lib/stores/app-store.ts index 68f232238ab..4c651d515d7 100644 --- a/app/src/lib/stores/app-store.ts +++ b/app/src/lib/stores/app-store.ts @@ -80,6 +80,7 @@ import { getPersistedThemeName, setPersistedTheme, } from '../../ui/lib/application-theme' +import { TitleBarStyle } from '../../ui/lib/title-bar-style' import { getAppMenu, getCurrentWindowState, @@ -91,6 +92,8 @@ import { sendWillQuitEvenIfUpdatingSync, quitApp, sendCancelQuittingSync, + saveTitleBarStyle, + getTitleBarStyle, } from '../../ui/main-process-proxy' import { API, @@ -513,6 +516,7 @@ export class AppStore extends TypedBaseStore { private selectedBranchesTab = BranchesTab.Branches private selectedTheme = ApplicationTheme.System private currentTheme: ApplicableTheme = ApplicationTheme.Light + private titleBarStyle: TitleBarStyle = 'native' private useWindowsOpenSSH: boolean = false @@ -1004,6 +1008,7 @@ export class AppStore extends TypedBaseStore { selectedBranchesTab: this.selectedBranchesTab, selectedTheme: this.selectedTheme, currentTheme: this.currentTheme, + titleBarStyle: this.titleBarStyle, apiRepositories: this.apiRepositoriesStore.getState(), useWindowsOpenSSH: this.useWindowsOpenSSH, showCommitLengthWarning: this.showCommitLengthWarning, @@ -2198,6 +2203,8 @@ export class AppStore extends TypedBaseStore { this.emitUpdate() }) + this.titleBarStyle = await getTitleBarStyle() + this.lastThankYou = getObject(lastThankYouKey) this.pullRequestSuggestedNextAction = @@ -6506,6 +6513,14 @@ export class AppStore extends TypedBaseStore { return Promise.resolve() } + /** + * Set the title bar style for the application + */ + public _setTitleBarStyle(titleBarStyle: TitleBarStyle) { + this.titleBarStyle = titleBarStyle + return saveTitleBarStyle(titleBarStyle) + } + public async _resolveCurrentEditor() { const match = await findEditorOrDefault(this.selectedExternalEditor) const resolvedExternalEditor = match != null ? match.editor : null diff --git a/app/src/main-process/app-window.ts b/app/src/main-process/app-window.ts index 0fabf6c23b1..233f0248c14 100644 --- a/app/src/main-process/app-window.ts +++ b/app/src/main-process/app-window.ts @@ -13,6 +13,7 @@ import { getWindowState, registerWindowStateChangedEvents, } from '../lib/window-state' +import { readTitleBarConfigFileSync } from '../lib/get-title-bar-config' import { MenuEvent } from './menu' import { URLActionType } from '../lib/parse-app-url' import { ILaunchStats } from '../lib/stats' @@ -75,6 +76,9 @@ export class AppWindow { } else if (__WIN32__) { windowOptions.frame = false } else if (__LINUX__) { + if (readTitleBarConfigFileSync().titleBarStyle === 'custom') { + windowOptions.frame = false + } windowOptions.icon = join(__dirname, 'static', 'logos', '512x512.png') // relax restriction here for users trying to run app at a small diff --git a/app/src/main-process/main.ts b/app/src/main-process/main.ts index b484101b68c..afa6de73c8e 100644 --- a/app/src/main-process/main.ts +++ b/app/src/main-process/main.ts @@ -40,6 +40,10 @@ import { } from '../lib/get-architecture' import { buildSpellCheckMenu } from './menu/build-spell-check-menu' import { getMainGUID, saveGUIDFile } from '../lib/get-main-guid' +import { + readTitleBarConfigFileSync, + saveTitleBarConfigFile, +} from '../lib/get-title-bar-config' import { getNotificationsPermission, requestNotificationsPermission, @@ -505,6 +509,11 @@ app.on('ready', () => { mainWindow?.quitAndInstallUpdate() ) + ipcMain.on('restart-app', () => { + app.relaunch() + app.exit() + }) + ipcMain.on('quit-app', () => app.quit()) ipcMain.on('minimize-window', () => mainWindow?.minimizeWindow()) @@ -685,6 +694,16 @@ app.on('ready', () => { ipcMain.handle('save-guid', (_, guid) => saveGUIDFile(guid)) + ipcMain.handle( + 'get-title-bar-style', + async () => readTitleBarConfigFileSync().titleBarStyle + ) + + ipcMain.handle( + 'save-title-bar-style', + async (_, titleBarStyle) => await saveTitleBarConfigFile({ titleBarStyle }) + ) + ipcMain.handle('show-notification', async (_, title, body, userInfo) => showNotification(title, body, userInfo) ) diff --git a/app/src/models/popup.ts b/app/src/models/popup.ts index cfc433bd35a..397817d380d 100644 --- a/app/src/models/popup.ts +++ b/app/src/models/popup.ts @@ -95,6 +95,7 @@ export enum PopupType { PullRequestComment = 'PullRequestComment', UnknownAuthors = 'UnknownAuthors', ConfirmRepoRulesBypass = 'ConfirmRepoRulesBypass', + ConfirmRestart = 'ConfirmRestart', } interface IBasePopup { @@ -420,5 +421,6 @@ export type PopupDetail = branch: string onConfirm: () => void } + | { type: PopupType.ConfirmRestart } export type Popup = IBasePopup & PopupDetail diff --git a/app/src/ui/app.tsx b/app/src/ui/app.tsx index 8c1115d126e..e2718ec4d8b 100644 --- a/app/src/ui/app.tsx +++ b/app/src/ui/app.tsx @@ -64,6 +64,7 @@ import { Welcome } from './welcome' import { AppMenuBar } from './app-menu' import { UpdateAvailable, renderBanner } from './banners' import { Preferences } from './preferences' +import { ConfirmRestart } from './preferences/confirm-restart' import { RepositorySettings } from './repository-settings' import { AppError } from './app-error' import { MissingRepository } from './missing-repository' @@ -1398,8 +1399,8 @@ export class App extends React.Component { * on Windows. */ private renderAppMenuBar() { - // We only render the app menu bar on Windows - if (!__WIN32__) { + // We do not render the app menu bar on macOS + if (__DARWIN__) { return null } @@ -1450,9 +1451,9 @@ export class App extends React.Component { this.state.currentFoldout && this.state.currentFoldout.type === FoldoutType.AppMenu - // As Linux still uses the classic Electron menu, we are opting out of the - // custom menu that is shown as part of the title bar below - if (__LINUX__) { + // We do not render the app menu bar on Linux when the user has selected + // the "native" menu option + if (__LINUX__ && this.state.titleBarStyle === 'native') { return null } @@ -1460,12 +1461,12 @@ export class App extends React.Component { // the title bar when the menu bar is active. On other platforms we // never render the title bar while in full-screen mode. if (inFullScreen) { - if (!__WIN32__ || !menuBarActive) { + if (__DARWIN__ || !menuBarActive) { return null } } - const showAppIcon = __WIN32__ && !this.state.showWelcomeFlow + const showAppIcon = !__DARWIN__ && !this.state.showWelcomeFlow const inWelcomeFlow = this.state.showWelcomeFlow const inNoRepositoriesView = this.inNoRepositoriesViewState() @@ -1658,6 +1659,7 @@ export class App extends React.Component { onDismissed={onPopupDismissedFn} selectedShell={this.state.selectedShell} selectedTheme={this.state.selectedTheme} + titleBarStyle={this.state.titleBarStyle} repositoryIndicatorsEnabled={this.state.repositoryIndicatorsEnabled} onOpenFileInExternalEditor={this.openFileInExternalEditor} /> @@ -2553,6 +2555,10 @@ export class App extends React.Component { /> ) } + + case PopupType.ConfirmRestart: { + return + } default: return assertNever(popup, `Unknown popup type: ${popup}`) } diff --git a/app/src/ui/dispatcher/dispatcher.ts b/app/src/ui/dispatcher/dispatcher.ts index 862c139218c..2148332fc17 100644 --- a/app/src/ui/dispatcher/dispatcher.ts +++ b/app/src/ui/dispatcher/dispatcher.ts @@ -91,6 +91,7 @@ import { TipState, IValidBranch } from '../../models/tip' import { Banner, BannerType } from '../../models/banner' import { ApplicationTheme } from '../lib/application-theme' +import { TitleBarStyle } from '../lib/title-bar-style' import { installCLI } from '../lib/install-cli' import { executeMenuItem, @@ -2467,6 +2468,14 @@ export class Dispatcher { return this.appStore._setSelectedTheme(theme) } + /** + * Set the title bar style for the application + */ + public async setTitleBarStyle(titleBarStyle: TitleBarStyle) { + await this.appStore._setTitleBarStyle(titleBarStyle) + this.showPopup({ type: PopupType.ConfirmRestart }) + } + /** * Increments either the `repoWithIndicatorClicked` or * the `repoWithoutIndicatorClicked` metric diff --git a/app/src/ui/lib/title-bar-style.ts b/app/src/ui/lib/title-bar-style.ts new file mode 100644 index 00000000000..452842d7794 --- /dev/null +++ b/app/src/ui/lib/title-bar-style.ts @@ -0,0 +1,17 @@ +/** + * This string enum represents the supported modes for rendering the title bar + * in the app. + * + * - 'native' - Use the default window style and chrome supported by the window + * manager + * + * - 'custom' - Hide the default window style and chrome and display the menu + * provided by GitHub Desktop + * + * This is only available on the Linux build. For other operating systems this + * is not configurable: + * + * - macOS uses the native title bar + * - Windows uses the custom title bar + */ +export type TitleBarStyle = 'native' | 'custom' diff --git a/app/src/ui/main-process-proxy.ts b/app/src/ui/main-process-proxy.ts index 7d438371632..09a1a67aec2 100644 --- a/app/src/ui/main-process-proxy.ts +++ b/app/src/ui/main-process-proxy.ts @@ -164,6 +164,9 @@ export const checkForUpdates = invokeProxy('check-for-updates', 1) /** Tell the main process to quit the app and install updates */ export const quitAndInstallUpdate = sendProxy('quit-and-install-updates', 0) +/** Tell the main process to restart the app */ +export const restartApp = sendProxy('restart-app', 0) + /** Tell the main process to quit the app */ export const quitApp = sendProxy('quit-app', 0) @@ -379,6 +382,10 @@ export const showOpenDialog = invokeProxy('show-open-dialog', 1) export const saveGUID = invokeProxy('save-guid', 1) export const getGUID = invokeProxy('get-guid', 0) +/** Tell the main process read/save the the title bar style */ +export const saveTitleBarStyle = invokeProxy('save-title-bar-style', 1) +export const getTitleBarStyle = invokeProxy('get-title-bar-style', 0) + /** Tell the main process to show a notification */ export const showNotification = invokeProxy('show-notification', 3) diff --git a/app/src/ui/preferences/appearance.tsx b/app/src/ui/preferences/appearance.tsx index 26c0a33ca5b..46fb07c1140 100644 --- a/app/src/ui/preferences/appearance.tsx +++ b/app/src/ui/preferences/appearance.tsx @@ -4,18 +4,32 @@ import { supportsSystemThemeChanges, getCurrentlyAppliedTheme, } from '../lib/application-theme' +import { TitleBarStyle } from '../lib/title-bar-style' import { Row } from '../lib/row' import { DialogContent } from '../dialog' import { RadioGroup } from '../lib/radio-group' +import { Select } from '../lib/select' import { encodePathAsUrl } from '../../lib/path' interface IAppearanceProps { readonly selectedTheme: ApplicationTheme readonly onSelectedThemeChanged: (theme: ApplicationTheme) => void + readonly titleBarStyle: TitleBarStyle + readonly onTitleBarStyleChanged: (titleBarStyle: TitleBarStyle) => void } interface IAppearanceState { readonly selectedTheme: ApplicationTheme | null + readonly titleBarStyle: TitleBarStyle +} + +function getTitleBarStyleDescription(titleBarStyle: TitleBarStyle): string { + switch (titleBarStyle) { + case 'custom': + return 'Uses the menu system provided by GitHub Desktop, hiding the default chrome provided by your window manager.' + case 'native': + return 'Uses the menu system and chrome provided by your window manager.' + } } export class Appearance extends React.Component< @@ -29,7 +43,10 @@ export class Appearance extends React.Component< props.selectedTheme !== ApplicationTheme.System || supportsSystemThemeChanges() - this.state = { selectedTheme: usePropTheme ? props.selectedTheme : null } + this.state = { + selectedTheme: usePropTheme ? props.selectedTheme : null, + titleBarStyle: props.titleBarStyle, + } if (!usePropTheme) { this.initializeSelectedTheme() @@ -61,6 +78,12 @@ export class Appearance extends React.Component< this.props.onSelectedThemeChanged(theme) } + private onSelectChanged = (event: React.FormEvent) => { + const titleBarStyle = event.currentTarget.value as TitleBarStyle + this.setState({ titleBarStyle }) + this.props.onTitleBarStyleChanged(titleBarStyle) + } + public renderThemeSwatch = (theme: ApplicationTheme) => { const darkThemeImage = encodePathAsUrl(__dirname, 'static/ghd_dark.svg') const lightThemeImage = encodePathAsUrl(__dirname, 'static/ghd_light.svg') @@ -98,6 +121,29 @@ export class Appearance extends React.Component< } } + private renderTitleBarStyleDropdown() { + const { titleBarStyle } = this.state + const titleBarStyleDescription = getTitleBarStyleDescription(titleBarStyle) + + return ( +
+

Title bar style

+ + + +
+ {titleBarStyleDescription} +
+
+ ) + } + public render() { const { selectedTheme } = this.state @@ -118,15 +164,18 @@ export class Appearance extends React.Component< return (

Theme

- - - ariaLabelledBy="theme-heading" - className="theme-selector" - selectedKey={selectedTheme} - radioButtonKeys={themes} - onSelectionChanged={this.onSelectedThemeChanged} - renderRadioButtonLabelContents={this.renderThemeSwatch} - /> + + + ariaLabelledBy="theme-heading" + className="theme-selector" + selectedKey={selectedTheme} + radioButtonKeys={themes} + onSelectionChanged={this.onSelectedThemeChanged} + renderRadioButtonLabelContents={this.renderThemeSwatch} + /> + + + {this.renderTitleBarStyleDropdown()}
) } diff --git a/app/src/ui/preferences/confirm-restart.tsx b/app/src/ui/preferences/confirm-restart.tsx new file mode 100644 index 00000000000..d8770355d5f --- /dev/null +++ b/app/src/ui/preferences/confirm-restart.tsx @@ -0,0 +1,58 @@ +import * as React from 'react' +import { + Dialog, + DialogContent, + DialogFooter, + OkCancelButtonGroup, +} from '../dialog' +import { restartApp } from '../main-process-proxy' + +interface IConfirmRestartProps { + /** + * Callback to use when the dialog gets closed. + */ + readonly onDismissed: () => void +} + +export class ConfirmRestart extends React.Component { + public constructor(props: IConfirmRestartProps) { + super(props) + } + + public render() { + return ( + + +

Restart GitHub Desktop to apply the title bar settings change?

+
+ {this.renderFooter()} +
+ ) + } + + private renderFooter() { + return ( + + + + ) + } + + private onNotNow = () => { + this.props.onDismissed() + } + + private onSubmit = async () => { + this.props.onDismissed() + restartApp() + } +} diff --git a/app/src/ui/preferences/preferences.tsx b/app/src/ui/preferences/preferences.tsx index 22e458a2961..04689102cb5 100644 --- a/app/src/ui/preferences/preferences.tsx +++ b/app/src/ui/preferences/preferences.tsx @@ -22,6 +22,7 @@ import { } from '../lib/identifier-rules' import { Appearance } from './appearance' import { ApplicationTheme } from '../lib/application-theme' +import { TitleBarStyle } from '../lib/title-bar-style' import { OkCancelButtonGroup } from '../dialog/ok-cancel-button-group' import { Integrations } from './integrations' import { @@ -65,6 +66,7 @@ interface IPreferencesProps { readonly selectedExternalEditor: string | null readonly selectedShell: Shell readonly selectedTheme: ApplicationTheme + readonly titleBarStyle: TitleBarStyle readonly repositoryIndicatorsEnabled: boolean readonly onOpenFileInExternalEditor: (path: string) => void } @@ -94,6 +96,7 @@ interface IPreferencesState { readonly selectedExternalEditor: string | null readonly availableShells: ReadonlyArray readonly selectedShell: Shell + readonly titleBarStyle: TitleBarStyle /** * If unable to save Git configuration values (name, email) * due to an existing configuration lock file this property @@ -143,6 +146,7 @@ export class Preferences extends React.Component< selectedExternalEditor: this.props.selectedExternalEditor, availableShells: [], selectedShell: this.props.selectedShell, + titleBarStyle: this.props.titleBarStyle, repositoryIndicatorsEnabled: this.props.repositoryIndicatorsEnabled, initiallySelectedTheme: this.props.selectedTheme, isLoadingGitConfig: true, @@ -362,6 +366,8 @@ export class Preferences extends React.Component< ) break @@ -525,6 +531,10 @@ export class Preferences extends React.Component< this.props.dispatcher.setSelectedTheme(theme) } + private onTitleBarStyleChanged = (titleBarStyle: TitleBarStyle) => { + this.setState({ titleBarStyle }) + } + private renderFooter() { const hasDisabledError = this.state.disallowedCharactersMessage != null @@ -634,6 +644,7 @@ export class Preferences extends React.Component< ) } await this.props.dispatcher.setShell(this.state.selectedShell) + await this.props.dispatcher.setTitleBarStyle(this.state.titleBarStyle) await this.props.dispatcher.setConfirmDiscardChangesSetting( this.state.confirmDiscardChanges ) diff --git a/app/src/ui/window/title-bar.tsx b/app/src/ui/window/title-bar.tsx index 06ce23af472..a0356fc8059 100644 --- a/app/src/ui/window/title-bar.tsx +++ b/app/src/ui/window/title-bar.tsx @@ -84,7 +84,7 @@ export class TitleBar extends React.Component { const isMaximized = this.props.windowState === 'maximized' // No Windows controls when we're in full-screen mode. - const winControls = __WIN32__ && !inFullScreen ? : null + const winControls = !inFullScreen ? : null // On Windows it's not possible to resize a frameless window if the // element that sits flush along the window edge has -webkit-app-region: drag. @@ -92,12 +92,14 @@ export class TitleBar extends React.Component { // window controls need to disable dragging so we add a 3px tall element which // disables drag while still letting users drag the app by the titlebar below // those 3px. - const topResizeHandle = - __WIN32__ && !isMaximized ?
: null + const topResizeHandle = !isMaximized ? ( +
+ ) : null // And a 3px wide element on the left hand side. - const leftResizeHandle = - __WIN32__ && !isMaximized ?
: null + const leftResizeHandle = !isMaximized ? ( +
+ ) : null const titleBarClass = this.props.titleBarStyle === 'light' ? 'light-title-bar' : '' diff --git a/app/src/ui/window/window-controls.tsx b/app/src/ui/window/window-controls.tsx index a98aef33062..558d33f47dc 100644 --- a/app/src/ui/window/window-controls.tsx +++ b/app/src/ui/window/window-controls.tsx @@ -114,11 +114,6 @@ export class WindowControls extends React.Component<{}, IWindowControlState> { } public render() { - // We only know how to render fake Windows-y controls - if (!__WIN32__) { - return - } - const min = this.renderButton('minimize', this.onMinimize, minimizePath) const maximizeOrRestore = this.state.windowState === 'maximized' diff --git a/app/styles/ui/window/_title-bar.scss b/app/styles/ui/window/_title-bar.scss index 2662b3bb513..6dae12eab55 100644 --- a/app/styles/ui/window/_title-bar.scss +++ b/app/styles/ui/window/_title-bar.scss @@ -15,7 +15,7 @@ border-bottom: 1px solid #000; } - @include win32 { + @mixin custom-title-bar { height: var(--win32-title-bar-height); background: var(--win32-title-bar-background-color); border-bottom: 1px solid #000; @@ -27,6 +27,14 @@ } } + @include win32 { + @include custom-title-bar; + } + + @include linux { + @include custom-title-bar; + } + .resize-handle { position: absolute; top: 0px; From 16f0a089f52fe9660d8c1c1b30cf6eb8c3c9f6de Mon Sep 17 00:00:00 2001 From: Ujhhgtg Date: Sun, 8 Oct 2023 23:45:52 +0800 Subject: [PATCH 84/97] add support for vscodium insiders (#928) * [app: editors] add vscodium insiders --- app/src/lib/editors/linux.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index ba8f33a7d0a..94122fc4683 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -65,6 +65,10 @@ const editors: ILinuxExternalEditor[] = [ '.local/share/flatpak/app/com.vscodium.codium/current/active/export/bin/com.vscodium.codium', ], }, + { + name: 'VSCodium (Insiders)', + paths: ['/usr/bin/codium-insiders'], + }, { name: 'Sublime Text', paths: ['/usr/bin/subl'], From 5d75f294376b4aae87212863b26692fda6d0eeb0 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 8 Oct 2023 13:58:06 -0300 Subject: [PATCH 85/97] use same node version when generating release notes because prebuilds weirdness --- .github/workflows/ci.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1ccaec744ae..d09e6584255 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -228,6 +228,12 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Use Node.js 18.14.0 + uses: actions/setup-node@v3 + with: + node-version: 18.14.0 + cache: yarn + - name: Download all artifacts uses: actions/download-artifact@v3 with: @@ -250,6 +256,7 @@ jobs: - name: Generate release notes run: | + node -v yarn node -r ts-node/register script/generate-release-notes.ts "${{ github.workspace }}/artifacts" "${{ env.RELEASE_TAG_WITHOUT_PREFIX }}" RELEASE_NOTES_FILE=script/release_notes.txt From 4913168adcae5401ddbf32d472a1529c05c884d7 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 26 Nov 2023 17:17:12 -0400 Subject: [PATCH 86/97] do not install python on linux runners (#955) --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d09e6584255..5d375d308d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -158,6 +158,7 @@ jobs: ref: ${{ inputs.ref }} submodules: recursive - uses: actions/setup-python@v5 + if: matrix.friendlyName != 'Ubuntu' with: python-version: '3.11' - name: Use Node.js ${{ env.NODE_VERSION }} From cd10351231ab36d9ca610a1eeecdab2df8da2ada Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 26 Nov 2023 17:41:58 -0400 Subject: [PATCH 87/97] Bump actions/setup-node from 3 to 4 (#949) Dependabot couldn't find the original pull request head commit, 693b4520f02744835209865019ddb4589358c21c. Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d375d308d4..8e29a3dbf8c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -230,7 +230,7 @@ jobs: - uses: actions/checkout@v3 - name: Use Node.js 18.14.0 - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18.14.0 cache: yarn From 7f8f220697af88958c823e9d4968d781b15e7d28 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 26 Nov 2023 20:07:47 -0400 Subject: [PATCH 88/97] drop unnecessary preamble from issue template (#956) --- .github/ISSUE_TEMPLATE/bug_report.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index f71cfe29e20..758ddff8beb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -1,10 +1,6 @@ name: 🐛 Bug Report description: File a bug report body: - - type: markdown - attributes: - value: | - Thanks for filing a bug report! This issue tracker is for [GitHub Desktop](https://desktop.github.com). Please search the issue tracker to see if there is an existing issue for the problem you are experiencing. If you are experiencing issues with the Linux fork of GitHub Desktop please open an issue [in its repository](https://github.com/shiftkey/desktop). If you are experiencing issues with github.com please [contact GitHub Support](https://support.github.com/). - type: textarea id: the-problem attributes: From 0723dc6ba3d6cf1975aafb4569307686efe2b41f Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 27 Nov 2023 09:42:31 -0400 Subject: [PATCH 89/97] upgrade to Electron 26.6.1 (#961) --- app/.npmrc | 2 +- package.json | 2 +- script/validate-electron-version.ts | 4 ++-- yarn.lock | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/.npmrc b/app/.npmrc index 104a19e8335..808c61399ad 100644 --- a/app/.npmrc +++ b/app/.npmrc @@ -1,3 +1,3 @@ runtime = electron disturl = https://electronjs.org/headers -target = 26.2.4 +target = 26.6.1 diff --git a/package.json b/package.json index 0f93caa85dc..c146d870bc5 100644 --- a/package.json +++ b/package.json @@ -159,7 +159,7 @@ "@types/webpack-hot-middleware": "^2.25.6", "@types/webpack-merge": "^5.0.0", "@types/xml2js": "^0.4.11", - "electron": "26.2.4", + "electron": "26.6.1", "electron-builder": "^24.6.4", "electron-packager": "^17.1.2", "eslint-plugin-github": "^4.10.1", diff --git a/script/validate-electron-version.ts b/script/validate-electron-version.ts index 432cef0d4f7..f0394ebcd8c 100644 --- a/script/validate-electron-version.ts +++ b/script/validate-electron-version.ts @@ -15,8 +15,8 @@ type ChannelToValidate = 'production' | 'beta' * to a previous version of GitHub Desktop without losing all settings. */ const ValidElectronVersions: Record = { - production: '26.2.4', - beta: '26.2.4', + production: '26.6.1', + beta: '26.6.1', } const channel = diff --git a/yarn.lock b/yarn.lock index 5d7a73cb5d2..2ef002c0c0e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3991,10 +3991,10 @@ electron-winstaller@*, electron-winstaller@^5.0.0: lodash.template "^4.2.2" temp "^0.9.0" -electron@26.2.4: - version "26.2.4" - resolved "https://registry.yarnpkg.com/electron/-/electron-26.2.4.tgz#36616b2386b083c13ae9188f2d8ccf233c23404a" - integrity sha512-weMUSMyDho5E0DPQ3breba3D96IxwNvtYHjMd/4/wNN3BdI5s3+0orNnPVGJFcLhSvKoxuKUqdVonUocBPwlQA== +electron@26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/electron/-/electron-26.6.1.tgz#bf4835d92210ccbec632088d1975bf78ed05c153" + integrity sha512-4Vz9u0Jt/khPa/en2l8Jv6SWEfsK/ieWYtchl5j0clbNSjdeTucnEFOhz9B9WwsAmfQjxBnpuMZpmdBuyxq+wg== dependencies: "@electron/get" "^2.0.0" "@types/node" "^18.11.18" From 08466274ad2cdc16cdb0bef9b2e939bab3fdcf5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 09:58:40 -0400 Subject: [PATCH 90/97] Bump electron-builder from 24.6.4 to 24.9.1 (#959) Bumps [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder) from 24.6.4 to 24.9.1. - [Release notes](https://github.com/electron-userland/electron-builder/releases) - [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md) - [Commits](https://github.com/electron-userland/electron-builder/commits/v24.9.1/packages/electron-builder) --- updated-dependencies: - dependency-name: electron-builder dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 86 ++++++++++++++++++++++++++-------------------------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index c146d870bc5..82064f1842a 100644 --- a/package.json +++ b/package.json @@ -160,7 +160,7 @@ "@types/webpack-merge": "^5.0.0", "@types/xml2js": "^0.4.11", "electron": "26.6.1", - "electron-builder": "^24.6.4", + "electron-builder": "^24.9.1", "electron-packager": "^17.1.2", "eslint-plugin-github": "^4.10.1", "markdownlint-cli": "^0.32.2", diff --git a/yarn.lock b/yarn.lock index 2ef002c0c0e..debed94f5b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"7zip-bin@~5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" - integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== +"7zip-bin@~5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d" + integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" @@ -2374,12 +2374,12 @@ app-builder-bin@4.0.0: resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== -app-builder-lib@24.6.4: - version "24.6.4" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.6.4.tgz#5bf77dd89d3ee557bc615b9ddfaf383f3e51577b" - integrity sha512-m9931WXb83teb32N0rKg+ulbn6+Hl8NV5SUpVDOVz9MWOXfhV6AQtTdftf51zJJvCQnQugGtSqoLvgw6mdF/Rg== +app-builder-lib@24.9.1: + version "24.9.1" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.9.1.tgz#bf3568529298b4de8595ed1acbb351fe27db5ba4" + integrity sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g== dependencies: - "7zip-bin" "~5.1.1" + "7zip-bin" "~5.2.0" "@develar/schema-utils" "~2.6.5" "@electron/notarize" "2.1.0" "@electron/osx-sign" "1.0.5" @@ -2388,12 +2388,12 @@ app-builder-lib@24.6.4: "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "24.5.0" - builder-util-runtime "9.2.1" + builder-util "24.8.1" + builder-util-runtime "9.2.3" chromium-pickle-js "^0.2.0" debug "^4.3.4" ejs "^3.1.8" - electron-publish "24.5.0" + electron-publish "24.8.1" form-data "^4.0.0" fs-extra "^10.1.0" hosted-git-info "^4.1.0" @@ -2947,24 +2947,24 @@ buffer@^5.1.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builder-util-runtime@9.2.1: - version "9.2.1" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz#3184dcdf7ed6c47afb8df733813224ced4f624fd" - integrity sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA== +builder-util-runtime@9.2.3: + version "9.2.3" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz#0a82c7aca8eadef46d67b353c638f052c206b83c" + integrity sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw== dependencies: debug "^4.3.4" sax "^1.2.4" -builder-util@24.5.0: - version "24.5.0" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.5.0.tgz#8683c9a7a1c5c9f9a4c4d2789ecca0e47dddd3f9" - integrity sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ== +builder-util@24.8.1: + version "24.8.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.8.1.tgz#594d45b0c86d1d17f5c7bebbb77405080b2571c2" + integrity sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw== dependencies: - "7zip-bin" "~5.1.1" + "7zip-bin" "~5.2.0" "@types/debug" "^4.1.6" app-builder-bin "4.0.0" bluebird-lst "^1.0.9" - builder-util-runtime "9.2.1" + builder-util-runtime "9.2.3" chalk "^4.1.2" cross-spawn "^7.0.3" debug "^4.3.4" @@ -3745,14 +3745,14 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@24.6.4: - version "24.6.4" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.6.4.tgz#e19b8305f7e1ea0b4faaa30382c81b9d6de39863" - integrity sha512-BNcHRc9CWEuI9qt0E655bUBU/j/3wUCYBVKGu1kVpbN5lcUdEJJJeiO0NHK3dgKmra6LUUZlo+mWqc+OCbi0zw== +dmg-builder@24.9.1: + version "24.9.1" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.9.1.tgz#04bf6c0dcd235f6214511f2358a78ed2b9379421" + integrity sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ== dependencies: - app-builder-lib "24.6.4" - builder-util "24.5.0" - builder-util-runtime "9.2.1" + app-builder-lib "24.9.1" + builder-util "24.8.1" + builder-util-runtime "9.2.3" fs-extra "^10.1.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" @@ -3871,16 +3871,16 @@ ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@^24.6.4: - version "24.6.4" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.6.4.tgz#c51271e49b9a02c9a3ec444f866b6008c4d98a1d" - integrity sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA== +electron-builder@^24.9.1: + version "24.9.1" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.9.1.tgz#4aee03947963b829a7f48a850fe02c219311ef63" + integrity sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg== dependencies: - app-builder-lib "24.6.4" - builder-util "24.5.0" - builder-util-runtime "9.2.1" + app-builder-lib "24.9.1" + builder-util "24.8.1" + builder-util-runtime "9.2.3" chalk "^4.1.2" - dmg-builder "24.6.4" + dmg-builder "24.9.1" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" @@ -3957,14 +3957,14 @@ electron-packager@^17.1.2: semver "^7.1.3" yargs-parser "^21.1.1" -electron-publish@24.5.0: - version "24.5.0" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.5.0.tgz#492a4d7caa232e88ee3c18f5c3b4dc637e5e1b3a" - integrity sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA== +electron-publish@24.8.1: + version "24.8.1" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.8.1.tgz#4216740372bf4297a429543402a1a15ce8c3560b" + integrity sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "24.5.0" - builder-util-runtime "9.2.1" + builder-util "24.8.1" + builder-util-runtime "9.2.3" chalk "^4.1.2" fs-extra "^10.1.0" lazy-val "^1.0.5" From 04529ea7ab7823f609473cc54cfb152c115affbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 15:14:02 -0400 Subject: [PATCH 91/97] Bump github/codeql-action from 2 to 3 (#976) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v2...v3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 7742c493b9b..7305888af47 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -22,7 +22,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: config-file: ./.github/codeql/codeql-config.yml @@ -32,7 +32,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below). - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -46,4 +46,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 From 87ad288d145de1fb2884b75d3d3d7ab91fd4b539 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 18 Dec 2023 16:07:16 -0400 Subject: [PATCH 92/97] bugfix: only set the popup for restarting when the title bar style has actually changed (#980) --- app/src/ui/dispatcher/dispatcher.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/ui/dispatcher/dispatcher.ts b/app/src/ui/dispatcher/dispatcher.ts index 2148332fc17..f5656a99da0 100644 --- a/app/src/ui/dispatcher/dispatcher.ts +++ b/app/src/ui/dispatcher/dispatcher.ts @@ -2472,8 +2472,14 @@ export class Dispatcher { * Set the title bar style for the application */ public async setTitleBarStyle(titleBarStyle: TitleBarStyle) { + const existingState = this.appStore.getState() + const { titleBarStyle: existingTitleBarStyle } = existingState + await this.appStore._setTitleBarStyle(titleBarStyle) - this.showPopup({ type: PopupType.ConfirmRestart }) + + if (titleBarStyle !== existingTitleBarStyle) { + this.showPopup({ type: PopupType.ConfirmRestart }) + } } /** From f589a5f53d13c998d1fb7994e5209fb73dd7326d Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 20 Dec 2023 10:36:39 -0400 Subject: [PATCH 93/97] bugfix: use env.NODE_VERSION instead of matrix.node placeholder --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8e29a3dbf8c..7ec88eb7912 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -87,7 +87,6 @@ jobs: friendlyName: Ubuntu image: ubuntu:18.04 arch: arm - node: 18.16.1 environment: AS: arm-linux-gnueabihf-as STRIP: arm-linux-gnueabihf-strip @@ -167,16 +166,17 @@ jobs: with: node-version: ${{ env.NODE_VERSION }} cache: yarn - - name: Install unofficial-builds Node.js ${{ matrix.node }} on Ubuntu + - name: + Install unofficial-builds Node.js ${{ env.NODE_VERSION }} on Ubuntu if: matrix.friendlyName == 'Ubuntu' run: | # This version supports older GLIBC (official builds required a minimum of GLIBC 2.28) - # this might break if you bump the `matrix.node` version - ensure you are on the latest version + # this might break if you bump the `env.NODE_VERSION` version - ensure you are on the latest version # of which ever major/minor release which should have this variant available # # See https://github.com/nodejs/unofficial-builds/ for more information on these versions. # - curl -sL 'https://unofficial-builds.nodejs.org/download/release/v${{ matrix.node }}/node-v${{ matrix.node }}-linux-x64-glibc-217.tar.xz' | xzcat | sudo tar -vx --strip-components=1 -C /usr/local/ + curl -sL 'https://unofficial-builds.nodejs.org/download/release/v${{ env.NODE_VERSION }}/node-v${{ env.NODE_VERSION }}-linux-x64-glibc-217.tar.xz' | xzcat | sudo tar -vx --strip-components=1 -C /usr/local/ sudo npm install --global yarn # This step can be removed as soon as official Windows arm64 builds are published: # https://github.com/nodejs/build/issues/2450#issuecomment-705853342 From 7b6808e3defa1fa990467fea592249aa6982848d Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 20 Dec 2023 10:45:56 -0400 Subject: [PATCH 94/97] add alternate branch to better build up commit history --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ec88eb7912..88d4b7289f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,7 @@ on: branches: - development - linux + - linux-vnext - 'linux-release-*' tags: - 'release-*.*.*-linux*' @@ -12,6 +13,7 @@ on: pull_request: branches: - linux + - linux-vnext - 'linux-release-*' env: From 737fb81dc09808eff3abfaa7f55e9f04e52f2dbb Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 20 Dec 2023 11:03:41 -0400 Subject: [PATCH 95/97] added Intellij Idea Ultimate and Goland under Linux IDE options (#985) * added intellij idea ultimate and golang under linux IDE options * Update Linux IDE integration doc --------- Co-authored-by: madeindreams Co-authored-by: madeindreams --- app/src/lib/editors/linux.ts | 14 ++++++++++++++ docs/technical/editor-integration.md | 2 ++ 2 files changed, 16 insertions(+) diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index 94122fc4683..285b155b7dc 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -114,6 +114,20 @@ const editors: ILinuxExternalEditor[] = [ name: 'IntelliJ IDEA', paths: ['/snap/bin/idea', '.local/share/JetBrains/Toolbox/scripts/idea'], }, + { + name: 'IntelliJ IDEA Ultimate Edition', + paths: [ + '/snap/bin/intellij-idea-ultimate', + '.local/share/JetBrains/Toolbox/scripts/intellij-idea-ultimate', + ], + }, + { + name: 'IntelliJ Goland', + paths: [ + '/snap/bin/goland', + '.local/share/JetBrains/Toolbox/scripts/goland', + ], + }, { name: 'JetBrains PyCharm', paths: [ diff --git a/docs/technical/editor-integration.md b/docs/technical/editor-integration.md index 09bf86b1204..9e626b2c26d 100644 --- a/docs/technical/editor-integration.md +++ b/docs/technical/editor-integration.md @@ -353,6 +353,8 @@ These editors are currently supported: - [Lite XL](https://lite-xl.com/) - [JetBrains PHPStorm](https://www.jetbrains.com/phpstorm/) - [JetBrains WebStorm](https://www.jetbrains.com/webstorm/) + - [JetBrains Idea Ultimate](https://www.jetbrains.com/idea/) + - [JetBrains Goland](https://www.jetbrains.com/go/) - [Emacs](https://www.gnu.org/software/emacs/) - [Pulsar](https://pulsar-edit.dev/) From 59a9eaf12d35a580b19ae1850d70b2bf1f67562f Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 20 Dec 2023 11:05:51 -0400 Subject: [PATCH 96/97] update @types/node to later version to try and sync with upstream changes (#983) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 82064f1842a..ee658ebb4e5 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "@types/legal-eagle": "^0.15.0", "@types/memoize-one": "^3.1.1", "@types/mri": "^1.1.0", - "@types/node": "18.16.1", + "@types/node": "18.16.20", "@types/prettier": "^2.0.1", "@types/react": "^16.8.7", "@types/react-css-transition-replace": "^2.1.3", diff --git a/yarn.lock b/yarn.lock index debed94f5b0..5177b70b7ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1463,10 +1463,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.24.tgz#d4606afd8cf6c609036b854360367d1b2c78931f" integrity sha512-1Ciqv9pqwVtW6FsIUKSZNB82E5Cu1I2bBTj1xuIHXLe/1zYLl3956Nbhg2MzSYHVfl9/rmanjbQIb7LibfCnug== -"@types/node@18.16.1": - version "18.16.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.1.tgz#5db121e9c5352925bb1f1b892c4ae620e3526799" - integrity sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA== +"@types/node@18.16.20": + version "18.16.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.20.tgz#b27be1ceb267bfb47d8bac024ff6379998f62207" + integrity sha512-nL54VfDjThdP2UXJXZao5wp76CDiDw4zSRO8d4Tk7UgDqNKGKVEQB0/t3ti63NS+YNNkIQDvwEAF04BO+WYu7Q== "@types/node@^18.11.18": version "18.16.3" From e035053c1aae9d4e0e6344266ccc31b8a1d7b36e Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 20 Dec 2023 11:06:50 -0400 Subject: [PATCH 97/97] Add additional link to known issues doc (#984) --- docs/known-issues.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/known-issues.md b/docs/known-issues.md index b810f4ce792..58987489f63 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -271,7 +271,9 @@ restrictions" enabled, which blocks the GitHub Desktop development app that is used by this fork. **Workaround:** ask your organization admin to [approve access](https://docs.github.com/en/organizations/restricting-access-to-your-organizations-data/approving-oauth-apps-for-your-organization) -to the GitHub Desktop development app. +to the GitHub Desktop development app. + +If you have not requested the GitHub Desktop development app for this organization, [follow these instructions first](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-your-membership-in-organizations/requesting-organization-approval-for-oauth-apps). ### My shell/terminal is not detected and is stuck on GNOME Terminal