├── .gitignore ├── src ├── mask.png ├── index.js └── fileicon.sh ├── package.json ├── LICENSE ├── .github └── workflows │ └── build.yml ├── README.md └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | yarn-error.log 4 | dist -------------------------------------------------------------------------------- /src/mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rikumi/iconsur/HEAD/src/mask.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "iconsur", 3 | "version": "1.7.0", 4 | "main": "src/index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "build": "pkg . --targets node16-macos-x64 --output dist/iconsur --debug" 8 | }, 9 | "bin": { 10 | "iconsur": "src/index.js" 11 | }, 12 | "repository": { 13 | "url": "https://github.com/rikumi/iconsur" 14 | }, 15 | "dependencies": { 16 | "commander": "^6.0.0", 17 | "cross-fetch": "^3.1.5", 18 | "glob": "^7.1.6", 19 | "icns-lib": "^1.0.1", 20 | "jimp": "^0.14.0", 21 | "plist": "^3.0.5" 22 | }, 23 | "devDependencies": { 24 | "@types/node": "^14.0.27", 25 | "pkg": "^5.6.0" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Rikumi Yu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build and upload new version 2 | on: 3 | push: 4 | branches: [main] 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | - uses: actions/setup-node@v1 11 | with: 12 | node-version: 10.x 13 | - run: npm install 14 | - run: npm run build 15 | - uses: pascalgn/npm-publish-action@1.3.8 16 | env: 17 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 18 | NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} 19 | - uses: nyaascii/package-version@v1.0.3 20 | - uses: actions/create-release@v1.1.1 21 | id: create_release 22 | env: 23 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 24 | with: 25 | tag_name: ${{ env.PACKAGE_VERSION }} 26 | release_name: ${{ env.PACKAGE_VERSION }} 27 | draft: false 28 | prerelease: false 29 | - uses: actions/upload-release-asset@v1.0.2 30 | env: 31 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 32 | with: 33 | upload_url: ${{ steps.create_release.outputs.upload_url }} 34 | asset_path: dist/iconsur 35 | asset_name: iconsur 36 | asset_content_type: application/octet-stream 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # IconSur: macOS Big Sur Adaptive Icon Generator 4 | 5 | 6 | 7 | 8 | 9 |

10 | 11 |
12 | 13 | `iconsur` is a command line tool to easily generate macOS Big Sur styled adaptive icons for third-party apps. 14 | 15 | The generation is based on the most related iOS app from the App Store, or, if there isn't one, is created from the original icon, in which case the background color and the scaling can be customized. 16 | 17 | ![image](https://user-images.githubusercontent.com/5051300/85926574-ebfb9d80-b8d2-11ea-836b-28e38d1f3447.png) 18 | 19 | ## Installation 20 | Install it easily: 21 | 22 | ### Using homebrew 23 | ``` shell 24 | brew install iconsur 25 | ``` 26 | 27 | ### Using npm 28 | ``` shell 29 | npm install -g iconsur 30 | ``` 31 | ## Usage 32 | 33 | Download the `iconsur` binary for macOS x64 from [Releases](https://github.com/rikumi/iconsur/releases), `chmod +x` and include it in your PATH. 34 | 35 | Start generating your first adaptive app icon: 36 | 37 | ```sh 38 | sudo iconsur set /Applications/Microsoft\ Word.app/ 39 | 40 | # Update the system icon cache and reload Finder & Dock 41 | sudo iconsur cache 42 | 43 | # Then the new icon will appear, and will last until the App is updated next time. 44 | ``` 45 | 46 | This will search for the App Store and use the most related iOS app. For apps from the Mac App Store, `sudo` is required to set the alternative icon. 47 | 48 | By default, the name for the macOS app is used to search for a corresponding iOS app. You can change the keyword by specifying `-k`/`--keyword`. 49 | 50 | If your app only has a corresponding iOS app in non-America store, you may like to specify the 2-letter country code with option `-r`/`--region`. 51 | 52 | ```sh 53 | sudo iconsur set /Applications/QQMusic.app/ -r cn 54 | sudo iconsur cache 55 | ``` 56 | 57 | For apps that do not have a corresponding iOS app, an irrelevant app can be found. In these cases, you may need to specify the `-l`/`--local` option to forcibly generate an icon locally: 58 | 59 | ```sh 60 | sudo iconsur set /Applications/Visual\ Studio\ Code.app/ -l 61 | sudo iconsur cache 62 | ``` 63 | 64 | You can also use your own original icon with the `-i`/`--input` option. Here IconSur plays the part of adding the background, masking the icon into continuous corners, and adding correct paddings around the masked icon. 65 | 66 | ```sh 67 | sudo iconsur set /Applications/Visual\ Studio\ Code.app/ -l -i /path/to/your/icon 68 | sudo iconsur cache 69 | ``` 70 | 71 | By default, the original app icon is scaled by 0.9 and is applied to a white background. You may like to change the scaling and background color of the icon. However, if the original icon is opaque, it will not get scaled down in case you specify an original opaque iOS icon from an app developer or a jailbreak icon pack. 72 | 73 | ```sh 74 | sudo iconsur set /Applications/Visual\ Studio\ Code.app/ -l -s 0.8 -c 87cdf0 75 | sudo iconsur cache 76 | ``` 77 | 78 | To remove the icon previously set for a specific app, use the `unset` subcommand: 79 | 80 | ```sh 81 | sudo iconsur unset /Applications/Microsoft\ Word.app/ 82 | sudo iconsur unset /Applications/Visual\ Studio\ Code.app/ 83 | sudo iconsur cache 84 | ``` 85 | 86 | ## Example 87 | 88 | See [my personal iconsur setup](https://gist.github.com/rikumi/e2ac39882a7dcd29642f29343da5a54a) as an example. 89 | 90 | ## Credits 91 | 92 | Thanks to [LiteIcon](https://freemacsoft.net/liteicon/) for the original inspiration, and [fileicon by mklement0](https://github.com/mklement0/fileicon) for the script for icon customization. 93 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | const fs = require('fs'); 3 | const os = require('os'); 4 | const path = require('path'); 5 | const cp = require('child_process'); 6 | 7 | const glob = require('glob'); 8 | const jimp = require('jimp'); 9 | const plist = require('plist'); 10 | const icns = require('icns-lib'); 11 | const { program } = require('commander'); 12 | const { default: fetch } = require('cross-fetch'); 13 | 14 | const jpeg = require('./openjpeg'); 15 | const { version } = require('../package.json'); 16 | 17 | jimp.decoders['image/jp2'] = (buffer) => { 18 | const { width, height, data } = jpeg(buffer, 'jp2'); 19 | 20 | // Convert Planar RGB into Pixel RGB 21 | const rgbaBuffer = Buffer.alloc(data.length); 22 | for (let i = 0; i < data.length; i++) { 23 | rgbaBuffer[i] = data[(data.length / 4) * (i % 4) + Math.round(i / 4)] || 0; 24 | } 25 | return { width, height, data: rgbaBuffer }; 26 | }; 27 | 28 | const fileicon = path.join(os.tmpdir(), `fileicon-${Math.random().toFixed(16).substr(2, 6)}.sh`); 29 | const fileiconBinaryReady = new Promise(resolve => { 30 | fs.createReadStream(path.join(__dirname, 'fileicon.sh')) 31 | .pipe(fs.createWriteStream(fileicon), { end: true }) 32 | .on('close', resolve); 33 | }).then(() => cp.spawnSync('chmod', ['+x', fileicon])); 34 | 35 | process.on('unhandledRejection', (e) => { throw e }); 36 | process.on('uncaughtException', (e) => { 37 | console.error('Error:', e.message); 38 | process.exit(1); 39 | }); 40 | 41 | program.name('iconsur'); 42 | program.version(version); 43 | program.option('-l, --local', 'Directly create an icon locally without searching for an iOS App'); 44 | program.option('-k, --keyword ', 'Specify custom keyword to search for an iOS App'); 45 | program.option('-r, --region ', 'Specify country or region to search (default: us)'); 46 | program.option('-s, --scale ', 'Specify scale for adaptive icon (default: 0.9)'); 47 | program.option('-c, --color ', 'Specify color for adaptive icon (default: ffffff)'); 48 | program.option('-i, --input ', 'Specify custom input image for adaptive icon'); 49 | program.option('-o, --output ', 'Write the generated icon to a file without actually applying to App'); 50 | 51 | program.command('set [otherDirs...]').action(async (dir, otherDirs) => { 52 | if (!otherDirs.length && ~dir.indexOf('*')) { 53 | [dir, ...otherDirs] = glob.sync(dir); 54 | } 55 | 56 | for (let appDir of [dir, ...otherDirs]) { 57 | console.log(`Processing ${appDir}...`); 58 | 59 | appDir = path.resolve(process.cwd(), appDir); 60 | if (!fs.statSync(appDir).isDirectory()) { 61 | console.error(`${appDir}: No such directory`); 62 | process.exit(1); 63 | } 64 | 65 | if (!appDir.endsWith('.app')) { 66 | console.error(`${appDir}: Not an App directory`); 67 | process.exit(1); 68 | } 69 | 70 | let appName = program.keyword; 71 | let srcIconFile = program.input; 72 | if (program.input) { 73 | program.local = true; 74 | } 75 | 76 | try { 77 | const infoPlist = path.join(appDir, 'Contents/Info.plist'); 78 | 79 | // Convert potentially binary plist to xml format 80 | const convertedPlist = path.resolve(os.tmpdir(), `tmp-${Math.random().toFixed(16).substr(2, 6)}.plist`); 81 | cp.spawnSync('plutil', ['-convert', 'xml1', '-o', convertedPlist, '--', infoPlist]); 82 | 83 | const infoPlistContents = plist.parse(fs.readFileSync(convertedPlist, 'utf-8')); 84 | if (!appName) { 85 | appName = infoPlistContents['CFBundleDisplayName'] || path.basename(appDir).replace(/\.app$/, ''); 86 | } 87 | if (!srcIconFile) { 88 | srcIconFile = path.resolve(appDir, 'Contents/Resources', infoPlistContents['CFBundleIconFile']); 89 | if (!/\.icns$/.test(srcIconFile)) { 90 | srcIconFile += '.icns'; 91 | } 92 | } 93 | } catch (e) { 94 | console.log(`Plist file might be corrupted; using fallback name and AppIcon.icns as default icon location.`); 95 | console.log('Re-run with option -k or --keyword to specify custom app name to search for.'); 96 | console.log('Re-run with option -i or --input to specify custom input image for an adaptive icon.'); 97 | 98 | if (!appName) { 99 | appName = path.basename(appDir).replace(/\.app$/, ''); 100 | } 101 | if (!srcIconFile) { 102 | srcIconFile = path.resolve(appDir, 'Contents/Resources/AppIcon.icns'); 103 | } 104 | } 105 | 106 | const imageSize = 1024; 107 | const iconPadding = 100; 108 | const iconSize = imageSize - 2 * iconPadding; 109 | const mask = (await jimp.read(path.join(__dirname, 'mask.png'))).resize(imageSize, imageSize); 110 | const region = program.region || 'us'; 111 | let resultIcon; 112 | let data = null; 113 | 114 | if (!program.local) { 115 | console.log(`Searching iOS App with name: ${appName}`); 116 | const res = await fetch(`https://itunes.apple.com/search?media=software&entity=software%2CiPadSoftware&term=${encodeURIComponent(appName)}&country=${region}&limit=1`); 117 | data = await res.json(); 118 | } 119 | 120 | if (data && data.results && data.results.length) { 121 | const app = data.results[0]; 122 | const appName = app.trackName; 123 | const iconUrl = app.artworkUrl512 || app.artworkUrl100; 124 | console.log(`Found iOS app: ${appName} with icon: ${iconUrl}`); 125 | console.log(`If this app is incorrect, specify the correct name with -k or --keyword, or generate an icon locally with option -l or --local`); 126 | const res = await fetch(iconUrl); 127 | const iconData = await res.buffer(); 128 | resultIcon = (await jimp.read(iconData)).resize(iconSize, iconSize); 129 | } else { 130 | if (!program.local) { 131 | console.log(`Cannot find iOS App with name: ${appName}`); 132 | } 133 | 134 | console.log(`Generating adaptive icon...`); 135 | if (!fs.existsSync(srcIconFile)) { 136 | console.error(`Cannot find icon at ${srcIconFile}`); 137 | process.exit(1); 138 | } 139 | 140 | let iconBuffer = fs.readFileSync(srcIconFile); 141 | 142 | try { 143 | const subIconBuffer = Object.entries(icns.parse(iconBuffer)) 144 | .filter(([k]) => icns.isImageType(k)) 145 | .map(([, v]) => v) 146 | .sort((a, b) => b.length - a.length)[0]; 147 | 148 | if (subIconBuffer) { 149 | iconBuffer = subIconBuffer; 150 | } 151 | } catch (e) { } 152 | 153 | let originalIcon; 154 | try { 155 | originalIcon = await jimp.read(iconBuffer); 156 | } catch (e) { 157 | console.error(`Failed to read original icon: ${e.message}`); 158 | console.error('Re-run with option -i or --input to use a custom image for generation.'); 159 | process.exit(1); 160 | } 161 | 162 | let originalIconScaleSize; 163 | if (originalIcon.hasAlpha()) { 164 | originalIconScaleSize = parseFloat(program.scale || '0.9'); 165 | originalIcon.contain(iconSize * originalIconScaleSize, iconSize * originalIconScaleSize); 166 | } else { 167 | console.log('The original icon image is opaque; thus it will not be scaled down.') 168 | originalIconScaleSize = 1; 169 | originalIcon.cover(iconSize, iconSize); 170 | } 171 | 172 | const scalePosition = iconSize * (1 - originalIconScaleSize) / 2; 173 | resultIcon = (await jimp.create(iconSize, iconSize)).composite(originalIcon, scalePosition, scalePosition); 174 | } 175 | 176 | const image = (await jimp.create(imageSize, imageSize, program.color || '#ffffff')).composite(resultIcon, iconPadding, iconPadding); 177 | 178 | // The masking algorithm that is both alpha- and color-friendly and full of magic 179 | image.scan(0, 0, imageSize, imageSize, (x, y) => { 180 | image.setPixelColor((mask.getPixelColor(x, y) & image.getPixelColor(x, y)) >>> 0, x, y); 181 | }); 182 | 183 | if (program.output) { 184 | program.output = String(program.output).replace(/(\..*)?$/, '.png'); 185 | await image.writeAsync(program.output); 186 | console.log(`Successfully saved icon for ${appDir} at ${program.output}\n`); 187 | } else { 188 | const tmpFile = path.resolve(os.tmpdir(), `tmp-${Math.random().toFixed(16).substr(2, 6)}.png`); 189 | await image.writeAsync(tmpFile); 190 | 191 | await fileiconBinaryReady; 192 | const { status } = cp.spawnSync(fileicon, ['set', appDir, tmpFile], { stdio: 'inherit' }); 193 | if (status) { 194 | console.error(`Failed to set custom icon: fileicon script exited with error ${status}`); 195 | process.exit(1); 196 | } 197 | console.log(`Successfully set icon for ${appDir}\n`); 198 | } 199 | }; 200 | }); 201 | 202 | program.command('unset [otherDirs...]').action(async (dir, otherDirs) => { 203 | if (!otherDirs.length && ~dir.indexOf('*')) { 204 | [dir, ...otherDirs] = glob.sync(dir); 205 | } 206 | 207 | await fileiconBinaryReady; 208 | for (let appDir of [dir, ...otherDirs]) { 209 | const { status } = cp.spawnSync(fileicon, ['rm', appDir], { stdio: 'inherit' }); 210 | if (status) { 211 | console.error(`Failed to remove custom icon: fileicon script exited with error ${status}`); 212 | process.exit(1); 213 | } 214 | } 215 | }); 216 | 217 | program.command('cache').action(() => { 218 | try { 219 | cp.execSync('sudo rm -rf /Library/Caches/com.apple.iconservices.store', { stdio: 'ignore' }); 220 | } catch (e) { } 221 | 222 | try { 223 | cp.execSync('sudo find /private/var/folders/ \\( -name com.apple.dock.iconcache -or -name com.apple.iconservices \\) -exec rm -rf {} \\;', { stdio: 'ignore' }); 224 | } catch (e) { } 225 | 226 | try { 227 | cp.execSync('sleep 3; sudo touch /Applications/*', { stdio: 'ignore' }); 228 | } catch (e) { } 229 | 230 | try { 231 | cp.execSync('killall Dock', { stdio: 'ignore' }); 232 | } catch (e) { } 233 | 234 | try { 235 | cp.execSync('killall Finder', { stdio: 'ignore' }); 236 | } catch (e) { } 237 | 238 | process.exit(); 239 | }); 240 | 241 | program.parse(process.argv); 242 | -------------------------------------------------------------------------------- /src/fileicon.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ### 4 | # Home page: https://github.com/mklement0/fileicon 5 | # Author: Michael Klement (http://same2u.net) 6 | # Invoke with: 7 | # --version for version information 8 | # --help for usage information 9 | ### 10 | 11 | # --- STANDARD SCRIPT-GLOBAL CONSTANTS 12 | 13 | kTHIS_NAME=${BASH_SOURCE##*/} 14 | kTHIS_HOMEPAGE='https://github.com/mklement0/fileicon' 15 | kTHIS_VERSION='v0.3.0' # NOTE: This assignment is automatically updated by `make version VER=` - DO keep the 'v' prefix. 16 | 17 | unset CDPATH # To prevent unpredictable `cd` behavior. 18 | 19 | # --- Begin: STANDARD HELPER FUNCTIONS 20 | 21 | die() { echo "$kTHIS_NAME: ERROR: ${1:-"ABORTING due to unexpected error."}" 1>&2; exit ${2:-1}; } 22 | dieSyntax() { echo "$kTHIS_NAME: ARGUMENT ERROR: ${1:-"Invalid argument(s) specified."} Use -h for help." 1>&2; exit 2; } 23 | 24 | # SYNOPSIS 25 | # openUrl 26 | # DESCRIPTION 27 | # Opens the specified URL in the system's default browser. 28 | openUrl() { 29 | local url=$1 platform=$(uname) cmd=() 30 | case $platform in 31 | 'Darwin') # OSX 32 | cmd=( open "$url" ) 33 | ;; 34 | 'CYGWIN_'*) # Cygwin on Windows; must call cmd.exe with its `start` builtin 35 | cmd=( cmd.exe /c start '' "$url " ) # !! Note the required trailing space. 36 | ;; 37 | 'MINGW32_'*) # MSYS or Git Bash on Windows; they come with a Unix `start` binary 38 | cmd=( start '' "$url" ) 39 | ;; 40 | *) # Otherwise, assume a Freedesktop-compliant OS, which includes many Linux distros, PC-BSD, OpenSolaris, ... 41 | cmd=( xdg-open "$url" ) 42 | ;; 43 | esac 44 | "${cmd[@]}" || { echo "Cannot locate or failed to open default browser; please go to '$url' manually." >&2; return 1; } 45 | } 46 | 47 | # Prints the embedded Markdown-formatted man-page source to stdout. 48 | printManPageSource() { 49 | /usr/bin/sed -n -e $'/^: <<\'EOF_MAN_PAGE\'/,/^EOF_MAN_PAGE/ { s///; t\np;}' "$BASH_SOURCE" 50 | } 51 | 52 | # Opens the man page, if installed; otherwise, tries to display the embedded Markdown-formatted man-page source; if all else fails: tries to display the man page online. 53 | openManPage() { 54 | local pager embeddedText 55 | if ! man 1 "$kTHIS_NAME" 2>/dev/null; then 56 | # 2nd attempt: if present, display the embedded Markdown-formatted man-page source 57 | embeddedText=$(printManPageSource) 58 | if [[ -n $embeddedText ]]; then 59 | pager='more' 60 | command -v less &>/dev/null && pager='less' # see if the non-standard `less` is available, because it's preferable to the POSIX utility `more` 61 | printf '%s\n' "$embeddedText" | "$pager" 62 | else # 3rd attempt: open the the man page on the utility's website 63 | openUrl "${kTHIS_HOMEPAGE}/doc/${kTHIS_NAME}.md" 64 | fi 65 | fi 66 | } 67 | 68 | # Prints the contents of the synopsis chapter of the embedded Markdown-formatted man-page source for quick reference. 69 | printUsage() { 70 | local embeddedText 71 | # Extract usage information from the SYNOPSIS chapter of the embedded Markdown-formatted man-page source. 72 | embeddedText=$(/usr/bin/sed -n -e $'/^: <<\'EOF_MAN_PAGE\'/,/^EOF_MAN_PAGE/!d; /^## SYNOPSIS$/,/^#/{ s///; t\np; }' "$BASH_SOURCE") 73 | if [[ -n $embeddedText ]]; then 74 | # Print extracted synopsis chapter - remove backticks for uncluttered display. 75 | printf '%s\n\n' "$embeddedText" | tr -d '`' 76 | else # No SYNOPIS chapter found; fall back to displaying the man page. 77 | echo "WARNING: usage information not found; opening man page instead." >&2 78 | openManPage 79 | fi 80 | } 81 | 82 | # --- End: STANDARD HELPER FUNCTIONS 83 | 84 | # --- PROCESS STANDARD, OUTPUT-INFO-THEN-EXIT OPTIONS. 85 | case $1 in 86 | --version) 87 | # Output version number and exit, if requested. 88 | ver="v0.3.0"; echo "$kTHIS_NAME $kTHIS_VERSION"$'\nFor license information and more, visit '"$kTHIS_HOMEPAGE"; exit 0 89 | ;; 90 | -h|--help) 91 | # Print usage information and exit. 92 | printUsage; exit 93 | ;; 94 | --man) 95 | # Display the manual page and exit. 96 | openManPage; exit 97 | ;; 98 | --man-source) # private option, used by `make update-doc` 99 | # Print raw, embedded Markdown-formatted man-page source and exit 100 | printManPageSource; exit 101 | ;; 102 | --home) 103 | # Open the home page and exit. 104 | openUrl "$kTHIS_HOMEPAGE"; exit 105 | ;; 106 | esac 107 | 108 | # --- Begin: SPECIFIC HELPER FUNCTIONS 109 | 110 | # NOTE: The functions below operate on byte strings such as the one above: 111 | # A single single string of pairs of hex digits, without separators or line breaks. 112 | # Thus, a given byte position is easily calculated: to get byte $byteIndex, use 113 | # ${byteString:byteIndex*2:2} 114 | 115 | # Outputs the specified EXTENDED ATTRIBUTE VALUE as a byte string (a hex dump that is a single-line string of pairs of hex digits, without separators or line breaks, such as "000A2C". 116 | # IMPORTANT: Hex. digits > 9 use UPPPERCASE characters. 117 | # getAttribByteString 118 | getAttribByteString() { 119 | xattr -px "$2" "$1" | tr -d ' \n' 120 | return ${PIPESTATUS[0]} 121 | } 122 | 123 | # Outputs the specified file's RESOURCE FORK as a byte string (a hex dump that is a single-line string of pairs of hex digits, without separators or line breaks, such as "000a2c". 124 | # IMPORTANT: Hex. digits > 9 use *lowercase* characters. 125 | # Note: This function relies on `xxd -p /..namedfork/rsrc | tr -d '\n'` rather than the conceptually equivalent call, 126 | # `getAttribByteString com.apple.ResourceFork`, for PERFORMANCE reasons: 127 | # getAttribByteString() (defined above) relies on `xattr`, which is a *Python* script [!! seemingly no longer, as of macOS 10.16] 128 | # and therefore quite slow due to Python's startup cost. 129 | # getResourceByteString 130 | getResourceByteString() { 131 | xxd -p "$1"/..namedfork/rsrc | tr -d '\n' 132 | } 133 | 134 | # Patches a single byte in the byte string provided via stdin. 135 | # patchByteInByteString ndx byteSpec 136 | # ndx is the 0-based byte index 137 | # - If has NO prefix: becomes the new byte 138 | # - If has prefix '|': "adds" the value: the result of a bitwise OR with the existing byte becomes the new byte 139 | # - If has prefix '~': "removes" the value: the result of a applying a bitwise AND with the bitwise complement of to the existing byte becomes the new byte 140 | patchByteInByteString() { 141 | local ndx=$1 byteSpec=$2 byteVal byteStr charPos op='' charsBefore='' charsAfter='' currByte 142 | byteStr=$( 0 && charPos < ${#byteStr} )) || return 1 161 | # Determine the target byte, and strings before and after the byte to patch. 162 | (( charPos >= 2 )) && charsBefore=${byteStr:0:charPos} 163 | charsAfter=${byteStr:charPos + 2} 164 | # Determine the new byte value 165 | if [[ -n $op ]]; then 166 | currByte=${byteStr:charPos:2} 167 | printf -v patchedByte '%02X' "$(( 0x${currByte} $op 0x${byteVal} ))" 168 | else 169 | patchedByte=$byteSpec 170 | fi 171 | printf '%s%s%s' "$charsBefore" "$patchedByte" "$charsAfter" 172 | } 173 | 174 | # hasAttrib 175 | hasAttrib() { 176 | xattr "$1" | /usr/bin/grep -Fqx "$2" 177 | } 178 | 179 | # hasIconsResource 180 | hasIconsResource() { 181 | local file=$1 182 | getResourceByteString "$file" | /usr/bin/grep -Fq "$kMAGICBYTES_ICNS_RESOURCE" 183 | } 184 | 185 | 186 | # setCustomIcon 187 | setCustomIcon() { 188 | 189 | local fileOrFolder=$1 imgFile=$2 190 | 191 | [[ (-f $fileOrFolder || -d $fileOrFolder) && -r $fileOrFolder && -w $fileOrFolder ]] || return 3 192 | [[ -f $imgFile ]] || return 3 193 | 194 | # !! 195 | # !! Sadly, Apple decided to remove the `-i` / `--addicon` option from the `sips` utility. 196 | # !! Therefore, use of *Cocoa* is required, which we do *via Python*, which has the added advantage 197 | # !! of creating a *set* of icons from the source image, scaling as necessary to create a 198 | # !! 512 x 512 top resolution icon (whereas sips -i created a single, 128 x 128 icon). 199 | # !! Thanks, https://apple.stackexchange.com/a/161984/28668 200 | # !! 201 | # !! Note: setIcon_forFile_options_() seemingly always indicates True, even with invalid image files, so 202 | # !! we attempt no error handling in the Python code. 203 | 204 | # macOS versions <= 12.2: 205 | # * Use the 2.x system python, which comes with the pyobjc packages preinstalled. 206 | if [[ -x /usr/bin/python && -z $__FILEICON_USEPY3 ]]; then 207 | 208 | /usr/bin/python - "$imgFile" "$fileOrFolder" <<'EOF' || return 209 | import sys, Cocoa 210 | Cocoa.NSWorkspace.sharedWorkspace().setIcon_forFile_options_(Cocoa.NSImage.alloc().initWithContentsOfFile_(sys.argv[1].decode('utf-8')), sys.argv[2].decode('utf-8'), 0) 211 | EOF 212 | # macOS versions >= 12.3, where the v2.x /usr/bin/python has been removed, or 213 | # if Python 3 is explicitly requested via a non-empty $__FILEICON_USEPY3 env. var: 214 | # * Use the first `python3` in the $PATH, which by default is the STUB at 215 | # /usr/bin/python3 that triggers a download-on-demand prompt as part of the 216 | # Xcode command-line tools. 217 | # For users that have a Homebrew 3.x Python installation, *it* will be used, 218 | # assuming its binary comes *first* in $PATH. 219 | else 220 | 221 | local done=0 retrying=0 output 222 | while (( ! done )); do 223 | # Note: The only difference to the v2.x Python code above is the removal of the .decode('utf-8') 224 | # calls, which are no longer necessary in v3.x. 225 | output="$(python3 - "$imgFile" "$fileOrFolder" 2>&1 <<'EOF' 226 | import sys, Cocoa 227 | Cocoa.NSWorkspace.sharedWorkspace().setIcon_forFile_options_(Cocoa.NSImage.alloc().initWithContentsOfFile_(sys.argv[1]), sys.argv[2], 0) 228 | EOF 229 | )" 230 | local ec=$? packageNames='pyobjc-core pyobjc-framework-Cocoa' 231 | done=1 232 | if (( ec )); then # The call failed. 233 | (( retrying )) && die "An unexpected error occured: $output" # Even on-demand pyobjc installation failed -> abort. 234 | # First, make sure that `python3` is actually Python, and not just the *stub* executable. 235 | python3 --version | /usr/bin/grep -q ' 3.' || die "The 'python3' binary in your path is not functional, presumably because it is the preinstalled stub at /usr/bin/python3 that triggers a prompt for on-demand installation. Perform this installation, or, if you have Homebrew installed, install Python 3 with \`brew install python@3\`" 236 | # Assume that the problem is the absence of the required pyobjc-* packages; attempt installation now. 237 | # Tips for debugging: 238 | # * To exercise this function, from the repo dir.: 239 | # touch /tmp/tf; ./bin/fileicon set /tmp/tf ./test/.fixtures/img.png 240 | # * To manage packages; prepend `sudo -H` to see machine-level packages 241 | # pip3 list -v # shows installed packages and their locations 242 | # pip3 uninstall -y pyobjc-core pyobjc-framework-Cocoa # uninstalls the required pyobjc-* packages 243 | # * To manage pip3's package *cache* 244 | # pip3 cache list # list cached packages 245 | # pip3 cache purge # clear cache 246 | # pip config set global.cache-dir false # disable cache globally 247 | # pip config unset global.cache-dir # re-enable globacl cache 248 | echo "Performing one-time user-level installation of required Python packages: $packageNames - this can take while..." >&2 249 | pip3 install -q --user $packageNames || die "On-demand installation of Python packages failed unexpectedly." 250 | done=0 retrying=1 # Retry 251 | fi 252 | 253 | done 254 | 255 | fi 256 | 257 | # Verify that a resource fork with icons was actually created. 258 | # For *files*, the resource fork is embedded in the file itself. 259 | # For *folders* a hidden file named $'Icon\r' is created *inside the folder*. 260 | [[ -d $fileOrFolder ]] && fileWithResourceFork=${fileOrFolder}/$kFILENAME_FOLDERCUSTOMICON || fileWithResourceFork=$fileOrFolder 261 | hasIconsResource "$fileWithResourceFork" || { 262 | cat >&2 < 274 | getCustomIcon() { 275 | 276 | local fileOrFolder=$1 icnsOutFile=$2 byteStr fileWithResourceFork byteOffset byteCount 277 | 278 | [[ (-f $fileOrFolder || -d $fileOrFolder) && -r $fileOrFolder ]] || return 3 279 | 280 | # Determine what file to extract the resource fork from. 281 | if [[ -d $fileOrFolder ]]; then 282 | fileWithResourceFork=${fileOrFolder}/$kFILENAME_FOLDERCUSTOMICON 283 | [[ -f $fileWithResourceFork ]] || { echo "Custom-icon file does not exist: '${fileWithResourceFork/$'\r'/\\r}'" >&2; return 1; } 284 | else 285 | fileWithResourceFork=$fileOrFolder 286 | fi 287 | 288 | # Determine (based on format description at https://en.wikipedia.org/wiki/Apple_Icon_Image_format): 289 | # - the byte offset at which the icns resource begins, via the magic literal identifying an icns resource 290 | # - the length of the resource, which is encoded in the 4 bytes right after the magic literal. 291 | read -r byteOffset byteCount < <(getResourceByteString "$fileWithResourceFork" | /usr/bin/awk -F "$kMAGICBYTES_ICNS_RESOURCE" '{ printf "%s %d", (length($1) + 2) / 2, "0x" substr($2, 0, 8) }') 292 | (( byteOffset > 0 && byteCount > 0 )) || { echo "Custom-icon file contains no icons resource: '${fileWithResourceFork/$'\r'/\\r}'" >&2; return 1; } 293 | 294 | # Extract the actual bytes using tail and head and save them to the output file. 295 | tail -c "+${byteOffset}" "$fileWithResourceFork/..namedfork/rsrc" | head -c $byteCount > "$icnsOutFile" || return 296 | 297 | return 0 298 | } 299 | 300 | # removeCustomIcon 301 | removeCustomIcon() { 302 | 303 | local fileOrFolder=$1 byteStr 304 | 305 | [[ (-f $fileOrFolder || -d $fileOrFolder) && -r $fileOrFolder && -w $fileOrFolder ]] || return 1 306 | 307 | # Step 1: Turn off the custom-icon flag in the com.apple.FinderInfo extended attribute. 308 | if hasAttrib "$fileOrFolder" com.apple.FinderInfo; then 309 | byteStr=$(getAttribByteString "$fileOrFolder" com.apple.FinderInfo | patchByteInByteString $kFI_BYTEOFFSET_CUSTOMICON '~'$kFI_VAL_CUSTOMICON) || return 310 | if [[ $byteStr == "$kFI_BYTES_BLANK" ]]; then # All bytes cleared? Remove the entire attribute. 311 | xattr -d com.apple.FinderInfo "$fileOrFolder" 312 | else # Update the attribute. 313 | xattr -wx com.apple.FinderInfo "$byteStr" "$fileOrFolder" || return 314 | fi 315 | fi 316 | 317 | # Step 2: Remove the resource fork (if target is a file) / hidden file with custom icon (if target is a folder) 318 | if [[ -d $fileOrFolder ]]; then 319 | rm -f "${fileOrFolder}/${kFILENAME_FOLDERCUSTOMICON}" 320 | else 321 | if hasIconsResource "$fileOrFolder"; then 322 | xattr -d com.apple.ResourceFork "$fileOrFolder" 323 | fi 324 | fi 325 | 326 | return 0 327 | } 328 | 329 | # testForCustomIcon 330 | testForCustomIcon() { 331 | 332 | local fileOrFolder=$1 byteStr byteVal fileWithResourceFork 333 | 334 | [[ (-f $fileOrFolder || -d $fileOrFolder) && -r $fileOrFolder ]] || return 3 335 | 336 | # Step 1: Check if the com.apple.FinderInfo extended attribute has the custom-icon 337 | # flag set. 338 | byteStr=$(getAttribByteString "$fileOrFolder" com.apple.FinderInfo 2>/dev/null) || return 1 339 | 340 | byteVal=${byteStr:2*kFI_BYTEOFFSET_CUSTOMICON:2} 341 | 342 | (( byteVal & kFI_VAL_CUSTOMICON )) || return 1 343 | 344 | # Step 2: Check if the resource fork of the relevant file contains an icns resource 345 | if [[ -d $fileOrFolder ]]; then 346 | fileWithResourceFork=${fileOrFolder}/${kFILENAME_FOLDERCUSTOMICON} 347 | else 348 | fileWithResourceFork=$fileOrFolder 349 | fi 350 | 351 | hasIconsResource "$fileWithResourceFork" || return 1 352 | 353 | return 0 354 | } 355 | 356 | # --- End: SPECIFIC HELPER FUNCTIONS 357 | 358 | # --- Begin: SPECIFIC SCRIPT-GLOBAL CONSTANTS 359 | 360 | kFILENAME_FOLDERCUSTOMICON=$'Icon\r' 361 | 362 | # The blank hex dump form (single string of pairs of hex digits) of the 32-byte data structure stored in extended attribute 363 | # com.apple.FinderInfo 364 | kFI_BYTES_BLANK='0000000000000000000000000000000000000000000000000000000000000000' 365 | 366 | # The hex dump form of the full 32 bytes that Finder assigns to the hidden $'Icon\r' 367 | # file whose com.apple.ResourceFork extended attribute contains the icon image data for the enclosing folder. 368 | # The first 8 bytes spell out the magic literal 'iconMACS'; they are followed by the invisibility flag, '40' in the 9th byte, and '10' (?? specifying what?) 369 | # in the 10th byte. 370 | # NOTE: Since file $'Icon\r' serves no other purpose than to store the icon, it is 371 | # safe to simply assign all 32 bytes blindly, without having to worry about 372 | # preserving existing values. 373 | kFI_BYTES_CUSTOMICONFILEFORFOLDER='69636F6E4D414353401000000000000000000000000000000000000000000000' 374 | 375 | # The hex dump form of the magic literal inside a resource fork that marks the 376 | # start of an icns (icons) resource. 377 | # NOTE: This will be used with `xxd -p .. | tr -d '\n'`, which uses *lowercase* 378 | # hex digits, so we must use lowercase here. 379 | kMAGICBYTES_ICNS_RESOURCE='69636e73' 380 | 381 | # The byte values (as hex strings) of the flags at the relevant byte position 382 | # of the com.apple.FinderInfo extended attribute. 383 | kFI_VAL_CUSTOMICON='04' 384 | 385 | # The custom-icon-flag byte offset in the com.apple.FinderInfo extended attribute. 386 | kFI_BYTEOFFSET_CUSTOMICON=8 387 | 388 | # --- End: SPECIFIC SCRIPT-GLOBAL CONSTANTS 389 | 390 | # Option defaults. 391 | force=0 quiet=0 392 | 393 | # --- Begin: OPTIONS PARSING 394 | allowOptsAfterOperands=1 operands=() i=0 optName= isLong=0 prefix= optArg= haveOptArgAttached=0 haveOptArgAsNextArg=0 acceptOptArg=0 needOptArg=0 395 | while (( $# )); do 396 | if [[ $1 =~ ^(-)[a-zA-Z0-9]+.*$ || $1 =~ ^(--)[a-zA-Z0-9]+.*$ ]]; then # an option: either a short option / multiple short options in compressed form or a long option 397 | prefix=${BASH_REMATCH[1]}; [[ $prefix == '--' ]] && isLong=1 || isLong=0 398 | for (( i = 1; i < (isLong ? 2 : ${#1}); i++ )); do 399 | acceptOptArg=0 needOptArg=0 haveOptArgAttached=0 haveOptArgAsNextArg=0 optArgAttached= optArgOpt= optArgReq= 400 | if (( isLong )); then # long option: parse into name and, if present, argument 401 | optName=${1:2} 402 | [[ $optName =~ ^([^=]+)=(.*)$ ]] && { optName=${BASH_REMATCH[1]}; optArgAttached=${BASH_REMATCH[2]}; haveOptArgAttached=1; } 403 | else # short option: *if* it takes an argument, the rest of the string, if any, is by definition the argument. 404 | optName=${1:i:1}; optArgAttached=${1:i+1}; (( ${#optArgAttached} >= 1 )) && haveOptArgAttached=1 405 | fi 406 | (( haveOptArgAttached )) && optArgOpt=$optArgAttached optArgReq=$optArgAttached || { (( $# > 1 )) && { optArgReq=$2; haveOptArgAsNextArg=1; }; } 407 | # ---- BEGIN: CUSTOMIZE HERE 408 | case $optName in 409 | f|force) 410 | force=1 411 | ;; 412 | q|quiet) 413 | quiet=1 414 | ;; 415 | *) 416 | dieSyntax "Unknown option: ${prefix}${optName}." 417 | ;; 418 | esac 419 | # ---- END: CUSTOMIZE HERE 420 | (( needOptArg )) && { (( ! haveOptArgAttached && ! haveOptArgAsNextArg )) && dieSyntax "Option ${prefix}${optName} is missing its argument." || (( haveOptArgAsNextArg )) && shift; } 421 | (( acceptOptArg || needOptArg )) && break 422 | done 423 | else # an operand 424 | if [[ $1 == '--' ]]; then 425 | shift; operands+=( "$@" ); break 426 | elif (( allowOptsAfterOperands )); then 427 | operands+=( "$1" ) # continue 428 | else 429 | operands=( "$@" ) 430 | break 431 | fi 432 | fi 433 | shift 434 | done 435 | (( "${#operands[@]}" > 0 )) && set -- "${operands[@]}"; unset allowOptsAfterOperands operands i optName isLong prefix optArgAttached haveOptArgAttached haveOptArgAsNextArg acceptOptArg needOptArg 436 | # --- End: OPTIONS PARSING: "$@" now contains all operands (non-option arguments). 437 | 438 | # Validate the command 439 | cmd=$(printf %s "$1" | tr '[:upper:]' '[:lower:]') # translate to all-lowercase - we don't want the command name to be case-sensitive 440 | [[ $cmd == 'remove' ]] && cmd='rm' # support alias 'remove' for 'rm' 441 | case $cmd in 442 | set|get|rm|remove|test) 443 | shift 444 | ;; 445 | *) 446 | dieSyntax "Unrecognized or missing command: '$cmd'." 447 | ;; 448 | esac 449 | 450 | # Validate file operands 451 | (( $# > 0 )) || dieSyntax "Missing operand(s)." 452 | 453 | # Target file or folder. 454 | targetFileOrFolder=$1 imgFile= outFile= 455 | [[ -f $targetFileOrFolder || -d $targetFileOrFolder ]] || die "Target not found or neither file nor folder: '$targetFileOrFolder'" 456 | # Make sure the target file/folder is readable, and, unless only getting or testing for an icon are requested, writeable too. 457 | [[ -r $targetFileOrFolder ]] || die "Cannot access '$targetFileOrFolder': you do not have read permissions." 458 | [[ $cmd == 'test' || $cmd == 'get' || -w $targetFileOrFolder ]] || die "Cannot modify '$targetFileOrFolder': you do not have write permissions." 459 | 460 | # Other operands, if any, and their number. 461 | valid=0 462 | case $cmd in 463 | 'set') 464 | (( $# <= 2 )) && { 465 | valid=1 466 | # If no image file was specified, the target file is assumed to be an image file itself whose image should be self-assigned as an icon. 467 | (( $# == 2 )) && imgFile=$2 || imgFile=$1 468 | # !! Apparently, a regular file is required - a process subsitution such 469 | # !! as `<(base64 -D ' 552 | # - All other headings should be level-2 headings in ALL-CAPS. 553 | # - TEXT 554 | # - Use NO indentation for regular chapter text; if you do, it will 555 | # be indented further than list items. 556 | # - Use 4-space indentation, as usual, for code blocks. 557 | # - Markup character-styling markup translates to ROFF rendering as follows: 558 | # `...` and **...** render as bolded (red) text 559 | # _..._ and *...* render as word-individually underlined text 560 | # - LISTS 561 | # - Indent list items by 2 spaces for better plain-text viewing, but note 562 | # that the ROFF generated by marked-man still renders them unindented. 563 | # - End every list item (bullet point) itself with 2 trailing spaces too so 564 | # that it renders on its own line. 565 | # - Avoid associating more than 1 paragraph with a list item, if possible, 566 | # because it requires the following trick, which hampers plain-text readability: 567 | # Use ' ' in lieu of an empty line. 568 | #### 569 | : <<'EOF_MAN_PAGE' 570 | # fileicon(1) - manage file and folder custom icons 571 | 572 | ## SYNOPSIS 573 | 574 | Manage custom icons for files and folders on macOS. 575 | 576 | SET a custom icon for a file or folder: 577 | 578 | fileicon set [] 579 | 580 | REMOVE a custom icon from a file or folder: 581 | 582 | fileicon rm 583 | 584 | GET a file or folder's custom icon: 585 | 586 | fileicon get [-f] [] 587 | 588 | -f ... force replacement of existing output file 589 | 590 | TEST if a file or folder has a custom icon: 591 | 592 | fileicon test 593 | 594 | All forms: option -q silences status output. 595 | 596 | Standard options: `--help`, `--man`, `--version`, `--home` 597 | 598 | ## DESCRIPTION 599 | 600 | `` is the file or folder whose custom icon should be managed. 601 | Note that symlinks are followed to their (ultimate target); that is, you 602 | can only assign custom icons to regular files and folders, not to symlinks 603 | to them. 604 | 605 | `` can be an image file of any format supported by the system. 606 | It is converted to an icon and assigned to ``. 607 | If you omit ``, `` must itself be an image file whose 608 | image should become its own icon. 609 | 610 | `` specifies the file to extract the custom icon to: 611 | Defaults to the filename of `` with extension `.icns` appended. 612 | If a value is specified, extension `.icns` is appended, unless already present. 613 | Either way, extraction fails if the target file already exists; use `-f` to 614 | override. 615 | Specify `-` to extract to stdout. 616 | 617 | Command `test` signals with its exit code whether a custom icon is set (0) 618 | or not (1); any other exit code signals an unexpected error. 619 | 620 | **Options**: 621 | 622 | * `-f`, `--force` 623 | When getting (extracting) a custom icon, forces replacement of the 624 | output file, if it already exists. 625 | 626 | * `-q`, `--quiet` 627 | Suppresses output of the status information that is by default output to 628 | stdout. 629 | Note that errors and warnings are still printed to stderr. 630 | 631 | ## NOTES 632 | 633 | Custom icons are stored in extended attributes of the HFS+ filesystem. 634 | Thus, if you copy files or folders to a different filesystem that doesn't 635 | support such attributes, custom icons are lost; for instance, custom icons 636 | cannot be stored in a Git repository. 637 | 638 | To determine if a give file or folder has extended attributes, use 639 | `ls -l@ `. 640 | 641 | When setting an image as a custom icon, a set of icons with several resolutions 642 | is created, with the highest resolution at 512 x 512 pixels. 643 | 644 | All icons created are square, so images with a non-square aspect ratio will 645 | appear distorted; for best results, use square imges. 646 | 647 | ## STANDARD OPTIONS 648 | 649 | All standard options provide information only. 650 | 651 | * `-h, --help` 652 | Prints the contents of the synopsis chapter to stdout for quick reference. 653 | 654 | * `--man` 655 | Displays this manual page, which is a helpful alternative to using `man`, 656 | if the manual page isn't installed. 657 | 658 | * `--version` 659 | Prints version information. 660 | 661 | * `--home` 662 | Opens this utility's home page in the system's default web browser. 663 | 664 | ## LICENSE 665 | 666 | For license information and more, visit the home page by running 667 | `fileicon --home` 668 | 669 | EOF_MAN_PAGE 670 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@types/node': ^14.0.27 5 | commander: ^6.0.0 6 | cross-fetch: ^3.1.5 7 | glob: ^7.1.6 8 | icns-lib: ^1.0.1 9 | jimp: ^0.14.0 10 | pkg: ^5.6.0 11 | plist: ^3.0.5 12 | 13 | dependencies: 14 | commander: 6.2.1 15 | cross-fetch: 3.1.5 16 | glob: 7.2.0 17 | icns-lib: 1.0.1 18 | jimp: 0.14.0 19 | plist: 3.0.5 20 | 21 | devDependencies: 22 | '@types/node': 14.18.12 23 | pkg: 5.6.0 24 | 25 | packages: 26 | 27 | /@babel/helper-validator-identifier/7.16.7: 28 | resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} 29 | engines: {node: '>=6.9.0'} 30 | dev: true 31 | 32 | /@babel/parser/7.16.2: 33 | resolution: {integrity: sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==} 34 | engines: {node: '>=6.0.0'} 35 | hasBin: true 36 | dev: true 37 | 38 | /@babel/runtime/7.17.9: 39 | resolution: {integrity: sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==} 40 | engines: {node: '>=6.9.0'} 41 | dependencies: 42 | regenerator-runtime: 0.13.9 43 | dev: false 44 | 45 | /@babel/types/7.16.0: 46 | resolution: {integrity: sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==} 47 | engines: {node: '>=6.9.0'} 48 | dependencies: 49 | '@babel/helper-validator-identifier': 7.16.7 50 | to-fast-properties: 2.0.0 51 | dev: true 52 | 53 | /@jimp/bmp/0.14.0_@jimp+custom@0.14.0: 54 | resolution: {integrity: sha512-5RkX6tSS7K3K3xNEb2ygPuvyL9whjanhoaB/WmmXlJS6ub4DjTqrapu8j4qnIWmO4YYtFeTbDTXV6v9P1yMA5A==} 55 | peerDependencies: 56 | '@jimp/custom': '>=0.3.5' 57 | dependencies: 58 | '@babel/runtime': 7.17.9 59 | '@jimp/custom': 0.14.0 60 | '@jimp/utils': 0.14.0 61 | bmp-js: 0.1.0 62 | dev: false 63 | 64 | /@jimp/core/0.14.0: 65 | resolution: {integrity: sha512-S62FcKdtLtj3yWsGfJRdFXSutjvHg7aQNiFogMbwq19RP4XJWqS2nOphu7ScB8KrSlyy5nPF2hkWNhLRLyD82w==} 66 | dependencies: 67 | '@babel/runtime': 7.17.9 68 | '@jimp/utils': 0.14.0 69 | any-base: 1.1.0 70 | buffer: 5.7.1 71 | exif-parser: 0.1.12 72 | file-type: 9.0.0 73 | load-bmfont: 1.4.1 74 | mkdirp: 0.5.6 75 | phin: 2.9.3 76 | pixelmatch: 4.0.2 77 | tinycolor2: 1.4.2 78 | dev: false 79 | 80 | /@jimp/custom/0.14.0: 81 | resolution: {integrity: sha512-kQJMeH87+kWJdVw8F9GQhtsageqqxrvzg7yyOw3Tx/s7v5RToe8RnKyMM+kVtBJtNAG+Xyv/z01uYQ2jiZ3GwA==} 82 | dependencies: 83 | '@babel/runtime': 7.17.9 84 | '@jimp/core': 0.14.0 85 | dev: false 86 | 87 | /@jimp/gif/0.14.0_@jimp+custom@0.14.0: 88 | resolution: {integrity: sha512-DHjoOSfCaCz72+oGGEh8qH0zE6pUBaBxPxxmpYJjkNyDZP7RkbBkZJScIYeQ7BmJxmGN4/dZn+MxamoQlr+UYg==} 89 | peerDependencies: 90 | '@jimp/custom': '>=0.3.5' 91 | dependencies: 92 | '@babel/runtime': 7.17.9 93 | '@jimp/custom': 0.14.0 94 | '@jimp/utils': 0.14.0 95 | gifwrap: 0.9.4 96 | omggif: 1.0.10 97 | dev: false 98 | 99 | /@jimp/jpeg/0.14.0_@jimp+custom@0.14.0: 100 | resolution: {integrity: sha512-561neGbr+87S/YVQYnZSTyjWTHBm9F6F1obYHiyU3wVmF+1CLbxY3FQzt4YolwyQHIBv36Bo0PY2KkkU8BEeeQ==} 101 | peerDependencies: 102 | '@jimp/custom': '>=0.3.5' 103 | dependencies: 104 | '@babel/runtime': 7.17.9 105 | '@jimp/custom': 0.14.0 106 | '@jimp/utils': 0.14.0 107 | jpeg-js: 0.4.3 108 | dev: false 109 | 110 | /@jimp/plugin-blit/0.14.0_@jimp+custom@0.14.0: 111 | resolution: {integrity: sha512-YoYOrnVHeX3InfgbJawAU601iTZMwEBZkyqcP1V/S33Qnz9uzH1Uj1NtC6fNgWzvX6I4XbCWwtr4RrGFb5CFrw==} 112 | peerDependencies: 113 | '@jimp/custom': '>=0.3.5' 114 | dependencies: 115 | '@babel/runtime': 7.17.9 116 | '@jimp/custom': 0.14.0 117 | '@jimp/utils': 0.14.0 118 | dev: false 119 | 120 | /@jimp/plugin-blur/0.14.0_@jimp+custom@0.14.0: 121 | resolution: {integrity: sha512-9WhZcofLrT0hgI7t0chf7iBQZib//0gJh9WcQMUt5+Q1Bk04dWs8vTgLNj61GBqZXgHSPzE4OpCrrLDBG8zlhQ==} 122 | peerDependencies: 123 | '@jimp/custom': '>=0.3.5' 124 | dependencies: 125 | '@babel/runtime': 7.17.9 126 | '@jimp/custom': 0.14.0 127 | '@jimp/utils': 0.14.0 128 | dev: false 129 | 130 | /@jimp/plugin-circle/0.14.0_@jimp+custom@0.14.0: 131 | resolution: {integrity: sha512-o5L+wf6QA44tvTum5HeLyLSc5eVfIUd5ZDVi5iRfO4o6GT/zux9AxuTSkKwnjhsG8bn1dDmywAOQGAx7BjrQVA==} 132 | peerDependencies: 133 | '@jimp/custom': '>=0.3.5' 134 | dependencies: 135 | '@babel/runtime': 7.17.9 136 | '@jimp/custom': 0.14.0 137 | '@jimp/utils': 0.14.0 138 | dev: false 139 | 140 | /@jimp/plugin-color/0.14.0_@jimp+custom@0.14.0: 141 | resolution: {integrity: sha512-JJz512SAILYV0M5LzBb9sbOm/XEj2fGElMiHAxb7aLI6jx+n0agxtHpfpV/AePTLm1vzzDxx6AJxXbKv355hBQ==} 142 | peerDependencies: 143 | '@jimp/custom': '>=0.3.5' 144 | dependencies: 145 | '@babel/runtime': 7.17.9 146 | '@jimp/custom': 0.14.0 147 | '@jimp/utils': 0.14.0 148 | tinycolor2: 1.4.2 149 | dev: false 150 | 151 | /@jimp/plugin-contain/0.14.0_04f2eb7c5fcee3779cc9de0411145f1d: 152 | resolution: {integrity: sha512-RX2q233lGyaxiMY6kAgnm9ScmEkNSof0hdlaJAVDS1OgXphGAYAeSIAwzESZN4x3ORaWvkFefeVH9O9/698Evg==} 153 | peerDependencies: 154 | '@jimp/custom': '>=0.3.5' 155 | '@jimp/plugin-blit': '>=0.3.5' 156 | '@jimp/plugin-resize': '>=0.3.5' 157 | '@jimp/plugin-scale': '>=0.3.5' 158 | dependencies: 159 | '@babel/runtime': 7.17.9 160 | '@jimp/custom': 0.14.0 161 | '@jimp/plugin-blit': 0.14.0_@jimp+custom@0.14.0 162 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0 163 | '@jimp/plugin-scale': 0.14.0_1b5204e571b7e69f994f3f739149c190 164 | '@jimp/utils': 0.14.0 165 | dev: false 166 | 167 | /@jimp/plugin-cover/0.14.0_132cab346e98a8a22cf9ce3f0298c53c: 168 | resolution: {integrity: sha512-0P/5XhzWES4uMdvbi3beUgfvhn4YuQ/ny8ijs5kkYIw6K8mHcl820HahuGpwWMx56DJLHRl1hFhJwo9CeTRJtQ==} 169 | peerDependencies: 170 | '@jimp/custom': '>=0.3.5' 171 | '@jimp/plugin-crop': '>=0.3.5' 172 | '@jimp/plugin-resize': '>=0.3.5' 173 | '@jimp/plugin-scale': '>=0.3.5' 174 | dependencies: 175 | '@babel/runtime': 7.17.9 176 | '@jimp/custom': 0.14.0 177 | '@jimp/plugin-crop': 0.14.0_@jimp+custom@0.14.0 178 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0 179 | '@jimp/plugin-scale': 0.14.0_1b5204e571b7e69f994f3f739149c190 180 | '@jimp/utils': 0.14.0 181 | dev: false 182 | 183 | /@jimp/plugin-crop/0.14.0_@jimp+custom@0.14.0: 184 | resolution: {integrity: sha512-Ojtih+XIe6/XSGtpWtbAXBozhCdsDMmy+THUJAGu2x7ZgKrMS0JotN+vN2YC3nwDpYkM+yOJImQeptSfZb2Sug==} 185 | peerDependencies: 186 | '@jimp/custom': '>=0.3.5' 187 | dependencies: 188 | '@babel/runtime': 7.17.9 189 | '@jimp/custom': 0.14.0 190 | '@jimp/utils': 0.14.0 191 | dev: false 192 | 193 | /@jimp/plugin-displace/0.14.0_@jimp+custom@0.14.0: 194 | resolution: {integrity: sha512-c75uQUzMgrHa8vegkgUvgRL/PRvD7paFbFJvzW0Ugs8Wl+CDMGIPYQ3j7IVaQkIS+cAxv+NJ3TIRBQyBrfVEOg==} 195 | peerDependencies: 196 | '@jimp/custom': '>=0.3.5' 197 | dependencies: 198 | '@babel/runtime': 7.17.9 199 | '@jimp/custom': 0.14.0 200 | '@jimp/utils': 0.14.0 201 | dev: false 202 | 203 | /@jimp/plugin-dither/0.14.0_@jimp+custom@0.14.0: 204 | resolution: {integrity: sha512-g8SJqFLyYexXQQsoh4dc1VP87TwyOgeTElBcxSXX2LaaMZezypmxQfLTzOFzZoK8m39NuaoH21Ou1Ftsq7LzVQ==} 205 | peerDependencies: 206 | '@jimp/custom': '>=0.3.5' 207 | dependencies: 208 | '@babel/runtime': 7.17.9 209 | '@jimp/custom': 0.14.0 210 | '@jimp/utils': 0.14.0 211 | dev: false 212 | 213 | /@jimp/plugin-fisheye/0.14.0_@jimp+custom@0.14.0: 214 | resolution: {integrity: sha512-BFfUZ64EikCaABhCA6mR3bsltWhPpS321jpeIQfJyrILdpFsZ/OccNwCgpW1XlbldDHIoNtXTDGn3E+vCE7vDg==} 215 | peerDependencies: 216 | '@jimp/custom': '>=0.3.5' 217 | dependencies: 218 | '@babel/runtime': 7.17.9 219 | '@jimp/custom': 0.14.0 220 | '@jimp/utils': 0.14.0 221 | dev: false 222 | 223 | /@jimp/plugin-flip/0.14.0_21b3d863db80a865c28da82979224ca7: 224 | resolution: {integrity: sha512-WtL1hj6ryqHhApih+9qZQYA6Ye8a4HAmdTzLbYdTMrrrSUgIzFdiZsD0WeDHpgS/+QMsWwF+NFmTZmxNWqKfXw==} 225 | peerDependencies: 226 | '@jimp/custom': '>=0.3.5' 227 | '@jimp/plugin-rotate': '>=0.3.5' 228 | dependencies: 229 | '@babel/runtime': 7.17.9 230 | '@jimp/custom': 0.14.0 231 | '@jimp/plugin-rotate': 0.14.0_6a26553348442491f47014d5048cf1c5 232 | '@jimp/utils': 0.14.0 233 | dev: false 234 | 235 | /@jimp/plugin-gaussian/0.14.0_@jimp+custom@0.14.0: 236 | resolution: {integrity: sha512-uaLwQ0XAQoydDlF9tlfc7iD9drYPriFe+jgYnWm8fbw5cN+eOIcnneEX9XCOOzwgLPkNCxGox6Kxjn8zY6GxtQ==} 237 | peerDependencies: 238 | '@jimp/custom': '>=0.3.5' 239 | dependencies: 240 | '@babel/runtime': 7.17.9 241 | '@jimp/custom': 0.14.0 242 | '@jimp/utils': 0.14.0 243 | dev: false 244 | 245 | /@jimp/plugin-invert/0.14.0_@jimp+custom@0.14.0: 246 | resolution: {integrity: sha512-UaQW9X9vx8orQXYSjT5VcITkJPwDaHwrBbxxPoDG+F/Zgv4oV9fP+udDD6qmkgI9taU+44Fy+zm/J/gGcMWrdg==} 247 | peerDependencies: 248 | '@jimp/custom': '>=0.3.5' 249 | dependencies: 250 | '@babel/runtime': 7.17.9 251 | '@jimp/custom': 0.14.0 252 | '@jimp/utils': 0.14.0 253 | dev: false 254 | 255 | /@jimp/plugin-mask/0.14.0_@jimp+custom@0.14.0: 256 | resolution: {integrity: sha512-tdiGM69OBaKtSPfYSQeflzFhEpoRZ+BvKfDEoivyTjauynbjpRiwB1CaiS8En1INTDwzLXTT0Be9SpI3LkJoEA==} 257 | peerDependencies: 258 | '@jimp/custom': '>=0.3.5' 259 | dependencies: 260 | '@babel/runtime': 7.17.9 261 | '@jimp/custom': 0.14.0 262 | '@jimp/utils': 0.14.0 263 | dev: false 264 | 265 | /@jimp/plugin-normalize/0.14.0_@jimp+custom@0.14.0: 266 | resolution: {integrity: sha512-AfY8sqlsbbdVwFGcyIPy5JH/7fnBzlmuweb+Qtx2vn29okq6+HelLjw2b+VT2btgGUmWWHGEHd86oRGSoWGyEQ==} 267 | peerDependencies: 268 | '@jimp/custom': '>=0.3.5' 269 | dependencies: 270 | '@babel/runtime': 7.17.9 271 | '@jimp/custom': 0.14.0 272 | '@jimp/utils': 0.14.0 273 | dev: false 274 | 275 | /@jimp/plugin-print/0.14.0_59cf2c48948cca49b82b3ff5e6e0e538: 276 | resolution: {integrity: sha512-MwP3sH+VS5AhhSTXk7pui+tEJFsxnTKFY3TraFJb8WFbA2Vo2qsRCZseEGwpTLhENB7p/JSsLvWoSSbpmxhFAQ==} 277 | peerDependencies: 278 | '@jimp/custom': '>=0.3.5' 279 | '@jimp/plugin-blit': '>=0.3.5' 280 | dependencies: 281 | '@babel/runtime': 7.17.9 282 | '@jimp/custom': 0.14.0 283 | '@jimp/plugin-blit': 0.14.0_@jimp+custom@0.14.0 284 | '@jimp/utils': 0.14.0 285 | load-bmfont: 1.4.1 286 | dev: false 287 | 288 | /@jimp/plugin-resize/0.14.0_@jimp+custom@0.14.0: 289 | resolution: {integrity: sha512-qFeMOyXE/Bk6QXN0GQo89+CB2dQcXqoxUcDb2Ah8wdYlKqpi53skABkgVy5pW3EpiprDnzNDboMltdvDslNgLQ==} 290 | peerDependencies: 291 | '@jimp/custom': '>=0.3.5' 292 | dependencies: 293 | '@babel/runtime': 7.17.9 294 | '@jimp/custom': 0.14.0 295 | '@jimp/utils': 0.14.0 296 | dev: false 297 | 298 | /@jimp/plugin-rotate/0.14.0_6a26553348442491f47014d5048cf1c5: 299 | resolution: {integrity: sha512-aGaicts44bvpTcq5Dtf93/8TZFu5pMo/61lWWnYmwJJU1RqtQlxbCLEQpMyRhKDNSfPbuP8nyGmaqXlM/82J0Q==} 300 | peerDependencies: 301 | '@jimp/custom': '>=0.3.5' 302 | '@jimp/plugin-blit': '>=0.3.5' 303 | '@jimp/plugin-crop': '>=0.3.5' 304 | '@jimp/plugin-resize': '>=0.3.5' 305 | dependencies: 306 | '@babel/runtime': 7.17.9 307 | '@jimp/custom': 0.14.0 308 | '@jimp/plugin-blit': 0.14.0_@jimp+custom@0.14.0 309 | '@jimp/plugin-crop': 0.14.0_@jimp+custom@0.14.0 310 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0 311 | '@jimp/utils': 0.14.0 312 | dev: false 313 | 314 | /@jimp/plugin-scale/0.14.0_1b5204e571b7e69f994f3f739149c190: 315 | resolution: {integrity: sha512-ZcJk0hxY5ZKZDDwflqQNHEGRblgaR+piePZm7dPwPUOSeYEH31P0AwZ1ziceR74zd8N80M0TMft+e3Td6KGBHw==} 316 | peerDependencies: 317 | '@jimp/custom': '>=0.3.5' 318 | '@jimp/plugin-resize': '>=0.3.5' 319 | dependencies: 320 | '@babel/runtime': 7.17.9 321 | '@jimp/custom': 0.14.0 322 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0 323 | '@jimp/utils': 0.14.0 324 | dev: false 325 | 326 | /@jimp/plugin-shadow/0.14.0_49f3f5687a96d0ff4a4adf2a40083cb6: 327 | resolution: {integrity: sha512-p2igcEr/iGrLiTu0YePNHyby0WYAXM14c5cECZIVnq/UTOOIQ7xIcWZJ1lRbAEPxVVXPN1UibhZAbr3HAb5BjQ==} 328 | peerDependencies: 329 | '@jimp/custom': '>=0.3.5' 330 | '@jimp/plugin-blur': '>=0.3.5' 331 | '@jimp/plugin-resize': '>=0.3.5' 332 | dependencies: 333 | '@babel/runtime': 7.17.9 334 | '@jimp/custom': 0.14.0 335 | '@jimp/plugin-blur': 0.14.0_@jimp+custom@0.14.0 336 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0 337 | '@jimp/utils': 0.14.0 338 | dev: false 339 | 340 | /@jimp/plugin-threshold/0.14.0_c55f475b14d9d0f52e32180be908a3e5: 341 | resolution: {integrity: sha512-N4BlDgm/FoOMV/DQM2rSpzsgqAzkP0DXkWZoqaQrlRxQBo4zizQLzhEL00T/YCCMKnddzgEhnByaocgaaa0fKw==} 342 | peerDependencies: 343 | '@jimp/custom': '>=0.3.5' 344 | '@jimp/plugin-color': '>=0.8.0' 345 | '@jimp/plugin-resize': '>=0.8.0' 346 | dependencies: 347 | '@babel/runtime': 7.17.9 348 | '@jimp/custom': 0.14.0 349 | '@jimp/plugin-color': 0.14.0_@jimp+custom@0.14.0 350 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0 351 | '@jimp/utils': 0.14.0 352 | dev: false 353 | 354 | /@jimp/plugins/0.14.0_@jimp+custom@0.14.0: 355 | resolution: {integrity: sha512-vDO3XT/YQlFlFLq5TqNjQkISqjBHT8VMhpWhAfJVwuXIpilxz5Glu4IDLK6jp4IjPR6Yg2WO8TmRY/HI8vLrOw==} 356 | peerDependencies: 357 | '@jimp/custom': '>=0.3.5' 358 | dependencies: 359 | '@babel/runtime': 7.17.9 360 | '@jimp/custom': 0.14.0 361 | '@jimp/plugin-blit': 0.14.0_@jimp+custom@0.14.0 362 | '@jimp/plugin-blur': 0.14.0_@jimp+custom@0.14.0 363 | '@jimp/plugin-circle': 0.14.0_@jimp+custom@0.14.0 364 | '@jimp/plugin-color': 0.14.0_@jimp+custom@0.14.0 365 | '@jimp/plugin-contain': 0.14.0_04f2eb7c5fcee3779cc9de0411145f1d 366 | '@jimp/plugin-cover': 0.14.0_132cab346e98a8a22cf9ce3f0298c53c 367 | '@jimp/plugin-crop': 0.14.0_@jimp+custom@0.14.0 368 | '@jimp/plugin-displace': 0.14.0_@jimp+custom@0.14.0 369 | '@jimp/plugin-dither': 0.14.0_@jimp+custom@0.14.0 370 | '@jimp/plugin-fisheye': 0.14.0_@jimp+custom@0.14.0 371 | '@jimp/plugin-flip': 0.14.0_21b3d863db80a865c28da82979224ca7 372 | '@jimp/plugin-gaussian': 0.14.0_@jimp+custom@0.14.0 373 | '@jimp/plugin-invert': 0.14.0_@jimp+custom@0.14.0 374 | '@jimp/plugin-mask': 0.14.0_@jimp+custom@0.14.0 375 | '@jimp/plugin-normalize': 0.14.0_@jimp+custom@0.14.0 376 | '@jimp/plugin-print': 0.14.0_59cf2c48948cca49b82b3ff5e6e0e538 377 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0 378 | '@jimp/plugin-rotate': 0.14.0_6a26553348442491f47014d5048cf1c5 379 | '@jimp/plugin-scale': 0.14.0_1b5204e571b7e69f994f3f739149c190 380 | '@jimp/plugin-shadow': 0.14.0_49f3f5687a96d0ff4a4adf2a40083cb6 381 | '@jimp/plugin-threshold': 0.14.0_c55f475b14d9d0f52e32180be908a3e5 382 | timm: 1.7.1 383 | dev: false 384 | 385 | /@jimp/png/0.14.0_@jimp+custom@0.14.0: 386 | resolution: {integrity: sha512-0RV/mEIDOrPCcNfXSPmPBqqSZYwGADNRVUTyMt47RuZh7sugbYdv/uvKmQSiqRdR0L1sfbCBMWUEa5G/8MSbdA==} 387 | peerDependencies: 388 | '@jimp/custom': '>=0.3.5' 389 | dependencies: 390 | '@babel/runtime': 7.17.9 391 | '@jimp/custom': 0.14.0 392 | '@jimp/utils': 0.14.0 393 | pngjs: 3.4.0 394 | dev: false 395 | 396 | /@jimp/tiff/0.14.0_@jimp+custom@0.14.0: 397 | resolution: {integrity: sha512-zBYDTlutc7j88G/7FBCn3kmQwWr0rmm1e0FKB4C3uJ5oYfT8645lftUsvosKVUEfkdmOaMAnhrf4ekaHcb5gQw==} 398 | peerDependencies: 399 | '@jimp/custom': '>=0.3.5' 400 | dependencies: 401 | '@babel/runtime': 7.17.9 402 | '@jimp/custom': 0.14.0 403 | utif: 2.0.1 404 | dev: false 405 | 406 | /@jimp/types/0.14.0_@jimp+custom@0.14.0: 407 | resolution: {integrity: sha512-hx3cXAW1KZm+b+XCrY3LXtdWy2U+hNtq0rPyJ7NuXCjU7lZR3vIkpz1DLJ3yDdS70hTi5QDXY3Cd9kd6DtloHQ==} 408 | peerDependencies: 409 | '@jimp/custom': '>=0.3.5' 410 | dependencies: 411 | '@babel/runtime': 7.17.9 412 | '@jimp/bmp': 0.14.0_@jimp+custom@0.14.0 413 | '@jimp/custom': 0.14.0 414 | '@jimp/gif': 0.14.0_@jimp+custom@0.14.0 415 | '@jimp/jpeg': 0.14.0_@jimp+custom@0.14.0 416 | '@jimp/png': 0.14.0_@jimp+custom@0.14.0 417 | '@jimp/tiff': 0.14.0_@jimp+custom@0.14.0 418 | timm: 1.7.1 419 | dev: false 420 | 421 | /@jimp/utils/0.14.0: 422 | resolution: {integrity: sha512-MY5KFYUru0y74IsgM/9asDwb3ERxWxXEu3CRCZEvE7DtT86y1bR1XgtlSliMrptjz4qbivNGMQSvUBpEFJDp1A==} 423 | dependencies: 424 | '@babel/runtime': 7.17.9 425 | regenerator-runtime: 0.13.9 426 | dev: false 427 | 428 | /@nodelib/fs.scandir/2.1.5: 429 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 430 | engines: {node: '>= 8'} 431 | dependencies: 432 | '@nodelib/fs.stat': 2.0.5 433 | run-parallel: 1.2.0 434 | dev: true 435 | 436 | /@nodelib/fs.stat/2.0.5: 437 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 438 | engines: {node: '>= 8'} 439 | dev: true 440 | 441 | /@nodelib/fs.walk/1.2.8: 442 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 443 | engines: {node: '>= 8'} 444 | dependencies: 445 | '@nodelib/fs.scandir': 2.1.5 446 | fastq: 1.13.0 447 | dev: true 448 | 449 | /@types/node/14.18.12: 450 | resolution: {integrity: sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==} 451 | dev: true 452 | 453 | /@types/node/16.9.1: 454 | resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} 455 | dev: false 456 | 457 | /agent-base/6.0.2: 458 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 459 | engines: {node: '>= 6.0.0'} 460 | dependencies: 461 | debug: 4.3.4 462 | transitivePeerDependencies: 463 | - supports-color 464 | dev: true 465 | 466 | /ansi-regex/2.1.1: 467 | resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} 468 | engines: {node: '>=0.10.0'} 469 | dev: true 470 | 471 | /ansi-regex/5.0.1: 472 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 473 | engines: {node: '>=8'} 474 | dev: true 475 | 476 | /ansi-styles/4.3.0: 477 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 478 | engines: {node: '>=8'} 479 | dependencies: 480 | color-convert: 2.0.1 481 | dev: true 482 | 483 | /any-base/1.1.0: 484 | resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} 485 | dev: false 486 | 487 | /aproba/1.2.0: 488 | resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} 489 | dev: true 490 | 491 | /are-we-there-yet/1.1.7: 492 | resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} 493 | dependencies: 494 | delegates: 1.0.0 495 | readable-stream: 2.3.7 496 | dev: true 497 | 498 | /array-union/2.1.0: 499 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 500 | engines: {node: '>=8'} 501 | dev: true 502 | 503 | /at-least-node/1.0.0: 504 | resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} 505 | engines: {node: '>= 4.0.0'} 506 | dev: true 507 | 508 | /balanced-match/1.0.2: 509 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 510 | dev: false 511 | 512 | /base64-js/1.5.1: 513 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 514 | 515 | /bl/4.1.0: 516 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 517 | dependencies: 518 | buffer: 5.7.1 519 | inherits: 2.0.4 520 | readable-stream: 3.6.0 521 | dev: true 522 | 523 | /bmp-js/0.1.0: 524 | resolution: {integrity: sha1-4Fpj95amwf8l9Hcex62twUjAcjM=} 525 | dev: false 526 | 527 | /brace-expansion/1.1.11: 528 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 529 | dependencies: 530 | balanced-match: 1.0.2 531 | concat-map: 0.0.1 532 | dev: false 533 | 534 | /braces/3.0.2: 535 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 536 | engines: {node: '>=8'} 537 | dependencies: 538 | fill-range: 7.0.1 539 | dev: true 540 | 541 | /buffer-equal/0.0.1: 542 | resolution: {integrity: sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=} 543 | engines: {node: '>=0.4.0'} 544 | dev: false 545 | 546 | /buffer/5.7.1: 547 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 548 | dependencies: 549 | base64-js: 1.5.1 550 | ieee754: 1.2.1 551 | 552 | /chalk/4.1.2: 553 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 554 | engines: {node: '>=10'} 555 | dependencies: 556 | ansi-styles: 4.3.0 557 | supports-color: 7.2.0 558 | dev: true 559 | 560 | /chownr/1.1.4: 561 | resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 562 | dev: true 563 | 564 | /cliui/7.0.4: 565 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 566 | dependencies: 567 | string-width: 4.2.3 568 | strip-ansi: 6.0.1 569 | wrap-ansi: 7.0.0 570 | dev: true 571 | 572 | /code-point-at/1.1.0: 573 | resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=} 574 | engines: {node: '>=0.10.0'} 575 | dev: true 576 | 577 | /color-convert/2.0.1: 578 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 579 | engines: {node: '>=7.0.0'} 580 | dependencies: 581 | color-name: 1.1.4 582 | dev: true 583 | 584 | /color-name/1.1.4: 585 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 586 | dev: true 587 | 588 | /commander/6.2.1: 589 | resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} 590 | engines: {node: '>= 6'} 591 | dev: false 592 | 593 | /concat-map/0.0.1: 594 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 595 | dev: false 596 | 597 | /console-control-strings/1.1.0: 598 | resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} 599 | dev: true 600 | 601 | /core-util-is/1.0.3: 602 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 603 | dev: true 604 | 605 | /cross-fetch/3.1.5: 606 | resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} 607 | dependencies: 608 | node-fetch: 2.6.7 609 | transitivePeerDependencies: 610 | - encoding 611 | dev: false 612 | 613 | /debug/4.3.4: 614 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 615 | engines: {node: '>=6.0'} 616 | peerDependencies: 617 | supports-color: '*' 618 | peerDependenciesMeta: 619 | supports-color: 620 | optional: true 621 | dependencies: 622 | ms: 2.1.2 623 | dev: true 624 | 625 | /decompress-response/4.2.1: 626 | resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} 627 | engines: {node: '>=8'} 628 | dependencies: 629 | mimic-response: 2.1.0 630 | dev: true 631 | 632 | /deep-extend/0.6.0: 633 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 634 | engines: {node: '>=4.0.0'} 635 | dev: true 636 | 637 | /deep-is/0.1.4: 638 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 639 | dev: true 640 | 641 | /delegates/1.0.0: 642 | resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} 643 | dev: true 644 | 645 | /detect-libc/1.0.3: 646 | resolution: {integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=} 647 | engines: {node: '>=0.10'} 648 | hasBin: true 649 | dev: true 650 | 651 | /dir-glob/3.0.1: 652 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 653 | engines: {node: '>=8'} 654 | dependencies: 655 | path-type: 4.0.0 656 | dev: true 657 | 658 | /dom-walk/0.1.2: 659 | resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} 660 | dev: false 661 | 662 | /emoji-regex/8.0.0: 663 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 664 | dev: true 665 | 666 | /end-of-stream/1.4.4: 667 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 668 | dependencies: 669 | once: 1.4.0 670 | dev: true 671 | 672 | /escalade/3.1.1: 673 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 674 | engines: {node: '>=6'} 675 | dev: true 676 | 677 | /escodegen/2.0.0: 678 | resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} 679 | engines: {node: '>=6.0'} 680 | hasBin: true 681 | dependencies: 682 | esprima: 4.0.1 683 | estraverse: 5.3.0 684 | esutils: 2.0.3 685 | optionator: 0.8.3 686 | optionalDependencies: 687 | source-map: 0.6.1 688 | dev: true 689 | 690 | /esprima/4.0.1: 691 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 692 | engines: {node: '>=4'} 693 | hasBin: true 694 | dev: true 695 | 696 | /estraverse/5.3.0: 697 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 698 | engines: {node: '>=4.0'} 699 | dev: true 700 | 701 | /esutils/2.0.3: 702 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 703 | engines: {node: '>=0.10.0'} 704 | dev: true 705 | 706 | /exif-parser/0.1.12: 707 | resolution: {integrity: sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=} 708 | dev: false 709 | 710 | /expand-template/2.0.3: 711 | resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} 712 | engines: {node: '>=6'} 713 | dev: true 714 | 715 | /fast-glob/3.2.11: 716 | resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} 717 | engines: {node: '>=8.6.0'} 718 | dependencies: 719 | '@nodelib/fs.stat': 2.0.5 720 | '@nodelib/fs.walk': 1.2.8 721 | glob-parent: 5.1.2 722 | merge2: 1.4.1 723 | micromatch: 4.0.5 724 | dev: true 725 | 726 | /fast-levenshtein/2.0.6: 727 | resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} 728 | dev: true 729 | 730 | /fastq/1.13.0: 731 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 732 | dependencies: 733 | reusify: 1.0.4 734 | dev: true 735 | 736 | /file-type/9.0.0: 737 | resolution: {integrity: sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==} 738 | engines: {node: '>=6'} 739 | dev: false 740 | 741 | /fill-range/7.0.1: 742 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 743 | engines: {node: '>=8'} 744 | dependencies: 745 | to-regex-range: 5.0.1 746 | dev: true 747 | 748 | /from2/2.3.0: 749 | resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=} 750 | dependencies: 751 | inherits: 2.0.4 752 | readable-stream: 2.3.7 753 | dev: true 754 | 755 | /fs-constants/1.0.0: 756 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 757 | dev: true 758 | 759 | /fs-extra/9.1.0: 760 | resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} 761 | engines: {node: '>=10'} 762 | dependencies: 763 | at-least-node: 1.0.0 764 | graceful-fs: 4.2.10 765 | jsonfile: 6.1.0 766 | universalify: 2.0.0 767 | dev: true 768 | 769 | /fs.realpath/1.0.0: 770 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 771 | dev: false 772 | 773 | /function-bind/1.1.1: 774 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 775 | dev: true 776 | 777 | /gauge/2.7.4: 778 | resolution: {integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=} 779 | dependencies: 780 | aproba: 1.2.0 781 | console-control-strings: 1.1.0 782 | has-unicode: 2.0.1 783 | object-assign: 4.1.1 784 | signal-exit: 3.0.7 785 | string-width: 1.0.2 786 | strip-ansi: 3.0.1 787 | wide-align: 1.1.5 788 | dev: true 789 | 790 | /get-caller-file/2.0.5: 791 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 792 | engines: {node: 6.* || 8.* || >= 10.*} 793 | dev: true 794 | 795 | /gifwrap/0.9.4: 796 | resolution: {integrity: sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==} 797 | dependencies: 798 | image-q: 4.0.0 799 | omggif: 1.0.10 800 | dev: false 801 | 802 | /github-from-package/0.0.0: 803 | resolution: {integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=} 804 | dev: true 805 | 806 | /glob-parent/5.1.2: 807 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 808 | engines: {node: '>= 6'} 809 | dependencies: 810 | is-glob: 4.0.3 811 | dev: true 812 | 813 | /glob/7.2.0: 814 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} 815 | dependencies: 816 | fs.realpath: 1.0.0 817 | inflight: 1.0.6 818 | inherits: 2.0.4 819 | minimatch: 3.1.2 820 | once: 1.4.0 821 | path-is-absolute: 1.0.1 822 | dev: false 823 | 824 | /global/4.4.0: 825 | resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} 826 | dependencies: 827 | min-document: 2.19.0 828 | process: 0.11.10 829 | dev: false 830 | 831 | /globby/11.1.0: 832 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 833 | engines: {node: '>=10'} 834 | dependencies: 835 | array-union: 2.1.0 836 | dir-glob: 3.0.1 837 | fast-glob: 3.2.11 838 | ignore: 5.2.0 839 | merge2: 1.4.1 840 | slash: 3.0.0 841 | dev: true 842 | 843 | /graceful-fs/4.2.10: 844 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 845 | dev: true 846 | 847 | /has-flag/4.0.0: 848 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 849 | engines: {node: '>=8'} 850 | dev: true 851 | 852 | /has-unicode/2.0.1: 853 | resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=} 854 | dev: true 855 | 856 | /has/1.0.3: 857 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 858 | engines: {node: '>= 0.4.0'} 859 | dependencies: 860 | function-bind: 1.1.1 861 | dev: true 862 | 863 | /https-proxy-agent/5.0.0: 864 | resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} 865 | engines: {node: '>= 6'} 866 | dependencies: 867 | agent-base: 6.0.2 868 | debug: 4.3.4 869 | transitivePeerDependencies: 870 | - supports-color 871 | dev: true 872 | 873 | /icns-lib/1.0.1: 874 | resolution: {integrity: sha512-J7+RDRQApG/vChY5TP043NitBcNC7QMn1kOgGvlAkyrK65hozAaSwTNsTZ2HJh+br9e1NlzpBreAOpk4YuhOJA==} 875 | engines: {node: '>=8'} 876 | dev: false 877 | 878 | /ieee754/1.2.1: 879 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 880 | 881 | /ignore/5.2.0: 882 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 883 | engines: {node: '>= 4'} 884 | dev: true 885 | 886 | /image-q/4.0.0: 887 | resolution: {integrity: sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==} 888 | dependencies: 889 | '@types/node': 16.9.1 890 | dev: false 891 | 892 | /inflight/1.0.6: 893 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 894 | dependencies: 895 | once: 1.4.0 896 | wrappy: 1.0.2 897 | dev: false 898 | 899 | /inherits/2.0.4: 900 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 901 | 902 | /ini/1.3.8: 903 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 904 | dev: true 905 | 906 | /into-stream/6.0.0: 907 | resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} 908 | engines: {node: '>=10'} 909 | dependencies: 910 | from2: 2.3.0 911 | p-is-promise: 3.0.0 912 | dev: true 913 | 914 | /is-core-module/2.8.1: 915 | resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} 916 | dependencies: 917 | has: 1.0.3 918 | dev: true 919 | 920 | /is-extglob/2.1.1: 921 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 922 | engines: {node: '>=0.10.0'} 923 | dev: true 924 | 925 | /is-fullwidth-code-point/1.0.0: 926 | resolution: {integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=} 927 | engines: {node: '>=0.10.0'} 928 | dependencies: 929 | number-is-nan: 1.0.1 930 | dev: true 931 | 932 | /is-fullwidth-code-point/3.0.0: 933 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 934 | engines: {node: '>=8'} 935 | dev: true 936 | 937 | /is-function/1.0.2: 938 | resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} 939 | dev: false 940 | 941 | /is-glob/4.0.3: 942 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 943 | engines: {node: '>=0.10.0'} 944 | dependencies: 945 | is-extglob: 2.1.1 946 | dev: true 947 | 948 | /is-number/7.0.0: 949 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 950 | engines: {node: '>=0.12.0'} 951 | dev: true 952 | 953 | /isarray/1.0.0: 954 | resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} 955 | dev: true 956 | 957 | /jimp/0.14.0: 958 | resolution: {integrity: sha512-8BXU+J8+SPmwwyq9ELihpSV4dWPTiOKBWCEgtkbnxxAVMjXdf3yGmyaLSshBfXc8sP/JQ9OZj5R8nZzz2wPXgA==} 959 | dependencies: 960 | '@babel/runtime': 7.17.9 961 | '@jimp/custom': 0.14.0 962 | '@jimp/plugins': 0.14.0_@jimp+custom@0.14.0 963 | '@jimp/types': 0.14.0_@jimp+custom@0.14.0 964 | regenerator-runtime: 0.13.9 965 | dev: false 966 | 967 | /jpeg-js/0.4.3: 968 | resolution: {integrity: sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==} 969 | dev: false 970 | 971 | /jsonfile/6.1.0: 972 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 973 | dependencies: 974 | universalify: 2.0.0 975 | optionalDependencies: 976 | graceful-fs: 4.2.10 977 | dev: true 978 | 979 | /levn/0.3.0: 980 | resolution: {integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=} 981 | engines: {node: '>= 0.8.0'} 982 | dependencies: 983 | prelude-ls: 1.1.2 984 | type-check: 0.3.2 985 | dev: true 986 | 987 | /load-bmfont/1.4.1: 988 | resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==} 989 | dependencies: 990 | buffer-equal: 0.0.1 991 | mime: 1.6.0 992 | parse-bmfont-ascii: 1.0.6 993 | parse-bmfont-binary: 1.0.6 994 | parse-bmfont-xml: 1.1.4 995 | phin: 2.9.3 996 | xhr: 2.6.0 997 | xtend: 4.0.2 998 | dev: false 999 | 1000 | /lru-cache/7.7.3: 1001 | resolution: {integrity: sha512-WY9wjJNQt9+PZilnLbuFKM+SwDull9+6IAguOrarOMoOHTcJ9GnXSO11+Gw6c7xtDkBkthR57OZMtZKYr+1CEw==} 1002 | engines: {node: '>=12'} 1003 | dev: true 1004 | 1005 | /merge2/1.4.1: 1006 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1007 | engines: {node: '>= 8'} 1008 | dev: true 1009 | 1010 | /micromatch/4.0.5: 1011 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1012 | engines: {node: '>=8.6'} 1013 | dependencies: 1014 | braces: 3.0.2 1015 | picomatch: 2.3.1 1016 | dev: true 1017 | 1018 | /mime/1.6.0: 1019 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 1020 | engines: {node: '>=4'} 1021 | hasBin: true 1022 | dev: false 1023 | 1024 | /mimic-response/2.1.0: 1025 | resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} 1026 | engines: {node: '>=8'} 1027 | dev: true 1028 | 1029 | /min-document/2.19.0: 1030 | resolution: {integrity: sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=} 1031 | dependencies: 1032 | dom-walk: 0.1.2 1033 | dev: false 1034 | 1035 | /minimatch/3.1.2: 1036 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1037 | dependencies: 1038 | brace-expansion: 1.1.11 1039 | dev: false 1040 | 1041 | /minimist/1.2.6: 1042 | resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} 1043 | 1044 | /mkdirp-classic/0.5.3: 1045 | resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1046 | dev: true 1047 | 1048 | /mkdirp/0.5.6: 1049 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1050 | hasBin: true 1051 | dependencies: 1052 | minimist: 1.2.6 1053 | dev: false 1054 | 1055 | /ms/2.1.2: 1056 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1057 | dev: true 1058 | 1059 | /multistream/4.1.0: 1060 | resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} 1061 | dependencies: 1062 | once: 1.4.0 1063 | readable-stream: 3.6.0 1064 | dev: true 1065 | 1066 | /napi-build-utils/1.0.2: 1067 | resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} 1068 | dev: true 1069 | 1070 | /node-abi/2.30.1: 1071 | resolution: {integrity: sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==} 1072 | dependencies: 1073 | semver: 5.7.1 1074 | dev: true 1075 | 1076 | /node-fetch/2.6.7: 1077 | resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} 1078 | engines: {node: 4.x || >=6.0.0} 1079 | peerDependencies: 1080 | encoding: ^0.1.0 1081 | peerDependenciesMeta: 1082 | encoding: 1083 | optional: true 1084 | dependencies: 1085 | whatwg-url: 5.0.0 1086 | 1087 | /npmlog/4.1.2: 1088 | resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} 1089 | dependencies: 1090 | are-we-there-yet: 1.1.7 1091 | console-control-strings: 1.1.0 1092 | gauge: 2.7.4 1093 | set-blocking: 2.0.0 1094 | dev: true 1095 | 1096 | /number-is-nan/1.0.1: 1097 | resolution: {integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=} 1098 | engines: {node: '>=0.10.0'} 1099 | dev: true 1100 | 1101 | /object-assign/4.1.1: 1102 | resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} 1103 | engines: {node: '>=0.10.0'} 1104 | dev: true 1105 | 1106 | /omggif/1.0.10: 1107 | resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} 1108 | dev: false 1109 | 1110 | /once/1.4.0: 1111 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 1112 | dependencies: 1113 | wrappy: 1.0.2 1114 | 1115 | /optionator/0.8.3: 1116 | resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} 1117 | engines: {node: '>= 0.8.0'} 1118 | dependencies: 1119 | deep-is: 0.1.4 1120 | fast-levenshtein: 2.0.6 1121 | levn: 0.3.0 1122 | prelude-ls: 1.1.2 1123 | type-check: 0.3.2 1124 | word-wrap: 1.2.3 1125 | dev: true 1126 | 1127 | /p-is-promise/3.0.0: 1128 | resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} 1129 | engines: {node: '>=8'} 1130 | dev: true 1131 | 1132 | /pako/1.0.11: 1133 | resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} 1134 | dev: false 1135 | 1136 | /parse-bmfont-ascii/1.0.6: 1137 | resolution: {integrity: sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=} 1138 | dev: false 1139 | 1140 | /parse-bmfont-binary/1.0.6: 1141 | resolution: {integrity: sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=} 1142 | dev: false 1143 | 1144 | /parse-bmfont-xml/1.1.4: 1145 | resolution: {integrity: sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==} 1146 | dependencies: 1147 | xml-parse-from-string: 1.0.1 1148 | xml2js: 0.4.23 1149 | dev: false 1150 | 1151 | /parse-headers/2.0.5: 1152 | resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} 1153 | dev: false 1154 | 1155 | /path-is-absolute/1.0.1: 1156 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 1157 | engines: {node: '>=0.10.0'} 1158 | dev: false 1159 | 1160 | /path-parse/1.0.7: 1161 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1162 | dev: true 1163 | 1164 | /path-type/4.0.0: 1165 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1166 | engines: {node: '>=8'} 1167 | dev: true 1168 | 1169 | /phin/2.9.3: 1170 | resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==} 1171 | dev: false 1172 | 1173 | /picomatch/2.3.1: 1174 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1175 | engines: {node: '>=8.6'} 1176 | dev: true 1177 | 1178 | /pixelmatch/4.0.2: 1179 | resolution: {integrity: sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=} 1180 | hasBin: true 1181 | dependencies: 1182 | pngjs: 3.4.0 1183 | dev: false 1184 | 1185 | /pkg-fetch/3.3.0: 1186 | resolution: {integrity: sha512-xJnIZ1KP+8rNN+VLafwu4tEeV4m8IkFBDdCFqmAJz9K1aiXEtbARmdbEe6HlXWGSVuShSHjFXpfkKRkDBQ5kiA==} 1187 | hasBin: true 1188 | dependencies: 1189 | chalk: 4.1.2 1190 | fs-extra: 9.1.0 1191 | https-proxy-agent: 5.0.0 1192 | node-fetch: 2.6.7 1193 | progress: 2.0.3 1194 | semver: 7.3.6 1195 | tar-fs: 2.1.1 1196 | yargs: 16.2.0 1197 | transitivePeerDependencies: 1198 | - encoding 1199 | - supports-color 1200 | dev: true 1201 | 1202 | /pkg/5.6.0: 1203 | resolution: {integrity: sha512-mHrAVSQWmHA41RnUmRpC7pK9lNnMfdA16CF3cqOI22a8LZxOQzF7M8YWtA2nfs+d7I0MTDXOtkDsAsFXeCpYjg==} 1204 | hasBin: true 1205 | peerDependencies: 1206 | node-notifier: '>=9.0.1' 1207 | peerDependenciesMeta: 1208 | node-notifier: 1209 | optional: true 1210 | dependencies: 1211 | '@babel/parser': 7.16.2 1212 | '@babel/types': 7.16.0 1213 | chalk: 4.1.2 1214 | escodegen: 2.0.0 1215 | fs-extra: 9.1.0 1216 | globby: 11.1.0 1217 | into-stream: 6.0.0 1218 | minimist: 1.2.6 1219 | multistream: 4.1.0 1220 | pkg-fetch: 3.3.0 1221 | prebuild-install: 6.1.4 1222 | progress: 2.0.3 1223 | resolve: 1.22.0 1224 | stream-meter: 1.0.4 1225 | tslib: 2.3.1 1226 | transitivePeerDependencies: 1227 | - encoding 1228 | - supports-color 1229 | dev: true 1230 | 1231 | /plist/3.0.5: 1232 | resolution: {integrity: sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==} 1233 | engines: {node: '>=6'} 1234 | dependencies: 1235 | base64-js: 1.5.1 1236 | xmlbuilder: 9.0.7 1237 | dev: false 1238 | 1239 | /pngjs/3.4.0: 1240 | resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} 1241 | engines: {node: '>=4.0.0'} 1242 | dev: false 1243 | 1244 | /prebuild-install/6.1.4: 1245 | resolution: {integrity: sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==} 1246 | engines: {node: '>=6'} 1247 | hasBin: true 1248 | dependencies: 1249 | detect-libc: 1.0.3 1250 | expand-template: 2.0.3 1251 | github-from-package: 0.0.0 1252 | minimist: 1.2.6 1253 | mkdirp-classic: 0.5.3 1254 | napi-build-utils: 1.0.2 1255 | node-abi: 2.30.1 1256 | npmlog: 4.1.2 1257 | pump: 3.0.0 1258 | rc: 1.2.8 1259 | simple-get: 3.1.1 1260 | tar-fs: 2.1.1 1261 | tunnel-agent: 0.6.0 1262 | dev: true 1263 | 1264 | /prelude-ls/1.1.2: 1265 | resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} 1266 | engines: {node: '>= 0.8.0'} 1267 | dev: true 1268 | 1269 | /process-nextick-args/2.0.1: 1270 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1271 | dev: true 1272 | 1273 | /process/0.11.10: 1274 | resolution: {integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI=} 1275 | engines: {node: '>= 0.6.0'} 1276 | dev: false 1277 | 1278 | /progress/2.0.3: 1279 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 1280 | engines: {node: '>=0.4.0'} 1281 | dev: true 1282 | 1283 | /pump/3.0.0: 1284 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 1285 | dependencies: 1286 | end-of-stream: 1.4.4 1287 | once: 1.4.0 1288 | dev: true 1289 | 1290 | /queue-microtask/1.2.3: 1291 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1292 | dev: true 1293 | 1294 | /rc/1.2.8: 1295 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1296 | hasBin: true 1297 | dependencies: 1298 | deep-extend: 0.6.0 1299 | ini: 1.3.8 1300 | minimist: 1.2.6 1301 | strip-json-comments: 2.0.1 1302 | dev: true 1303 | 1304 | /readable-stream/2.3.7: 1305 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 1306 | dependencies: 1307 | core-util-is: 1.0.3 1308 | inherits: 2.0.4 1309 | isarray: 1.0.0 1310 | process-nextick-args: 2.0.1 1311 | safe-buffer: 5.1.2 1312 | string_decoder: 1.1.1 1313 | util-deprecate: 1.0.2 1314 | dev: true 1315 | 1316 | /readable-stream/3.6.0: 1317 | resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} 1318 | engines: {node: '>= 6'} 1319 | dependencies: 1320 | inherits: 2.0.4 1321 | string_decoder: 1.3.0 1322 | util-deprecate: 1.0.2 1323 | dev: true 1324 | 1325 | /regenerator-runtime/0.13.9: 1326 | resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} 1327 | dev: false 1328 | 1329 | /require-directory/2.1.1: 1330 | resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} 1331 | engines: {node: '>=0.10.0'} 1332 | dev: true 1333 | 1334 | /resolve/1.22.0: 1335 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 1336 | hasBin: true 1337 | dependencies: 1338 | is-core-module: 2.8.1 1339 | path-parse: 1.0.7 1340 | supports-preserve-symlinks-flag: 1.0.0 1341 | dev: true 1342 | 1343 | /reusify/1.0.4: 1344 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1345 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1346 | dev: true 1347 | 1348 | /run-parallel/1.2.0: 1349 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1350 | dependencies: 1351 | queue-microtask: 1.2.3 1352 | dev: true 1353 | 1354 | /safe-buffer/5.1.2: 1355 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1356 | dev: true 1357 | 1358 | /safe-buffer/5.2.1: 1359 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1360 | dev: true 1361 | 1362 | /sax/1.2.4: 1363 | resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} 1364 | dev: false 1365 | 1366 | /semver/5.7.1: 1367 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1368 | hasBin: true 1369 | dev: true 1370 | 1371 | /semver/7.3.6: 1372 | resolution: {integrity: sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==} 1373 | engines: {node: ^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0} 1374 | hasBin: true 1375 | dependencies: 1376 | lru-cache: 7.7.3 1377 | dev: true 1378 | 1379 | /set-blocking/2.0.0: 1380 | resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} 1381 | dev: true 1382 | 1383 | /signal-exit/3.0.7: 1384 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1385 | dev: true 1386 | 1387 | /simple-concat/1.0.1: 1388 | resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 1389 | dev: true 1390 | 1391 | /simple-get/3.1.1: 1392 | resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} 1393 | dependencies: 1394 | decompress-response: 4.2.1 1395 | once: 1.4.0 1396 | simple-concat: 1.0.1 1397 | dev: true 1398 | 1399 | /slash/3.0.0: 1400 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1401 | engines: {node: '>=8'} 1402 | dev: true 1403 | 1404 | /source-map/0.6.1: 1405 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1406 | engines: {node: '>=0.10.0'} 1407 | requiresBuild: true 1408 | dev: true 1409 | optional: true 1410 | 1411 | /stream-meter/1.0.4: 1412 | resolution: {integrity: sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=} 1413 | dependencies: 1414 | readable-stream: 2.3.7 1415 | dev: true 1416 | 1417 | /string-width/1.0.2: 1418 | resolution: {integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=} 1419 | engines: {node: '>=0.10.0'} 1420 | dependencies: 1421 | code-point-at: 1.1.0 1422 | is-fullwidth-code-point: 1.0.0 1423 | strip-ansi: 3.0.1 1424 | dev: true 1425 | 1426 | /string-width/4.2.3: 1427 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1428 | engines: {node: '>=8'} 1429 | dependencies: 1430 | emoji-regex: 8.0.0 1431 | is-fullwidth-code-point: 3.0.0 1432 | strip-ansi: 6.0.1 1433 | dev: true 1434 | 1435 | /string_decoder/1.1.1: 1436 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1437 | dependencies: 1438 | safe-buffer: 5.1.2 1439 | dev: true 1440 | 1441 | /string_decoder/1.3.0: 1442 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1443 | dependencies: 1444 | safe-buffer: 5.2.1 1445 | dev: true 1446 | 1447 | /strip-ansi/3.0.1: 1448 | resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} 1449 | engines: {node: '>=0.10.0'} 1450 | dependencies: 1451 | ansi-regex: 2.1.1 1452 | dev: true 1453 | 1454 | /strip-ansi/6.0.1: 1455 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1456 | engines: {node: '>=8'} 1457 | dependencies: 1458 | ansi-regex: 5.0.1 1459 | dev: true 1460 | 1461 | /strip-json-comments/2.0.1: 1462 | resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} 1463 | engines: {node: '>=0.10.0'} 1464 | dev: true 1465 | 1466 | /supports-color/7.2.0: 1467 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1468 | engines: {node: '>=8'} 1469 | dependencies: 1470 | has-flag: 4.0.0 1471 | dev: true 1472 | 1473 | /supports-preserve-symlinks-flag/1.0.0: 1474 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1475 | engines: {node: '>= 0.4'} 1476 | dev: true 1477 | 1478 | /tar-fs/2.1.1: 1479 | resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} 1480 | dependencies: 1481 | chownr: 1.1.4 1482 | mkdirp-classic: 0.5.3 1483 | pump: 3.0.0 1484 | tar-stream: 2.2.0 1485 | dev: true 1486 | 1487 | /tar-stream/2.2.0: 1488 | resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 1489 | engines: {node: '>=6'} 1490 | dependencies: 1491 | bl: 4.1.0 1492 | end-of-stream: 1.4.4 1493 | fs-constants: 1.0.0 1494 | inherits: 2.0.4 1495 | readable-stream: 3.6.0 1496 | dev: true 1497 | 1498 | /timm/1.7.1: 1499 | resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==} 1500 | dev: false 1501 | 1502 | /tinycolor2/1.4.2: 1503 | resolution: {integrity: sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==} 1504 | dev: false 1505 | 1506 | /to-fast-properties/2.0.0: 1507 | resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} 1508 | engines: {node: '>=4'} 1509 | dev: true 1510 | 1511 | /to-regex-range/5.0.1: 1512 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1513 | engines: {node: '>=8.0'} 1514 | dependencies: 1515 | is-number: 7.0.0 1516 | dev: true 1517 | 1518 | /tr46/0.0.3: 1519 | resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} 1520 | 1521 | /tslib/2.3.1: 1522 | resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} 1523 | dev: true 1524 | 1525 | /tunnel-agent/0.6.0: 1526 | resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} 1527 | dependencies: 1528 | safe-buffer: 5.2.1 1529 | dev: true 1530 | 1531 | /type-check/0.3.2: 1532 | resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=} 1533 | engines: {node: '>= 0.8.0'} 1534 | dependencies: 1535 | prelude-ls: 1.1.2 1536 | dev: true 1537 | 1538 | /universalify/2.0.0: 1539 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 1540 | engines: {node: '>= 10.0.0'} 1541 | dev: true 1542 | 1543 | /utif/2.0.1: 1544 | resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==} 1545 | dependencies: 1546 | pako: 1.0.11 1547 | dev: false 1548 | 1549 | /util-deprecate/1.0.2: 1550 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 1551 | dev: true 1552 | 1553 | /webidl-conversions/3.0.1: 1554 | resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} 1555 | 1556 | /whatwg-url/5.0.0: 1557 | resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} 1558 | dependencies: 1559 | tr46: 0.0.3 1560 | webidl-conversions: 3.0.1 1561 | 1562 | /wide-align/1.1.5: 1563 | resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 1564 | dependencies: 1565 | string-width: 4.2.3 1566 | dev: true 1567 | 1568 | /word-wrap/1.2.3: 1569 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 1570 | engines: {node: '>=0.10.0'} 1571 | dev: true 1572 | 1573 | /wrap-ansi/7.0.0: 1574 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1575 | engines: {node: '>=10'} 1576 | dependencies: 1577 | ansi-styles: 4.3.0 1578 | string-width: 4.2.3 1579 | strip-ansi: 6.0.1 1580 | dev: true 1581 | 1582 | /wrappy/1.0.2: 1583 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 1584 | 1585 | /xhr/2.6.0: 1586 | resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} 1587 | dependencies: 1588 | global: 4.4.0 1589 | is-function: 1.0.2 1590 | parse-headers: 2.0.5 1591 | xtend: 4.0.2 1592 | dev: false 1593 | 1594 | /xml-parse-from-string/1.0.1: 1595 | resolution: {integrity: sha1-qQKekp09vN7RafPG4oI42VpdWig=} 1596 | dev: false 1597 | 1598 | /xml2js/0.4.23: 1599 | resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} 1600 | engines: {node: '>=4.0.0'} 1601 | dependencies: 1602 | sax: 1.2.4 1603 | xmlbuilder: 11.0.1 1604 | dev: false 1605 | 1606 | /xmlbuilder/11.0.1: 1607 | resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} 1608 | engines: {node: '>=4.0'} 1609 | dev: false 1610 | 1611 | /xmlbuilder/9.0.7: 1612 | resolution: {integrity: sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=} 1613 | engines: {node: '>=4.0'} 1614 | dev: false 1615 | 1616 | /xtend/4.0.2: 1617 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1618 | engines: {node: '>=0.4'} 1619 | dev: false 1620 | 1621 | /y18n/5.0.8: 1622 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1623 | engines: {node: '>=10'} 1624 | dev: true 1625 | 1626 | /yargs-parser/20.2.9: 1627 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 1628 | engines: {node: '>=10'} 1629 | dev: true 1630 | 1631 | /yargs/16.2.0: 1632 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 1633 | engines: {node: '>=10'} 1634 | dependencies: 1635 | cliui: 7.0.4 1636 | escalade: 3.1.1 1637 | get-caller-file: 2.0.5 1638 | require-directory: 2.1.1 1639 | string-width: 4.2.3 1640 | y18n: 5.0.8 1641 | yargs-parser: 20.2.9 1642 | dev: true 1643 | --------------------------------------------------------------------------------