diff --git a/.eslintrc.json b/.eslintrc.json index 5df43ca7..6d386ddb 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -21,7 +21,11 @@ "prefer-regex-literals": "warn", "require-await": "warn", "camelcase": "error", + "no-invalid-regexp": "off", "@typescript-eslint/no-var-requires": "warn", - "no-param-reassign": "warn" // Disable reassign, since this basically means you override the reference from the caller function with a new local version. (It doesn't do what you expect) + "no-param-reassign": "warn", // Disable reassign, since this basically means you override the reference from the caller function with a new local version. (It doesn't do what you expect) + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-unused-vars": "off" } } diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 39b18d75..0f29935a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,13 +3,19 @@ version: 2 updates: + # GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: weekly + commit-message: + prefix: deps + # NPM - package-ecosystem: "npm" directory: "/" schedule: interval: monthly ignore: - dependency-name: "@types/vscode" - assignees: - - LuqueDaniel commit-message: prefix: deps diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4efdfe45..d18d102a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -40,7 +40,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index f297e918..ee82bc52 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -2,6 +2,10 @@ name: PR Check on: pull_request: + types: [synchronize, opened, reopened, edited] + branches: + - master + - develop env: NODE_VERSION: 16 @@ -12,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup uses: ./.github/actions/setup with: @@ -25,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup uses: ./.github/actions/setup with: @@ -38,7 +42,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup uses: ./.github/actions/setup with: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 167a9161..190984a9 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,7 +15,7 @@ jobs: name: Publish Extension runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: node-version: 16 diff --git a/.gitignore b/.gitignore index 05203c8c..001fb001 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules out dist *.vsix +dist/* diff --git a/.prettierignore b/.prettierignore index fc483344..0c84c503 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,4 +3,7 @@ **/dist # Ignore all markdown files: -*.md \ No newline at end of file +*.md + +# Ignore all generated typescript files: +*.g.ts \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index b9b84954..e77304bd 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,5 @@ { // See http://go.microsoft.com/fwlink/?LinkId=827846 // for the documentation about the extensions.json format - "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "ms-vscode.vscode-js-profile-flame"] + "recommendations": [ "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "ms-vscode.vscode-js-profile-flame" ] } diff --git a/.vscode/launch.json b/.vscode/launch.json index 24bea414..bd4adadd 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,8 +14,9 @@ "--extensionDevelopmentPath=${workspaceFolder}", "${workspaceFolder}/examples" // open examples directory ], - "outFiles": ["${workspaceFolder}/dist/**/*.js"], - "preLaunchTask": "npm: watch" + "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], + "preLaunchTask": "npm: watch", + "skipFiles": [ "/**", "**/extensions/git*/**", "**/node_modules/prettier/**", "**/node/extensionHostProcess.js" ] }, { "name": "Launch Extension (Release)", @@ -26,17 +27,19 @@ "--extensionDevelopmentPath=${workspaceFolder}", "${workspaceFolder}/examples" // open examples directory ], - "outFiles": ["${workspaceFolder}/dist/**/*.js"], - "preLaunchTask": "npm: watch-release" + "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], + "preLaunchTask": "npm: watch-release", + "skipFiles": [ "/**", "**/extensions/git*/**", "**/node_modules/prettier/**" ] }, { "name": "Extension Tests", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", - "args": ["--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/out/test"], - "outFiles": ["${workspaceFolder}/out/test/**/*.js"], - "preLaunchTask": "npm: test-compile" + "args": [ "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/out/test" ], + "outFiles": [ "${workspaceFolder}/out/test/**/*.js" ], + "preLaunchTask": "npm: test-compile", + "skipFiles": [ "/**", "**/extensions/git*/**", "**/node_modules/prettier/**" ] } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 1b097189..971e2696 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,11 +14,14 @@ "editor.formatOnPaste": false, "editor.formatOnSave": true, + "json.format.enable": true, + "json.format.keepLines": true, + "[jsonc]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "vscode.json-language-features" }, "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "vscode.json-language-features" }, "[python]": { "editor.defaultFormatter": "esbenp.prettier-vscode" @@ -27,5 +30,189 @@ "editor.defaultFormatter": "esbenp.prettier-vscode" }, - "eslint.validate": ["javascript", "typescript"] + "eslint.validate": [ + "javascript", + "typescript" + ], + "cSpell.words": [ + "Ren'Py", + "rpyc", + "Uncompiled" + ], + + "editor.tokenColorCustomizations": { + "[*Light*]": { + "textMateRules": [ + { + "scope": "ref.matchtext", + "settings": { + "foreground": "#000" + } + } + ] + }, + "[*Dark*]": { + "textMateRules": [ + { + "scope": "ref.matchtext", + "settings": { + "foreground": "#fff" + } + } + ] + }, + "textMateRules": [ + { + "scope": "renpy.meta.plain", + "settings": { + "fontStyle": "" + } + }, + { + "scope": "renpy.meta.i", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "renpy.meta.b", + "settings": { + "fontStyle": "bold" + } + }, + { + "scope": [ + "renpy.meta.u", + "renpy.meta.a" + ], + "settings": { + "fontStyle": "underline" + } + }, + { + "scope": "renpy.meta.s", + "settings": { + "fontStyle": "strikethrough" + } + }, + { + "scope": "renpy.meta.i renpy.meta.b", + "settings": { + "fontStyle": "italic bold" + } + }, + { + "scope": "renpy.meta.i renpy.meta.u", + "settings": { + "fontStyle": "italic underline" + } + }, + { + "scope": "renpy.meta.i renpy.meta.s", + "settings": { + "fontStyle": "italic strikethrough" + } + }, + { + "scope": "renpy.meta.b renpy.meta.u", + "settings": { + "fontStyle": "bold underline" + } + }, + { + "scope": "renpy.meta.b renpy.meta.s", + "settings": { + "fontStyle": "bold strikethrough" + } + }, + { + "scope": "renpy.meta.u renpy.meta.s", + "settings": { + "fontStyle": "underline strikethrough" + } + }, + { + "scope": "renpy.meta.i renpy.meta.b renpy.meta.u", + "settings": { + "fontStyle": "italic bold underline" + } + }, + { + "scope": "renpy.meta.i renpy.meta.b renpy.meta.s", + "settings": { + "fontStyle": "italic bold strikethrough" + } + }, + { + "scope": "renpy.meta.i renpy.meta.u renpy.meta.s", + "settings": { + "fontStyle": "italic underline strikethrough" + } + }, + { + "scope": "renpy.meta.b renpy.meta.u renpy.meta.s", + "settings": { + "fontStyle": "bold underline strikethrough" + } + }, + { + "scope": "renpy.meta.i renpy.meta.b renpy.meta.u renpy.meta.s", + "settings": { + "fontStyle": "italic bold underline strikethrough" + } + }, + { + "scope": "renpy.meta.color.text", + "settings": { + "foreground": "#ffffff" + } + }, + { + "scope": "renpy.meta.color.#0000ffff", + "settings": { + "foreground": "#0000ffff" + } + }, + { + "scope": "renpy.meta.color.#00ff00", + "settings": { + "foreground": "#00ff00" + } + }, + { + "scope": "renpy.meta.color.#f00", + "settings": { + "foreground": "#f00" + } + }, + { + "scope": "text.notes.info", + "settings": { + "foreground": "#17a2b8", + "fontStyle": "bold" + } + }, + { + "scope": "text.notes.success", + "settings": { + "foreground": "#28a745", + "fontStyle": "bold" + } + }, + { + "scope": "text.notes.warning", + "settings": { + "foreground": "#ffc107", + "fontStyle": "bold" + } + }, + { + "scope": "text.notes.danger", + "settings": { + "foreground": "#dc3545", + "fontStyle": "bold" + } + } + ] + } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 43139e84..3ee4695b 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -120,7 +120,7 @@ "type": "npm", "script": "lint", "group": "build", - "problemMatcher": ["$eslint-stylish"] + "problemMatcher": [ "$eslint-stylish" ] } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index eb2c35d1..6786b4be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,202 +1,6 @@ # Changelog -## 2.0.13 (2022/08/29) +## 2.3.x -### Fixes - -* Fixed overwrite existing 'files.exclude' in `settings.json` [#184](https://github.com/LuqueDaniel/vscode-language-renpy/pull/184) - -## 2.0.12 (2022/07/12) - -### Changes - -* Updated minimum version of VS Code to `1.63.0` [#159](https://github.com/LuqueDaniel/vscode-language-renpy/pull/159) -* Replaced config option `renpy.excludeRpycFilesFromWorkspace` with `renpy.excludeCompiledFilesFromWorkspace`. Now `*.rpyc`, `*.rpa`, `*.rpymc` files and the `cache/` directory will be excluded from the workspace [#155](https://github.com/LuqueDaniel/vscode-language-renpy/pull/155) - -### Dependencies - -* Bumps `@types/node` from `17.0.31` to `18.0.3` [#157](https://github.com/LuqueDaniel/vscode-language-renpy/pull/157) -* Bumps `typescript` from `4.6.4` to `4.7.4` [#152](https://github.com/LuqueDaniel/vscode-language-renpy/pull/152) - -## 2.0.11 (2022/06/30) - -### Changes - -* Added default language icon for `.rpy` and `.rpym` files [#140](https://github.com/LuqueDaniel/vscode-language-renpy/pull/140) - -### Fixes - -* Listen to config changes and update value accordingly [#147](https://github.com/LuqueDaniel/vscode-language-renpy/discussions/147) and [#149](https://github.com/LuqueDaniel/vscode-language-renpy/issues/149) - -## 2.0.10 (2022/05/24) - -### Fixes - -* Allow double underscore in variable names [#123](https://github.com/LuqueDaniel/vscode-language-renpy/pull/123) (fix issue [#122](https://github.com/LuqueDaniel/vscode-language-renpy/issues/122)) - -### Other changes - -* Reserved variable names now show as warnings instead of errors - -## 2.0.9 (2022/05/02) - -### Fixes - -* Properly remove the leading slash in file path [#98](https://github.com/LuqueDaniel/vscode-language-renpy/pull/98) (fix issue [#91](https://github.com/LuqueDaniel/vscode-language-renpy/issues/91)) -* Don't overwrite the config file [#105](https://github.com/LuqueDaniel/vscode-language-renpy/pull/105) - -### Other changes - -* Updated development dependencies: - * [#106](https://github.com/LuqueDaniel/vscode-language-renpy/pull/106) `@types/node` from `17.0.23` to `17.0.31` - * [#107](https://github.com/LuqueDaniel/vscode-language-renpy/pull/107) `@types/mocha` from `9.1.0` to `9.1.1` - * [#108](https://github.com/LuqueDaniel/vscode-language-renpy/pull/108) `typescript` from `4.6.3` to `4.6.4` - -## 2.0.8 (2022/04/07) - -Fixes an error in our publishing workflow. - -## 2.0.7 (2022/04/07) - -### Changes and improvements - -* Improved detection of `label`, `transform`, `screen`, `def` and `class` in some special cases. -* Updated dev dependencies. -* Updated README.md - -### Fixes - -* Fix `Visual Studio Code.edit.py` opening files containing spaces in the path [#79](https://github.com/LuqueDaniel/vscode-language-renpy/issues/79) - -## 2.0.6 (2022/02/22) - -### Changes and improvements - -* Allow extension to run in an untrusted workspace [#70](https://github.com/LuqueDaniel/vscode-language-renpy/pull/70). -* Remove folding provider. More information [#69](https://github.com/LuqueDaniel/vscode-language-renpy/issues/69). - -### Fixes - -* Fix folding class at the end of init python block [#68](https://github.com/LuqueDaniel/vscode-language-renpy/pull/68). -* Other issues related to folding: [#66](https://github.com/LuqueDaniel/vscode-language-renpy/issues/66) and [#65](https://github.com/LuqueDaniel/vscode-language-renpy/issues/65). - -## 2.0.5 (2021/12/24) - -### Fixes - -* Fix semantic exception when position is negative [#62](https://github.com/LuqueDaniel/vscode-language-renpy/issues/62) -* Fix (Uncompiled Game) status bar text when editing a non-Renpy workspace/file - -## 2.0.4 (2021/11/14) - -### Changes and improvements - -* Ren'Py default transforms are now included in the 'at' autocomplete list [#51](https://github.com/LuqueDaniel/vscode-language-renpy/issues/51) -* Doc strings are no longer parsed for semantic tokens [#44](https://github.com/LuqueDaniel/vscode-language-renpy/issues/44) - -### Fixes - -* Fix folding for label starting with a dot [#52](https://github.com/LuqueDaniel/vscode-language-renpy/issues/52) -* Fix undefined store warnings for Classes and Callables [#56](https://github.com/LuqueDaniel/vscode-language-renpy/issues/56) - -## 2.0.3 (2021/10/31) - -### Changes and improvements - -* Add support for named stores [#38](https://github.com/LuqueDaniel/vscode-language-renpy/issues/38) -* Add highlighting for `extend` keyword [#41](https://github.com/LuqueDaniel/vscode-language-renpy/pull/41) -* Change highlighting for label names [#41](https://github.com/LuqueDaniel/vscode-language-renpy/pull/41) - -### Fixes - -* Fix class variables not highlighting or showing in completion list [#46](https://github.com/LuqueDaniel/vscode-language-renpy/issues/46) -* Fix inherited classes not showing completion parameters [#45](https://github.com/LuqueDaniel/vscode-language-renpy/issues/45) -* Fix syntax highlighting for `self/cls` so they are tokenized as keywords [#47](https://github.com/LuqueDaniel/vscode-language-renpy/issues/47) - -## 2.0.2 (2021/10/25) - -### Changes and improvements - -* Improve folding function and grammar by [@joe69-96](https://github.com/joe69-96) in [#32](https://github.com/LuqueDaniel/vscode-language-renpy/pull/32). -* Add settings for diagnostic warnings by [@rdurfee](https://github.com/rdurfee) in [#35](https://github.com/LuqueDaniel/vscode-language-renpy/pull/35) - * Diagnostic warnings can now be disabled for reserved variable names, invalid variable names, or invalid filenames. - * Reserved Ren'Py variables such as `_window_subtitle` no longer flag an error or warning - * Variable names with numbers now highlight properly in Python functions -* Defined variables and persistents are now recognized without a compile by [@rdurfee](https://github.com/rdurfee) in [#37](https://github.com/LuqueDaniel/vscode-language-renpy/pull/37) - * Adding default/define variables and persistents are now recognized without a compile [#27](https://github.com/LuqueDaniel/vscode-language-renpy/issues/27) - * Auto-complete now functions correctly for internal classes such as `iap` and `updater` [#36](https://github.com/LuqueDaniel/vscode-language-renpy/issues/36) - * Documentation for reserved Ren'Py variables such as `_window_subtitle` now displays correctly [#36](https://github.com/LuqueDaniel/vscode-language-renpy/issues/36) - -## 2.0.1 (2021/10/19) - -### Fixes - -* Providers fixes by [@rdurfee](https://github.com/rdurfee) in [#26](https://github.com/LuqueDaniel/vscode-language-renpy/pull/26) - * The extension now works with most features even when navigation.json is not found - * Fixed missing command errors when navigation.json is not found - * Warnings for undefined store variables can now be disabled - * Hover documentation displays properly for python function defs spanning multiple lines - * Completion now works properly with user-defined stores - * Document Symbols (Outline) for Classes now display properties, fields, and methods -* Fix variable parsing ending prematurely by [@joe69-96](https://github.com/joe69-96) in [#29](https://github.com/LuqueDaniel/vscode-language-renpy/pull/29). - -## 2.0.0 (2021/10/16) - -### Features - -These features have been added by [@rdurfee](https://github.com/rdurfee) - PR [#21](https://github.com/LuqueDaniel/vscode-language-renpy/pull/21). - -* Extension Settings - Allows you to enable/disable certain new functionality -* Hover - Hovering over a keyword will display the selected item's source file/location as well as documentation if available -* Definition - Adds support for right-click Go To Definition (F12), which will jump to the selected keyword's source -* Document Symbols - Document Symbols are displayed in the Outline window in the sidebar -* Signature Help - Shows the documentation pop-up as you enter a function's arguments -* Completion - Displays a pop-up auto-complete menu with appropriate choices as you type your script -* Document Color - Displays a color block next to detected colors in your script and allows you to pick new colors with a click -* Reference - Adds support for Go To Reference, which searches your documents for the selected keyword -* Folding - Adds folding support to collapse logical sections of your script in the editor -* Semantic Tokens - Detects parameters and variables in screens and functions and colorizes them correctly -* Diagnostics - Adds support for detection of issues with indentation or invalid filenames/variable names and marks them as errors or warnings in the editor - -## 1.1.0 (2021/08/13) - -### Features - -* Update syntax to Ren'Py 7.4.6 [[#18](https://github.com/LuqueDaniel/vscode-language-renpy/pull/18)] ([01f12fa](https://github.com/LuqueDaniel/vscode-language-renpy/commit/01f12fa43913d4c5ea14d738bfa69c4f5fcb2dcf)) - -### Fixes - -* fixed keyword highlighted when using snake case [[#19](https://github.com/LuqueDaniel/vscode-language-renpy/pull/19)] ([65dc0f3](https://github.com/LuqueDaniel/vscode-language-renpy/commit/65dc0f3cd15dd3922de8ef4fc8a59f0f40304eed)) - -## 1.0.8 (2021/08/12) - -### Fixes - -* Fixed extension's icon [[#17](https://github.com/LuqueDaniel/vscode-language-renpy/pull/17)] - -### Dependencies - -* Bump `path-parse` from `1.0.6` to `1.0.7` [[#16](https://github.com/LuqueDaniel/vscode-language-renpy/pull/16)] - -## 1.0.7 (2021/03/29) - -* Add Python-like custom folding markers [[#12](https://github.com/LuqueDaniel/vscode-language-renpy/pull/12)] -* Migrate from node to node-test -* Fix npm errors and vulnerabilities -* Upgrade packages. - -## 1.0.0 (2019/08/17) - -* Update Ren'Py syntax -* Adds new `surroundingPairs`, `autoClosingPairs` elements - -## 0.0.5 (2019/03/15) - -* Update for Ren'Py 7.1.4 - -## 0.0.1 (2018/05/15) - -First release! :tada: - -* Adds syntax highlight -* Adds snippets +* Development of Ren'Py language has moved to the Ren'Py project. +* Updated the Ren'Py API to match the in-development version of Ren'Py 8.3. diff --git a/Contributing.md b/Contributing.md index bce7a2f4..3be1b3ef 100644 --- a/Contributing.md +++ b/Contributing.md @@ -2,13 +2,13 @@ :sparkles: Welcome, and thank you for your interest in contributing! :sparkles: -Please note we have a [code of conduct](https://github.com/LuqueDaniel/vscode-language-renpy/blob/master/CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. +Please note we have a [code of conduct](https://github.com/renpy/vscode-language-renpy/blob/master/CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. ## Reporting bugs or proposing features Open a new issue for each bug or feature you want to propose. -1. Before reporting a bug :mag: **[check](https://github.com/LuqueDaniel/vscode-language-renpy/issues)** if it has +1. Before reporting a bug :mag: **[check](https://github.com/renpy/vscode-language-renpy/issues)** if it has already been reported. 2. Specify steps to reproduce. @@ -29,9 +29,31 @@ If you want to add new features, please make sure to discuss it in an issue. 4. Install the recommended extensions (A popup should appear). This will make sure you get the best developer experience in our workflow and it will format the code as intended. -5. Make your changes and submit a pull request +5. Make your changes and submit a pull request with `develop` as your target branch 6. Happy coding! 🚀 +Tips: + +If you're working on syntax features, add the following textmate rule to your vscode `settings.json` file: + +```json +"editor.tokenColorCustomizations": { + "textMateRules": [ + { + "scope": "debug.invalid.illegal.unmatched.renpy", + "settings": { + "foreground": "#f00" + } + }, +} +``` + +This will make any unmatched tokens red. + +Use ctrl+alt+shift+i to display the vscode build-in token debug information. + +https://regexr.com will be your new best friend. + ## Additional Information ### Extension Versions diff --git a/LICENSE b/LICENSE index ce70363d..894b197c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ The MIT License -Copyright 2018 (c) Daniel Luque +Original work Copyright (c) 2018 Daniel Luque +Modified work Copyright (c) 2024 Tom Rothamel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -21,7 +22,7 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------------------- +--- This extension was derived from a Atom package located at https://github.com/renpy/language-renpy and distributed under the following @@ -50,7 +51,7 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------------------- +--- This package was derived from a TextMate bundle located at https://github.com/textmate/python.tmbundle and distributed under the following diff --git a/README.md b/README.md index a149eb4c..9ebe91ed 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,9 @@ An extension that adds rich support for the [Ren'Py](https://www.renpy.org/) programming language to [Visual Studio Code](https://code.visualstudio.com/). -- [![Visual Studio Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/luquedaniel.languague-renpy?label=Visual%20Studio%20Marketplace&style=flat-square)](https://marketplace.visualstudio.com/items?itemName=LuqueDaniel.languague-renpy) -[![Visual Studio Marketplace Rating](https://img.shields.io/visual-studio-marketplace/r/luquedaniel.languague-renpy?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=LuqueDaniel.languague-renpy&ssr=false#review-details) -![Visual Studio Marketplace Installs](https://img.shields.io/visual-studio-marketplace/i/luquedaniel.languague-renpy?style=flat-square) -- [![Open VSX Version](https://img.shields.io/open-vsx/v/LuqueDaniel/languague-renpy?label=Open%20VSX&style=flat-square)](https://open-vsx.org/extension/LuqueDaniel/languague-renpy) -[![Open VSX Rating](https://img.shields.io/open-vsx/rating/LuqueDaniel/languague-renpy?style=flat-square)](https://open-vsx.org/extension/LuqueDaniel/languague-renpy) -![Open VSX Downloads](https://img.shields.io/open-vsx/dt/LuqueDaniel/languague-renpy?style=flat-square) - Snippets converted from [Ren'Py language support in Atom](https://github.com/renpy/language-renpy) -Feel free to [contribute](https://github.com/LuqueDaniel/vscode-language-renpy/blob/master/Contributing.md), fork this and send a pull request. :smile: +Feel free to [contribute](https://github.com/renpy/vscode-language-renpy/blob/master/Contributing.md), fork this and send a pull request. :smile: ## Features @@ -62,12 +55,6 @@ Feel free to [contribute](https://github.com/LuqueDaniel/vscode-language-renpy/b > Document Symbols are displayed in the Outline window in the sidebar. -## Integrate VSCode as code editor in Ren'Py (Ren'Py 7.4 and older) - -Note: In Ren'py 7.5/8.0 VSCode is already included by default in the list of text editors - -You can copy the [`Visual Studio Code.edit.py`](https://raw.githubusercontent.com/LuqueDaniel/vscode-language-renpy/master/Visual%20Studio%20Code.edit.py) file that is available at the root of this repository to the root of your project directory. This will add VSCode (or VSCodium) to the list of text editors in Ren'Py. - ## Thanks To - [language-renpy](https://github.com/renpy/language-renpy). All contributors diff --git a/TODO.md b/TODO.md index 96ddf9b3..86afdf79 100644 --- a/TODO.md +++ b/TODO.md @@ -3,7 +3,6 @@ Renpy Features List - Support launching the project through VSCode - Bugs to fix: - * Fix error on restart * Show color editor in tags (also check https://www.renpy.org/doc/html/color_class.html) * % can be escaped in strings * if line contains unclosed ( [ or { line is continued (see https://www.renpy.org/doc/html/language_basics.html#logical-lines) diff --git a/Visual Studio Code.edit.py b/Visual Studio Code.edit.py deleted file mode 100644 index 6cbe8e59..00000000 --- a/Visual Studio Code.edit.py +++ /dev/null @@ -1,72 +0,0 @@ -import os -import subprocess -import sys - -import renpy.editor - - -class Editor(renpy.editor.Editor): - - has_projects = True - - def get_code(self): - """ - Returns the path to the code executable, if None. - """ - - DIR = os.path.abspath(os.path.dirname(__file__)) - - if renpy.windows: - code = "Code.cmd" - elif renpy.macintosh: - DIR = os.path.abspath("/Applications") - code = os.path.join( - DIR, - "Visual Studio Code.app", - "Contents", - "Resources", - "app", - "bin", - "code", - ) - else: - code = "code" - - return code - - def open(self, filename, line=None, **kwargs): - if line: - filename = "{}:{}".format(filename, line) - self.args.append(filename) - - def open_project(self, project): - self.args.append(project) - - def begin(self, new_window=False, **kwargs): - self.args = [] - - def end(self, **kwargs): - self.args.reverse() - code = self.get_code() - args = [code, "-g"] + self.args - args = [renpy.exports.fsencode(i) for i in args] - - if renpy.windows: - CREATE_NO_WINDOW = 0x08000000 - subprocess.Popen(args, creationflags=CREATE_NO_WINDOW) - else: - subprocess.Popen(args) - - -def main(): - e = Editor() - e.begin() - - for i in sys.argv[1:]: - e.open(i) - - e.end() - - -if __name__ == "__main__": - main() diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index c897acda..cf1dda83 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -7,6 +7,12 @@ }, "editor.tokenColorCustomizations": { "textMateRules": [ + { + "scope": "debug.invalid.illegal.unmatched.renpy", + "settings": { + "foreground": "#f00" + } + }, { "scope": "renpy.meta.plain", "settings": { @@ -26,7 +32,7 @@ } }, { - "scope": ["renpy.meta.u", "renpy.meta.a"], + "scope": [ "renpy.meta.u", "renpy.meta.a" ], "settings": { "fontStyle": "underline" } diff --git a/examples/example.rpy b/examples/example.rpy index 4eb0d13a..7a33a535 100644 --- a/examples/example.rpy +++ b/examples/example.rpy @@ -94,6 +94,8 @@ label start: e "Ren'Py is a language and engine for writing and playing visual novel games." + $ seen = 1 + e "Our goal is to allow people to be able to write the script for a game, and with very little effort, turn that script into a working game." diff --git a/examples/game/script.rpy b/examples/game/script.rpy index 5732dc3a..c26e531d 100644 --- a/examples/game/script.rpy +++ b/examples/game/script.rpy @@ -44,9 +44,9 @@ label start: # These display lines of dialogue. - e "You've created a new Ren'Py game." + character.e "You've created a new Ren'Py game." - # call a label + # call a label call sidebar_label @@ -96,7 +96,7 @@ screen hello_title(): # sample python code init: "Renpy code block" - + python: renpy.pause(delay) diff --git a/examples/test_ren.py b/examples/test_ren.py new file mode 100644 index 00000000..4e90b358 --- /dev/null +++ b/examples/test_ren.py @@ -0,0 +1,17 @@ +# This is not included in the game. It's here so that an editor knows +# the type of strength. +strength = 100 + +"""renpy +init python: +""" + +class BoostStrength(Action): + """ + Boosts the strength of the player by 10. + """ + + def __call__(self): + global strength + strength += 10 + renpy.restart_interaction() \ No newline at end of file diff --git a/examples/tokenizer_tests.rpy b/examples/tokenizer_tests.rpy new file mode 100644 index 00000000..6b53275e --- /dev/null +++ b/examples/tokenizer_tests.rpy @@ -0,0 +1,33 @@ +init python hide early in Namespace: + + def sampleFunction(name, delay, position=(0,0)): + """ + This is a sample function. + """ +# test + renpy.pause(delay) + return name + + class Inventory: + """ + This is a fake inventory class. + """ + + def __init__(self): + self.items = [] + + def add(self, item): + """Add an item to the inventory.""" + self.items.append(item); + return + +label start: + "Light Distraction\n{color=ff0000}{size=18}[distraction_percentages[0]]%% Chance{/size}{/color}" + + menu: + "It's a video game.": + jump game + + "It's an interactive book.": + jump book + \ No newline at end of file diff --git a/examples/unit_test.rpy b/examples/unit_test.rpy index 87ddda91..1d68dd45 100644 --- a/examples/unit_test.rpy +++ b/examples/unit_test.rpy @@ -326,6 +326,7 @@ call .subroutine(2) from test #lol + call screen start #lol call expression "sub" + "routine" pass (count=3) #lol call expression "sub" + "routine" pass (count=3) from _class test #lol @@ -547,11 +548,11 @@ show bg washington with None - show eileen happy at left + show eileen happy at left #test show lucy mad at right with dissolve - show eileen happy at left with dissolve + show eileen happy with dissolve at left show lucy mad at right with dissolve with None @@ -625,6 +626,8 @@ pass "Fly above." if drank_tea: pass + "Dig below." if len(my_var) >= 2: + pass default menuset = set() @@ -837,7 +840,7 @@ queue sound "woof.mp3" volume 0.75 queue sound "woof.mp3" volume 1.0 - define audio.woof = "woof.mp23 + define audio.woof = "woof.mp3" # ... @@ -1199,6 +1202,14 @@ translate piglatin python: style.default.font = "stonecutter.ttf" + old "These two lines will be combined together to form a long line.\n\nThis line will be separate." + new _p(""" + These two lines will be combined together + to form a long line. Bork bork bork. + + This line will be separate. Bork bork bork. + """) + frame: style_prefix "pref" has vbox @@ -1214,13 +1225,7 @@ This line will be separate. """) - old "These two lines will be combined together to form a long line.\n\nThis line will be separate." - new _p(""" - These two lines will be combined together - to form a long line. Bork bork bork. - - This line will be separate. Bork bork bork. - """) + #endregion Translation @@ -1564,6 +1569,19 @@ @renpy.atl_warper def linear(t): return t + + init python: + @dataclass + class LatLonPair: + lon: float, + lat: float + + @dataclass + class SimpleWeatherInfo: + id: int, + main: str, + description: str, + icon: str label start: show eileen happy at a, b, c @@ -1853,7 +1871,7 @@ image big hello world = Text("Hello World", style="big") screen hello_world: - text "Hello, World" style "big" + text "Hello, World" style "big" at 0# Comment style my_text is text: size 40 @@ -1873,6 +1891,21 @@ variant "touch" take big_red + style history_text: + xpos gui.history_text_xpos + ypos gui.history_text_ypos + xanchor gui.history_text_xalign + xsize gui.history_text_width + min_width gui.history_text_width + text_align gui.history_text_xalign + layout ("subtitle" if gui.history_text_xalign else "tex") + + style history_label: + xfill True + + style history_label_text: + xalign 0.5 + init python: style.button['Foo'].background = "#f00" style.button['Bar'].background = "#00f" @@ -3540,9 +3573,9 @@ #region Customizing the Keymap # see https://www.renpy.org/doc/html/keymap.html - init: - $ config.keymap['dismiss'].append('t') - $ config.keymap['dismiss'].remove('K_SPACE') + init python: + config.keymap['dismiss'].append('t') + config.keymap['dismiss'].remove('K_SPACE') config.keymap = dict( @@ -3663,59 +3696,59 @@ ) - config.pad_bindings = { - "pad_leftshoulder_press" : [ "rollback", ], - "pad_lefttrigger_pos" : [ "rollback", ], - "pad_back_press" : [ "rollback", ], + config.pad_bindings = { + "pad_leftshoulder_press" : [ "rollback", ], + "pad_lefttrigger_pos" : [ "rollback", ], + "pad_back_press" : [ "rollback", ], - "repeat_pad_leftshoulder_press" : [ "rollback", ], - "repeat_pad_lefttrigger_pos" : [ "rollback", ], - "repeat_pad_back_press" : [ "rollback", ], + "repeat_pad_leftshoulder_press" : [ "rollback", ], + "repeat_pad_lefttrigger_pos" : [ "rollback", ], + "repeat_pad_back_press" : [ "rollback", ], - "pad_guide_press" : [ "game_menu", ], - "pad_start_press" : [ "game_menu", ], + "pad_guide_press" : [ "game_menu", ], + "pad_start_press" : [ "game_menu", ], - "pad_y_press" : [ "hide_windows", ], + "pad_y_press" : [ "hide_windows", ], - "pad_rightshoulder_press" : [ "rollforward", ], - "repeat_pad_rightshoulder_press" : [ "rollforward", ], + "pad_rightshoulder_press" : [ "rollforward", ], + "repeat_pad_rightshoulder_press" : [ "rollforward", ], - "pad_righttrigger_pos" : [ "dismiss", "button_select", "bar_activate", "bar_deactivate" ], - "pad_a_press" : [ "dismiss", "button_select", "bar_activate", "bar_deactivate"], - "pad_b_press" : [ "button_alternate" ], + "pad_righttrigger_pos" : [ "dismiss", "button_select", "bar_activate", "bar_deactivate" ], + "pad_a_press" : [ "dismiss", "button_select", "bar_activate", "bar_deactivate"], + "pad_b_press" : [ "button_alternate" ], - "pad_dpleft_press" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "pad_leftx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "pad_rightx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "pad_dpleft_press" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "pad_leftx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "pad_rightx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "pad_dpright_press" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "pad_leftx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "pad_rightx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "pad_dpright_press" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "pad_leftx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "pad_rightx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "pad_dpup_press" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "pad_lefty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "pad_righty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "pad_dpup_press" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "pad_lefty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "pad_righty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "pad_dpdown_press" : [ "focus_down", "bar_down", "viewport_downarrow" ], - "pad_lefty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], - "pad_righty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], + "pad_dpdown_press" : [ "focus_down", "bar_down", "viewport_downarrow" ], + "pad_lefty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], + "pad_righty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], - "repeat_pad_dpleft_press" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "repeat_pad_leftx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "repeat_pad_rightx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "repeat_pad_dpleft_press" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "repeat_pad_leftx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], + "repeat_pad_rightx_neg" : [ "focus_left", "bar_left", "viewport_leftarrow" ], - "repeat_pad_dpright_press" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "repeat_pad_leftx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "repeat_pad_rightx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "repeat_pad_dpright_press" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "repeat_pad_leftx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], + "repeat_pad_rightx_pos" : [ "focus_right", "bar_right", "viewport_rightarrow" ], - "repeat_pad_dpup_press" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "repeat_pad_lefty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "repeat_pad_righty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "repeat_pad_dpup_press" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "repeat_pad_lefty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], + "repeat_pad_righty_neg" : [ "focus_up", "bar_up", "viewport_uparrow" ], - "repeat_pad_dpdown_press" : [ "focus_down", "bar_down", "viewport_downarrow" ], - "repeat_pad_lefty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], - "repeat_pad_righty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], - } + "repeat_pad_dpdown_press" : [ "focus_down", "bar_down", "viewport_downarrow" ], + "repeat_pad_lefty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], + "repeat_pad_righty_pos" : [ "focus_down", "bar_down", "viewport_downarrow" ], + } #endregion Customizing the Keymap @@ -3793,6 +3826,25 @@ #endregion Python and Ren'Py #region other + screen extract_dialogue: + + frame: + style_group "l" + style "l_root" + + window: + + has vbox + + label _("Extract Dialogue: [project.current.display_name!q]"): + test + + add HALF_SPACER + + frame: + style "l_indent" + xfill True + # Return Statement label main_menu: return "no_unlock" diff --git a/grammars/python.grammar.ebnf b/grammars/python.grammar.ebnf new file mode 100644 index 00000000..b6ce02dc --- /dev/null +++ b/grammars/python.grammar.ebnf @@ -0,0 +1,872 @@ +PYTHON_CONTROL_FLOW_KEYWORD = "if" | "else" | "elif" | "while" | "for" + |"return" | "continue" | "yield" | "break" | "pass" + | "try" | "finally"; + +PYTHON_KEYWORD = "True" | "False" | "None" + | PYTHON_CONTROL_FLOW_KEYWORD + | "raise" | "except" + | "as" | "with" | "from" | "in" | "is" + | "and" | "not" | "or" | "del" + | "global" | "nonlocal" | "async" | "await" + | "def" | "class" | "lambda" | "import" | "assert"; + +# PEG grammar for Python + + + +# ========================= START OF THE GRAMMAR ========================= + +# General grammatical elements and rules: +# +# * Strings with double quotes (") denote SOFT KEYWORDS +# * Strings with single quotes (') denote KEYWORDS +# * Upper case names (NAME) denote tokens in the Grammar/Tokens file +# * Rule names starting with "invalid_" are used for specialized syntax errors +# - These rules are NOT used in the first pass of the parser. +# - Only if the first pass fails to parse, a second pass including the invalid +# rules will be executed. +# - If the parser fails in the second phase with a generic syntax error, the +# location of the generic failure of the first pass will be used (this avoids +# reporting incorrect locations due to the invalid rules). +# - The order of the alternatives involving invalid rules matter +# (like any rule in PEG). +# +# Grammar Syntax (see PEP 617 for more information): +# +# rule_name: expression +# Optionally, a type can be included right after the rule name, which +# specifies the return type of the C or Python function corresponding to the +# rule: +# rule_name[return_type]: expression +# If the return type is omitted, then a void * is returned in C and an Any in +# Python. +# e1 e2 +# Match e1, then match e2. +# e1 | e2 +# Match e1 or e2. +# The first alternative can also appear on the line after the rule name for +# formatting purposes. In that case, a | must be used before the first +# alternative, like so: +# rule_name[return_type]: +# | first_alt +# | second_alt +# ( e ) +# Match e (allows also to use other operators in the group like '(e)*') +# [ e ] or e? +# Optionally match e. +# e* +# Match zero or more occurrences of e. +# e+ +# Match one or more occurrences of e. +# s.e+ +# Match one or more occurrences of e, separated by s. The generated parse tree +# does not include the separator. This is otherwise identical to (e (s e)*). +# &e +# Succeed if e can be parsed, without consuming any input. +# !e +# Fail if e can be parsed, without consuming any input. +# ~ +# Commit to the current alternative, even if it fails to parse. +# + +# STARTING RULES +# ============== + +file: [statements] ENDMARKER +interactive: statement_newline +eval: expressions NEWLINE* ENDMARKER +func_type: '(' [type_expressions] ')' '->' expression NEWLINE* ENDMARKER +fstring: star_expressions + +# GENERAL STATEMENTS +# ================== + +statements: statement+ + +statement: compound_stmt | simple_stmts + +statement_newline: + | compound_stmt NEWLINE + | simple_stmts + | NEWLINE + | ENDMARKER + +simple_stmts: + | simple_stmt !';' NEWLINE # Not needed, there for speedup + | ';'.simple_stmt+ [';'] NEWLINE + +# NOTE: assignment MUST precede expression, else parsing a simple assignment +# will throw a SyntaxError. +simple_stmt: + | assignment + | star_expressions + | return_stmt + | import_stmt + | raise_stmt + | 'pass' + | del_stmt + | yield_stmt + | assert_stmt + | 'break' + | 'continue' + | global_stmt + | nonlocal_stmt + +compound_stmt: + | function_def + | if_stmt + | class_def + | with_stmt + | for_stmt + | try_stmt + | while_stmt + | match_stmt + +# SIMPLE STATEMENTS +# ================= + +# NOTE: annotated_rhs may start with 'yield'; yield_expr must start with 'yield' +assignment: + | NAME ':' expression ['=' annotated_rhs ] + | ('(' single_target ')' + | single_subscript_attribute_target) ':' expression ['=' annotated_rhs ] + | (star_targets '=' )+ (yield_expr | star_expressions) !'=' [TYPE_COMMENT] + | single_target augassign ~ (yield_expr | star_expressions) + +annotated_rhs: yield_expr | star_expressions + +augassign: + | '+=' + | '-=' + | '*=' + | '@=' + | '/=' + | '%=' + | '&=' + | '|=' + | '^=' + | '<<=' + | '>>=' + | '**=' + | '//=' + +return_stmt: + | 'return' [star_expressions] + +raise_stmt: + | 'raise' expression ['from' expression ] + | 'raise' + +global_stmt: 'global' ','.NAME+ + +nonlocal_stmt: 'nonlocal' ','.NAME+ + +del_stmt: + | 'del' del_targets &(';' | NEWLINE) + +yield_stmt: yield_expr + +assert_stmt: 'assert' expression [',' expression ] + +import_stmt: import_name | import_from + +# Import statements +# ----------------- + +import_name: 'import' dotted_as_names +# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS +import_from: + | 'from' ('.' | '...')* dotted_name 'import' import_from_targets + | 'from' ('.' | '...')+ 'import' import_from_targets +import_from_targets: + | '(' import_from_as_names [','] ')' + | import_from_as_names !',' + | '*' +import_from_as_names: + | ','.import_from_as_name+ +import_from_as_name: + | NAME ['as' NAME ] +dotted_as_names: + | ','.dotted_as_name+ +dotted_as_name: + | dotted_name ['as' NAME ] +dotted_name: + | dotted_name '.' NAME + | NAME + +# COMPOUND STATEMENTS +# =================== + +# Common elements +# --------------- + +block: + | NEWLINE INDENT statements DEDENT + | simple_stmts + +decorators: ('@' named_expression NEWLINE )+ + +# Class definitions +# ----------------- + +class_def: + | decorators class_def_raw + | class_def_raw + +class_def_raw: + | 'class' NAME ['(' [arguments] ')' ] ':' block + +# Function definitions +# -------------------- + +function_def: + | decorators function_def_raw + | function_def_raw + +function_def_raw: + | 'def' NAME '(' [params] ')' ['->' expression ] ':' [func_type_comment] block + | ASYNC 'def' NAME '(' [params] ')' ['->' expression ] ':' [func_type_comment] block + +# Function parameters +# ------------------- + +params: + | parameters + +parameters: + | slash_no_default param_no_default* param_with_default* [star_etc] + | slash_with_default param_with_default* [star_etc] + | param_no_default+ param_with_default* [star_etc] + | param_with_default+ [star_etc] + | star_etc + +# Some duplication here because we can't write (',' | &')'), +# which is because we don't support empty alternatives (yet). + +slash_no_default: + | param_no_default+ '/' ',' + | param_no_default+ '/' &')' +slash_with_default: + | param_no_default* param_with_default+ '/' ',' + | param_no_default* param_with_default+ '/' &')' + +star_etc: + | '*' param_no_default param_maybe_default* [kwds] + | '*' param_no_default_star_annotation param_maybe_default* [kwds] + | '*' ',' param_maybe_default+ [kwds] + | kwds + +kwds: + | '**' param_no_default + +# One parameter. This *includes* a following comma and type comment. +# +# There are three styles: +# - No default +# - With default +# - Maybe with default +# +# There are two alternative forms of each, to deal with type comments: +# - Ends in a comma followed by an optional type comment +# - No comma, optional type comment, must be followed by close paren +# The latter form is for a final parameter without trailing comma. +# + +param_no_default: + | param ',' TYPE_COMMENT? + | param TYPE_COMMENT? &')' +param_no_default_star_annotation: + | param_star_annotation ',' TYPE_COMMENT? + | param_star_annotation TYPE_COMMENT? &')' +param_with_default: + | param default ',' TYPE_COMMENT? + | param default TYPE_COMMENT? &')' +param_maybe_default: + | param default? ',' TYPE_COMMENT? + | param default? TYPE_COMMENT? &')' +param: NAME annotation? +param_star_annotation: NAME star_annotation +annotation: ':' expression +star_annotation: ':' star_expression +default: '=' expression | invalid_default + +# If statement +# ------------ + +if_stmt: + | 'if' named_expression ':' block elif_stmt + | 'if' named_expression ':' block [else_block] +elif_stmt: + | 'elif' named_expression ':' block elif_stmt + | 'elif' named_expression ':' block [else_block] +else_block: + | 'else' ':' block + +# While statement +# --------------- + +while_stmt: + | 'while' named_expression ':' block [else_block] + +# For statement +# ------------- + +for_stmt: + | 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] + | ASYNC 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] + +# With statement +# -------------- + +with_stmt: + | 'with' '(' ','.with_item+ ','? ')' ':' block + | 'with' ','.with_item+ ':' [TYPE_COMMENT] block + | ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block + | ASYNC 'with' ','.with_item+ ':' [TYPE_COMMENT] block + +with_item: + | expression 'as' star_target &(',' | ')' | ':') + | expression + +# Try statement +# ------------- + +try_stmt: + | 'try' ':' block finally_block + | 'try' ':' block except_block+ [else_block] [finally_block] + | 'try' ':' block except_star_block+ [else_block] [finally_block] + + +# Except statement +# ---------------- + +except_block: + | 'except' expression ['as' NAME ] ':' block + | 'except' ':' block +except_star_block: + | 'except' '*' expression ['as' NAME ] ':' block +finally_block: + | 'finally' ':' block + +# Match statement +# --------------- + +match_stmt: + | "match" subject_expr ':' NEWLINE INDENT case_block+ DEDENT + +subject_expr: + | star_named_expression ',' star_named_expressions? + | named_expression + +case_block: + | "case" patterns guard? ':' block + +guard: 'if' named_expression + +patterns: + | open_sequence_pattern + | pattern + +pattern: + | as_pattern + | or_pattern + +as_pattern: + | or_pattern 'as' pattern_capture_target + +or_pattern: + | '|'.closed_pattern+ + +closed_pattern: + | literal_pattern + | capture_pattern + | wildcard_pattern + | value_pattern + | group_pattern + | sequence_pattern + | mapping_pattern + | class_pattern + +# Literal patterns are used for equality and identity constraints +literal_pattern: + | signed_number !('+' | '-') + | complex_number + | strings + | 'None' + | 'True' + | 'False' + +# Literal expressions are used to restrict permitted mapping pattern keys +literal_expr: + | signed_number !('+' | '-') + | complex_number + | strings + | 'None' + | 'True' + | 'False' + +complex_number: + | signed_real_number '+' imaginary_number + | signed_real_number '-' imaginary_number + +signed_number: + | NUMBER + | '-' NUMBER + +signed_real_number: + | real_number + | '-' real_number + +real_number: + | NUMBER + +imaginary_number: + | NUMBER + +capture_pattern: + | pattern_capture_target + +pattern_capture_target: + | !"_" NAME !('.' | '(' | '=') + +wildcard_pattern: + | "_" + +value_pattern: + | attr !('.' | '(' | '=') + +attr: + | name_or_attr '.' NAME + +name_or_attr: + | attr + | NAME + +group_pattern: + | '(' pattern ')' + +sequence_pattern: + | '[' maybe_sequence_pattern? ']' + | '(' open_sequence_pattern? ')' + +open_sequence_pattern: + | maybe_star_pattern ',' maybe_sequence_pattern? + +maybe_sequence_pattern: + | ','.maybe_star_pattern+ ','? + +maybe_star_pattern: + | star_pattern + | pattern + +star_pattern: + | '*' pattern_capture_target + | '*' wildcard_pattern + +mapping_pattern: + | '{' '}' + | '{' double_star_pattern ','? '}' + | '{' items_pattern ',' double_star_pattern ','? '}' + | '{' items_pattern ','? '}' + +items_pattern: + | ','.key_value_pattern+ + +key_value_pattern: + | (literal_expr | attr) ':' pattern + +double_star_pattern: + | '**' pattern_capture_target + +class_pattern: + | name_or_attr '(' ')' + | name_or_attr '(' positional_patterns ','? ')' + | name_or_attr '(' keyword_patterns ','? ')' + | name_or_attr '(' positional_patterns ',' keyword_patterns ','? ')' + +positional_patterns: + | ','.pattern+ + +keyword_patterns: + | ','.keyword_pattern+ + +keyword_pattern: + | NAME '=' pattern + +# EXPRESSIONS +# ----------- + +expressions: + | expression (',' expression )+ [','] + | expression ',' + | expression + +expression: + | disjunction 'if' disjunction 'else' expression + | disjunction + | lambdef + +yield_expr: + | 'yield' 'from' expression + | 'yield' [star_expressions] + +star_expressions: + | star_expression (',' star_expression )+ [','] + | star_expression ',' + | star_expression + +star_expression: + | '*' bitwise_or + | expression + +star_named_expressions: ','.star_named_expression+ [','] + +star_named_expression: + | '*' bitwise_or + | named_expression + +assignment_expression: + | NAME ':=' ~ expression + +named_expression: + | assignment_expression + | expression !':=' + +disjunction: + | conjunction ('or' conjunction )+ + | conjunction + +conjunction: + | inversion ('and' inversion )+ + | inversion + +inversion: + | 'not' inversion + | comparison + +# Comparison operators +# -------------------- + +comparison: + | bitwise_or compare_op_bitwise_or_pair+ + | bitwise_or + +compare_op_bitwise_or_pair: + | eq_bitwise_or + | noteq_bitwise_or + | lte_bitwise_or + | lt_bitwise_or + | gte_bitwise_or + | gt_bitwise_or + | notin_bitwise_or + | in_bitwise_or + | isnot_bitwise_or + | is_bitwise_or + +eq_bitwise_or: '==' bitwise_or +noteq_bitwise_or: + | ('!=' ) bitwise_or +lte_bitwise_or: '<=' bitwise_or +lt_bitwise_or: '<' bitwise_or +gte_bitwise_or: '>=' bitwise_or +gt_bitwise_or: '>' bitwise_or +notin_bitwise_or: 'not' 'in' bitwise_or +in_bitwise_or: 'in' bitwise_or +isnot_bitwise_or: 'is' 'not' bitwise_or +is_bitwise_or: 'is' bitwise_or + +# Bitwise operators +# ----------------- + +bitwise_or: + | bitwise_or '|' bitwise_xor + | bitwise_xor + +bitwise_xor: + | bitwise_xor '^' bitwise_and + | bitwise_and + +bitwise_and: + | bitwise_and '&' shift_expr + | shift_expr + +shift_expr: + | shift_expr '<<' sum + | shift_expr '>>' sum + | sum + +# Arithmetic operators +# -------------------- + +sum: + | sum '+' term + | sum '-' term + | term + +term: + | term '*' factor + | term '/' factor + | term '//' factor + | term '%' factor + | term '@' factor + | factor + +factor: + | '+' factor + | '-' factor + | '~' factor + | power + +power: + | await_primary '**' factor + | await_primary + +# Primary elements +# ---------------- + +# Primary elements are things like "obj.something.something", "obj[something]", "obj(something)", "obj" ... + +await_primary: + | AWAIT primary + | primary + +primary: + | primary '.' NAME + | primary genexp + | primary '(' [arguments] ')' + | primary '[' slices ']' + | atom + +slices: + | slice !',' + | ','.(slice | starred_expression)+ [','] + +slice: + | [expression] ':' [expression] [':' [expression] ] + | named_expression + +atom: + | NAME + | 'True' + | 'False' + | 'None' + | strings + | NUMBER + | (tuple | group | genexp) + | (list | listcomp) + | (dict | set | dictcomp | setcomp) + | '...' + +group: + | '(' (yield_expr | named_expression) ')' + +# Lambda functions +# ---------------- + +lambdef: + | 'lambda' [lambda_params] ':' expression + +lambda_params: + | lambda_parameters + +# lambda_parameters etc. duplicates parameters but without annotations +# or type comments, and if there's no comma after a parameter, we expect +# a colon, not a close parenthesis. (For more, see parameters above.) +# +lambda_parameters: + | lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* [lambda_star_etc] + | lambda_slash_with_default lambda_param_with_default* [lambda_star_etc] + | lambda_param_no_default+ lambda_param_with_default* [lambda_star_etc] + | lambda_param_with_default+ [lambda_star_etc] + | lambda_star_etc + +lambda_slash_no_default: + | lambda_param_no_default+ '/' ',' + | lambda_param_no_default+ '/' &':' + +lambda_slash_with_default: + | lambda_param_no_default* lambda_param_with_default+ '/' ',' + | lambda_param_no_default* lambda_param_with_default+ '/' &':' + +lambda_star_etc: + | '*' lambda_param_no_default lambda_param_maybe_default* [lambda_kwds] + | '*' ',' lambda_param_maybe_default+ [lambda_kwds] + | lambda_kwds + +lambda_kwds: + | '**' lambda_param_no_default + +lambda_param_no_default: + | lambda_param ',' + | lambda_param &':' +lambda_param_with_default: + | lambda_param default ',' + | lambda_param default &':' +lambda_param_maybe_default: + | lambda_param default? ',' + | lambda_param default? &':' +lambda_param: NAME + +# LITERALS +# ======== + +strings: STRING+ + +list: + | '[' [star_named_expressions] ']' + +tuple: + | '(' [star_named_expression ',' [star_named_expressions] ] ')' + +set: '{' star_named_expressions '}' + +# Dicts +# ----- + +dict: + | '{' [double_starred_kvpairs] '}' + +double_starred_kvpairs: ','.double_starred_kvpair+ [','] + +double_starred_kvpair: + | '**' bitwise_or + | kvpair + +kvpair: expression ':' expression + +# Comprehensions & Generators +# --------------------------- + +for_if_clauses: + | for_if_clause+ + +for_if_clause: + | ASYNC 'for' star_targets 'in' ~ disjunction ('if' disjunction )* + | 'for' star_targets 'in' ~ disjunction ('if' disjunction )* + +listcomp: + | '[' named_expression for_if_clauses ']' + +setcomp: + | '{' named_expression for_if_clauses '}' + +genexp: + | '(' ( assignment_expression | expression !':=') for_if_clauses ')' + +dictcomp: + | '{' kvpair for_if_clauses '}' + +# FUNCTION CALL ARGUMENTS +# ======================= + +arguments: + | args [','] &')' + +args: + | ','.(starred_expression | ( assignment_expression | expression !':=') !'=')+ [',' kwargs ] + | kwargs + +kwargs: + | ','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+ + | ','.kwarg_or_starred+ + | ','.kwarg_or_double_starred+ + +starred_expression: + | '*' expression + +kwarg_or_starred: + | NAME '=' expression + | starred_expression + +kwarg_or_double_starred: + | NAME '=' expression + | '**' expression + +# ASSIGNMENT TARGETS +# ================== + +# Generic targets +# --------------- + +# NOTE: star_targets may contain *bitwise_or, targets may not. +star_targets: + | star_target !',' + | star_target (',' star_target )* [','] + +star_targets_list_seq: ','.star_target+ [','] + +star_targets_tuple_seq: + | star_target (',' star_target )+ [','] + | star_target ',' + +star_target: + | '*' (!'*' star_target) + | target_with_star_atom + +target_with_star_atom: + | t_primary '.' NAME !t_lookahead + | t_primary '[' slices ']' !t_lookahead + | star_atom + +star_atom: + | NAME + | '(' target_with_star_atom ')' + | '(' [star_targets_tuple_seq] ')' + | '[' [star_targets_list_seq] ']' + +single_target: + | single_subscript_attribute_target + | NAME + | '(' single_target ')' + +single_subscript_attribute_target: + | t_primary '.' NAME !t_lookahead + | t_primary '[' slices ']' !t_lookahead + +t_primary: + | t_primary '.' NAME &t_lookahead + | t_primary '[' slices ']' &t_lookahead + | t_primary genexp &t_lookahead + | t_primary '(' [arguments] ')' &t_lookahead + | atom &t_lookahead + +t_lookahead: '(' | '[' | '.' + +# Targets for del statements +# -------------------------- + +del_targets: ','.del_target+ [','] + +del_target: + | t_primary '.' NAME !t_lookahead + | t_primary '[' slices ']' !t_lookahead + | del_t_atom + +del_t_atom: + | NAME + | '(' del_target ')' + | '(' [del_targets] ')' + | '[' [del_targets] ']' + +# TYPING ELEMENTS +# --------------- + +# type_expressions allow */** but ignore them +type_expressions: + | ','.expression+ ',' '*' expression ',' '**' expression + | ','.expression+ ',' '*' expression + | ','.expression+ ',' '**' expression + | '*' expression ',' '**' expression + | '*' expression + | '**' expression + | ','.expression+ + +func_type_comment: + | NEWLINE TYPE_COMMENT &(NEWLINE INDENT) # Must be followed by indented block + | TYPE_COMMENT + +# ========================= END OF THE GRAMMAR =========================== + + + +# ========================= START OF INVALID RULES ======================= \ No newline at end of file diff --git a/grammars/renpy.atl.grammar.ebnf b/grammars/renpy.atl.grammar.ebnf new file mode 100644 index 00000000..c19bbe1e --- /dev/null +++ b/grammars/renpy.atl.grammar.ebnf @@ -0,0 +1,28 @@ +script atl_transform : "transform" `qualname` ( " (" `parameters` ")" )? ":" + : `atl_block` + +script atl_image : "image" `image_name` ":" : `atl_block` + +script atl_scene : `stmt_scene` ":" : `atl_block` atl_show : `stmt_show` ":" : `atl_block` + +atl atl_properties : ( `property` `simple_expression` ( "knot" `simple_expression` )* : | "clockwise" : | "counterclockwise" : | "circles" simple_expression : | simple_expression )* + +atl atl_interp : ( `warper` `simple_expression` | "warp" `simple_expression` `simple_expression` )? `atl_properties` : | ( `warper` `simple_expression` | "warp" `simple_expression` `simple_expression` )? ":" : `atl_properties` + +atl atl_time : "time" `simple_expression` + +atl atl_expression : `simple_expression` ("with" `simple_expression`)? + +atl atl_repeat : "repeat" (`simple_expression`)? + +atl atl_block_stmt : "block" ":" : `atl_block` + +atl atl_choice : "choice" (`simple_expression`)? ":" : `atl_block` + +atl atl_parallel : "parallel" ":" : `atl_block` + +atl atl_on : "on" `name` [ "," `name` ] * ":" : `atl_block` + +atl atl_contains : "contains" (`expression`)? + +atl atl_function : "function" `expression` \ No newline at end of file diff --git a/grammars/renpy.grammar.ebnf b/grammars/renpy.grammar.ebnf new file mode 100644 index 00000000..40df8e9b --- /dev/null +++ b/grammars/renpy.grammar.ebnf @@ -0,0 +1,351 @@ +(* + This document is speficied using extended EBNF syntax. + For EBNF see: https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form + For EBNF syntax highlighting see: https://marketplace.visualstudio.com/items?itemName=omkov.vscode-ebnf + + Symbol specification for this document: + = - definition + ; - end of definition + | - alternation (or) + , - concatenation (and) + - - except (not) + + "..." - literal + (...) - grouping + ? ... ? - special sequence (For anything that can't be (easily) expressed using other symbols) + [...] or ...? - optional (zero or one) + {...} or ...* - optionally repeating (zero or more) + ...+ - repeating (one or more, same as `e, {e}`) + s.e+ - join (Match one or more occurrences of e, separated by s. Same as `e, {s, e}`) + + &... - positive lookahead (fail if ... does not match) + !... - negative lookahead (fail if ... matches) + &<... - positive lookbehind (fail if ... was not matched in the current expression) + !<... - negative lookbehind (fail if ... was already matched in the current expression) + + Note that: + - Whitespaces between concatenations are implied, but can be specified for clarity. + - Expressions with alternations on a new line are considered grouped. + - Convention is to put the most significant (higher precedence) expressions first. +*) + +(*===Tokens with definition===*) +(* + POSIX character classes defined using unicode categories + For POSIX see: https://www.regular-expressions.info/posixbrackets.html + For unicode categories see: https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt + For category breakdown see: https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt +*) +UPPER = "\p{Uppercase_Letter}"; +LOWER = "\p{Lowercase_Letter}"; +ALPHA = "\p{Letter}" | "\p{Letter_Number}"; +LETTER = "\p{Letter}"; +DIGIT = "\p{Digit}"; +HEX_DIGIT = "\p{Hex_Digit}"; +ALNUM = ALPHA | DIGIT; +WORD_CHAR = ALNUM | "\p{Connector_Punctuation}"; +NEWLINE = "\r\n" | "\n" | "\r"; +WHITESPACE = " " | "\t"; +INDENT = ? Block opening sequence of WHITESPACE ?; +DEDENT = ? Block closing sequence of WHITESPACE less then INDENT ?; +CHARACTER = "\p{Any}"; + +HASH = HEX_DIGIT+; +INTEGER = ["+" | "-"], DIGIT+; +FLOAT = ["+" | "-"], (DIGIT+, [".", DIGIT*] | ".", DIGIT+), [("e" | "E"), INTEGER]; + +OPERATOR = "<>" | "<<" | "<=" | "<" | ">>" | ">=" | ">" | "!=" | "==" + | "|" | "^" | "&" | "+" | "-" | "**" | "*" | "//" | "/" | "%" | "~" + | "\bor\b" | "\band\b" | "\bnot\b" | "\bin\b" | "\bis\b" + ; + +RENPY_KEYWORD = "as" | "at" | "behind" | "call" | "expression" | "hide" | "if" | "in" + | "image" | "init" | "jump" | "menu" | "onlayer" | "python" | "return" | "scene" + | "show" | "with" | "while" | "zorder"; + +IDENTIFIER = "\p{XID_Start}", {"\p{XID_Continue}"}; (* Based on Python specification. See: https://docs.python.org/3/reference/lexical_analysis.html#identifiers *) +WORD = IDENTIFIER; +NAME = WORD - RENPY_KEYWORD; +DOTTED_NAME = NAME, {".", NAME}; +LABEL_NAME = [NAME?, "."], NAME; +IMAGE_NAME_COMPONENT = WORD_CHAR+; +IMAGE_NAME = WHITESPACE.IMAGE_NAME_COMPONENT+; + +STYLE_PROPERTY_PREFIX = ["selected_"], [("hover_" | "idle_" | "insensitive_" | "activate_")]; +STYLE_PROPERTY = "activate_sound" | "adjust_spacing" | "aft_bar" | "aft_gutter" | "align" | "alt" | "altruby_style" | "anchor" | "antialias" | "area" | "background" | "bar_invert" + | "bar_resizing" | "bar_vertical" | "base_bar" | "black_color" | "bold" | "bottom_bar" | "bottom_gutter" | "bottom_margin" | "bottom_padding" | "box_first_spacing" | "box_layout" | "box_reverse" + | "box_spacing" | "box_wrap" | "box_wrap_spacing" | "caret" | "child" | "clipping" | "color" | "debug" | "drop_shadow" | "drop_shadow_color" | "enable_hover" | "first_indent" + | "first_spacing" | "fit_first" | "focus_mask" | "focus_rect" | "font" | "fore_bar" | "fore_gutter" | "foreground" | "hinting" | "hover_sound" | "hyperlink_functions" | "italic" + | "justify" | "kerning" | "key_events" | "keyboard_focus" | "language" | "layout" | "left_bar" | "left_gutter" | "left_margin" | "left_padding" | "line_leading" | "line_overlap_split" + | "line_spacing" | "margin" | "maximum" | "min_width" | "minimum" | "minwidth" | "mipmap" | "modal" | "mouse" | "newline_indent" | "offset" | "order_reverse" + | "outline_scaling" | "outlines" | "padding" | "pos" | "rest_indent" | "right_bar" | "right_gutter" | "right_margin" | "right_padding" | "ruby_style" | "size" | "size_group" + | "slow_abortable" | "slow_cps" | "slow_cps_multiplier" | "slow_speed" | "sound" | "spacing" | "strikethrough" | "subpixel" | "subtitle_width" | "text_align" | "text_y_fudge" | "textalign" + | "thumb" | "thumb_offset" | "thumb_shadow" | "time_policy" | "top_bar" | "top_gutter" | "top_margin" | "top_padding" | "underline" | "unscrollable" | "vertical" | "xalign" + | "xanchor" | "xcenter" | "xfill" | "xfit" | "xmargin" | "xmaximum" | "xminimum" | "xoffset" | "xpadding" | "xpos" | "xsize" | "xspacing" + | "xysize" | "yalign" | "yanchor" | "ycenter" | "yfill" | "yfit" | "ymargin" | "ymaximum" | "yminimum" | "yoffset" | "ypadding" | "ypos" | "ysize" | "yspacing"; +STYLE_PROPERTY_NAME = "properties" | (STYLE_PROPERTY_PREFIX?, STYLE_PROPERTY); + +PYTHON_EXPRESSION = ? any valid Python expression ?; +PYTHON_STRING = ? python string ?; +STRING = ? renpy string ?; + + +(*===Renpy Expressions===*) +simple_expression = OPERATOR*, (PYTHON_STRING | NAME | FLOAT | parenthesized_python), [(".", NAME) | parenthesized_python] +simple_operator_expression = simple_expression, {OPERATOR, simple_expression}; +simple_expression_list = simple_expression, {",", simple_expression}; + +parenthesized_python = + | "(", PYTHON_EXPRESSION, ")" + | "[", PYTHON_EXPRESSION, "]" + | "{", PYTHON_EXPRESSION, "}" + ; +python_assignment_operation = "=", PYTHON_EXPRESSION; + +(* TODO: These 4 have some special rules that are not yet defined here *) +parameter = NAME, [python_assignment_operation]; +parameters = "(", [",".parameter+], ")"; +argument = [NAME, "="], PYTHON_EXPRESSION; +arguments = "(", [",".argument+], ")"; + +guard_expression = "if", PYTHON_EXPRESSION; +expression_clause = "expression", simple_expression; +as_expression = "as", NAME; +at_expression = "at", simple_expression_list; +onlayer_expression = "onlayer", NAME; +zorder_expression = "zorder", simple_expression; +behind_expression = "behind", ",".NAME+; +from_expression = "from", LABEL_NAME; +with_expression = "with", simple_expression; + + + +(* image specifier *) +image_specifier_keywords = "as" | "at" | "onlayer" | "zorder" | "behind"; +image_specifier = [expression_clause | IMAGE_NAME], { !=12.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", + "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-client/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.1.tgz", + "integrity": "sha512-ExPSbgjwCoht6kB7B4MeZoBAxcQSIl29r/bPeazZJx50ej4JJCByimLOrZoIsurISNyJQQHf30b3JfqC3Hb88A==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.9.0", + "@azure/logger": "^1.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", + "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz", + "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" }, "engines": { - "vscode": "^1.67.2" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.3.0.tgz", + "integrity": "sha512-LHZ58/RsIpIWa4hrrE2YuJ/vzG1Jv9f774RfTTAVDZDriubvJ0/S5u4pnw4akJDlS0TiJb6VMphmVUFsWmgodQ==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.5.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^3.11.1", + "@azure/msal-node": "^2.9.2", + "events": "^3.0.0", + "jws": "^4.0.0", + "open": "^8.0.0", + "stoppable": "^1.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.2.tgz", + "integrity": "sha512-l170uE7bsKpIU6B/giRc9i4NI0Mj+tANMMMxf7Zi/5cKzEqPayP7+X1WPrG7e+91JgY8N+7K7nF2WOi7iVhXvg==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.18.0.tgz", + "integrity": "sha512-jvK5bDUWbpOaJt2Io/rjcaOVcUzkqkrCme/WntdV1SMUc67AiTcEdKuY6G/nMQ7N5Cfsk9SfpugflQwDku53yg==", + "dev": true, + "dependencies": { + "@azure/msal-common": "14.13.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "14.13.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.13.0.tgz", + "integrity": "sha512-b4M/tqRzJ4jGU91BiwCsLTqChveUEyFK3qY2wGfZ0zBswIBZjAxopx5CYt5wzZFKuN15HqRDYXQbztttuIC3nA==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.10.0.tgz", + "integrity": "sha512-JxsSE0464a8IA/+q5EHKmchwNyUFJHtCH00tSXsLaOddwLjG6yVvTH6lGgPcWMhO7YWUXj/XVgVgeE9kZtsPUQ==", + "dev": true, + "dependencies": { + "@azure/msal-common": "14.13.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -151,16 +400,40 @@ "node": ">=10.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -174,30 +447,30 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -212,25 +485,36 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", @@ -241,22 +525,32 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -310,6 +604,18 @@ "node": ">= 8" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "dev": true, @@ -363,9 +669,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/json-schema": { @@ -376,36 +682,35 @@ }, "node_modules/@types/json5": { "version": "0.0.29", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/mocha": { - "version": "9.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "18.7.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz", - "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", + "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", "dev": true }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "node_modules/@types/node": { + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/vscode": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.70.0.tgz", - "integrity": "sha512-3/9Fz0F2eBgwciazc94Ien+9u1elnjFg9YAhvAb3qDy/WeFWD9VrOPU7CIytryOVUdbxus8uzL4VZYONA0gDtA==", + "version": "1.75.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.75.1.tgz", + "integrity": "sha512-emg7wdsTFzdi+elvoyoA+Q8keEautdQHyY5LNmHVM4PTpY8JgOTVADrGVyXGepJ6dVW2OS5/xnLUWh+nZxvdiA==", "dev": true }, "node_modules/@types/webpack": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", - "integrity": "sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==", + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", + "integrity": "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==", "dev": true, "dependencies": { "@types/node": "*", @@ -414,31 +719,31 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.35.1.tgz", - "integrity": "sha512-RBZZXZlI4XCY4Wzgy64vB+0slT9+yAPQRjj/HSaRwUot33xbDjF1oN9BLwOLTewoOI0jothIltZRe9uJCHf8gg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/type-utils": "5.35.1", - "@typescript-eslint/utils": "5.35.1", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.15.0.tgz", + "integrity": "sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/type-utils": "7.15.0", + "@typescript-eslint/utils": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -447,25 +752,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.35.1.tgz", - "integrity": "sha512-XL2TBTSrh3yWAsMYpKseBYTVpvudNf69rPOWXWVBI08My2JVT5jR66eTt4IgQFHA/giiKJW5dUD4x/ZviCKyGg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/typescript-estree": "5.35.1", + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/typescript-estree": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -474,16 +780,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.35.1.tgz", - "integrity": "sha512-kCYRSAzIW9ByEIzmzGHE50NGAvAP3wFTaZevgWva7GpquDyFPFcmvVkFJGWJJktg/hLwmys/FZwqM9EKr2u24Q==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.15.0.tgz", + "integrity": "sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1" + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -491,24 +797,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.35.1.tgz", - "integrity": "sha512-8xT8ljvo43Mp7BiTn1vxLXkjpw8wS4oAc00hMSB4L1/jIiYbjjnc3Qp2GAUOG/v8zsNCd1qwcqfCQ0BuishHkw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.15.0.tgz", + "integrity": "sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.35.1", + "@typescript-eslint/typescript-estree": "7.15.0", + "@typescript-eslint/utils": "7.15.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -517,12 +824,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.35.1.tgz", - "integrity": "sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.15.0.tgz", + "integrity": "sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -530,21 +837,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz", - "integrity": "sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.15.0.tgz", + "integrity": "sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -556,222 +864,527 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.35.1.tgz", - "integrity": "sha512-v6F8JNXgeBWI4pzZn36hT2HXXzoBBBJuOYvoQiaQaEEjdi5STzux3Yj8v7ODIpx36i/5s8TdzuQ54TPc5AITQQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.15.0.tgz", + "integrity": "sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/typescript-estree": "5.35.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/typescript-estree": "7.15.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz", - "integrity": "sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.15.0.tgz", + "integrity": "sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.35.1", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "7.15.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vscode/debugadapter": { + "version": "1.66.0", + "resolved": "https://registry.npmjs.org/@vscode/debugadapter/-/debugadapter-1.66.0.tgz", + "integrity": "sha512-U/m5l6igHtQ8rSMSKW9oWeco9ySPqGYjqW9NECGPGWZ/xnoYicpqUoXhGx3xUNsafrinzWvUWrSUL/Cdgj2V+w==", + "dev": true, + "dependencies": { + "@vscode/debugprotocol": "1.66.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@vscode/debugprotocol": { + "version": "1.66.0", + "resolved": "https://registry.npmjs.org/@vscode/debugprotocol/-/debugprotocol-1.66.0.tgz", + "integrity": "sha512-VGcRBLNL8QwHzwerSWOb60fy1FO7bdseZv6OkTS4opoP3xeyDX58i4/wAwakL2Y4P9NafN4VGrvlXSWIratmWA==", + "dev": true + }, + "node_modules/@vscode/vsce": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.29.0.tgz", + "integrity": "sha512-63+aEO8SpjE6qKiIh2Cqy/P9zC7+USElGwpEdkyPp89xIBDBr5IqeNS3zkD3mp3wZqbvHIpJsCCNu74WQirYCg==", + "dev": true, + "dependencies": { + "@azure/identity": "^4.1.0", + "@vscode/vsce-sign": "^2.0.0", + "azure-devops-node-api": "^12.5.0", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "cockatiel": "^3.1.2", + "commander": "^6.2.1", + "form-data": "^4.0.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^7.5.2", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 16" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "node_modules/@vscode/vsce-sign": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.4.tgz", + "integrity": "sha512-0uL32egStKYfy60IqnynAChMTbL0oqpqk0Ew0YHiIb+fayuGZWADuIPHWUcY1GCnAA+VgchOPDMxnc2R3XGWEA==", + "dev": true, + "hasInstallScript": true, + "optionalDependencies": { + "@vscode/vsce-sign-alpine-arm64": "2.0.2", + "@vscode/vsce-sign-alpine-x64": "2.0.2", + "@vscode/vsce-sign-darwin-arm64": "2.0.2", + "@vscode/vsce-sign-darwin-x64": "2.0.2", + "@vscode/vsce-sign-linux-arm": "2.0.2", + "@vscode/vsce-sign-linux-arm64": "2.0.2", + "@vscode/vsce-sign-linux-x64": "2.0.2", + "@vscode/vsce-sign-win32-arm64": "2.0.2", + "@vscode/vsce-sign-win32-x64": "2.0.2" + } + }, + "node_modules/@vscode/vsce-sign-alpine-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.2.tgz", + "integrity": "sha512-E80YvqhtZCLUv3YAf9+tIbbqoinWLCO/B3j03yQPbjT3ZIHCliKZlsy1peNc4XNZ5uIb87Jn0HWx/ZbPXviuAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-alpine-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.2.tgz", + "integrity": "sha512-n1WC15MSMvTaeJ5KjWCzo0nzjydwxLyoHiMJHu1Ov0VWTZiddasmOQHekA47tFRycnt4FsQrlkSCTdgHppn6bw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.2.tgz", + "integrity": "sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz", + "integrity": "sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.2.tgz", + "integrity": "sha512-Fkb5jpbfhZKVw3xwR6t7WYfwKZktVGNXdg1m08uEx1anO0oUPUkoQRsNm4QniL3hmfw0ijg00YA6TrxCRkPVOQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.2.tgz", + "integrity": "sha512-Ybeu7cA6+/koxszsORXX0OJk9N0GgfHq70Wqi4vv2iJCZvBrOWwcIrxKjvFtwyDgdeQzgPheH5nhLVl5eQy7WA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.2.tgz", + "integrity": "sha512-NsPPFVtLaTlVJKOiTnO8Cl78LZNWy0Q8iAg+LlBiCDEgC12Gt4WXOSs2pmcIjDYzj2kY4NwdeN1mBTaujYZaPg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-win32-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.2.tgz", + "integrity": "sha512-wPs848ymZ3Ny+Y1Qlyi7mcT6VSigG89FWQnp2qRYCyMhdJxOpA4lDwxzlpL8fG6xC8GjQjGDkwbkWUcCobvksQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vscode/vsce-sign-win32-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.2.tgz", + "integrity": "sha512-pAiRN6qSAhDM5SVOIxgx+2xnoVUePHbRNC7OD2aOR3WltTKxxF25OfpK8h8UQ7A0BuRkSgREbB59DBlFk4iAeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vscode/vsce/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@vscode/vsce/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@vscode/vsce/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "dependencies": { - "envinfo": "^7.7.3" + "engines": { + "node": ">=14.15.0" }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" }, "peerDependenciesMeta": { "webpack-dev-server": { @@ -791,10 +1404,22 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -803,10 +1428,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -875,15 +1500,15 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -953,15 +1578,33 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-includes": { - "version": "3.1.5", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -980,14 +1623,53 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.0", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -997,16 +1679,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "minimalistic-assert": "^1.0.0" } }, "node_modules/asn1.js/node_modules/bn.js": { @@ -1016,22 +1719,32 @@ "dev": true }, "node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", "dev": true, "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -1040,9 +1753,9 @@ } }, "node_modules/azure-devops-node-api": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", - "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", "dev": true, "dependencies": { "tunnel": "0.0.6", @@ -1105,6 +1818,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "optional": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -1130,6 +1844,7 @@ "url": "https://feross.org/support" } ], + "optional": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1140,6 +1855,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1176,12 +1892,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1241,34 +1957,37 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "dev": true, "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" } }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/browserify-sign/node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, "node_modules/browserify-sign/node_modules/safe-buffer": { @@ -1301,9 +2020,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "dev": true, "funding": [ { @@ -1313,13 +2032,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -1361,6 +2084,12 @@ "node": "*" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1395,12 +2124,19 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.2", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1416,9 +2152,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001384", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001384.tgz", - "integrity": "sha512-BBWt57kqWbc0GYZXb47wTXpmAgqr5LSibPzNjk/AWMdmJMQhLqOl3c/Kd4OAU/tu4NLfYkMx8Tlq3RVBkOBolQ==", + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", "dev": true, "funding": [ { @@ -1428,6 +2164,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -1536,7 +2276,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "dev": true, + "optional": true }, "node_modules/chrome-trace-event": { "version": "1.0.3", @@ -1571,6 +2312,15 @@ "node": ">=6" } }, + "node_modules/cockatiel": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.1.3.tgz", + "integrity": "sha512-xC759TpZ69d7HhfDp8m2WkRwEUiCkxY8Ee2OQH/3H6zmy2D/5Sm+zSTbPRa+V2QyjDtpMvjOIAOVjA2gp6N1kQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1595,6 +2345,18 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", @@ -1622,20 +2384,20 @@ "dev": true }, "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, "dependencies": { - "fast-glob": "^3.2.11", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^13.1.1", + "globby": "^14.0.0", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -1646,28 +2408,29 @@ } }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/copy-webpack-plugin/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, "engines": { "node": ">=12" @@ -1676,25 +2439,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/create-ecdh": { @@ -1809,6 +2594,57 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.3.4", "dev": true, @@ -1830,6 +2666,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "optional": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -1845,14 +2682,16 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "optional": true, "engines": { "node": ">=4.0.0" } }, "node_modules/deep-is": { "version": "0.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/deepmerge": { "version": "4.2.2", @@ -1863,11 +2702,39 @@ "node": ">=0.10.0" } }, - "node_modules/define-properties": { + "node_modules/define-data-property": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "license": "MIT", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -1878,6 +2745,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -1893,6 +2769,7 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "dev": true, + "optional": true, "engines": { "node": ">=8" } @@ -1961,12 +2838,12 @@ } }, "node_modules/domain-browser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", - "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-5.7.0.tgz", + "integrity": "sha512-edTFu0M/7wO1pXY6GDxVNVW086uqwWYIHP98txhcPyV995X21JIH2DtYp33sQJOupYoXKe9RwTw2Ya2vWaquTQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=4" }, "funding": { "url": "https://bevry.me/fund" @@ -2021,16 +2898,25 @@ "readable-stream": "^2.0.2" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.233", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.233.tgz", - "integrity": "sha512-ejwIKXTg1wqbmkcRJh9Ur3hFGHFDZDw1POzdsVrB2WZjgRuRMHIQQKNpe64N/qh3ZtH2otEoRoS+s6arAAuAAw==", + "version": "1.4.818", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.818.tgz", + "integrity": "sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==", "dev": true }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", "dev": true, "dependencies": { "bn.js": "^4.11.9", @@ -2053,14 +2939,15 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "optional": true, "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -2104,33 +2991,57 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -2139,24 +3050,73 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, - "node_modules/es-shim-unscopables": { + "node_modules/es-object-atoms": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "license": "MIT", "dependencies": { - "has": "^1.0.3" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -2169,16 +3129,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", - "dev": true - }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -2194,49 +3148,48 @@ } }, "node_modules/eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2250,60 +3203,74 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.7.3", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, - "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { - "version": "2.26.0", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, - "license": "MIT", "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -2313,11 +3280,12 @@ } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -2331,10 +3299,14 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT" + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-scope": { "version": "5.1.1", @@ -2349,38 +3321,16 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/escape-string-regexp": { @@ -2395,21 +3345,26 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2485,14 +3440,14 @@ } }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2502,9 +3457,10 @@ } }, "node_modules/esquery": { - "version": "1.4.0", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2514,8 +3470,9 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2556,6 +3513,15 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -2580,6 +3546,7 @@ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true, + "optional": true, "engines": { "node": ">=6" } @@ -2591,9 +3558,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2626,8 +3593,9 @@ }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fastest-levenshtein": { "version": "1.0.16", @@ -2668,9 +3636,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -2679,26 +3647,6 @@ "node": ">=8" } }, - "node_modules/filter-obj": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", - "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/flat-cache": { "version": "3.0.4", "dev": true, @@ -2726,15 +3674,15 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", + "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", + "cosmiconfig": "^8.2.0", "deepmerge": "^4.2.2", "fs-extra": "^10.0.0", "memfs": "^3.4.1", @@ -2750,13 +3698,7 @@ }, "peerDependencies": { "typescript": ">3.6.0", - "vue-template-compiler": "*", "webpack": "^5.11.0" - }, - "peerDependenciesMeta": { - "vue-template-compiler": { - "optional": true - } } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { @@ -2777,11 +3719,26 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "optional": true }, "node_modules/fs-extra": { "version": "10.1.0", @@ -2809,9 +3766,9 @@ "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -2848,19 +3805,24 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -2869,39 +3831,43 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-intrinsic": { - "version": "1.1.2", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -2914,7 +3880,8 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true + "dev": true, + "optional": true }, "node_modules/glob": { "version": "7.1.6", @@ -2953,9 +3920,9 @@ "dev": true }, "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2967,6 +3934,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -2987,32 +3970,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "dev": true, - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">= 0.4.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/has-bigints": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3027,11 +4013,24 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3039,8 +4038,9 @@ }, "node_modules/has-symbols": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3049,11 +4049,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -3120,6 +4121,18 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3214,9 +4227,10 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -3282,15 +4296,17 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "optional": true }, "node_modules/internal-slot": { - "version": "1.0.3", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, - "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -3298,12 +4314,12 @@ } }, "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/is-arguments": { @@ -3322,6 +4338,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3330,8 +4362,9 @@ }, "node_modules/is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -3353,8 +4386,9 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -3367,9 +4401,10 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3378,11 +4413,30 @@ } }, "node_modules/is-core-module": { - "version": "2.9.0", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, - "license": "MIT", "dependencies": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3390,8 +4444,9 @@ }, "node_modules/is-date-object": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -3402,6 +4457,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "dev": true, @@ -3453,9 +4523,10 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3474,8 +4545,9 @@ }, "node_modules/is-number-object": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -3486,6 +4558,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3500,8 +4581,9 @@ }, "node_modules/is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -3514,11 +4596,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3526,8 +4612,9 @@ }, "node_modules/is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -3540,8 +4627,9 @@ }, "node_modules/is-symbol": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -3553,16 +4641,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -3573,8 +4657,9 @@ }, "node_modules/is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -3582,6 +4667,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "1.0.0", "dev": true, @@ -3677,16 +4774,86 @@ "json5": "lib/cli.js" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dev": true, + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", "dev": true, "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" } }, "node_modules/keytar": { @@ -3695,6 +4862,7 @@ "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", "dev": true, "hasInstallScript": true, + "optional": true, "dependencies": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" @@ -3720,8 +4888,9 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3759,23 +4928,53 @@ "node": ">=6.11.5" } }, - "node_modules/locate-path": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", "dev": true, "license": "MIT" }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "node_modules/lru-cache": { "version": "6.0.0", "dev": true, @@ -3932,6 +5131,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "optional": true, "engines": { "node": ">=10" }, @@ -3982,7 +5182,8 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "optional": true }, "node_modules/ms": { "version": "2.1.2", @@ -3999,7 +5200,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "dev": true, + "optional": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -4017,6 +5219,7 @@ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", "dev": true, + "optional": true, "dependencies": { "semver": "^7.3.5" }, @@ -4034,58 +5237,61 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true + "dev": true, + "optional": true }, "node_modules/node-polyfill-webpack-plugin": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-1.1.4.tgz", - "integrity": "sha512-Z0XTKj1wRWO8o/Vjobsw5iOJCN+Sua3EZEUc2Ziy9CyVvmHKu6o+t4gUH9GOE0czyPR94LI6ZCV/PpcM8b5yow==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WLk77vLpbcpmTekRj6s6vYxk30XoyaY5MDZ4+9g8OaKoG3Ij+TjOqhpQjVUlfDZBPBgpNATDltaQkzuXSnnkwg==", "dev": true, "dependencies": { - "assert": "^2.0.0", + "assert": "^2.1.0", "browserify-zlib": "^0.2.0", "buffer": "^6.0.3", "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", + "domain-browser": "^5.7.0", "events": "^3.3.0", - "filter-obj": "^2.0.2", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "^1.0.1", "process": "^0.11.10", - "punycode": "^2.1.1", + "punycode": "^2.3.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", + "readable-stream": "^4.5.2", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "tty-browserify": "^0.0.1", - "url": "^0.11.0", - "util": "^0.12.4", + "type-fest": "^4.18.2", + "url": "^0.11.3", + "util": "^0.12.5", "vm-browserify": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">=14" }, "peerDependencies": { "webpack": ">=5" } }, "node_modules/node-polyfill-webpack-plugin/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/node-polyfill-webpack-plugin/node_modules/safe-buffer": { @@ -4117,10 +5323,22 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/node-polyfill-webpack-plugin/node_modules/type-fest": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz", + "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/normalize-path": { @@ -4145,21 +5363,25 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, - "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -4170,20 +5392,22 @@ }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.2", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -4193,14 +5417,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.values": { - "version": "1.1.5", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4217,17 +5474,35 @@ "wrappy": "1" } }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { - "version": "0.9.1", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -4239,36 +5514,6 @@ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", "dev": true }, - "node_modules/p-limit": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -4288,18 +5533,55 @@ } }, "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "dev": true, "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-asn1/node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" } }, + "node_modules/parse-asn1/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -4328,9 +5610,9 @@ } }, "node_modules/parse-semver/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -4367,14 +5649,6 @@ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true }, - "node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "dev": true, @@ -4428,9 +5702,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -4527,11 +5801,21 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, + "optional": true, "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -4555,22 +5839,23 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -4615,27 +5900,28 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "optional": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.2.tgz", + "integrity": "sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -4644,16 +5930,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", @@ -4707,6 +5983,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "optional": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -4722,6 +5999,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -4739,9 +6017,10 @@ } }, "node_modules/readable-stream": { - "version": "2.3.7", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4765,25 +6044,27 @@ } }, "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -4792,17 +6073,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -4813,11 +6083,12 @@ } }, "node_modules/resolve": { - "version": "1.22.1", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, - "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4915,16 +6186,51 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.1.2", "dev": true, "license": "MIT" }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/sax": { "version": "1.2.4", @@ -4933,15 +6239,15 @@ "dev": true }, "node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -4952,15 +6258,15 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -4986,13 +6292,10 @@ "dev": true }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -5001,14 +6304,46 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "dev": true, @@ -5059,13 +6394,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5089,7 +6429,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "optional": true }, "node_modules/simple-get": { "version": "4.0.1", @@ -5110,6 +6451,7 @@ "url": "https://feross.org/support" } ], + "optional": true, "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -5126,12 +6468,12 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/source-map-support": { @@ -5144,6 +6486,25 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -5202,27 +6563,50 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5241,8 +6625,9 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -5296,6 +6681,7 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "optional": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -5308,6 +6694,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "optional": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -5324,6 +6711,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5334,13 +6722,13 @@ } }, "node_modules/terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -5352,16 +6740,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz", - "integrity": "sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -5386,19 +6774,19 @@ } }, "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -5465,16 +6853,29 @@ "dev": true, "license": "MIT/X11" }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-loader": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", - "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" @@ -5485,9 +6886,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -5528,35 +6929,22 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tslib": { - "version": "1.14.1", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true }, "node_modules/tty-browserify": { "version": "0.0.1", @@ -5578,6 +6966,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "optional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -5587,8 +6976,9 @@ }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -5608,10 +6998,83 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-rest-client": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", - "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", "dev": true, "dependencies": { "qs": "^6.9.1", @@ -5620,15 +7083,16 @@ } }, "node_modules/typescript": { - "version": "4.7.4", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uc.micro": { @@ -5639,8 +7103,9 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -5652,11 +7117,29 @@ } }, "node_modules/underscore": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", - "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -5684,9 +7167,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -5696,186 +7179,93 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - }, - "node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/vsce": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.11.0.tgz", - "integrity": "sha512-pr9Y0va/HCer0tTifeqaUrK24JJSpRd6oLeF/PY6FtrY41e+lwxiAq6jfMXx4ShAZglYg2rFKoKROwa7E7SEqQ==", - "dev": true, - "dependencies": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "vsce" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/vsce/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "punycode": "^2.1.0" } }, - "node_modules/vsce/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "punycode": "^1.4.1", + "qs": "^6.11.2" } }, - "node_modules/vsce/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, - "node_modules/vsce/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/vsce/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/util-deprecate": { + "version": "1.0.2", "dev": true, - "bin": { - "semver": "bin/semver" - } + "license": "MIT" }, - "node_modules/vsce/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "bin": { + "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, "node_modules/vscode-test": { "version": "1.6.1", "dev": true, @@ -5891,9 +7281,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -5904,34 +7294,34 @@ } }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.92.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", + "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -5951,44 +7341,42 @@ } }, "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x" + "webpack": "5.x.x" }, "peerDependenciesMeta": { "@webpack-cli/generators": { "optional": true }, - "@webpack-cli/migrate": { - "optional": true - }, "webpack-bundle-analyzer": { "optional": true }, @@ -5998,12 +7386,12 @@ } }, "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=14" } }, "node_modules/webpack-merge": { @@ -6029,9 +7417,9 @@ } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -6062,8 +7450,9 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -6076,17 +7465,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6102,9 +7490,10 @@ "dev": true }, "node_modules/word-wrap": { - "version": "1.2.3", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6114,19 +7503,6 @@ "dev": true, "license": "ISC" }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", @@ -6150,15 +7526,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -6201,30 +7568,232 @@ } }, "dependencies": { + "@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "dev": true, + "requires": { + "tslib": "^2.2.0" + } + }, + "@azure/core-auth": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", + "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", + "dev": true, + "requires": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.1.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + } + } + }, + "@azure/core-client": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", + "dev": true, + "requires": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + } + } + }, + "@azure/core-rest-pipeline": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.1.tgz", + "integrity": "sha512-ExPSbgjwCoht6kB7B4MeZoBAxcQSIl29r/bPeazZJx50ej4JJCByimLOrZoIsurISNyJQQHf30b3JfqC3Hb88A==", + "dev": true, + "requires": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.9.0", + "@azure/logger": "^1.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + }, + "agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "requires": { + "debug": "^4.3.4" + } + }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + } + } + }, + "@azure/core-tracing": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", + "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + }, + "@azure/core-util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz", + "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==", + "dev": true, + "requires": { + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + } + } + }, + "@azure/identity": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.3.0.tgz", + "integrity": "sha512-LHZ58/RsIpIWa4hrrE2YuJ/vzG1Jv9f774RfTTAVDZDriubvJ0/S5u4pnw4akJDlS0TiJb6VMphmVUFsWmgodQ==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.5.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^3.11.1", + "@azure/msal-node": "^2.9.2", + "events": "^3.0.0", + "jws": "^4.0.0", + "open": "^8.0.0", + "stoppable": "^1.1.0", + "tslib": "^2.2.0" + } + }, + "@azure/logger": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.2.tgz", + "integrity": "sha512-l170uE7bsKpIU6B/giRc9i4NI0Mj+tANMMMxf7Zi/5cKzEqPayP7+X1WPrG7e+91JgY8N+7K7nF2WOi7iVhXvg==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + }, + "@azure/msal-browser": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.18.0.tgz", + "integrity": "sha512-jvK5bDUWbpOaJt2Io/rjcaOVcUzkqkrCme/WntdV1SMUc67AiTcEdKuY6G/nMQ7N5Cfsk9SfpugflQwDku53yg==", + "dev": true, + "requires": { + "@azure/msal-common": "14.13.0" + } + }, + "@azure/msal-common": { + "version": "14.13.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.13.0.tgz", + "integrity": "sha512-b4M/tqRzJ4jGU91BiwCsLTqChveUEyFK3qY2wGfZ0zBswIBZjAxopx5CYt5wzZFKuN15HqRDYXQbztttuIC3nA==", + "dev": true + }, + "@azure/msal-node": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.10.0.tgz", + "integrity": "sha512-JxsSE0464a8IA/+q5EHKmchwNyUFJHtCH00tSXsLaOddwLjG6yVvTH6lGgPcWMhO7YWUXj/XVgVgeE9kZtsPUQ==", + "dev": true, + "requires": { + "@azure/msal-common": "14.13.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + } + }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" } }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "dependencies": { "ansi-styles": { @@ -6294,16 +7863,31 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -6311,23 +7895,23 @@ "strip-json-comments": "^3.1.1" } }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -6335,20 +7919,32 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } } }, "@jridgewell/resolve-uri": { @@ -6358,19 +7954,31 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } } }, "@jridgewell/sourcemap-codec": { @@ -6415,6 +8023,12 @@ "fastq": "^1.6.0" } }, + "@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true + }, "@tootallnate/once": { "version": "1.1.2", "dev": true @@ -6464,9 +8078,9 @@ } }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "@types/json-schema": { @@ -6477,34 +8091,35 @@ }, "@types/json5": { "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/mocha": { - "version": "9.1.1", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", + "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", "dev": true }, "@types/node": { - "version": "18.7.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz", - "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } }, "@types/vscode": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.70.0.tgz", - "integrity": "sha512-3/9Fz0F2eBgwciazc94Ien+9u1elnjFg9YAhvAb3qDy/WeFWD9VrOPU7CIytryOVUdbxus8uzL4VZYONA0gDtA==", + "version": "1.75.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.75.1.tgz", + "integrity": "sha512-emg7wdsTFzdi+elvoyoA+Q8keEautdQHyY5LNmHVM4PTpY8JgOTVADrGVyXGepJ6dVW2OS5/xnLUWh+nZxvdiA==", "dev": true }, "@types/webpack": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", - "integrity": "sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==", + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", + "integrity": "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==", "dev": true, "requires": { "@types/node": "*", @@ -6513,266 +8128,481 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.35.1.tgz", - "integrity": "sha512-RBZZXZlI4XCY4Wzgy64vB+0slT9+yAPQRjj/HSaRwUot33xbDjF1oN9BLwOLTewoOI0jothIltZRe9uJCHf8gg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.15.0.tgz", + "integrity": "sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/type-utils": "7.15.0", + "@typescript-eslint/utils": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/parser": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/typescript-estree": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.15.0.tgz", + "integrity": "sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.15.0.tgz", + "integrity": "sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/type-utils": "5.35.1", - "@typescript-eslint/utils": "5.35.1", + "@typescript-eslint/typescript-estree": "7.15.0", + "@typescript-eslint/utils": "7.15.0", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.15.0.tgz", + "integrity": "sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.15.0.tgz", + "integrity": "sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, - "@typescript-eslint/parser": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.35.1.tgz", - "integrity": "sha512-XL2TBTSrh3yWAsMYpKseBYTVpvudNf69rPOWXWVBI08My2JVT5jR66eTt4IgQFHA/giiKJW5dUD4x/ZviCKyGg==", + "@typescript-eslint/utils": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.15.0.tgz", + "integrity": "sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/typescript-estree": "5.35.1", - "debug": "^4.3.4" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/typescript-estree": "7.15.0" } }, - "@typescript-eslint/scope-manager": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.35.1.tgz", - "integrity": "sha512-kCYRSAzIW9ByEIzmzGHE50NGAvAP3wFTaZevgWva7GpquDyFPFcmvVkFJGWJJktg/hLwmys/FZwqM9EKr2u24Q==", + "@typescript-eslint/visitor-keys": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.15.0.tgz", + "integrity": "sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1" + "@typescript-eslint/types": "7.15.0", + "eslint-visitor-keys": "^3.4.3" } }, - "@typescript-eslint/type-utils": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.35.1.tgz", - "integrity": "sha512-8xT8ljvo43Mp7BiTn1vxLXkjpw8wS4oAc00hMSB4L1/jIiYbjjnc3Qp2GAUOG/v8zsNCd1qwcqfCQ0BuishHkw==", + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@vscode/debugadapter": { + "version": "1.66.0", + "resolved": "https://registry.npmjs.org/@vscode/debugadapter/-/debugadapter-1.66.0.tgz", + "integrity": "sha512-U/m5l6igHtQ8rSMSKW9oWeco9ySPqGYjqW9NECGPGWZ/xnoYicpqUoXhGx3xUNsafrinzWvUWrSUL/Cdgj2V+w==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.35.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "@vscode/debugprotocol": "1.66.0" } }, - "@typescript-eslint/types": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.35.1.tgz", - "integrity": "sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ==", + "@vscode/debugprotocol": { + "version": "1.66.0", + "resolved": "https://registry.npmjs.org/@vscode/debugprotocol/-/debugprotocol-1.66.0.tgz", + "integrity": "sha512-VGcRBLNL8QwHzwerSWOb60fy1FO7bdseZv6OkTS4opoP3xeyDX58i4/wAwakL2Y4P9NafN4VGrvlXSWIratmWA==", "dev": true }, - "@typescript-eslint/typescript-estree": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz", - "integrity": "sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA==", + "@vscode/vsce": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.29.0.tgz", + "integrity": "sha512-63+aEO8SpjE6qKiIh2Cqy/P9zC7+USElGwpEdkyPp89xIBDBr5IqeNS3zkD3mp3wZqbvHIpJsCCNu74WQirYCg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@azure/identity": "^4.1.0", + "@vscode/vsce-sign": "^2.0.0", + "azure-devops-node-api": "^12.5.0", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "cockatiel": "^3.1.2", + "commander": "^6.2.1", + "form-data": "^4.0.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "keytar": "^7.7.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^7.5.2", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + } } }, - "@typescript-eslint/utils": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.35.1.tgz", - "integrity": "sha512-v6F8JNXgeBWI4pzZn36hT2HXXzoBBBJuOYvoQiaQaEEjdi5STzux3Yj8v7ODIpx36i/5s8TdzuQ54TPc5AITQQ==", + "@vscode/vsce-sign": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.4.tgz", + "integrity": "sha512-0uL32egStKYfy60IqnynAChMTbL0oqpqk0Ew0YHiIb+fayuGZWADuIPHWUcY1GCnAA+VgchOPDMxnc2R3XGWEA==", "dev": true, "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/typescript-estree": "5.35.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@vscode/vsce-sign-alpine-arm64": "2.0.2", + "@vscode/vsce-sign-alpine-x64": "2.0.2", + "@vscode/vsce-sign-darwin-arm64": "2.0.2", + "@vscode/vsce-sign-darwin-x64": "2.0.2", + "@vscode/vsce-sign-linux-arm": "2.0.2", + "@vscode/vsce-sign-linux-arm64": "2.0.2", + "@vscode/vsce-sign-linux-x64": "2.0.2", + "@vscode/vsce-sign-win32-arm64": "2.0.2", + "@vscode/vsce-sign-win32-x64": "2.0.2" } }, - "@typescript-eslint/visitor-keys": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz", - "integrity": "sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g==", + "@vscode/vsce-sign-alpine-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.2.tgz", + "integrity": "sha512-E80YvqhtZCLUv3YAf9+tIbbqoinWLCO/B3j03yQPbjT3ZIHCliKZlsy1peNc4XNZ5uIb87Jn0HWx/ZbPXviuAQ==", "dev": true, - "requires": { - "@typescript-eslint/types": "5.35.1", - "eslint-visitor-keys": "^3.3.0" - } + "optional": true + }, + "@vscode/vsce-sign-alpine-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.2.tgz", + "integrity": "sha512-n1WC15MSMvTaeJ5KjWCzo0nzjydwxLyoHiMJHu1Ov0VWTZiddasmOQHekA47tFRycnt4FsQrlkSCTdgHppn6bw==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-darwin-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.2.tgz", + "integrity": "sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-darwin-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz", + "integrity": "sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-linux-arm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.2.tgz", + "integrity": "sha512-Fkb5jpbfhZKVw3xwR6t7WYfwKZktVGNXdg1m08uEx1anO0oUPUkoQRsNm4QniL3hmfw0ijg00YA6TrxCRkPVOQ==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-linux-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.2.tgz", + "integrity": "sha512-Ybeu7cA6+/koxszsORXX0OJk9N0GgfHq70Wqi4vv2iJCZvBrOWwcIrxKjvFtwyDgdeQzgPheH5nhLVl5eQy7WA==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-linux-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.2.tgz", + "integrity": "sha512-NsPPFVtLaTlVJKOiTnO8Cl78LZNWy0Q8iAg+LlBiCDEgC12Gt4WXOSs2pmcIjDYzj2kY4NwdeN1mBTaujYZaPg==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-win32-arm64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.2.tgz", + "integrity": "sha512-wPs848ymZ3Ny+Y1Qlyi7mcT6VSigG89FWQnp2qRYCyMhdJxOpA4lDwxzlpL8fG6xC8GjQjGDkwbkWUcCobvksQ==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-win32-x64": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.2.tgz", + "integrity": "sha512-pAiRN6qSAhDM5SVOIxgx+2xnoVUePHbRNC7OD2aOR3WltTKxxF25OfpK8h8UQ7A0BuRkSgREbB59DBlFk4iAeg==", + "dev": true, + "optional": true }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, "requires": {} }, "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "requires": { - "envinfo": "^7.7.3" - } + "requires": {} }, "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, "requires": {} }, @@ -6788,16 +8618,25 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "requires": {} }, @@ -6843,15 +8682,15 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" } }, "json-schema-traverse": { @@ -6904,14 +8743,27 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, "array-includes": { - "version": "3.1.5", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, @@ -6921,26 +8773,69 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, "array.prototype.flat": { - "version": "1.3.0", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "minimalistic-assert": "^1.0.0" }, "dependencies": { "bn.js": { @@ -6952,27 +8847,37 @@ } }, "assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", "dev": true, "requires": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "azure-devops-node-api": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", - "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", "dev": true, "requires": { "tunnel": "0.0.6", @@ -7012,6 +8917,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "optional": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -7023,6 +8929,7 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, + "optional": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -7033,6 +8940,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "optional": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7066,12 +8974,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "brorand": { @@ -7128,31 +9036,31 @@ } }, "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "dev": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "safe-buffer": { @@ -7173,15 +9081,15 @@ } }, "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" } }, "buffer": { @@ -7200,6 +9108,12 @@ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -7227,11 +9141,16 @@ "dev": true }, "call-bind": { - "version": "1.0.2", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -7241,9 +9160,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001384", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001384.tgz", - "integrity": "sha512-BBWt57kqWbc0GYZXb47wTXpmAgqr5LSibPzNjk/AWMdmJMQhLqOl3c/Kd4OAU/tu4NLfYkMx8Tlq3RVBkOBolQ==", + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", "dev": true }, "chainsaw": { @@ -7323,7 +9242,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "dev": true, + "optional": true }, "chrome-trace-event": { "version": "1.0.3", @@ -7352,6 +9272,12 @@ "shallow-clone": "^3.0.0" } }, + "cockatiel": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.1.3.tgz", + "integrity": "sha512-xC759TpZ69d7HhfDp8m2WkRwEUiCkxY8Ee2OQH/3H6zmy2D/5Sm+zSTbPRa+V2QyjDtpMvjOIAOVjA2gp6N1kQ==", + "dev": true + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -7373,6 +9299,15 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", @@ -7396,36 +9331,43 @@ "dev": true }, "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, "requires": { - "fast-glob": "^3.2.11", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^13.1.1", + "globby": "^14.0.0", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "dependencies": { "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" } }, + "path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true + }, "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true } } @@ -7435,16 +9377,15 @@ "dev": true }, "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" } }, "create-ecdh": { @@ -7545,6 +9486,39 @@ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, "debug": { "version": "4.3.4", "dev": true, @@ -7557,6 +9531,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "optional": true, "requires": { "mimic-response": "^3.1.0" } @@ -7565,10 +9540,13 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "dev": true, + "optional": true }, "deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "deepmerge": { @@ -7577,14 +9555,40 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, - "define-properties": { + "define-data-property": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -7599,7 +9603,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true + "dev": true, + "optional": true }, "diff": { "version": "4.0.2", @@ -7654,9 +9659,9 @@ } }, "domain-browser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", - "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-5.7.0.tgz", + "integrity": "sha512-edTFu0M/7wO1pXY6GDxVNVW086uqwWYIHP98txhcPyV995X21JIH2DtYp33sQJOupYoXKe9RwTw2Ya2vWaquTQ==", "dev": true }, "domelementtype": { @@ -7689,19 +9694,28 @@ "version": "0.1.4", "dev": true, "requires": { - "readable-stream": "^2.0.2" + "readable-stream": "^2.0.2" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" } }, "electron-to-chromium": { - "version": "1.4.233", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.233.tgz", - "integrity": "sha512-ejwIKXTg1wqbmkcRJh9Ur3hFGHFDZDw1POzdsVrB2WZjgRuRMHIQQKNpe64N/qh3ZtH2otEoRoS+s6arAAuAAw==", + "version": "1.4.818", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.818.tgz", + "integrity": "sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==", "dev": true }, "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", "dev": true, "requires": { "bn.js": "^4.11.9", @@ -7726,14 +9740,15 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "optional": true, "requires": { "once": "^1.4.0" } }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -7762,49 +9777,113 @@ } }, "es-abstract": { - "version": "1.20.1", - "dev": true, - "requires": { - "call-bind": "^1.0.2", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" } }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, - "es-shim-unscopables": { + "es-object-atoms": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -7812,16 +9891,10 @@ "is-symbol": "^1.0.2" } }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", - "dev": true - }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true }, "escape-string-regexp": { @@ -7831,49 +9904,48 @@ "dev": true }, "eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -7882,7 +9954,9 @@ "dev": true }, "eslint-scope": { - "version": "7.1.1", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -7891,6 +9965,8 @@ }, "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "find-up": { @@ -7939,15 +10015,20 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.6", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" }, "dependencies": { "debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -7956,15 +10037,18 @@ } }, "eslint-module-utils": { - "version": "2.7.3", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "dependencies": { "debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -7973,29 +10057,37 @@ } }, "eslint-plugin-import": { - "version": "2.26.0", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "dependencies": { "debug": { - "version": "2.6.9", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "doctrine": { @@ -8005,8 +10097,10 @@ "esutils": "^2.0.2" } }, - "ms": { - "version": "2.0.0", + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -8021,38 +10115,27 @@ "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "3.0.0", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "dev": true - } - } - }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" } }, "esquery": { - "version": "1.4.0", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -8060,6 +10143,8 @@ "dependencies": { "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -8087,6 +10172,12 @@ "version": "2.0.3", "dev": true }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -8107,7 +10198,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true + "dev": true, + "optional": true }, "fast-deep-equal": { "version": "3.1.3", @@ -8116,9 +10208,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -8147,6 +10239,8 @@ }, "fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fastest-levenshtein": { @@ -8181,27 +10275,14 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, - "filter-obj": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", - "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "flat-cache": { "version": "3.0.4", "dev": true, @@ -8224,15 +10305,15 @@ } }, "fork-ts-checker-webpack-plugin": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", + "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", + "cosmiconfig": "^8.2.0", "deepmerge": "^4.2.2", "fs-extra": "^10.0.0", "memfs": "^3.4.1", @@ -8256,11 +10337,23 @@ } } }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "optional": true }, "fs-extra": { "version": "10.1.0", @@ -8284,9 +10377,9 @@ "dev": true }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -8310,49 +10403,59 @@ } }, "function-bind": { - "version": "1.1.1", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { - "version": "1.1.5", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "dev": true - }, "functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "get-intrinsic": { - "version": "1.1.2", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-symbol-description": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true + "dev": true, + "optional": true }, "glob": { "version": "7.1.6", @@ -8380,14 +10483,24 @@ "dev": true }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, + "globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "requires": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + } + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -8402,25 +10515,31 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { - "version": "4.2.9", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "has": { - "version": "1.0.3", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "has-bigints": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { @@ -8430,21 +10549,33 @@ "dev": true }, "has-property-descriptors": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "requires": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" } }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, "has-symbols": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-tostringtag": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "hash-base": { @@ -8487,6 +10618,15 @@ "minimalistic-assert": "^1.0.1" } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -8549,7 +10689,9 @@ "dev": true }, "ignore": { - "version": "5.2.0", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true }, "import-fresh": { @@ -8592,21 +10734,24 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "optional": true }, "internal-slot": { - "version": "1.0.3", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, "is-arguments": { @@ -8619,6 +10764,16 @@ "has-tostringtag": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -8627,6 +10782,8 @@ }, "is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "requires": { "has-bigints": "^1.0.1" @@ -8643,6 +10800,8 @@ }, "is-boolean-object": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -8650,23 +10809,44 @@ } }, "is-callable": { - "version": "1.2.4", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { - "version": "2.9.0", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dev": true, + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "requires": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" } }, "is-date-object": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "dev": true @@ -8698,7 +10878,9 @@ } }, "is-negative-zero": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, "is-number": { @@ -8709,11 +10891,19 @@ }, "is-number-object": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -8725,6 +10915,8 @@ }, "is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -8732,14 +10924,18 @@ } }, "is-shared-array-buffer": { - "version": "1.0.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" } }, "is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -8747,31 +10943,40 @@ }, "is-symbol": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" } }, "is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { "call-bind": "^1.0.2" } }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, "isarray": { "version": "1.0.0", "dev": true @@ -8848,6 +11053,12 @@ "minimist": "^1.2.0" } }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -8858,11 +11069,74 @@ "universalify": "^2.0.0" } }, + "jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dev": true, + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "dependencies": { + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + } + } + }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dev": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dev": true, + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "keytar": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", "dev": true, + "optional": true, "requires": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" @@ -8882,6 +11156,8 @@ }, "levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { "prelude-ls": "^1.2.1", @@ -8913,18 +11189,52 @@ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, - "locate-path": { - "version": "2.0.0", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true }, "lodash.merge": { "version": "4.6.2", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "dev": true, @@ -9050,7 +11360,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true + "dev": true, + "optional": true }, "minimalistic-assert": { "version": "1.0.1", @@ -9086,7 +11397,8 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "optional": true }, "ms": { "version": "2.1.2", @@ -9102,7 +11414,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "dev": true, + "optional": true }, "natural-compare": { "version": "1.4.0", @@ -9119,6 +11432,7 @@ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", "dev": true, + "optional": true, "requires": { "semver": "^7.3.5" } @@ -9133,49 +11447,52 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true + "dev": true, + "optional": true }, "node-polyfill-webpack-plugin": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-1.1.4.tgz", - "integrity": "sha512-Z0XTKj1wRWO8o/Vjobsw5iOJCN+Sua3EZEUc2Ziy9CyVvmHKu6o+t4gUH9GOE0czyPR94LI6ZCV/PpcM8b5yow==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WLk77vLpbcpmTekRj6s6vYxk30XoyaY5MDZ4+9g8OaKoG3Ij+TjOqhpQjVUlfDZBPBgpNATDltaQkzuXSnnkwg==", "dev": true, "requires": { - "assert": "^2.0.0", + "assert": "^2.1.0", "browserify-zlib": "^0.2.0", "buffer": "^6.0.3", "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", + "domain-browser": "^5.7.0", "events": "^3.3.0", - "filter-obj": "^2.0.2", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "^1.0.1", "process": "^0.11.10", - "punycode": "^2.1.1", + "punycode": "^2.3.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", + "readable-stream": "^4.5.2", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "tty-browserify": "^0.0.1", - "url": "^0.11.0", - "util": "^0.12.4", + "type-fest": "^4.18.2", + "url": "^0.11.3", + "util": "^0.12.5", "vm-browserify": "^1.1.2" }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" } }, "safe-buffer": { @@ -9192,13 +11509,19 @@ "requires": { "safe-buffer": "~5.2.0" } + }, + "type-fest": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz", + "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==", + "dev": true } } }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "normalize-path": { @@ -9217,40 +11540,71 @@ } }, "object-inspect": { - "version": "1.12.2", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true }, "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" } }, "object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { - "version": "4.1.2", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" } }, "object.values": { - "version": "1.1.5", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "once": { @@ -9260,8 +11614,21 @@ "wrappy": "1" } }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, "optionator": { - "version": "0.9.1", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "requires": { "deep-is": "^0.1.3", @@ -9269,7 +11636,7 @@ "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" } }, "os-browserify": { @@ -9278,24 +11645,6 @@ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", "dev": true }, - "p-limit": { - "version": "1.3.0", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "dev": true - }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -9312,16 +11661,35 @@ } }, "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "dev": true, "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "parse-json": { @@ -9346,9 +11714,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -9378,10 +11746,6 @@ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true }, - "path-exists": { - "version": "3.0.0", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "dev": true @@ -9420,9 +11784,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "picomatch": { @@ -9491,11 +11855,18 @@ } } }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, + "optional": true, "requires": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -9513,12 +11884,14 @@ }, "prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "dev": true }, "process": { @@ -9558,32 +11931,27 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "optional": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.2.tgz", + "integrity": "sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "dev": true - }, "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", @@ -9620,6 +11988,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "optional": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -9631,7 +12000,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true + "dev": true, + "optional": true } } }, @@ -9645,7 +12015,9 @@ } }, "readable-stream": { - "version": "2.3.7", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -9667,27 +12039,26 @@ } }, "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "requires": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" } }, "regexp.prototype.flags": { - "version": "1.4.3", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, - "regexpp": { - "version": "3.2.0", - "dev": true - }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -9695,10 +12066,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -9758,15 +12131,40 @@ "queue-microtask": "^1.2.2" } }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "safe-buffer": { "version": "5.1.2", "dev": true }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } }, "sax": { "version": "1.2.4", @@ -9775,27 +12173,27 @@ "dev": true }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" } }, "ajv-keywords": { @@ -9816,21 +12214,44 @@ } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "randombytes": "^2.1.0" } }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "requires": { - "randombytes": "^2.1.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" } }, "setimmediate": { @@ -9868,25 +12289,30 @@ "dev": true }, "side-channel": { - "version": "1.0.4", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true + "dev": true, + "optional": true }, "simple-get": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "dev": true, + "optional": true, "requires": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -9900,9 +12326,9 @@ "dev": true }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true }, "source-map-support": { @@ -9913,8 +12339,22 @@ "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, + "stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true + }, "stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -9970,22 +12410,38 @@ "safe-buffer": "~5.1.0" } }, + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + } + }, "string.prototype.trimend": { - "version": "1.0.5", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimstart": { - "version": "1.0.5", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "strip-ansi": { @@ -9997,6 +12453,8 @@ }, "strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, "strip-json-comments": { @@ -10029,6 +12487,7 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "optional": true, "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -10041,6 +12500,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "optional": true, "requires": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -10054,6 +12514,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "optional": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10063,13 +12524,13 @@ } }, "terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -10083,32 +12544,32 @@ } }, "terser-webpack-plugin": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz", - "integrity": "sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "dependencies": { "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -10153,22 +12614,30 @@ "version": "0.3.9", "dev": true }, + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} + }, "ts-loader": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", - "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "requires": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" } }, "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", @@ -10187,28 +12656,23 @@ } }, "tsconfig-paths": { - "version": "3.14.1", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "tslib": { - "version": "1.14.1", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", @@ -10226,12 +12690,15 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.0.1" } }, "type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { "prelude-ls": "^1.2.1" @@ -10243,10 +12710,62 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, "typed-rest-client": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", - "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", "dev": true, "requires": { "qs": "^6.9.1", @@ -10255,7 +12774,9 @@ } }, "typescript": { - "version": "4.7.4", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true }, "uc.micro": { @@ -10266,6 +12787,8 @@ }, "unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -10275,9 +12798,21 @@ } }, "underscore": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", - "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true }, "universalify": { @@ -10303,13 +12838,13 @@ } }, "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { @@ -10322,19 +12857,19 @@ } }, "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.2" }, "dependencies": { "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true } } @@ -10346,16 +12881,15 @@ "dev": true }, "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", "which-typed-array": "^1.1.2" } }, @@ -10363,6 +12897,12 @@ "version": "1.0.2", "dev": true }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -10375,92 +12915,6 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "vsce": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.11.0.tgz", - "integrity": "sha512-pr9Y0va/HCer0tTifeqaUrK24JJSpRd6oLeF/PY6FtrY41e+lwxiAq6jfMXx4ShAZglYg2rFKoKROwa7E7SEqQ==", - "dev": true, - "requires": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "vscode-test": { "version": "1.6.1", "dev": true, @@ -10472,9 +12926,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -10482,41 +12936,41 @@ } }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.92.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", + "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -10527,29 +12981,30 @@ } }, "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "dependencies": { "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true } } @@ -10579,6 +13034,8 @@ }, "which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { "is-bigint": "^1.0.1", @@ -10589,17 +13046,16 @@ } }, "which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" } }, "wildcard": { @@ -10609,23 +13065,15 @@ "dev": true }, "word-wrap": { - "version": "1.2.3", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, "wrappy": { "version": "1.0.2", "dev": true }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, "xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", @@ -10642,12 +13090,6 @@ "version": "4.0.0", "dev": true }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index 52bd3ae6..473d639e 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { - "name": "languague-renpy", - "displayName": "Ren'Py Language", + "name": "language-renpy", + "displayName": "Ren'Py Language (8.3+)", "description": "Adds rich support for the Ren'Py programming language to Visual Studio Code.", - "version": "2.1.2", - "publisher": "LuqueDaniel", + "version": "2.3.10", + "publisher": "renpy", "license": "MIT", - "homepage": "https://github.com/LuqueDaniel/vscode-language-renpy", + "homepage": "https://github.com/renpy/vscode-language-renpy", "repository": { "type": "git", - "url": "https://github.com/LuqueDaniel/vscode-language-renpy" + "url": "https://github.com/renpy/vscode-language-renpy" }, "bugs": { - "url": "https://github.com/LuqueDaniel/vscode-language-renpy/issues" + "url": "https://github.com/renpy/vscode-language-renpy/issues" }, "icon": "icon.png", "galleryBanner": { @@ -27,7 +27,7 @@ "Snippets" ], "engines": { - "vscode": "^1.67.2" + "vscode": "^1.75.0" }, "capabilities": { "untrustedWorkspaces": { @@ -35,7 +35,9 @@ } }, "activationEvents": [ - "workspaceContains:**/*.rpy" + "workspaceContains:**/*.rpy", + "workspaceContains:**/_ren.py", + "onDebugResolve:renpy" ], "main": "./dist/extension", "browser": "./dist/extension.js", @@ -45,7 +47,8 @@ "id": "renpy", "aliases": [ "Ren'Py", - "renpy" + "renpy", + "rpy" ], "extensions": [ ".rpy", @@ -67,9 +70,38 @@ "scopeName": "source.renpy", "path": "./syntaxes/renpy.tmLanguage.json" }, + { + "scopeName": "source.renpy.screen", + "path": "./syntaxes/renpy.screen.tmLanguage.json" + }, + { + "scopeName": "source.renpy.style", + "path": "./syntaxes/renpy.style.tmLanguage.json" + }, + { + "scopeName": "source.renpy.atl", + "path": "./syntaxes/renpy.atl.tmLanguage.json" + }, { "scopeName": "source.renpy.python", "path": "./syntaxes/renpy.python.tmLanguage.json" + }, + { + "scopeName": "renpy.comment.injection", + "path": "./syntaxes/injection.json", + "injectTo": [ + "source.python" + ], + "embeddedLanguages": { + "meta.embedded.renpy": "renpy" + } + }, + { + "scopeName": "text.log.injection", + "path": "./syntaxes/log.injection.json", + "injectTo": [ + "text.log" + ] } ], "snippets": [ @@ -94,6 +126,85 @@ { "command": "renpy.toggleTokenDebugView", "title": "Renpy: Toggle token debug visualization" + }, + { + "command": "renpy.migrateOldFiles", + "title": "Renpy: Cleanup unused compiled Ren'Py source files" + }, + { + "command": "renpy.runCommand", + "title": "Renpy: Run Project", + "category": "Run", + "icon": "$(play)" + } + ], + "debuggers": [ + { + "type": "renpy", + "label": "Ren'Py", + "languages": [ + "renpy" + ], + "runtime": "node", + "configurationAttributes": { + "launch": { + "required": [ ], + "properties": { + "command": { + "type": "string", + "description": "Command to run Ren'Py with.", + "default": "run" + }, + "args": { + "type": "array", + "description": "Args to run Ren'Py with.", + "default": [ ] + } + } + } + }, + "initialConfigurations": [ + { + "type": "renpy", + "request": "launch", + "name": "Ren'Py: Launch", + "command": "run", + "args": [ ] + } + ], + "configurationSnippets": [ + { + "label": "Ren'Py", + "description": "A new configuration for launching a Ren'Py project", + "body": { + "type": "renpy", + "request": "launch", + "name": "Ren'Py", + "command": "run", + "args": [ ] + } + } + ] + } + ], + "taskDefinitions": [ + { + "type": "renpy", + "required": [ + "command" + ], + "properties": { + "command": { + "type": "string", + "description": "Command to run Ren'Py with.", + "default": "run" + }, + "args": { + "type": "array", + "description": "Args to run Ren'Py with.", + "default": [ ] + } + } } ], "configuration": [ @@ -182,6 +293,11 @@ "Ignore filename issues" ], "description": "Enable filename checks. Filenames must begin with a letter or number, and may not begin with '00', as Ren'Py uses such files for its own purposes. If set to Error or Warning, documents will be marked in the editor if the document filename does not meet Ren'Py's specifications. If set to Disabled, filename issues will be ignored." + }, + "renpy.renpyExecutableLocation": { + "type": "string", + "default": "", + "description": "Location of Ren'Py installation. Should be .exe on Windows and .sh on Mac/Linux." } } } @@ -189,34 +305,35 @@ }, "scripts": { "vscode:prepublish": "npm run package", - "package": "node_modules/.bin/webpack --mode production --devtool hidden-source-map", - "watch": "node_modules/.bin/webpack --mode development --watch", - "watch-release": "node_modules/.bin/webpack --mode production --watch", + "package": "webpack --mode production --devtool hidden-source-map", + "watch": "webpack --mode development --watch", + "watch-release": "webpack --mode production --watch", "test-compile": "tsc -p ./", "test": "npm run test-compile && node ./node_modules/vscode/bin/test", "lint": "eslint -c .eslintrc.json --ext .ts ./src/", - "vsce-package": "vsce package -o languague-renpy.vsix", + "vsce-package": "vsce package -o language-renpy.vsix", "format-check": "prettier --check 'src/**/*.ts' '.github/**/*.yml'" }, "devDependencies": { - "@types/mocha": "^9.1.1", - "@types/node": "^18.7.13", - "@types/vscode": "^1.67.2", - "@types/webpack": "^5.28.0", - "@typescript-eslint/eslint-plugin": "^5.32.0", - "@typescript-eslint/parser": "^5.35.1", - "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.23.0", - "eslint-plugin-import": "^2.26.0", - "fork-ts-checker-webpack-plugin": "^7.2.11", - "node-polyfill-webpack-plugin": "^1.1.4", - "ts-loader": "^9.3.0", - "ts-node": "^10.8.0", - "typescript": "^4.7.2", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.10", + "@types/vscode": "1.75", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^7.15.0", + "@typescript-eslint/parser": "^7.15.0", + "@vscode/debugadapter": "^1.66.0", + "@vscode/vsce": "^2.29.0", + "copy-webpack-plugin": "^12.0.2", + "eslint": "^8.42.0", + "eslint-plugin-import": "^2.29.1", + "fork-ts-checker-webpack-plugin": "^9.0.2", + "node-polyfill-webpack-plugin": "^4.0.0", + "prettier": "^3.3.2", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", + "typescript": "^5.5.3", "vscode-test": "^1.6.1", - "webpack": "^5.72.1", - "webpack-cli": "^4.9.2", - "vsce": "^2.9.2", - "prettier": "^2.7.1" + "webpack": "^5.92.1", + "webpack-cli": "^5.1.4" } } diff --git a/scripts/documentation/README.md b/scripts/documentation/README.md new file mode 100644 index 00000000..4a348fe5 --- /dev/null +++ b/scripts/documentation/README.md @@ -0,0 +1 @@ +Copy these two scripts into renpy's `sphinx\game` folder and generate the documentation normally. It should now have created the `renpy.json` file in the `sphinx` folder. \ No newline at end of file diff --git a/scripts/documentation/makeJson.py b/scripts/documentation/makeJson.py new file mode 100644 index 00000000..4f6a4690 --- /dev/null +++ b/scripts/documentation/makeJson.py @@ -0,0 +1,710 @@ +from __future__ import print_function + +import doc +import shaderdoc +import inspect +import re +import collections +import keyword +import renpy.sl2 +import shutil +import os +import json + +#import __builtin__ + +root = "" +final_output = "" +incdir = "" +fnpath = "" + +# A map from filename to a list of lines that are supposed to go into +# that file. +line_buffer = collections.defaultdict(list) + +# A map from id(o) to the names it's documented under. +documented = collections.defaultdict(list) + +# This keeps all objects we see alive, to prevent duplicates in documented. +documented_list = [ ] + +name_kind = collections.defaultdict(str) + +### ROB'S STUFF +name_docs = collections.defaultdict(str) +name_args = collections.defaultdict(str) +name_class = collections.defaultdict(str) +output = collections.defaultdict(str) +baseoutput = collections.defaultdict(str) +test_mode = True + +def set_root(path): + global root, final_output, incdir + root = path + final_output = os.path.join(root, 'renpy.json') + incdir = os.path.join(root, 'source', 'inc') + +def set_renpy_root(path): + global fnpath + fnpath = path + +def json_scan_docs(filename=None): + """ + Scans the documentation for functions, classes, and variables. + """ + + def scan_file(fn): + f = open(fn) + basefile = os.path.splitext(os.path.basename(fn))[0] + + buffer = [] + current_kind = "" + current_class = "" + get_docs = False + + for l in f: + m = re.search(r"\.\. (\w+):: ([.\w+]+)(.*)", l) + + if not m: + if current_kind == "": + continue + else: + if len(l) > 1 and not l.startswith(' '): + name_docs[current_kind] = format_doc_string(buffer) + format_output(basefile, current_kind) + get_docs = False + current_kind = "" + buffer = [] + else: + if len(l) > 1: + buffer.append(l.replace(' ','').replace(' ','').replace('\n','').replace('\\','"')) + else: + buffer.append(l.replace('\n','')) + continue + + if (current_kind != ""): + name_docs[current_kind] = format_doc_string(buffer) + format_output(basefile, current_kind) + get_docs = False + current_kind = "" + buffer = [] + + current_kind = m.group(2) + name_args[current_kind] = m.group(3) + name_kind[current_kind] = m.group(1) + get_docs = True + buffer = [] + if m.group(1) == "class": + current_class = m.group(2) + name_class[current_kind] = "" + if (m.group(1) == "method" or m.group(1) == "attribute"): + if l.startswith(' ') and current_class != "": + name_class[current_kind] = current_class + + if (current_kind != ""): + name_docs[current_kind] = format_doc_string(buffer) + format_output(basefile, current_kind) + + output["renpy.say"] = output["say"] + del output["say"] + + output_json("black", "internal", "image", " = Solid(\"#000\")", "", "image", "") + output_json("renpy.music", "basefile", "", "", "", "", documentation["renpy.music"]) + output_json("renpy.sound", "basefile", "", "", "", "", documentation["renpy.sound"]) + + audio_doc = documentation["renpy.sound.register_channel"] + audio_args = override_args["renpy.sound.register_channel"] + output_json("renpy.music.register_channel", "audio", "function", audio_args, "", "", audio_doc) + output_json("renpy.sound.register_channel", "audio", "function", audio_args, "", "", audio_doc) + override_documented["renpy.music.register_channel"] = True + override_documented["renpy.sound.register_channel"] = True + + if (filename): + scan_file(os.path.join(root, "source", filename)) + else: + for i in os.listdir(os.path.join(root, "source")): + if i.endswith(".rst"): + scan_file(os.path.join(root, "source", i)) + + for i in os.listdir(os.path.join(root, "source", "inc")): + scan_file(os.path.join(root, "source", "inc", i)) + +def format_doc_string(buffer): + docs = "\n".join(buffer).replace('"', "\\""") + + codeblock = "" + split = docs.split("::") + if len(split) == 2: + docs = split[0].rstrip() + codeblock = split[1].lstrip() + codeblock = "```\n" + codeblock + "\n```" + + docs = docs.replace("\n\n", "!!!!").replace("\n", " ").replace("!!!!", "\n\n") + docs = docs.replace("\n\n", "!!!!").replace("\n", " ").replace("!!!!", "\n\n") + + if len(codeblock): + docs = docs + "\n" + codeblock + + return docs.strip() + +def format_output(basefile, current_kind): + if basefile in ["screen_special"]: + return + + if name_class[current_kind] != "": + key = "{}.{}".format(name_class[current_kind], current_kind) + else: + key = current_kind + + if key == "inc" or name_kind[current_kind] in ["productionlist","ifconfig","figure","image","raw","only","warning","highlight"]: + return + + if basefile == "store_variables": + name_class[current_kind] = "store" + elif basefile in ["screen_actions"]: + name_kind[current_kind] = "Action" + + output_json(key, + basefile, + current_kind, + name_args[current_kind], + name_class[current_kind], + name_kind[current_kind], + name_docs[current_kind] + ) + + return + +def output_json(key, basefile, kind, nargs, nclass, nkind, ndocs): + if (key in ignore_list): + return + + if key.startswith('_') and not (key in documentation): + print("output_json skipping '{}'", key) + return + + if (key == "Image"): + ndocs = "Loads an image from a file. filename is a string giving the name of the file.\n\nfilename should be a JPEG or PNG file with an appropriate extension.\n\nIf optimize_bounds is True, only the portion of the image inside the bounding box of non-transparent pixels is loaded into GPU memory. (The only reason to set this to False is when using an image as input to a shader.)" + + if ndocs == "" and key in documentation: + ndocs = documentation[key] + if key in override_args: + nargs = override_args[key] + elif ("->" in ndocs): + if key in documentation: + ndocs = documentation[key] + else: + return + elif "This module provides" in ndocs: + return + + if "." in key and len(ndocs) == 0: + return + + if key.startswith('im.') or key == "im": + basefile = "obsolete" + elif (key.startswith('ui.') or key == "ui") and key != "ui.adjustment": + basefile = "obsolete" + elif key in obsoleted: + basefile = "obsolete" + ndocs = obsoleted[key] + + if ndocs.startswith('Returns a transition') or key == 'Swing': + basefile = 'transitions' + + if nargs: + nargs = nargs.replace("(self, ", "(") + + if nkind == "" and key in override_kind: + nkind = override_kind[key] + + output[key] = [ + basefile, + kind, + nargs, + nclass, + nkind, + ndocs + ] + + if test_mode or key=="_autosave": + print("{} = {}".format(key, output[key])) + + return + +def sort_output_json(): + for key in undocumented: + output.pop(key, None) + + group = {} + for key in sorted(output): + if key.startswith("config."): + group[key] = output[key] + baseoutput["config"] = group + + group = {} + for key, value in iter(output.items()): + if key.startswith("renpy."): + group[key] = value + baseoutput["renpy"] = group + + group = {} + for key, value in iter(output.items()): + if not key.startswith("config.") and not key.startswith("renpy."): + group[key] = value + baseoutput["internal"] = group + + jsonStr = json.dumps(baseoutput) + # print("") + # print(jsonStr) + + with open(os.path.join(root, 'renpy.json'), "w") as f: + f.write(jsonStr) + +def json_write_reserved(module, dest, ignore_builtins): + for i in sorted(dir(module)): + if i == "doc": + continue + + if i.startswith("_"): + continue + + #if ignore_builtins and hasattr(__builtin__, i): + # continue + + simple_scan(i, getattr(module, i), "") + +def scan_section(name, o): + """ + Scans object o. Assumes it has the name name. + """ + + #print("scan_section {}".format(name)) + for n in dir(o): + if n.startswith('_'): + continue + simple_scan(name + n, getattr(o, n)) + +def simple_scan(name, o, prefix=""): + doc_type = "function" + # The section it's going into. + section = None + # The formatted arguments. + args = None + + # Get the function's docstring. + doc = inspect.getdoc(o) + if doc is None: + doc = inspect.getcomments(o) + try: + doc = o.__doc__ + except AttributeError: + doc = None + + # doc strings are compiled out of the final binaries :( + # if doc is None: + # doc = getattr(o, "__doc__", None) + # if not isinstance(doc, basestring): + # doc = None + + #if not doc: + # return + + # Break up the doc string, scan it for specials. + lines = [ ] + + if doc: + for l in doc.split("\n"): + m = re.match(r':doc: *(\w+) *(\w+)?', l) + if m: + section = m.group(1) + if m.group(2): + doc_type = m.group(2) + continue + + m = re.match(r':args: *(.*)', l) + if m: + args = m.group(1) + continue + + m = re.match(r':name: *(\S+)', l) + if m: + if name != m.group(1): + return + continue + + lines.append(l) + + if args is None: + # Get the arguments. + if inspect.isclass(o): + init = getattr(o, "__init__", None) + if not init: + return + + init_doc = inspect.getdoc(init) + if init_doc and not init_doc.startswith("x.__init__("): + lines.append("") + lines.extend(init_doc.split("\n")) + try: + args = inspect.getfullargspec(init) + except: + args = None + + elif inspect.isfunction(o): + args = inspect.getfullargspec(o) + + elif inspect.ismethod(o): + args = inspect.getfullargspec(o) + + else: + #print("Warning: %s has section but not args." % name) + #return + pass + + # Format the arguments. + if args is not None: + args = inspect.formatargspec(*args) + args = args.replace("(self, ", "(") + args = re.sub(r'\<[^>]*\>', 'NotSet', args) + else: + args = "()" + + # Put it into the line buffer. + lb = line_buffer[section] + + nkind = "" + if inspect.isclass(o): + doc_type = "class" + tree = inspect.getclasstree([o], unique=True) + if tree and len(tree) > 0 and renpy.ui.Action in tree[0]: + nkind = "Action" + + lb.append(prefix + ".. %s:: %s%s" % (doc_type, name, args)) + + for l in lines: + lb.append(prefix + " " + l) + + lb.append(prefix + "") + + # if inspect.isclass(o): + # if (name not in [ "Matrix", "OffsetMatrix", "RotateMatrix", "ScaleMatrix" ]): + # for i in dir(o): + # simple_scan(i, getattr(o, i), prefix + " ") + + if name == "identity": + raise Exception("identity") + + documented_list.append(o) + documented[id(o)].append(name) + + output_json(name, + 'internal', + doc_type, + args, + '', + nkind, + format_doc_string(lines) + ) + +def parse_file_test(): + parse_file("", fnpath + "audio/audio.py") + +def parse_file_list(): + # extract documentation from the source files + print("documentation count={}".format(len(documentation))) + print("ignore_list count={}".format(len(ignore_list))) + + common_list = ["00action_audio.rpy","00action_control.rpy", + "00action_data.rpy","00action_file.rpy","00action_menu.rpy", + "00action_other.rpy","00barvalues.rpy","00gamepad.rpy", + "00matrixcolor.rpy","00matrixtransform.rpy","00mousedisplayable.rpy", + "00musicroom.rpy","00gallery.rpy","00inputvalues.rpy", + "00nvl_mode.rpy","00placeholder.rpy","00preferences.rpy", + "00sideimage.rpy","00stylepreferences.rpy","00voice.rpy", + "00layeredimage.rpy"] + + for p in common_list: + parse_file("", os.path.join(fnpath, 'common', p)) + + renpy_list = ["exports.py", "character.py", "display/video.py", + "display/image.py", "display/transition.py", "common/00library.rpy", + "gl2/live2d.py","statements.py","sl2/slparser.py","text/font.py", + "gl2/gl2shadercache.py","loadsave.py","display/focus.py", + "display/behavior.py","ast.py","display/screen.py", + "lint.py"] + + for p in renpy_list: + parse_file("renpy", os.path.join(fnpath, p)) + parse_file("", os.path.join(fnpath, p)) + + parse_file("renpy.sound", os.path.join(fnpath, 'audio', 'audio.py')) + parse_file("renpy.music", os.path.join(fnpath, 'audio', 'music.py')) + + parse_file("", os.path.join(fnpath, "audio", "audio.py")) + parse_file("", os.path.join(fnpath, "display", "layout.py")) + parse_file("", os.path.join(fnpath, "display", "model.py")) + parse_file("", os.path.join(fnpath, "display", "imagelike.py")) + parse_file("", os.path.join(fnpath, "display", "particle.py")) + parse_file("", os.path.join(fnpath, "display", "motion.py")) + parse_file("", os.path.join(fnpath, "display", "dragdrop.py")) + parse_file("", os.path.join(fnpath, "text", "extras.py")) + parse_file("", os.path.join(fnpath, "text", "text.py")) + parse_file("", os.path.join(fnpath, "defaultstore.py")) + parse_file("", os.path.join(fnpath, "common", "00definitions.rpy")) + parse_file("", os.path.join(fnpath, "color.py")) + parse_file("", os.path.join(fnpath, "python.py")) + parse_file("", os.path.join(fnpath, "ui.py")) + + parse_file("gui", os.path.join(fnpath, "common", "00gui.rpy")) + parse_file("build", os.path.join(fnpath, "common", "00build.rpy")) + parse_file("define", os.path.join(fnpath, "common", "00definitions.rpy")) + parse_file("iap", os.path.join(fnpath, "common", "00iap.rpy")) + parse_file("layeredimage", os.path.join(fnpath, "common", "00layeredimage.rpy")) + parse_file("updater", os.path.join(fnpath, "common", "00updater.rpy")) + parse_file("im", os.path.join(fnpath, "display", "im.py")) + parse_file("ui", os.path.join(fnpath, "ui.py")) + parse_file("achievement", os.path.join(fnpath, "common", "00achievement.rpy")) + + print("documentation count={}".format(len(documentation))) + print("ignore_list count={}".format(len(ignore_list))) + +def parse_file(prefix, fn): + f = open(fn) + lb = [] + inside_doc = False + kwtype = "" + function = "" + args = "" + + #print("documentation count={}".format(len(documentation))) + for l in f: + m = re.search(r"^\s{0,4}(class|def)\s+(\w+)(\(.*\)):(.*)", l) + if m: + kwtype = m.group(1) + function = m.group(2) + args = m.group(3) + + if prefix and len(prefix) > 0: + function = prefix + "." + function + + if test_mode: + print("found: {}{}".format(function,args)) + + lb = [] + continue + else: + m = re.search(r"^\s{0,4}(class|def)\s+(\w+)(\()", l) + if m: + kwtype = m.group(1) + function = m.group(2) + args = "" + + if prefix and len(prefix) > 0: + function = prefix + "." + function + + if test_mode: + print("found multiline: {}{}".format(function,args)) + + lb = [] + continue + + if '"""' in l: + if len(lb) > 0: + docs = format_doc_string(lb) + #if test_mode: + # print("{} : {} : {}".format(function,args,docs)) + if docs and len(docs) > 0: + if not function in documentation: + documentation[function] = docs + if prefix and len(prefix) > 0 and kwtype == "def": + override_args[function] = args + lb = [] + inside_doc = False + else: + inside_doc = True + elif inside_doc: + if ":undocumented:" in l: + undocumented.append(function) + ignore_list.append(function) + lb = [] + inside_doc = False + elif ":doc:" in l: + override_documented[function] = True + #print("*** override_documented[{}]".format(function)) + #if function == "AnimatedValue": + # print("AnimatedValue={}".format(fn)) + if "00action" in fn or "00inputvalues" in fn or "00barvalues" in fn: + override_kind[function] = "Action" + pass + elif ":args:" in l: + args = l.replace(":args:", "").strip() + override_args[function] = args + elif ":name:" in l: + override_name = l.replace(":name:", "").strip() + function = override_name + elif "figure::" in l: + pass + else: + if len(l) > 1: + lb.append(l.replace(' ','').replace(' ','').replace('\n','').replace('\\','"')) + else: + lb.append(l.replace('\n','')) + +def copyRenpyFunctions(): + new_output = output["renpy.sound.register_channel"][:] + new_output[1] = 'renpy.music.register_channel' + output["renpy.music.register_channel"] = new_output + override_args["renpy.music.register_channel"] = override_args["renpy.sound.register_channel"] + override_documented["renpy.music.register_channel"] = True + + new_keys = [] + for o in output: + # get ready to copy the renpy.music functions + # remove the undocumented audio functions + if "renpy.music." in o: + if o in override_args and o in override_documented: + new_keys.append(o) + else: + output[o] = ":undocumented:" + undocumented.append(o) + elif "achievement." in o: + if o in override_documented: + new_keys.append(o) + else: + output[o] = ":undocumented:" + undocumented.append(o) + + # add copies of the renpy.music functions to renpy.sound + for key in new_keys: + new_key = key.replace('.music.', '.sound.') + new_output = output[key][:] + new_output[2] = new_output[2].replace('channel="music"', 'channel="sound"') + output[new_key] = new_output + + #update transitions + new_output = output["irisin"][:] + new_output[1] = 'irisout' + new_output[5] = new_output[5].replace('irisout', 'irisin') + output["irisout"] = new_output + + for key in ["pushleft", "pushup", "pushdown"]: + new_output = output["pushright"][:] + new_output[1] = key + new_output[5] = new_output[5].replace(key, 'pushright') + output[key] = new_output + + for key in ["wiperight", "wipeup", "wipedown"]: + new_output = output["wipeleft"][:] + new_output[1] = key + new_output[5] = new_output[5].replace(key, 'wipeleft') + output[key] = new_output + + for key in ["slideright", "slideup", "slidedown"]: + new_output = output["slideleft"][:] + new_output[1] = key + new_output[5] = new_output[5].replace(key, 'slideleft') + output[key] = new_output + + for key in ["slideawayright", "slideawayup", "slideawaydown"]: + new_output = output["slideawayleft"][:] + new_output[1] = key + new_output[5] = new_output[5].replace(key, 'slideawayleft') + output[key] = new_output + + for key in ["moveinleft", "moveintop", "moveinbottom"]: + new_output = output["moveinright"][:] + new_output[1] = key + new_output[5] = new_output[5].replace(key, 'moveinright') + output[key] = new_output + + for key in ["moveoutleft", "moveouttop", "moveoutbottom"]: + new_output = output["moveoutright"][:] + new_output[1] = key + new_output[5] = new_output[5].replace(key, 'moveoutright') + output[key] = new_output + + for key in ['easeinright','easeinleft','easeintop','easeinbottom','easeoutright','easeoutleft','easeouttop','easeoutbottom']: + new_output = output["ease"][:] + new_output[1] = key + new_output[5] = new_output[5].replace(key, 'ease') + output[key] = new_output + + ui_docs = documentation["ui"] + for key in ["ui.add", "ui.bar", "ui.imagebutton", "ui.input", "ui.key", "ui.label", "ui.null", "ui.text", "ui.textbutton", "ui.timer", "ui.vbar", "ui.hotspot", "ui.hotbar", "ui.spritemanager", "ui.button", "ui.frame", "ui.transform", "ui.window", "ui.drag", "ui.fixed", "ui.grid", "ui.hbox", "ui.side", "ui.vbox", "ui.imagemap", "ui.draggroup"]: + output_json(key,'obsolete',key,'','','ui',ui_docs) + + #for key in ['_autosave','_confirm_quit','_dismiss_pause','_game_menu_screen','_history','_history_list','_ignore_action','_menu','_quit_slot','_rollback','_screenshot_pattern','_skipping','_version','_window','_window_auto','_window_subtitle']: + # output_json(key,'store_variables',key,'','','','') + +# ignore these keywords and don't document them +ignore_list = ["sys","os","renpy.os","renpy.open","renpy.copy","im.open","im.os","ui.open","ui.tobytes", + "updater.json","renpy.renpy_pure","renpy.public_api","layeredimage.Layer","nvl_erase", + "updater.io","updater.zlib","updater.subprocess","updater.traceback","updater.future","updater.os", + "updater.python_object","updater.zsync_path","updater.hashlib","updater.tobytes","updater.rsa", + "updater.tarfile","updater.struct","updater.codecs","updater.urlparse","updater.threading", + "renpy.munge","default","define"] + +# override documentation for common objects whose pydoc is empty for some reason +override_args = {} +override_documented = {} +undocumented = [] +obsoleted = { + "LiveCrop": "LiveCrop is now :func:`Crop`.", + "LiveComposite": "LiveComposite is now :func:`Composite`." +} +override_kind = { + "If" : "Action", + "FileAction" : "Action", + "ScreenVariableValue" : "Action", + "AudioPositionValue" : "Action", + "FieldValue" : "Action", + "DictValue" : "Action", + "Preference" : "Action", + "GetCharacterVolume" : "Action", + "GamepadCalibrate" : "Action", + "GamepadExists" : "Action" +} + +documentation = { + "renpy" : "To allow Ren'Py to be scripted in Python, each Ren'Py statement has a Python equivalent. This usually consists of a Python function, but may also consist of a pattern of Python calls that perform an action equivalent to the statement.", + "Lexer" : "The parse method of renpy.register_statement takes a Lexer object", + "HistoryEntry" : "The _history_list variable stores the actual history, as a list of HistoryEntry objects.", + "save_name": "A save name that is included with saves.", + "build.display_name" : "The name that will be displayed in the title bar.", + "build.version" : "The version used by the build system.", + "iap" : "Ren'Py includes a high-level in-app purchasing framework. This framework currently only supports unlock-style purchases from the Apple App Store, Google Play, and the Amazon Appstore.", + "ui" : "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement.", + "im" : "An image manipulator is a displayable that takes an image or image manipulator, and either loads it or performs an operation on it. Image manipulators can only take images or other image manipulators as input.\n\nWith the few exceptions listed below, the use of image manipulators is historic. A number of image manipulators that had been documented in the past should no longer be used, as they suffer from inherent problems. In any case except for im.Data, the Transform() displayable provides similar functionality in a more general manner, while fixing the problems, although it sometimes requires gl2 to be enabled.", + "config" : "Configuration variables control the behavior of Ren'Py's implementation, allowing Ren'Py itself to be customized in a myriad of ways. These range from the common (such as changing the screen size) to the obscure (adding new kinds of archive files).\n\nRen'Py's implementation makes the assumption that, once the GUI system has initialized, configuration variables will not change. Changing configuration variables outside of init blocks can lead to undefined behavior. Configuration variables are not part of the save data.", + "Live2D" : "This displayable displays a Live2D animation.\n\nOnly filename should be given positionally, and all other arguments should be given as keyword arguments.", + "Transform" : "A transform applies operations such as cropping, rotation, scaling, and alpha-blending to its child. A transform object has fields corresponding to the transform properties, which it applies to its child.", + "persistent" : "The persistent variable allows access to the Persistent object's fields, which contains saved data that is not associated with a particular point in a game.", + "say" : "The equivalent of the say statement.\n\n`who` Either the character that will say something, None for the narrator, or a string giving the character name. In the latter case, the say() is used to create the speaking character.\n\n`what` A string giving the line to say. Percent-substitutions are performed in this string.", + "achievement" : "The Achievement module allows the developer to grant achievements to the player, to clear achievements, and to determine if an achievement has been granted. It also allows the recording of progress towards an achievement.\n\nBy default, the achievement stores information in the persistent file. If Steam support is available and enabled, achievement information is automatically synchronized with Steam.", + "renpy.music" : "Most renpy.music functions have aliases in renpy.sound. These functions are similar, except they default to the sound channel rather than the music channel, and default to not looping.", + "renpy.sound" : "Most renpy.sound functions have aliases in renpy.music. These functions are similar, except they default to the music channel rather than the sound channel, and default to looping.", + "Image" : "Loads an image from a file. filename is a string giving the name of the file.\n\nfilename should be a JPEG or PNG file with an appropriate extension.\n\nIf optimize_bounds is True, only the portion of the image inside the bounding box of non-transparent pixels is loaded into GPU memory. (The only reason to set this to False is when using an image as input to a shader.)", + "DynamicCharacter" : "Creates and returns a `Character` object that has the `dynamic` property set to `True`.\n\n`name_expr` should either be a string containing a Python expression, a function, or a callable object. If it's a string, that string will be evaluated before each line of dialogue, and the result used as the name of the character. Otherwise, the function or callable object will be called with no arguments before each line of dialogue, and the return value of the call will be used as the name of the character.", + "adv" : "This is a template ADV-mode character, and the default character kind that is used when `Character()` is called.", + "name_only" : "This is a template character that is used when a string is given as the character name in a say statement.", + "narrator" : "This is the character that speaks narration (say statements that do not give a character or character name).", + "_autosave" : "This variable can be set to False to disable autosave.", + "_confirm_quit" : "This determines if quitting the game asks for confirmation. It is set to False during the splashscreen, and is ignored when in the main menu.", + "_dismiss_pause" : "If True, the player can dismiss pauses and transitions.", + "_game_menu_screen" : "This is the screen that is displayed when entering the game menu with no more specific screen selected. (For example, when right-clicking, pressing escape, or when ShowMenu() is not given an argument.) If None, entry to the game menu is disallowed.\n\nThis is set to None at the start of the splashscreen, and restored to its original value when the splashscreen ends.", + "_history" : "If true, Ren'Py will record dialogue history when a line is shown. (Note that `config.history_list_length` must be set as well.)", + "_history_list" : "This is a list of history objects, corresponding to each line of history from oldest to newest. See the History section for more information.", + "_ignore_action" : "When this is not None, it's an action that is run after clicking Ignore on the error handling screen. The action is usually `Jump()`, to jump the game to a place that can recover from an error. If None, control continues with the next Ren'Py statement.", + "_menu" : "Ren'Py sets this variable to True when entering a main menu or game menu context.", + "_quit_slot" : "If not None, this should be a string giving the name of a file slot. When Ren'Py quits, the game will be saved in this slot.", + "_rollback" : "Controls if rollback is allowed.", + "_screenshot_pattern" : "If not None, this string is used in preference to `config.screenshot_pattern` to determine the filename of a screenshot. Please see the documentation for that variable for the format of the string.", + "_skipping" : "Controls if skipping is allowed.", + "_version" : "This is set to `config.version` when a new game is started. It can be used by the `after_load` label or `config.after_load_callbacks` to determine which upgrades need to be done.\n\nThis is only set once, upon the initial start. After that, the game is responsible for updating `_version` as necessary.", + "_window" : "This set by the `window show` and `window hide` statements, and indirectly by `window auto`. If true, the dialogue window is shown during non-dialogue statements.", + "_window_auto" : "This is set to true by `window auto` and to false by `window show` and `window hide`. If true, the `window auto` behavior occurs.", + "_window_subtitle" : "This is appended to `config.window_title` to produce the caption for the game window. This is automatically set to `config.menu_window_subtitle` while in the game menu.", + "_live2d_fade" : "If true, Live2D animations use motion fading. If False, animations are transitioned abruptly.", + "_in_replay" : "When in replay mode, this is sent to the label at which replay mode was started. Outside of replay mode, this is None." +} diff --git a/scripts/documentation/makeJsonDoc.rpy b/scripts/documentation/makeJsonDoc.rpy new file mode 100644 index 00000000..8379ac35 --- /dev/null +++ b/scripts/documentation/makeJsonDoc.rpy @@ -0,0 +1,44 @@ +init python: + import doc + import shaderdoc + import makeJson + + def export(): + # the folder containing the sphinx project + root = "/Users/robdurfee/Library/CloudStorage/OneDrive-Personal/Documents/RenPy/sphinx" + incdir = os.path.join(root, 'source', 'inc') + makeJson.set_root(root) + # the renpy SDK folder + makeJson.set_renpy_root("/Applications/renpy-8-sdk/renpy/") + + makeJson.parse_file_list() + shaderdoc.shaders(incdir=incdir) + + makeJson.scan_section("", renpy.store) + makeJson.scan_section("renpy.", renpy) + makeJson.scan_section("renpy.music.", renpy.music) + #makeJson.scan_section("theme.", theme) + makeJson.scan_section("layout.", layout) + makeJson.scan_section("define.", define) + makeJson.scan_section("ui.", ui) + makeJson.scan_section("im.", im) + #makeJson.scan_section("im.matrix.", im.matrix) + makeJson.scan_section("build.", build) + makeJson.scan_section("updater.", updater) + makeJson.scan_section("iap.", iap) + makeJson.scan_section("achievement.", achievement) + makeJson.scan_section("gui.", gui) + makeJson.scan_section("layeredimage.", layeredimage) + makeJson.scan_section("Matrix.", Matrix) + + makeJson.json_scan_docs() + #makeJson.json_write_reserved(__builtin__, os.path.join(incdir, 'reserved_builtins'), False) + makeJson.json_write_reserved(store, os.path.join(incdir, 'test'), True) + makeJson.json_scan_docs('transitions.rst') + makeJson.json_scan_docs('transforms.rst') + makeJson.copyRenpyFunctions() + makeJson.sort_output_json() + raise SystemExit + +label exportJson: + $ export() diff --git a/snippets/snippets.json b/snippets/snippets.json index 14d14563..36db952d 100644 --- a/snippets/snippets.json +++ b/snippets/snippets.json @@ -1,6 +1,6 @@ { "Region": { - "prefix": ["#region", "region"], + "prefix": [ "#region", "region" ], "body": "#region ${1:Region name}\n$0\n#endregion ${1:Region name}", "description": "Create a new folding region." }, diff --git a/src/color.ts b/src/color.ts index 690ee09d..ff8c19de 100644 --- a/src/color.ts +++ b/src/color.ts @@ -1,25 +1,44 @@ // Color conversion methods for Color provider -import { CancellationToken, Color, ColorInformation, ColorPresentation, DocumentColorProvider, Range, TextDocument, TextEdit } from "vscode"; -import { injectCustomTextmateTokens, TextMateRule } from "./decorator"; +import { CancellationToken, Color, ColorInformation, ColorPresentation, ProviderResult, Range, TextDocument, TextEdit, languages } from "vscode"; +import { ValueEqualsSet } from "./utilities/hashset"; +import { Tokenizer } from "./tokenizer/tokenizer"; import { LiteralTokenType } from "./tokenizer/renpy-tokens"; -import { tokenizeDocument } from "./tokenizer/tokenizer"; +import { TextMateRule, injectCustomTextmateTokens } from "./decorator"; -export class RenpyColorProvider implements DocumentColorProvider { - public provideDocumentColors(document: TextDocument, token: CancellationToken): Thenable { - return getColorInformation(document); - } - public provideColorPresentations(color: Color, context: { document: TextDocument; range: Range }, token: CancellationToken): Thenable { - return getColorPresentations(color, context.document, context.range); - } -} +export type DocumentColorContext = { + document: TextDocument; + range: Range; +}; + +export const colorProvider = languages.registerColorProvider("renpy", { + provideDocumentColors(document: TextDocument, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getColorInformation(document)); + }); + }, + + provideColorPresentations(color: Color, context: DocumentColorContext, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getColorPresentations(color, context)); + }); + }, +}); /** * Finds all colors in the given document and returns their ranges and color * @param document - the TextDocument to search - * @returns - Thenable - an array that provides a range and color for each match + * @returns - ColorInformation[] - an array that provides a range and color for each match */ -export function getColorInformation(document: TextDocument): Thenable { - injectCustomColorStyles(document); +export async function getColorInformation(document: TextDocument) { + await injectCustomColorStyles(document); // find all colors in the document const colors: ColorInformation[] = []; @@ -62,7 +81,7 @@ export function getColorInformation(document: TextDocument): Thenable { +export function getColorPresentations(color: Color, context: DocumentColorContext): ColorPresentation[] { // user hovered/tapped the color block/return the color they picked const colors: ColorPresentation[] = []; - const line = document.lineAt(range.start.line).text; - const text = line.substring(range.start.character, range.end.character); - const oldRange = new Range(range.start.line, range.start.character, range.start.line, range.start.character + text.length); + const range = context.range; + const text = context.document.getText(range); + const oldRange = new Range(range.start, range.end); const colR = Math.round(color.red * 255); const colG = Math.round(color.green * 255); @@ -107,20 +126,21 @@ export function getColorPresentations(color: Color, document: TextDocument, rang colors.push(rgbColorPres); } - return Promise.resolve(colors); + return colors; } -export function injectCustomColorStyles(document: TextDocument) { - const documentTokens = tokenizeDocument(document); - +export async function injectCustomColorStyles(document: TextDocument) { + // Disabled until filter is added to the tree class + const documentTokens = await Tokenizer.tokenizeDocument(document); // TODO: Should probably make sure this constant is actually part of a tag, but for now this is fine. - const colorTags = documentTokens.filter((x) => x.tokenType === LiteralTokenType.Color); - const colorRules: TextMateRule[] = []; + const colorTags = documentTokens.filter((x) => x.token?.type === LiteralTokenType.Color); + const colorRules = new ValueEqualsSet(); // Build the new rules for this file - colorTags.forEach((color) => { - const lowerColor = document.getText(color.getRange()).toLowerCase(); - colorRules.push({ scope: `renpy.meta.color.${lowerColor}`, settings: { foreground: lowerColor } }); + colorTags.forEach((colorNode) => { + const lowerColor = document.getText(colorNode.token?.getVSCodeRange()).toLowerCase(); + const newRule = new TextMateRule(`renpy.meta.color.${lowerColor}`, { foreground: lowerColor }); + colorRules.add(newRule); }); injectCustomTextmateTokens(colorRules); @@ -215,32 +235,55 @@ export function convertHtmlToColor(htmlHex: string): Color | null { */ export function convertRenpyColorToColor(renpy: string): Color | null { try { - const colorTuple = renpy.replace("Color(", "").replace("color", "").replace("=", "").replace(" ", "").replace("(", "[").replace(")", "]"); - const result = JSON.parse(colorTuple); - if (result.length === 3) { - return new Color(parseInt(result[0], 16) / 255, parseInt(result[1], 16) / 255, parseInt(result[2], 16) / 255, 1.0); - } else if (result.length === 4) { - return new Color(parseInt(result[0], 16) / 255, parseInt(result[1], 16) / 255, parseInt(result[2], 16) / 255, parseInt(result[3], 16) / 255); + const colorTuple = renpy + .replaceAll(" ", "") + .replace(/[Cc]olor=?\(/g, "") + .replace(")", ""); + + const result = colorTuple.split(","); + if (result.length < 3) { + return null; } - return null; + + const r = parseInt(result[0], 16) / 255; + const g = parseInt(result[1], 16) / 255; + const b = parseInt(result[2], 16) / 255; + const a = result.length === 4 ? parseInt(result[3], 16) / 255 : 1.0; + return new Color(r, g, b, a); } catch (error) { return null; } } +/** + * Returns a float value based on the given Ren'Py float string value + * @remarks Values starting with a dot (e.g., `.5`) are forced to be parsed as `0.5` due to javascript's `parseFloat` behavior. + * @param value The renpy float value to parse + * @returns The parsed float value + */ +function parseRenpyFloat(value: string): number { + if (value.startsWith(".")) { + return parseFloat("0" + value); + } + return parseFloat(value); +} + /** * Returns a Color provider object based on the given Ren'Py rgb tuple - * @remarks - * The rgb tuple values should be numeric values between 0.0 and 1.0 (e.g., `rgb=(1.0, 0.0, 0.0)`) + * @remarks The rgb tuple values should be numeric values between 0.0 and 1.0 (e.g., `rgb=(1.0, 0.0, 0.0)`). + * Values starting with a dot (e.g., `.5`) are forced to be parsed as `0.5` due to javascript's `parseFloat` behavior. * @param renpyColor - Renpy `rgb` color tuple (e.g., `rgb=(r, g, b)`) * @returns The `Color` provider object */ export function convertRgbColorToColor(renpyColor: string): Color | null { try { - const colorTuple = renpyColor.replace("rgb", "").replace("=", "").replace(" ", "").replace("(", "[").replace(")", "]"); - const result = JSON.parse(colorTuple); + const colorTuple = renpyColor + .replaceAll(" ", "") + .replace(/rgb=\(/g, "") + .replace(")", ""); + const result = colorTuple.split(","); if (result.length === 3) { - return new Color(parseFloat(result[0]), parseFloat(result[1]), parseFloat(result[2]), 1.0); + return new Color(parseRenpyFloat(result[0]), parseRenpyFloat(result[1]), parseRenpyFloat(result[2]), 1.0); } return null; } catch (error) { diff --git a/src/completion.ts b/src/completion.ts index 008bd26a..c0639343 100644 --- a/src/completion.ts +++ b/src/completion.ts @@ -1,10 +1,30 @@ // Completion Provider -import { TextDocument, Position, CompletionContext, CompletionItem, CompletionTriggerKind, CompletionItemKind, workspace } from "vscode"; +import { TextDocument, Position, CompletionContext, CompletionItem, CompletionTriggerKind, CompletionItemKind, workspace, languages, CancellationToken, ProviderResult } from "vscode"; import { Displayable } from "./displayable"; import { getDefinitionFromFile } from "./hover"; import { getCurrentContext } from "./navigation"; import { NavigationData } from "./navigation-data"; +export const completionProvider = languages.registerCompletionItemProvider( + "renpy", + { + provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: CompletionContext): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getCompletionList(document, position, context)); + }); + }, + }, + ".", + " ", + "@", + "-", + "(", +); + /** * Returns an array of auto-complete items related to the keyword at the given document/position * @param document - The current TextDocument diff --git a/src/configuration.ts b/src/configuration.ts new file mode 100644 index 00000000..19dd0dbd --- /dev/null +++ b/src/configuration.ts @@ -0,0 +1,56 @@ +import { ConfigurationTarget, ExtensionContext, WorkspaceConfiguration, workspace } from "vscode"; + +export class Configuration { + public static initialize(context: ExtensionContext) { + // hide rpyc files if the setting is enabled + const config = workspace.getConfiguration("renpy"); + if (config?.excludeCompiledFilesFromWorkspace) { + this.excludeCompiledFilesConfig(); + } + + // Listen to configuration changes + context.subscriptions.push( + workspace.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("renpy.excludeCompiledFilesFromWorkspace")) { + if (workspace.getConfiguration("renpy").get("excludeCompiledFilesFromWorkspace")) { + this.excludeCompiledFilesConfig(); + } + } + }), + ); + } + + public static isAutoSaveDisabled(): boolean { + const config = workspace.getConfiguration("files"); + const autoSave = config.get("autoSave"); + return autoSave === "off"; + } + + public static compileOnDocumentSave(): boolean { + const config = workspace.getConfiguration("renpy"); + return config.get("compileOnDocumentSave") === true; + } + + public static shouldWatchFoldersForChanges(): boolean { + const config = workspace.getConfiguration("renpy"); + return config.get("watchFoldersForChanges") === true; + } + + public static getRenpyExecutablePath(): string { + const config = workspace.getConfiguration("renpy"); + return config.get("renpyExecutableLocation") || ""; + } + + private static excludeCompiledFilesConfig() { + const renpyExclude = ["**/*.rpyc", "**/*.rpa", "**/*.rpymc", "**/cache/"]; + const config = workspace.getConfiguration("files"); + const workspaceExclude = config.inspect("exclude"); + const exclude = { ...workspaceExclude?.workspaceValue }; + renpyExclude.forEach((element) => { + if (!(element in exclude)) { + Object.assign(exclude, { [element]: true }); + } + }); + config.update("exclude", exclude, ConfigurationTarget.Workspace); + } +} diff --git a/src/debugger.ts b/src/debugger.ts new file mode 100644 index 00000000..3ed4d936 --- /dev/null +++ b/src/debugger.ts @@ -0,0 +1,72 @@ +import * as vscode from "vscode"; +import { DebugSession, TerminatedEvent } from "@vscode/debugadapter"; +import { getWorkspaceFolder } from "./workspace"; +import { Configuration } from "./configuration"; +import { logToast } from "./logger"; +import { isValidExecutable } from "./extension"; + +function getTerminal(name: string): vscode.Terminal { + let i: number; + for (i = 0; i < vscode.window.terminals.length; i++) { + if (vscode.window.terminals[i].name === name) { + return vscode.window.terminals[i]; + } + } + return vscode.window.createTerminal(name); +} + +export class RenpyAdapterDescriptorFactory implements vscode.DebugAdapterDescriptorFactory { + createDebugAdapterDescriptor(session: vscode.DebugSession): vscode.ProviderResult { + return new vscode.DebugAdapterInlineImplementation(new RenpyDebugSession(session.configuration.command, session.configuration.args)); + } +} + +class RenpyDebugSession extends DebugSession { + private command = "run"; + private args?: string[]; + + public constructor(command: string, args?: string[]) { + super(); + this.command = command; + if (args) { + this.args = args; + } + } + + protected override initializeRequest(): void { + const terminal = getTerminal("Ren'py Debug"); + terminal.show(); + let program = Configuration.getRenpyExecutablePath(); + + if (!isValidExecutable(program)) { + logToast(vscode.LogLevel.Error, "Ren'Py executable location not configured or is invalid."); + return; + } + + program += " " + getWorkspaceFolder(); + if (this.command) { + program += " " + this.command; + } + if (this.args) { + program += " " + this.args.join(" "); + } + terminal.sendText(program); + this.sendEvent(new TerminatedEvent()); + } +} + +export class RenpyConfigurationProvider implements vscode.DebugConfigurationProvider { + resolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration): vscode.ProviderResult { + if (!config.type && !config.request && !config.name) { + const editor = vscode.window.activeTextEditor; + if (editor && editor.document.languageId === "renpy") { + config.type = "renpy"; + config.request = "launch"; + config.name = "Ren'Py: Launch"; + config.command = "run"; + config.args = []; + } + } + return config; + } +} diff --git a/src/decorator.ts b/src/decorator.ts index 7e86372e..feee1942 100644 --- a/src/decorator.ts +++ b/src/decorator.ts @@ -1,62 +1,74 @@ -import { ConfigurationTarget, workspace } from "vscode"; +import { ConfigurationTarget, workspace, LogLevel } from "vscode"; +import * as util from "util"; +import { IEquatable, ValueEqualsSet } from "./utilities/hashset"; +import { logMessage } from "./logger"; -export type TextMateRule = { scope: string | string[]; settings: { fontStyle?: string; foreground?: string } }; -type TextMateRules = { textMateRules: TextMateRule[] }; +export class TextMateRule implements IEquatable { + public scope: string | string[]; + public settings: { fontStyle?: string; foreground?: string }; -const customFontStyleRules: TextMateRule[] = [ - { scope: "renpy.meta.plain", settings: { fontStyle: "" } }, - { scope: "renpy.meta.i", settings: { fontStyle: "italic" } }, - { scope: "renpy.meta.b", settings: { fontStyle: "bold" } }, - { scope: ["renpy.meta.u", "renpy.meta.a"], settings: { fontStyle: "underline" } }, - { scope: "renpy.meta.s", settings: { fontStyle: "strikethrough" } }, + constructor(scope: string | string[], settings: { fontStyle?: string; foreground?: string }) { + this.scope = scope; + this.settings = settings; + } + + equals(other: TextMateRule): boolean { + return util.isDeepStrictEqual(this, other); + } +} +type TextMateRuleConfiguration = { scope: string | string[]; settings: { fontStyle?: string; foreground?: string } }; +type TextMateRules = { textMateRules: TextMateRuleConfiguration[] }; + +const customFontStyleRules = new ValueEqualsSet([ + new TextMateRule("renpy.meta.plain", { fontStyle: "" }), + new TextMateRule("renpy.meta.i", { fontStyle: "italic" }), + new TextMateRule("renpy.meta.b", { fontStyle: "bold" }), + new TextMateRule(["renpy.meta.u", "renpy.meta.a"], { fontStyle: "underline" }), + new TextMateRule("renpy.meta.s", { fontStyle: "strikethrough" }), - { scope: "renpy.meta.i renpy.meta.b", settings: { fontStyle: "italic bold" } }, - { scope: "renpy.meta.i renpy.meta.u", settings: { fontStyle: "italic underline" } }, - { scope: "renpy.meta.i renpy.meta.s", settings: { fontStyle: "italic strikethrough" } }, - { scope: "renpy.meta.b renpy.meta.u", settings: { fontStyle: "bold underline" } }, - { scope: "renpy.meta.b renpy.meta.s", settings: { fontStyle: "bold strikethrough" } }, - { scope: "renpy.meta.u renpy.meta.s", settings: { fontStyle: "underline strikethrough" } }, + new TextMateRule("renpy.meta.i renpy.meta.b", { fontStyle: "italic bold" }), + new TextMateRule("renpy.meta.i renpy.meta.u", { fontStyle: "italic underline" }), + new TextMateRule("renpy.meta.i renpy.meta.s", { fontStyle: "italic strikethrough" }), + new TextMateRule("renpy.meta.b renpy.meta.u", { fontStyle: "bold underline" }), + new TextMateRule("renpy.meta.b renpy.meta.s", { fontStyle: "bold strikethrough" }), + new TextMateRule("renpy.meta.u renpy.meta.s", { fontStyle: "underline strikethrough" }), - { scope: "renpy.meta.i renpy.meta.b renpy.meta.u", settings: { fontStyle: "italic bold underline" } }, - { scope: "renpy.meta.i renpy.meta.b renpy.meta.s", settings: { fontStyle: "italic bold strikethrough" } }, - { scope: "renpy.meta.i renpy.meta.u renpy.meta.s", settings: { fontStyle: "italic underline strikethrough" } }, - { scope: "renpy.meta.b renpy.meta.u renpy.meta.s", settings: { fontStyle: "bold underline strikethrough" } }, + new TextMateRule("renpy.meta.i renpy.meta.b renpy.meta.u", { fontStyle: "italic bold underline" }), + new TextMateRule("renpy.meta.i renpy.meta.b renpy.meta.s", { fontStyle: "italic bold strikethrough" }), + new TextMateRule("renpy.meta.i renpy.meta.u renpy.meta.s", { fontStyle: "italic underline strikethrough" }), + new TextMateRule("renpy.meta.b renpy.meta.u renpy.meta.s", { fontStyle: "bold underline strikethrough" }), - { scope: "renpy.meta.i renpy.meta.b renpy.meta.u renpy.meta.s", settings: { fontStyle: "italic bold underline strikethrough" } }, + new TextMateRule("renpy.meta.i renpy.meta.b renpy.meta.u renpy.meta.s", { fontStyle: "italic bold underline strikethrough" }), - { scope: "renpy.meta.color.text", settings: { foreground: "#ffffff" } }, -]; + new TextMateRule("renpy.meta.color.text", { foreground: "#ffffff" }), +]); -export function injectCustomTextmateTokens(rules: TextMateRule[]) { +export function injectCustomTextmateTokens(rules: ValueEqualsSet) { const tokensConfig = workspace.getConfiguration("editor"); // If the config didn't exist yet, push the default tokens let tokenColorCustomizations = tokensConfig.get("tokenColorCustomizations"); - if (tokenColorCustomizations === undefined || tokenColorCustomizations.textMateRules === undefined) tokenColorCustomizations = { textMateRules: customFontStyleRules }; + if (tokenColorCustomizations === undefined || tokenColorCustomizations.textMateRules === undefined) { + tokenColorCustomizations = { textMateRules: customFontStyleRules.toArray() }; + } const currentRules = tokenColorCustomizations.textMateRules; // Build the new rules for this file - const newRules = customFontStyleRules.concat(rules); // Always add the default rules - const filteredRules = newRules.filter((y) => { - return !currentRules.some((x) => { - if (x.scope instanceof Array && y.scope instanceof Array) { - return x.scope.length === y.scope.length && x.scope.every((value, index) => value === y.scope[index]); - } - - return x.scope === y.scope || (x.scope === y.scope && (x.settings.foreground !== y.settings.foreground || x.settings.fontStyle !== y.settings.fontStyle)); - }); - }); - - if (filteredRules.length !== 0) { - tokenColorCustomizations.textMateRules = currentRules.concat(filteredRules); + const newRules = customFontStyleRules.addRange(rules); // Always add the default rules + for (const rule of currentRules) { + newRules.add(new TextMateRule(rule.scope, rule.settings)); + } + + if (newRules.size !== currentRules.length) { + tokenColorCustomizations.textMateRules = newRules.toArray(); tokensConfig.update("tokenColorCustomizations", tokenColorCustomizations, ConfigurationTarget.Workspace).then( () => { - console.log("Successfully updated the tokenColorCustomizations config"); + logMessage(LogLevel.Info, "Successfully updated the tokenColorCustomizations config"); }, (reason) => { - console.error("Failed to update the tokenColorCustomizations config! : " + reason); - } + logMessage(LogLevel.Error, "Failed to update the tokenColorCustomizations config! : " + reason); + }, ); } } diff --git a/src/definition.ts b/src/definition.ts index cacf1277..d8648e8a 100644 --- a/src/definition.ts +++ b/src/definition.ts @@ -1,16 +1,26 @@ -// Definition Provider -"use strict"; - -import { Definition, Location, Position, TextDocument, Uri } from "vscode"; +// Provider for Go To Definition +import { CancellationToken, Definition, Location, Position, ProviderResult, TextDocument, Uri, languages } from "vscode"; import { getKeywordPrefix } from "./extension"; import { rangeAsString } from "./navigation"; import { NavigationData } from "./navigation-data"; import { getFileWithPath, stripWorkspaceFromFile } from "./workspace"; +export const definitionProvider = languages.registerDefinitionProvider("renpy", { + provideDefinition(document: TextDocument, position: Position, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getDefinition(document, position)); + }); + }, +}); + export function getDefinition(document: TextDocument, position: Position): Definition | undefined { const range = document.getWordRangeAtPosition(position); if (!range) { - return; + return undefined; } // check if this range is a semantic token diff --git a/src/diagnostics.ts b/src/diagnostics.ts index cd3ca478..c95a966f 100644 --- a/src/diagnostics.ts +++ b/src/diagnostics.ts @@ -110,7 +110,7 @@ function refreshDiagnostics(doc: TextDocument, diagnosticCollection: DiagnosticC const filename = extractFilename(doc.uri.path); if (filename) { - if (!filename.match(/^[a-zA-Z0-9]/) || filename.startsWith("00")) { + if ((!filename.match(/^[a-zA-Z0-9]/) || filename.startsWith("00")) && !doc.uri.path.includes("renpy/common")) { const invalidRange = new Range(0, 0, doc.lineCount, 0); const range = doc.validateRange(invalidRange); const diagnostic = new Diagnostic(range, "Filenames must begin with a letter or number, but may not begin with '00' as Ren'Py uses such files for its own purposes.", severity); diff --git a/src/displayable.ts b/src/displayable.ts index 70b076e5..3766bd92 100644 --- a/src/displayable.ts +++ b/src/displayable.ts @@ -1,5 +1,4 @@ // Displayable Class -"use strict"; export class Displayable { name: string; diff --git a/src/extension.ts b/src/extension.ts index 4a47704c..87c7fd3f 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,181 +4,52 @@ import * as cp from "child_process"; import * as fs from "fs"; -import { - ExtensionContext, - languages, - commands, - window, - TextDocument, - Position, - CancellationToken, - CompletionContext, - CompletionItem, - CompletionItemProvider, - ConfigurationTarget, - Definition, - DefinitionProvider, - DocumentSemanticTokensProvider, - DocumentSymbol, - DocumentSymbolProvider, - Hover, - HoverProvider, - Location, - ProviderResult, - Range, - ReferenceContext, - ReferenceProvider, - SemanticTokens, - SemanticTokensLegend, - DocumentSelector, - StatusBarItem, - workspace, - WorkspaceConfiguration, - SignatureHelpProvider, - SignatureHelp, - SignatureHelpContext, - StatusBarAlignment, - Uri, -} from "vscode"; -import { RenpyColorProvider } from "./color"; +import { ExtensionContext, languages, commands, window, TextDocument, Position, debug, Range, workspace, Uri, DebugConfiguration, ProviderResult, DebugConfigurationProviderTriggerKind, tasks, LogLevel, ExtensionMode } from "vscode"; +import { colorProvider } from "./color"; import { getStatusBarText, NavigationData } from "./navigation-data"; import { cleanUpPath, getAudioFolder, getImagesFolder, getNavigationJsonFilepath, getWorkspaceFolder, stripWorkspaceFromFile } from "./workspace"; import { diagnosticsInit } from "./diagnostics"; -import { getSemanticTokens } from "./semantics"; -import { getHover } from "./hover"; -import { getCompletionList } from "./completion"; -import { getDefinition } from "./definition"; -import { getDocumentSymbols } from "./outline"; -import { findAllReferences } from "./references"; +import { semanticTokensProvider } from "./semantics"; +import { hoverProvider } from "./hover"; +import { completionProvider } from "./completion"; +import { definitionProvider } from "./definition"; +import { symbolProvider } from "./outline"; +import { referencesProvider } from "./references"; import { registerDebugDecorator, unregisterDebugDecorator } from "./tokenizer/debug-decorator"; -import { clearTokenCache } from "./tokenizer/tokenizer"; -import { getSignatureHelp } from "./signature"; +import { Tokenizer } from "./tokenizer/tokenizer"; +import { signatureProvider } from "./signature"; +import { initializeLoggingSystems, logMessage, logToast, updateStatusBar } from "./logger"; +import { Configuration } from "./configuration"; +import { RenpyAdapterDescriptorFactory, RenpyConfigurationProvider } from "./debugger"; +import { RenpyTaskProvider } from "./task-provider"; -const selector: DocumentSelector = { scheme: "file", language: "renpy" }; -let myStatusBarItem: StatusBarItem; +let extensionMode: ExtensionMode = null!; -export async function activate(context: ExtensionContext): Promise { - console.log("Ren'Py extension activated"); - - const filepath = getNavigationJsonFilepath(); - const jsonFileExists = fs.existsSync(filepath); - if (!jsonFileExists) { - console.log("Navigation.json file is missing."); - } +export function isShippingBuild(): boolean { + return extensionMode !== ExtensionMode.Development; +} - // hide rpyc files if the setting is enabled - const config = workspace.getConfiguration("renpy"); - if (config) { - updateShowCompiledFilesConfig(config.excludeCompiledFilesFromWorkspace); - } +export async function activate(context: ExtensionContext): Promise { + extensionMode = context.extensionMode; + initializeLoggingSystems(context); + updateStatusBar("$(sync~spin) Loading Ren'Py extension..."); - // Listen to configuration changes - context.subscriptions.push( - workspace.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration("renpy.excludeCompiledFilesFromWorkspace")) { - const newValue: boolean = workspace.getConfiguration("renpy").get("excludeCompiledFilesFromWorkspace") ?? true; - updateShowCompiledFilesConfig(newValue); - } - }) - ); + Configuration.initialize(context); - // hover provider for code tooltip - const hoverProvider = languages.registerHoverProvider( - selector, - new (class implements HoverProvider { - async provideHover(document: TextDocument, position: Position, token: CancellationToken): Promise { - return getHover(document, position); - } - })() - ); + // Subscribe to supported language features context.subscriptions.push(hoverProvider); - - // provider for Go To Definition - const definitionProvider = languages.registerDefinitionProvider( - selector, - new (class implements DefinitionProvider { - provideDefinition(document: TextDocument, position: Position, token: CancellationToken): ProviderResult { - return getDefinition(document, position); - } - })() - ); context.subscriptions.push(definitionProvider); - - // provider for Outline view - const symbolProvider = languages.registerDocumentSymbolProvider( - selector, - new (class implements DocumentSymbolProvider { - provideDocumentSymbols(document: TextDocument, token: CancellationToken): ProviderResult { - return getDocumentSymbols(document); - } - })() - ); context.subscriptions.push(symbolProvider); - - // provider for Method Signature Help - const signatureProvider = languages.registerSignatureHelpProvider( - selector, - new (class implements SignatureHelpProvider { - provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken, context: SignatureHelpContext): ProviderResult { - return getSignatureHelp(document, position, context); - } - })(), - "(", - ",", - "=" - ); context.subscriptions.push(signatureProvider); - - // Completion provider - const completionProvider = languages.registerCompletionItemProvider( - selector, - new (class implements CompletionItemProvider { - provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: CompletionContext): ProviderResult { - return getCompletionList(document, position, context); - } - })(), - ".", - " ", - "@", - "-", - "(" - ); context.subscriptions.push(completionProvider); - - // Color Provider - const colorProvider = languages.registerColorProvider("renpy", new RenpyColorProvider()); context.subscriptions.push(colorProvider); + context.subscriptions.push(referencesProvider); + context.subscriptions.push(semanticTokensProvider); - // Find All References provider - const references = languages.registerReferenceProvider( - selector, - new (class implements ReferenceProvider { - async provideReferences(document: TextDocument, position: Position, context: ReferenceContext, token: CancellationToken): Promise { - return await findAllReferences(document, position, context); - } - })() - ); - context.subscriptions.push(references); - - const tokenTypes = ["class", "parameter", "variable", "keyword"]; - const tokenModifiers = ["declaration", "defaultLibrary"]; - const legend = new SemanticTokensLegend(tokenTypes, tokenModifiers); - - // Semantic Token Provider - const semanticTokens = languages.registerDocumentSemanticTokensProvider( - selector, - new (class implements DocumentSemanticTokensProvider { - provideDocumentSemanticTokens(document: TextDocument, token: CancellationToken): ProviderResult { - if (document.languageId !== "renpy") { - return; - } else { - return getSemanticTokens(document, legend); - } - } - })(), - legend - ); - context.subscriptions.push(semanticTokens); + // diagnostics (errors and warnings) + const diagnostics = languages.createDiagnosticCollection("renpy"); + context.subscriptions.push(diagnostics); + subscribeToDocumentChanges(context, diagnostics); // A TextDocument was saved context.subscriptions.push( @@ -187,14 +58,12 @@ export async function activate(context: ExtensionContext): Promise { return; } - const filesConfig = workspace.getConfiguration("files"); - if (filesConfig.get("autoSave") === undefined || filesConfig.get("autoSave") !== "off") { + if (Configuration.isAutoSaveDisabled()) { // only trigger document refreshes if file autoSave is off return; } - const config = workspace.getConfiguration("renpy"); - if (config && config.compileOnDocumentSave) { + if (Configuration.compileOnDocumentSave()) { if (!NavigationData.isCompiling) { ExecuteRenpyCompile(); } @@ -202,11 +71,16 @@ export async function activate(context: ExtensionContext): Promise { if (!NavigationData.isImporting) { updateStatusBar("$(sync~spin) Initializing Ren'Py static data..."); - const uri = Uri.file(document.fileName); - const filename = stripWorkspaceFromFile(uri.path); - NavigationData.clearScannedDataForFile(filename); - NavigationData.scanDocumentForClasses(filename, document); - updateStatusBar(getStatusBarText()); + try { + const uri = Uri.file(document.fileName); + const filename = stripWorkspaceFromFile(uri.path); + NavigationData.clearScannedDataForFile(filename); + NavigationData.scanDocumentForClasses(filename, document); + updateStatusBar(getStatusBarText()); + } catch (error) { + updateStatusBar("Failed to load Ren'Py static data..."); + logMessage(LogLevel.Error, error as string); + } } }) ); @@ -220,7 +94,7 @@ export async function activate(context: ExtensionContext): Promise { try { await NavigationData.refresh(true); } catch (error) { - console.log(error); + logMessage(LogLevel.Error, error as string); } finally { updateStatusBar(getStatusBarText()); } @@ -234,103 +108,200 @@ export async function activate(context: ExtensionContext): Promise { try { window.showTextDocument(uri, { selection: range }); } catch (error) { - window.showWarningMessage(`Could not jump to the location (error: ${error})`); + logToast(LogLevel.Warning, `Could not jump to the location (error: ${error})`); } }); context.subscriptions.push(gotoFileLocationCommand); + const migrateOldFilesCommand = commands.registerCommand("renpy.migrateOldFiles", async () => { + if (workspace !== null) { + const altURIs = await workspace.findFiles("**/*.rpyc", null, 50); + altURIs.forEach(async (uri) => { + const sourceFile = Uri.parse(uri.toString().replace(".rpyc", ".rpy")); + try { + await workspace.fs.stat(sourceFile); + } catch (error) { + const endOfPath = uri.toString().replace("game", "old-game").lastIndexOf("/"); + const properLocation = Uri.parse(uri.toString().replace("game", "old-game")); + const oldDataDirectory = Uri.parse(properLocation.toString().substring(0, endOfPath)); + workspace.fs.createDirectory(oldDataDirectory); + workspace.fs + .readFile(uri) + .then((data) => workspace.fs.writeFile(properLocation, data)) + .then(() => workspace.fs.delete(uri)); + } + }); + } + }); + context.subscriptions.push(migrateOldFilesCommand); + + // custom command - refresh diagnostics + const refreshDiagnosticsCommand = commands.registerCommand("renpy.refreshDiagnostics", () => { + if (window.activeTextEditor) { + refreshDiagnostics(window.activeTextEditor.document, diagnostics); + } + }); + context.subscriptions.push(refreshDiagnosticsCommand); + // custom command - toggle token debug view let isShowingTokenDebugView = false; - const toggleTokenDebugViewCommand = commands.registerCommand("renpy.toggleTokenDebugView", () => { + const toggleTokenDebugViewCommand = commands.registerCommand("renpy.toggleTokenDebugView", async () => { if (!isShowingTokenDebugView) { - clearTokenCache(); - registerDebugDecorator(context); + logToast(LogLevel.Info, "Enabled token debug view"); + Tokenizer.clearTokenCache(); + await registerDebugDecorator(context); } else { + logToast(LogLevel.Info, "Disabled token debug view"); unregisterDebugDecorator(); } isShowingTokenDebugView = !isShowingTokenDebugView; }); context.subscriptions.push(toggleTokenDebugViewCommand); + // custom command - call renpy to run workspace + const runCommand = commands.registerCommand("renpy.runCommand", () => { + //EsLint recommends config be removed as it has already been declared in a previous scope + const rpyPath = Configuration.getRenpyExecutablePath(); + + if (!isValidExecutable(rpyPath)) { + logToast(LogLevel.Error, "Ren'Py executable location not configured or is invalid."); + return; + } + + debug.startDebugging( + undefined, + { + type: "renpy", + name: "Run Project", + request: "launch", + program: rpyPath, + }, + { noDebug: true } + ); + + //call renpy + const result = RunWorkspaceFolder(); + if (result) { + logToast(LogLevel.Info, "Ren'Py is running successfully"); + } + }); + context.subscriptions.push(runCommand); + // custom command - call renpy to compile const compileCommand = commands.registerCommand("renpy.compileNavigationData", () => { // check Settings has the path to Ren'Py executable // Call Ren'Py with the workspace folder and the json-dump argument const config = workspace.getConfiguration("renpy"); if (!config) { - window.showErrorMessage("Ren'Py executable location not configured or is invalid."); + logToast(LogLevel.Error, "Ren'Py executable location not configured or is invalid."); } else { if (isValidExecutable(config.renpyExecutableLocation)) { // call renpy const result = ExecuteRenpyCompile(); if (result) { - window.showInformationMessage("Ren'Py compilation has completed."); + logToast(LogLevel.Info, "Ren'Py compilation has completed."); } } else { - window.showErrorMessage("Ren'Py executable location not configured or is invalid."); + logToast(LogLevel.Error, "Ren'Py executable location not configured or is invalid."); } } }); context.subscriptions.push(compileCommand); - // Custom status bar - myStatusBarItem = window.createStatusBarItem(StatusBarAlignment.Right, 100); - context.subscriptions.push(myStatusBarItem); - myStatusBarItem.text = "$(sync~spin) Initializing Ren'Py static data..."; - myStatusBarItem.show(); + const filepath = getNavigationJsonFilepath(); + const jsonFileExists = fs.existsSync(filepath); + if (!jsonFileExists) { + logMessage(LogLevel.Warning, "Navigation.json file is missing."); + } // Detect file system change to the navigation.json file and trigger a refresh updateStatusBar("$(sync~spin) Initializing Ren'Py static data..."); - await NavigationData.init(context.extensionPath); - updateStatusBar(getStatusBarText()); + try { + await NavigationData.init(context.extensionPath); + updateStatusBar(getStatusBarText()); + } catch (error) { + updateStatusBar("Failed to load Ren'Py static data..."); + logMessage(LogLevel.Error, error as string); + } try { fs.watch(getNavigationJsonFilepath(), async (event, filename) => { - if (filename) { - console.log(`${filename} changed`); - updateStatusBar("$(sync~spin) Refreshing Ren'Py navigation data..."); - try { - await NavigationData.refresh(); - } catch (error) { - console.log(`${Date()}: error refreshing NavigationData: ${error}`); - } finally { - updateStatusBar(getStatusBarText()); - } + if (!filename) { + return; + } + + logMessage(LogLevel.Debug, `${filename} changed`); + updateStatusBar("$(sync~spin) Refreshing Ren'Py navigation data..."); + try { + await NavigationData.refresh(); + } catch (error) { + logMessage(LogLevel.Error, `${Date()}: error refreshing NavigationData: ${error}`); + } finally { + updateStatusBar(getStatusBarText()); } }); } catch (error) { - console.log(`Watch navigation.json file error: ${error}`); + logMessage(LogLevel.Error, `Watch navigation.json file error: ${error}`); } - if (config && config.watchFoldersForChanges) { - console.log("Starting Watcher for images folder."); + if (Configuration.shouldWatchFoldersForChanges()) { + logMessage(LogLevel.Info, "Starting Watcher for images folder."); try { fs.watch(getImagesFolder(), { recursive: true }, async (event, filename) => { if (filename && event === "rename") { - console.log(`${filename} created/deleted`); + logMessage(LogLevel.Debug, `${filename} created/deleted`); await NavigationData.scanForImages(); } }); } catch (error) { - console.log(`Watch image folder error: ${error}`); + logMessage(LogLevel.Error, `Watch image folder error: ${error}`); } - console.log("Starting Watcher for audio folder."); + logMessage(LogLevel.Info, "Starting Watcher for audio folder."); try { fs.watch(getAudioFolder(), { recursive: true }, async (event, filename) => { if (filename && event === "rename") { - console.log(`${filename} created/deleted`); + logMessage(LogLevel.Debug, `${filename} created/deleted`); await NavigationData.scanForAudio(); } }); } catch (error) { - console.log(`Watch audio folder error: ${error}`); + logMessage(LogLevel.Error, `Watch audio folder error: ${error}`); } } + + const factory = new RenpyAdapterDescriptorFactory(); + context.subscriptions.push(debug.registerDebugAdapterDescriptorFactory("renpy", factory)); + const provider = new RenpyConfigurationProvider(); + context.subscriptions.push(debug.registerDebugConfigurationProvider("renpy", provider)); + context.subscriptions.push( + debug.registerDebugConfigurationProvider( + "renpy", + { + provideDebugConfigurations(): ProviderResult { + return [ + { + type: "renpy", + request: "launch", + name: "Ren'Py: Launch", + command: "run", + args: [], + }, + ]; + }, + }, + DebugConfigurationProviderTriggerKind.Dynamic + ) + ); + + const taskProvider = new RenpyTaskProvider(); + context.subscriptions.push(tasks.registerTaskProvider("renpy", taskProvider)); + + logMessage(LogLevel.Info, "Ren'Py extension activated!"); } export function deactivate() { - console.log("Ren'Py extension deactivating"); + logMessage(LogLevel.Info, "Ren'Py extension deactivating"); fs.unwatchFile(getNavigationJsonFilepath()); } @@ -360,39 +331,55 @@ export function getKeywordPrefix(document: TextDocument, position: Position, ran return; } -function updateStatusBar(text: string) { - if (text === "") { - myStatusBarItem.hide(); - } else { - myStatusBarItem.text = text; - myStatusBarItem.show(); +export function isValidExecutable(renpyExecutableLocation: string): boolean { + if (!renpyExecutableLocation || renpyExecutableLocation === "") { + return false; } + return fs.existsSync(renpyExecutableLocation); } +// Attempts to run renpy executable through console commands. +function RunWorkspaceFolder(): boolean { + const rpyPath = Configuration.getRenpyExecutablePath(); -function updateShowCompiledFilesConfig(hide: boolean) { - const config = workspace.getConfiguration("files"); - const newConfig = { - ...config.inspect("exclude")?.workspaceValue, - "**/*.rpyc": hide, - "**/*.rpa": hide, - "**/*.rpymc": hide, - "**/cache/": hide, - }; - config.update("exclude", newConfig, ConfigurationTarget.Workspace); -} - -function isValidExecutable(renpyExecutableLocation: string): boolean { - if (!renpyExecutableLocation || renpyExecutableLocation === "") { + if (isValidExecutable(rpyPath)) { + const renpyPath = cleanUpPath(Uri.file(rpyPath).path); + const cwd = renpyPath.substring(0, renpyPath.lastIndexOf("/")); + const workFolder = getWorkspaceFolder(); + const args: string[] = [`${workFolder}`, "run"]; + if (workFolder.endsWith("/game")) { + try { + updateStatusBar("$(sync~spin) Running Ren'Py..."); + const result = cp.spawnSync(rpyPath, args, { + cwd: `${cwd}`, + env: { PATH: process.env.PATH }, + }); + if (result.error) { + logMessage(LogLevel.Error, `renpy spawn error: ${result.error}`); + return false; + } + if (result.stderr && result.stderr.length > 0) { + logMessage(LogLevel.Error, `renpy spawn stderr: ${result.stderr}`); + return false; + } + } catch (error) { + logMessage(LogLevel.Error, `renpy spawn error: ${error}`); + return false; + } finally { + updateStatusBar(getStatusBarText()); + } + return true; + } + return false; + } else { + logMessage(LogLevel.Warning, "config for renpy does not exist"); return false; } - return fs.existsSync(renpyExecutableLocation); } function ExecuteRenpyCompile(): boolean { - const config = workspace.getConfiguration("renpy"); - const renpy = config.renpyExecutableLocation; - if (isValidExecutable(renpy)) { - const renpyPath = cleanUpPath(Uri.file(renpy).path); + const rpyPath = Configuration.getRenpyExecutablePath(); + if (isValidExecutable(rpyPath)) { + const renpyPath = cleanUpPath(Uri.file(rpyPath).path); const cwd = renpyPath.substring(0, renpyPath.lastIndexOf("/")); let wf = getWorkspaceFolder(); @@ -405,17 +392,22 @@ function ExecuteRenpyCompile(): boolean { try { NavigationData.isCompiling = true; updateStatusBar("$(sync~spin) Compiling Ren'Py navigation data..."); - const result = cp.spawnSync(renpy, args, { cwd: `${cwd}`, env: { PATH: process.env.PATH }, encoding: "utf-8", windowsHide: true }); + const result = cp.spawnSync(rpyPath, args, { + cwd: `${cwd}`, + env: { PATH: process.env.PATH }, + encoding: "utf-8", + windowsHide: true, + }); if (result.error) { - console.log(`renpy spawn error: ${result.error}`); + logMessage(LogLevel.Error, `renpy spawn error: ${result.error}`); return false; } if (result.stderr && result.stderr.length > 0) { - console.log(`renpy spawn stderr: ${result.stderr}`); + logMessage(LogLevel.Error, `renpy spawn stderr: ${result.stderr}`); return false; } } catch (error) { - console.log(`renpy spawn error: ${error}`); + logMessage(LogLevel.Error, `renpy spawn error: ${error}`); return false; } finally { NavigationData.isCompiling = false; diff --git a/src/hover.ts b/src/hover.ts index 8d2d1b8c..e1937d02 100644 --- a/src/hover.ts +++ b/src/hover.ts @@ -1,14 +1,26 @@ // Hover Provider "use strict"; -import { Hover, MarkdownString, Position, Range, TextDocument, Uri } from "vscode"; +import { CancellationToken, Hover, MarkdownString, Position, ProviderResult, Range, TextDocument, Uri, languages } from "vscode"; import { getKeywordPrefix } from "./extension"; import { rangeAsString, Navigation, getPyDocsAtLine, formatDocumentationAsMarkdown } from "./navigation"; import { NavigationData } from "./navigation-data"; import { stripWorkspaceFromFile, extractFilename, getFileWithPath } from "./workspace"; import * as fs from "fs"; -export function getHover(document: TextDocument, position: Position): Hover | null | undefined { +export const hoverProvider = languages.registerHoverProvider("renpy", { + provideHover(document: TextDocument, position: Position, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getHoverContent(document, position)); + }); + }, +}); + +export function getHoverContent(document: TextDocument, position: Position): Hover | null | undefined { let range = document.getWordRangeAtPosition(position); if (!range) { return undefined; @@ -180,30 +192,32 @@ export function getDefinitionFromFile(filename: string, line: number): Navigatio try { const data = fs.readFileSync(filepath, "utf-8"); const lines = data.split("\n"); - if (line <= lines.length) { - let text = lines[line - 1].trim(); - if (text.endsWith(":")) { - text = text.slice(0, -1); - } else if (text.endsWith("(")) { - text = text + ")"; - } else if (text.endsWith("[")) { - text = text + "]"; - } else if (text.endsWith("{")) { - text = text + "}"; - } + if (line >= lines.length) { + return undefined; + } - let docs = ""; - docs = getPyDocsAtLine(lines, line - 1); + let text = lines[line - 1].trim(); + if (text.endsWith(":")) { + text = text.slice(0, -1); + } else if (text.endsWith("(")) { + text = text + ")"; + } else if (text.endsWith("[")) { + text = text + "]"; + } else if (text.endsWith("{")) { + text = text + "}"; + } - let args = ""; - if (text.indexOf("(") > 0) { - args = text.substring(text.indexOf("(")); - args = args.replace("(self, ", "("); - args = args.replace("(self)", "()"); - } + let docs = ""; + docs = getPyDocsAtLine(lines, line - 1); - return new Navigation("workspace", text, filename, line, docs, args, "", 0); + let args = ""; + if (text.indexOf("(") > 0) { + args = text.substring(text.indexOf("(")); + args = args.replace("(self, ", "("); + args = args.replace("(self)", "()"); } + + return new Navigation("workspace", text, filename, line, docs, args, "", 0); } catch (error) { return undefined; } diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 00000000..5c9ada3b --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,117 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { ExtensionContext, StatusBarAlignment, window, LogLevel } from "vscode"; +import { isShippingBuild } from "./extension"; + +const outputChannel = window.createOutputChannel("Ren'Py Language Extension", { log: true }); +const statusBar = window.createStatusBarItem(StatusBarAlignment.Right, 100); + +export function initializeLoggingSystems(context: ExtensionContext) { + context.subscriptions.push(outputChannel); + + outputChannel.clear(); + + statusBar.name = "Ren'Py Language Extension Status"; + statusBar.tooltip = "Ren'Py Language Extension Status"; + context.subscriptions.push(statusBar); +} + +export function updateStatusBar(text: string) { + if (text === "") { + statusBar.hide(); + return; + } + + logCatMessage(LogLevel.Info, LogCategory.Status, text); + statusBar.text = text; + statusBar.show(); +} + +// eslint-disable-next-line no-shadow +export const enum LogCategory { + Default, + Status, + Parser, + Tokenizer, +} + +function getLogCategoryPrefix(category: LogCategory): string { + switch (category) { + case LogCategory.Default: + return "[Default]"; + case LogCategory.Status: + return "[Status]"; + case LogCategory.Parser: + return "[Parser]"; + case LogCategory.Tokenizer: + return "[Tokenizer]"; + } +} + +export function logMessage(level: LogLevel, message: string): void { + logCatMessage(level, LogCategory.Default, message); +} + +export function logCatMessage(level: LogLevel, category: LogCategory, message: string): void { + const outputMsg = `${getLogCategoryPrefix(category)} > ${message}`; + + switch (level) { + case LogLevel.Trace: + outputChannel.trace(outputMsg); + break; + case LogLevel.Debug: + outputChannel.debug(outputMsg); + break; + case LogLevel.Info: + outputChannel.info(outputMsg); + break; + case LogLevel.Warning: + outputChannel.warn(outputMsg); + break; + case LogLevel.Error: + outputChannel.error(outputMsg); + break; + } + + debugLog(level, outputMsg); +} + +function debugLog(level: LogLevel, message: string) { + if (isShippingBuild()) { + return; + } + + switch (level) { + case LogLevel.Trace: + console.trace(message); + break; + case LogLevel.Debug: + console.debug(message); + break; + case LogLevel.Info: + console.info(message); + break; + case LogLevel.Warning: + console.warn(message); + break; + case LogLevel.Error: + console.error(message); + break; + } +} + +export function logToast(level: LogLevel, message: string): void { + logMessage(level, message); + + switch (level) { + case LogLevel.Debug: + case LogLevel.Info: + window.showInformationMessage(message); + break; + case LogLevel.Warning: + window.showWarningMessage(message); + break; + case LogLevel.Error: + window.showErrorMessage(message); + break; + } +} diff --git a/src/navigation-data.ts b/src/navigation-data.ts index 1355606d..b22525ae 100644 --- a/src/navigation-data.ts +++ b/src/navigation-data.ts @@ -1,6 +1,5 @@ -"use strict"; - -import { commands, CompletionItem, CompletionItemKind, Position, TextDocument, window, workspace } from "vscode"; +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { commands, CompletionItem, CompletionItemKind, CompletionItemTag, LogLevel, MarkdownString, Position, SnippetString, TextDocument, window, workspace } from "vscode"; import { getDefinitionFromFile } from "./hover"; import { DataType, getBaseTypeFromDefine, getNamedParameter, getPyDocsFromTextDocumentAtLine, Navigation, splitParameters, stripQuotes } from "./navigation"; import { cleanUpPath, extractFilenameWithoutExtension, getFileWithPath, getNavigationJsonFilepath, stripWorkspaceFromFile } from "./workspace"; @@ -9,11 +8,23 @@ import { Displayable } from "./displayable"; import { Character } from "./character"; import data from "./renpy.json"; import kwData from "./renpyauto.json"; +import { logMessage, logToast } from "./logger"; + const filterCharacter = "\u2588"; +interface RenpyItem { + [key: string]: string | string[]; +} + +interface RenpyFunctions { + config: RenpyItem; + internal: RenpyItem; + renpy: RenpyItem; +} + export class NavigationData { static data: any = {}; - static renpyFunctions: any; + static renpyFunctions: RenpyFunctions; static autoCompleteKeywords: any; static renpyAutoComplete: CompletionItem[]; static configAutoComplete: CompletionItem[]; @@ -25,32 +36,88 @@ export class NavigationData { static isImporting = false; static isCompiling = false; + static makeCompletionItem(name: string, item: string[]): CompletionItem { + const storage = item[0]; + const kind = item[1]; + const args = item[2]; + //const parentClass = item[3]; + const accessKind = item[4]; + const doc = item[5]; + + const completionItem = new CompletionItem(name, undefined); + completionItem.documentation = new MarkdownString(doc); + + if (accessKind === "var") { + completionItem.kind = CompletionItemKind.Field; + } else if (kind === "class" || accessKind === "class") { + completionItem.kind = CompletionItemKind.Class; + } else if (accessKind === "exception") { + completionItem.kind = CompletionItemKind.Issue; + } else if (storage === "basefile") { + completionItem.kind = CompletionItemKind.Field; + } else if (accessKind === "attribute") { + completionItem.kind = CompletionItemKind.Property; + } else if (storage === "audio") { + completionItem.kind = CompletionItemKind.Method; + } else if (accessKind === "ui") { + completionItem.kind = CompletionItemKind.Event; + } else if (kind === "image") { + completionItem.kind = CompletionItemKind.Constant; + } else if (kind === "function" || accessKind === "function") { + completionItem.kind = CompletionItemKind.Function; + } else if (accessKind === "method") { + completionItem.kind = CompletionItemKind.Method; + } else { + console.error("Unhandled kind: " + kind); + } + + // Automatically add parenthesis and trigger hints for functions and methods + if (completionItem.kind === CompletionItemKind.Method || completionItem.kind === CompletionItemKind.Function) { + completionItem.insertText = new SnippetString(`${name}($1)`); + completionItem.command = { command: "editor.action.triggerParameterHints", title: "Parameter Hints" }; + completionItem.detail = `def ${name}(${args})`; + } + + if (storage === "obsolete") { + completionItem.tags = [CompletionItemTag.Deprecated]; + } + return completionItem; + } + static async init(extensionPath: string) { - console.log(`NavigationData init`); + logMessage(LogLevel.Info, `NavigationData init`); - NavigationData.renpyFunctions = data; + NavigationData.renpyFunctions = data as RenpyFunctions; NavigationData.autoCompleteKeywords = kwData; NavigationData.renpyAutoComplete = []; - for (const key in NavigationData.renpyFunctions.renpy) { - if (key.charAt(0) === key.charAt(0).toUpperCase()) { - NavigationData.renpyAutoComplete.push(new CompletionItem(key.substring(6), CompletionItemKind.Class)); - } else { - NavigationData.renpyAutoComplete.push(new CompletionItem(key.substring(6), CompletionItemKind.Method)); + + // for key and value in NavigationData.renpyFunctions.renpy (which is an object) + for (const [key, value] of Object.entries(NavigationData.renpyFunctions.renpy)) { + if (typeof value === "string") { + continue; } + NavigationData.renpyAutoComplete.push(NavigationData.makeCompletionItem(key.substring(6), value)); } NavigationData.configAutoComplete = []; - for (const key in NavigationData.renpyFunctions.config) { - NavigationData.configAutoComplete.push(new CompletionItem(key.substring(7), CompletionItemKind.Property)); + for (const [key, value] of Object.entries(NavigationData.renpyFunctions.config)) { + if (typeof value === "string") { + continue; + } + NavigationData.configAutoComplete.push(NavigationData.makeCompletionItem(key.substring(7), value)); } NavigationData.guiAutoComplete = []; NavigationData.internalAutoComplete = []; - for (const key in NavigationData.renpyFunctions.internal) { - NavigationData.internalAutoComplete.push(new CompletionItem(key, CompletionItemKind.Class)); + for (const [key, value] of Object.entries(NavigationData.renpyFunctions.internal)) { + if (typeof value === "string") { + continue; + } + + NavigationData.internalAutoComplete.push(NavigationData.makeCompletionItem(key, value)); if (key.startsWith("gui.")) { - NavigationData.guiAutoComplete.push(new CompletionItem(key.substring(4), CompletionItemKind.Variable)); + NavigationData.guiAutoComplete.push(NavigationData.makeCompletionItem(key.substring(4), value)); } } @@ -58,13 +125,13 @@ export class NavigationData { } static async refresh(interactive = false): Promise { - console.log(`${Date()}: NavigationData refresh`); + logMessage(LogLevel.Info, `${Date()}: NavigationData refresh`); NavigationData.isImporting = true; try { NavigationData.data = readNavigationJson(); if (NavigationData.data.error) { - window.showWarningMessage("Navigation data is empty. Ren'Py could not compile your project. Please check your project can start successfully."); + logToast(LogLevel.Warning, "Navigation data is empty. Ren'Py could not compile your project. Please check your project can start successfully."); } if (NavigationData.data.location === undefined) { NavigationData.data.location = {}; @@ -99,14 +166,14 @@ export class NavigationData { await NavigationData.scanForFonts(); await NavigationData.scanForAudio(); commands.executeCommand("renpy.refreshDiagnostics"); - console.log(`NavigationData for ${NavigationData.data.name} v${NavigationData.data.version} loaded`); + logMessage(LogLevel.Info, `NavigationData for ${NavigationData.data.name} v${NavigationData.data.version} loaded`); if (interactive) { - window.showInformationMessage(`NavigationData for ${NavigationData.data.name} v${NavigationData.data.version} loaded`); + logToast(LogLevel.Info, `NavigationData for ${NavigationData.data.name} v${NavigationData.data.version} loaded`); } } catch (error) { - console.log(`Error loading NavigationData.json: ${error}`); + logMessage(LogLevel.Error, `Error loading NavigationData.json: ${error}`); if (interactive) { - window.showErrorMessage(`NavigationData.json not loaded. Please check Ren'Py can start your project successfully.`); + logToast(LogLevel.Error, `NavigationData.json not loaded. Please check Ren'Py can start your project successfully.`); } } finally { NavigationData.isImporting = false; @@ -201,6 +268,8 @@ export class NavigationData { if (locations && locations.length > 0) { return locations; } + + return undefined; } static getNavigationDumpEntry(keyword: string): Navigation | undefined { @@ -208,6 +277,7 @@ export class NavigationData { if (data) { return data[0]; } + return undefined; } static getNavigationDumpEntries(keyword: string): Navigation[] | undefined { @@ -416,6 +486,7 @@ export class NavigationData { } } } + return; } static getClassData(location: Navigation): Navigation { @@ -593,7 +664,7 @@ export class NavigationData { 0, //location array[5], //documentation array[2], //args - array[4] //type + array[4], //type ); } @@ -913,7 +984,7 @@ export class NavigationData { } static async getCharacterImageAttributes() { - //console.log("getCharacterImageAttributes"); + //logMessage(LogLevel.Info, "getCharacterImageAttributes"); const characters = NavigationData.gameObjects["characters"]; const displayables = NavigationData.data.location["displayable"]; for (const key in characters) { @@ -1034,7 +1105,7 @@ export class NavigationData { export function readNavigationJson() { try { const filepath = getNavigationJsonFilepath(); - console.log(`readNavigationJson: ${filepath}`); + logMessage(LogLevel.Info, `readNavigationJson: ${filepath}`); let flatData; try { flatData = fs.readFileSync(filepath, "utf-8"); @@ -1044,7 +1115,7 @@ export function readNavigationJson() { const json = JSON.parse(flatData); return json; } catch (error) { - window.showErrorMessage(`readNavigationJson error: ${error}`); + logToast(LogLevel.Error, `readNavigationJson error: ${error}`); } } diff --git a/src/outline.ts b/src/outline.ts index e87eca37..baefbd08 100644 --- a/src/outline.ts +++ b/src/outline.ts @@ -1,11 +1,21 @@ // Document Symbol (Outline) Provider -"use strict"; - -import { TextDocument, DocumentSymbol, Uri, Range, SymbolKind } from "vscode"; +import { TextDocument, DocumentSymbol, Uri, Range, SymbolKind, languages, CancellationToken, ProviderResult } from "vscode"; import { Navigation } from "./navigation"; import { NavigationData } from "./navigation-data"; import { stripWorkspaceFromFile } from "./workspace"; +export const symbolProvider = languages.registerDocumentSymbolProvider("renpy", { + provideDocumentSymbols(document: TextDocument, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return; + } + + return new Promise((resolve) => { + resolve(getDocumentSymbols(document)); + }); + }, +}); + /** * Gets an array of Document Symbols for the given TextDocument used to populate the editor's Outline view * @param document - The current TextDocument diff --git a/src/references.ts b/src/references.ts index 7270ba3e..84d65343 100644 --- a/src/references.ts +++ b/src/references.ts @@ -1,10 +1,18 @@ -// References Provider -"use strict"; - -import { TextDocument, Position, ReferenceContext, Location, workspace } from "vscode"; +// Find all References Provider +import { TextDocument, Position, ReferenceContext, Location, workspace, languages, CancellationToken } from "vscode"; import { getKeywordPrefix } from "./extension"; import { NavigationData } from "./navigation-data"; +export const referencesProvider = languages.registerReferenceProvider("renpy", { + async provideReferences(document: TextDocument, position: Position, context: ReferenceContext, token: CancellationToken) { + if (token.isCancellationRequested) { + return; + } + + return await findAllReferences(document, position, context); + }, +}); + /** * Returns an array of Locations that describe all matches for the keyword at the current position * @param document - The current text document @@ -16,7 +24,7 @@ export async function findAllReferences(document: TextDocument, position: Positi const range = document.getWordRangeAtPosition(position); let keyword = document.getText(range); if (!keyword) { - return; + return undefined; } if (range) { @@ -30,8 +38,8 @@ export async function findAllReferences(document: TextDocument, position: Positi const files = await workspace.findFiles("**/*.rpy"); if (files && files.length > 0) { for (const file of files) { - document = await workspace.openTextDocument(file); - const locations = findReferenceMatches(keyword, document); + const textDocument = await workspace.openTextDocument(file); + const locations = findReferenceMatches(keyword, textDocument); if (locations) { for (const l of locations) { references.push(l); diff --git a/src/renpy.json b/src/renpy.json index b7ea4496..9a678ecf 100644 --- a/src/renpy.json +++ b/src/renpy.json @@ -1 +1,8831 @@ -{"renpy": {"renpy.count_seen_dialogue_blocks": ["internal", "function", "()", "", "", "Returns the number of dialogue blocks the user has seen in any play-through of the current game."], "renpy.timeout": ["internal", "function", "(seconds)", "", "", "Causes an event to be generated before `seconds` seconds have elapsed. This ensures that the event method of a user-defined displayable will be called."], "renpy.context": ["internal", "function", "()", "", "", "Returns an object that is unique to the current context. The object is copied when entering a new context, but changes to the copy do not change the original.\n\nThe object is saved and participates in rollback."], "renpy.sound.get_pos": ["internal", "function", "(channel=\"sound\")", "", "", "Returns the current position of the audio or video file on `channel`, in seconds. Returns None if no audio is playing on `channel`.\n\nAs this may return None before a channel starts playing, or if the audio channel involved has been muted, callers of this function should always handle a None value."], "renpy.clear_keymap_cache": ["internal", "function", "()", "", "", "Clears the keymap cache. This allows changes to :var:`config.keymap` to take effect without restarting Ren'Py."], "renpy.error": ["internal", "function", "(msg)", "", "", "Reports `msg`, a string, as as error for the user. This is logged as a parse or lint error when approprate, and otherwise it is raised as an exception."], "renpy.fnmatch": ["internal", "function", "()", "", "", "Filename matching with shell patterns.\n\nfnmatch(FILENAME, PATTERN) matches according to the local convention. fnmatchcase(FILENAME, PATTERN) always takes case in account.\n\nThe functions operate by translating the pattern into a regular expression. They cache the compiled regular expressions for speed.\n\nThe function translate(PATTERN) returns a regular expression corresponding to PATTERN. (It does not compile it.)"], "renpy.get_physical_size": ["internal", "function", "()", "", "", "Returns the size of the physical window."], "renpy.ios": ["other", "renpy.ios", "", "", "var", "Has a true value when running on iOS."], "renpy.language_tailor": ["other", "renpy.language_tailor", "(chars, cls)", "", "function", "This can be used to override the line breaking class of a character. For example, the linebreaking class of a character can be set to ID to treat it as an ideograph, which allows breaks before and after that character.\n\n`chars` A string containing each of the characters to tailor.\n\n`cls` A string giving a character class. This should be one of the classes defined in Table 1 of `UAX #14: Unicode Line Breaking Algorithm `_."], "renpy.music.queue": ["internal", "function", "(filenames, channel=\"music\", loop=None, clear_queue=True, fadein=0, tight=None, relative_volume=1.0)", "", "", "This queues the given filenames on the specified channel.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`clear_queue` If True, then the queue is cleared, making these files the files that are played when the currently playing file finishes. If it is False, then these files are placed at the back of the queue. In either case, if no music is playing these files begin playing immediately.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.shown_window": ["internal", "function", "()", "", "", "Call this to indicate that the window has been shown. This interacts with the \\window show\\ statement, which shows an empty window whenever this functions has not been called during an interaction."], "renpy.with_statement": ["internal", "function", "(trans, always=False)", "", "", "Causes a transition to occur. This is the Python equivalent of the with statement.\n\n`trans` The transition.\n\n`always` If True, the transition will always occur, even if the user has disabled transitions.\n\nThis function returns true if the user chose to interrupt the transition, and false otherwise."], "renpy.get_placement": ["internal", "function", "(d)", "", "", "This gets the placement of displayable d. There's very little warranty on this information, as it might change when the displayable is rendered, and might not exist until the displayable is first rendered.\n\nThis returns an object with the following fields, each corresponding to a style property:\n\n* pos * xpos * ypos * anchor * xanchor * yanchor * offset * xoffset * yoffset * subpixel"], "renpy.try_compile": ["internal", "function", "(where, expr, additional=None)", "", "", "Tries to compile an expression, and writes an error to lint.txt if it fails.\n\n`where` A string giving the location the expression is found. Used to generate an error message of the form \\Could not evaluate `expr` in `where`.\\\n\n`expr` The expression to try compiling.\n\n`additional` If given, an additional line of information that is addded to the error message."], "renpy.Render.add_uniform": ["cdd", "add_uniform", "(name, value)", "renpy.Render", "method", "Causes the uniform `name` to have `value` when this Render or its children are drawn."], "renpy.show_screen": ["internal", "function", "(_screen_name, *_args, **kwargs)", "", "", "The programmatic equivalent of the show screen statement.\n\nShows the named screen. This takes the following keyword arguments:\n\n`_screen_name` The name of the screen to show. `_layer` The layer to show the screen on. `_zorder` The zorder to show the screen on. If not specified, defaults to the zorder associated with the screen. It that's not specified, it is 0 by default. `_tag` The tag to show the screen with. If not specified, defaults to the tag associated with the screen. It that's not specified, defaults to the name of the screen. `_widget_properties` A map from the id of a widget to a property name -> property value map. When a widget with that id is shown by the screen, the specified properties are added to it. `_transient` If true, the screen will be automatically hidden at the end of the current interaction.\n\nNon-keyword arguments, and keyword arguments that do not begin with an underscore, are passed to the screen."], "renpy.threading": ["internal", "function", "()", "", "", "Thread module emulating a subset of Java's threading model."], "renpy.get_autoreload": ["internal", "function", "()", "", "", "Gets the autoreload flag."], "renpy.movie_cutscene": ["internal", "function", "(filename, delay=None, loops=0, stop_music=True)", "", "", "This displays a movie cutscene for the specified number of seconds. The user can click to interrupt the cutscene. Overlays and Underlays are disabled for the duration of the cutscene.\n\n`filename` The name of a file containing any movie playable by Ren'Py.\n\n`delay` The number of seconds to wait before ending the cutscene. Normally the length of the movie, in seconds. If None, then the delay is computed from the number of loops (that is, loops + 1) * the length of the movie. If -1, we wait until the user clicks.\n\n`loops` The number of extra loops to show, -1 to loop forever.\n\nReturns True if the movie was terminated by the user, or False if the given delay elapsed uninterrupted."], "renpy.force_autosave": ["internal", "function", "(take_screenshot=False, block=False)", "", "", "Forces a background autosave to occur.\n\n`take_screenshot` If True, a new screenshot will be taken. If False, the existing screenshot will be used.\n\n`block` If True, blocks until the autosave completes."], "renpy.register_statement": ["internal", "function", "(name, parse=None, lint=None, execute=None, predict=None, next=None, scry=None, block=False, init=False, translatable=False, execute_init=None, init_priority=0, label=None, warp=None, translation_strings=None, force_begin_rollback=False, post_execute=None, post_label=None, predict_all=True, predict_next=None)", "", "", "This registers a user-defined statement.\n\n`name` This is either a space-separated list of names that begin the statement, or the empty string to define a new default statement (the default statement will replace the say statement).\n\n`block` When this is False, the statement does not expect a block. When True, it expects a block, but leaves it up to the lexer to parse that block. If the string \\script\\, the block is interpreted as containing one or more Ren'Py script language statements. If the string \\possible\\, the block expect condition is determined by the parse function.\n\n`parse` This is a function that takes a Lexer object. This function should parse the statement, and return an object. This object is passed as an argument to all the other functions.\n\n`lint` This is called to check the statement. It is passed a single argument, the object returned from parse. It should call renpy.error to report errors.\n\n`execute` This is a function that is called when the statement executes. It is passed a single argument, the object returned from parse.\n\n`execute_init` This is a function that is called at init time, at priority 0.\n\n`predict` This is a function that is called to predict the images used by the statement. It is passed a single argument, the object returned from parse. It should return a list of displayables used by the statement.\n\n`next` This is a function that is called to determine the next statement.\n\nIf `block` is not \\script\\, this is passed a single argument, the object returned from the parse function. If `block` is \\script\\, an additional argument is passed, an object that names the first statement in the block.\n\nThe function should return either a string giving a label to jump to, the second argument to transfer control into the block, or None to continue to the statement after this one.\n\n`label` This is a function that is called to determine the label of this statement. If it returns a string, that string is used as the statement label, which can be called and jumped to like any other label.\n\n`warp` This is a function that is called to determine if this statement should execute during warping. If the function exists and returns true, it's run during warp, otherwise the statement is not run during warp.\n\n`scry` Used internally by Ren'Py.\n\n`init` True if this statement should be run at init-time. (If the statement is not already inside an init block, it's automatically placed inside an init block.) This calls the execute function, in addition to the execute_init function.\n\n`init_priority` An integer that determines the priority of initialization of the init block.\n\n`translation_strings` A function that is called with the parsed block. It's expected to return a list of strings, which are then reported as being available to be translated.\n\n`force_begin_rollback` This should be set to true on statements that are likely to cause the end of a fast skip, similar to ``menu`` or ``call screen``.\n\n`post_execute` A function that is executed as part the next statement after this one. (Adding a post_execute function changes the contents of the RPYC file, meaning a Force Compile is necessary.)\n\n`post_label` This is a function that is called to determine the label of this the post execute statement. If it returns a string, that string is used as the statement label, which can be called and jumped to like any other label. This can be used to create a unique return point.\n\n`predict_all` If True, then this predicts all sub-parses of this statement and the statement after this statement.\n\n`predict_next` This is called with a single argument, the label of the statement that would run after this statement.\n\nThis should be called to predict the statements that can run after this one. It's expected to return a list of of labels or SubParse objects. This is not called if `predict_all` is true."], "renpy.sound.register_channel": ["audio", "renpy.music.register_channel", "(name, mixer=None, loop=None, stop_on_mute=True, tight=False, file_prefix=\"\", file_suffix=\"\", buffer_queue=True, movie=False, framedrop=True)", "", "", "This registers a new audio channel named `name`. Audio can then be played on the channel by supplying the channel name to the play or queue statements.\n\n`mixer` The name of the mixer the channel uses. By default, Ren'Py knows about the \\music\\, \\sfx\\, and \\voice\\ mixers. Using other names is possible, but may require changing the preferences screens.\n\n`loop` If true, sounds on this channel loop by default.\n\n`stop_on_mute` If true, music on the channel is stopped when the channel is muted.\n\n`tight` If true, sounds will loop even when fadeout is occurring. This should be set to True for a sound effects or seamless music channel, and False if the music fades out on its own.\n\n`file_prefix` A prefix that is prepended to the filenames of the sound files being played on this channel.\n\n`file_suffix` A suffix that is appended to the filenames of the sound files being played on this channel.\n\n`buffer_queue` Should we buffer the first second or so of a queued file? This should be True for audio, and False for movie playback.\n\n`movie` If true, this channel will be set up to play back videos.\n\n`framedrop` This controls what a video does when lagging. If true, frames will be dropped to keep up with realtime and the soundtrack. If false, Ren'Py will display frames late rather than dropping them."], "renpy.save_persistent": ["internal", "function", "()", "", "", "Saves the persistent data to disk."], "renpy.list_saved_games": ["internal", "function", "(regexp=r'.', fast=False)", "", "", "Lists the save games. For each save game, returns a tuple containing:\n\n* The filename of the save. * The extra_info that was passed in. * A displayable that, when displayed, shows the screenshot that was used when saving the game. * The time the game was stayed at, in seconds since the UNIX epoch.\n\n`regexp` A regular expression that is matched against the start of the filename to filter the list.\n\n`fast` If fast is true, the filename is returned instead of the tuple."], "renpy.mark_label_unseen": ["internal", "function", "(label)", "", "", "Marks the named label as if it has not been executed on the current user's system yet."], "renpy.transition": ["internal", "function", "(trans, layer=None, always=False)", "", "", "Sets the transition that will be used during the next interaction.\n\n`layer` The layer the transition applies to. If None, the transition applies to the entire scene.\n\n`always` If false, this respects the transition preference. If true, the transition is always run."], "renpy.context_dynamic": ["internal", "function", "(*vars)", "", "", "This can be given one or more variable names as arguments. This makes the variables dynamically scoped to the current context. The variables will be reset to their original value when the call returns.\n\nAn example call is\n```\n$ renpy.context_dynamic(\\x\\, \\y\\, \\z\\)\n```"], "renpy.reset_physical_size": ["internal", "function", "()", "", "", "Attempts to set the size of the physical window to the specified values in renpy.config. (That is, screen_width and screen_height.) This has the side effect of taking the screen out of fullscreen mode."], "renpy.can_show": ["internal", "function", "(name, layer=None, tag=None)", "", "", "Determines if `name` can be used to show an image. This interprets `name` as a tag and attributes. This is combined with the attributes of the currently-showing image with `tag` on `layer` to try to determine a unique image to show. If a unique image can be show, returns the name of that image as a tuple. Otherwise, returns None.\n\n`tag` The image tag to get attributes from. If not given, defaults to the first component of `name`.\n\n`layer` The layer to check. If None, uses the default layer for `tag`."], "renpy.has_image": ["internal", "function", "(name, exact=False)", "", "", "Return true if an image with `name` exists, and false if no such image exists.\n\n`name` Either a string giving an image name, or a tuple of strings giving the name components.\n\n`exact` Returns true if and only if an image with the exact name exists - parameterized matches are not included."], "renpy.get_mode": ["internal", "function", "()", "", "", "Returns the current mode, or None if it is not defined."], "renpy.image_size": ["internal", "function", "(im)", "", "", "Given an image manipulator, loads it and returns a (``width``, ``height``) tuple giving its size.\n\nThis reads the image in from disk and decompresses it, without using the image cache. This can be slow."], "renpy.sound.get_duration": ["internal", "function", "(channel=\"sound\")", "", "", "Returns the duration of the audio or video file on `channel`. Returns 0.0 if no file is playing on `channel`."], "renpy.force_full_redraw": ["internal", "function", "()", "", "", "Forces the screen to be redrawn in full. Call this after using pygame to redraw the screen directly."], "renpy.try_eval": ["internal", "function", "(where, expr, additional=None)", "", "", "Tries to evaluate an expression, and writes an error to lint.txt if it fails.\n\n`where` A string giving the location the expression is found. Used to generate an error message of the form \\Could not evaluate `expr` in `where`.\\\n\n`expr` The expression to try evaluating.\n\n`additional` If given, an additional line of information that is addded to the error message."], "renpy.sound.set_volume": ["internal", "function", "(volume, delay=0, channel=\"sound\")", "", "", "Sets the volume of this channel, as a fraction of the volume of the mixer controlling the channel.\n\n`volume` This is a number between 0.0 and 1.0, and is interpreted as a fraction of the mixer volume for the channel.\n\n`delay` It takes delay seconds to change/fade the volume from the old to the new value. This value is persisted into saves, and participates in rollback.\n\n`channel` The channel to be set"], "renpy.version_string": ["other", "renpy.version_string", "", "", "var", "The version number of Ren'Py, as a string of the form \\Ren'Py 1.2.3.456\\."], "renpy.music.set_pan": ["internal", "function", "(pan, delay, channel=\"music\")", "", "", "Sets the pan of this channel.\n\n`pan` A number between -1 and 1 that control the placement of the audio. If this is -1, then all audio is sent to the left channel. If it's 0, then the two channels are equally balanced. If it's 1, then all audio is sent to the right ear.\n\n`delay` The amount of time it takes for the panning to occur.\n\n`channel` The channel the panning takes place on. This can be a sound or a music channel. Often, this is channel 7, the default music channel."], "renpy.load": ["internal", "function", "(filename)", "", "", "Loads the list of shaders from the file, and compiles all shaders for which the parts exist, and for which compilation can succeed."], "renpy.predict_show_display_say": ["internal", "function", "(who, what, who_args, what_args, window_args, image=False, two_window=False, side_image=None, screen=None, properties=None, **kwargs)", "", "", "This is the default function used by Character to predict images that will be used by show_display_say. It's called with more-or-less the same parameters as show_display_say, and it's expected to return a list of images used by show_display_say."], "renpy.MenuEntry": ["internal", "class", "()", "", "", "The object passed into the choice screen."], "renpy.get_skipping": ["internal", "function", "()", "", "", "Returns \\slow\\ if the Ren'Py is skipping, \\fast\\ if Ren'Py is fast skipping, and None if it is not skipping."], "renpy.seen_audio": ["internal", "function", "(filename)", "", "", "Returns True if the given filename has been played at least once on the current user's system."], "renpy.focus_coordinates": ["internal", "function", "()", "", "", "This attempts to find the coordinates of the currently-focused displayable. If it can, it will return them as a (x, y, w, h) tuple. If not, it will return a (None, None, None, None) tuple."], "renpy.list_images": ["internal", "function", "()", "", "", "Returns a list of images that have been added to Ren'Py, as a list of strings with spaces between the name components."], "renpy.Render.canvas": ["cdd", "canvas", "()", "renpy.Render", "method", "Returns a canvas object. A canvas object has methods corresponding to the `pygame.draw `_ functions, with the first parameter (the surface) omitted.\n\nCanvas objects also have a get_surface() method that returns the pygame Surface underlying the canvas."], "renpy.rename_save": ["internal", "function", "(old, new)", "", "", "Renames a save from `old` to `new`. (Does nothing if `old` does not exist.)"], "renpy.get_side_image": ["internal", "function", "(prefix_tag, image_tag=None, not_showing=None, layer=None)", "", "", "This attempts to find an image to show as the side image.\n\nIt begins by determining a set of image attributes. If `image_tag` is given, it gets the image attributes from the tag. Otherwise, it gets them from the currently showing character.\n\nIt then looks up an image with the tag `prefix_tag` and those attributes, and returns it if it exists.\n\nIf not_showing is True, this only returns a side image if the image the attributes are taken from is not on the screen. If Nome, the value is taken from :var:`config.side_image_only_not_showing`.\n\nIf `layer` is None, uses the default layer for the currently showing tag."], "renpy.predicting": ["internal", "function", "()", "", "", "Returns true if Ren'Py is currently predicting the screen."], "renpy.call": ["internal", "function", "(label, *args, **kwargs)", "", "", "Causes the current Ren'Py statement to terminate, and a jump to a `label` to occur. When the jump returns, control will be passed to the statement following the current statement.\n\n`from_current` If true, control will return to the current statement, rather than the statement following the current statement. (This will lead to the current statement being run twice. This must be passed as a keyword argument.)"], "renpy.get_registered_image": ["internal", "function", "(name)", "", "", "If an image with the same name has been registered with renpy.register_image, returns it. Otherwise, returns None."], "renpy.in_rollback": ["internal", "function", "()", "", "", "Returns true if the game has been rolled back."], "renpy.get_identifier_checkpoints": ["internal", "function", "(identifier)", "", "", "Given a rollback_identifier from a HistoryEntry object, returns the number of checkpoints that need to be passed to :func:`renpy.rollback` to reach that identifier. Returns None of the identifier is not in the rollback history."], "renpy.mark_image_unseen": ["internal", "function", "(name)", "", "", "Marks the named image as if it has not been displayed on the current user's system yet."], "renpy.has_label": ["internal", "function", "(name)", "", "", "Returns true if `name` is a valid label the program, or false otherwise.\n\n`name` Should be a string to check for the existence of a label. It can also be an opaque tuple giving the name of a non-label statement."], "renpy.slot_screenshot": ["internal", "function", "(slotname)", "", "", "Returns a display that can be used as the screenshot for `slotname`, or None if the slot is empty."], "renpy.get_filename_line": ["internal", "function", "()", "", "", "Returns a pair giving the filename and line number of the current statement."], "renpy.get_attributes": ["internal", "function", "(layer, tag, default=())", "", "", "Return a tuple giving the image attributes for the image `tag`. If the image tag has not had any attributes associated since the last time it was hidden, returns `if_hidden`.\n\n`layer` The layer to check. If None, uses the default layer for `tag`."], "renpy.get_mouse_name": ["internal", "function", "(interaction=False)", "", "", "Returns the name of the mouse that should be shown.\n\n `interaction` If true, get a mouse name that is based on the type of interaction occuring. (This is rarely useful.)"], "renpy.mark_audio_seen": ["internal", "function", "(filename)", "", "", "Marks the given filename as if it has been already played on the current user's system."], "renpy.license": ["other", "renpy.license", "", "", "var", "A string giving license text that should be included in a game's about screen."], "renpy.is_selected": ["internal", "function", "(action)", "", "", "Returns true if `action` indicates it is selected, or false otherwise."], "renpy.list_slots": ["internal", "function", "(regexp=None)", "", "", "Returns a list of non-empty save slots. If `regexp` exists, only slots that begin with `regexp` are returned. The slots are sorted in string-order."], "renpy.maximum_framerate": ["internal", "function", "(t)", "", "", "Forces Ren'Py to draw the screen at the maximum framerate for `t` seconds. If `t` is None, cancels the maximum framerate request."], "renpy.render": ["udd_utility", "renpy.render", "(d, width, height, st, at)", "", "function", "Causes a displayable to be rendered, and a renpy.Render object to be returned.\n\n`d` The displayable to render.\n\n`width`, `height` The width and height available for the displayable to render into.\n\n`st`, `at` The shown and animation timebases.\n\nRenders returned by this object may be cached, and should not be modified once they have been retrieved."], "renpy.map_event": ["internal", "function", "(ev, keysym)", "", "", "Returns true if the pygame event `ev` matches `keysym`\n\n`keysym` One of:\n\n* The name of a keybinding in :var:`config.keymap`. * A keysym, as documented in the :ref:`keymap` section. * A list containing one or more keysyms."], "renpy.start_predict_screen": ["internal", "function", "(_screen_name, *args, **kwargs)", "", "", "Causes Ren'Py to start predicting the screen named `_screen_name` with the given arguments. This replaces any previous prediction of `_screen_name`. To stop predicting a screen, call :func:`renpy.stop_predict_screen`."], "renpy.call_screen": ["internal", "function", "(_screen_name, *args, **kwargs)", "", "", "The programmatic equivalent of the call screen statement.\n\nThis shows `_screen_name` as a screen, then causes an interaction to occur. The screen is hidden at the end of the interaction, and the result of the interaction is returned.\n\nPositional arguments, and keyword arguments that do not begin with _ are passed to the screen.\n\nIf the keyword argument `_with_none` is false, \\with None\\ is not run at the end of end of the interaction.\n\nIf the keyword argument `_mode` in kwargs, it will be mode of this interaction, otherwise it will be \\screen\\ mode."], "renpy.has_screen": ["internal", "function", "(name)", "", "", "Returns true if a screen with the given name exists."], "renpy.Render.add_property": ["cdd", "add_property", "(name, value)", "renpy.Render", "method", "Causes the GL property `name` to have `value` when this Render or one of its children are drawn."], "renpy.eval_who": ["internal", "function", "(who, fast=None)", "", "", "Evaluates the `who` parameter to a say statement."], "renpy.set_tag_attributes": ["internal", "function", "(name, layer=None)", "", "", "This sets the attributes associated with an image tag when that image tag is not showing. The main use of this would be to directly set the attributes used by a side image.\n\nFor example::\n\n$ renpy.set_tag_attributes(\\lucy mad\\) $ renpy.say(l, \\I'm rather cross.\\)\n\nand::\n\nl mad \\I'm rather cross.\\\n\nare equivalent."], "renpy.mobile": ["other", "renpy.mobile", "", "", "var", "Has a true value when running on Android or iOS or in the browser."], "renpy.get_refresh_rate": ["internal", "function", "(precision=5)", "", "", "Returns the refresh rate of the current screen, as a floating-point number of frames per second.\n\n`precision` The raw data Ren'Py gets is number of frames per second, rounded down. This means that a monitor that runs at 59.95 frames per second will be reported at 59 fps. The precision argument reduces the precision of this reading, such that the only valid readings are multiples of the precision.\n\nSince all monitor framerates tend to be multiples of 5 (25, 30, 60, 75, and 120), this likely will improve accuracy. Setting precision to 1 disables this."], "renpy.flush_cache_file": ["internal", "function", "(fn)", "", "", "This flushes all image cache entries that refer to the file `fn`. This may be called when an image file changes on disk to force Ren'Py to use the new version."], "renpy.scry": ["internal", "function", "(self)", "", "", "Returns the scry object for the current statement.\n\nThe scry object tells Ren'Py about things that must be true in the future of the current statement. Right now, the scry object has one field:\n\n``nvl_clear`` Is true if an ``nvl clear`` statement will execute before the next interaction."], "renpy.Render.get_size": ["cdd", "get_size", "()", "renpy.Render", "method", "Returns a (width, height) tuple giving the size of this render."], "renpy.stop_predict": ["internal", "function", "(*args)", "", "", "This function takes one or more displayables as arguments. It causes Ren'Py to stop predicting those displayables during every interaction.\n\nWildcard patterns can be used as described in :func:`renpy.start_predict`."], "renpy.free_memory": ["internal", "function", "()", "", "", "Attempts to free some memory. Useful before running a renpygame-based minigame."], "renpy.restart_interaction": ["internal", "function", "()", "", "", "Restarts the current interaction. Among other things, this displays images added to the scene, re-evaluates screens, and starts any queued transitions.\n\nThis only does anything when called from within an interaction (for example, from an action). Outside an interaction, this function has no effect."], "renpy.log": ["internal", "function", "(msg)", "", "", "If :var:`config.log` is not set, this does nothing. Otherwise, it opens the logfile (if not already open), formats the message to :var:`config.log_width` columns, and prints it to the logfile."], "renpy.music.is_playing": ["internal", "function", "(channel=\"music\")", "", "", "Returns True if the channel is currently playing a sound, False if it is not, or if the sound system isn't working."], "renpy.get_return_stack": ["internal", "function", "()", "", "", "Returns a list giving the current return stack. The return stack is a list of statement names.\n\nThe statement names will be strings (for labels), or opaque tuples (for non-label statements)."], "renpy.set_autoreload": ["internal", "function", "(autoreload)", "", "", "Sets the autoreload flag, which determines if the game will be automatically reloaded after file changes. Autoreload will not be fully enabled until the game is reloaded with :func:`renpy.utter_restart`."], "renpy.context_nesting_level": ["internal", "function", "()", "", "", "Returns the nesting level of the current context. This is 0 for the outermost context (the context that is saved, loaded, and rolled-back), and is non-zero in other contexts, such as menu and replay contexts."], "renpy.quit": ["internal", "function", "(relaunch=False, status=0, save=False)", "", "", "This causes Ren'Py to exit entirely.\n\n`relaunch` If true, Ren'Py will run a second copy of itself before quitting.\n\n`status` The status code Ren'Py will return to the operating system. Generally, 0 is success, and positive integers are failure.\n\n`save` If true, the game is saved in :var:`_quit_slot` before Ren'Py terminates."], "renpy.register_style_preference": ["internal", "function", "(preference, alternative, style, property, value)", "", "", "Registers information about an alternative for a style preference.\n\n`preference` A string, the name of the style preference.\n\n`alternative` A string, the name of the alternative.\n\n`style` The style that will be updated. This may be a style object or a string giving the style name.\n\n`property` A string giving the name of the style property that will be update.\n\n`value` The value that will be assigned to the style property."], "renpy.unlink_save": ["internal", "function", "(filename)", "", "", "Deletes the save slot with the given name."], "renpy.movie_stop": ["internal", "function", "(clear=True, only_fullscreen=False)", "", "", "Stops the currently playing movie."], "renpy.set_mouse_pos": ["internal", "function", "(x, y, duration=0)", "", "", "Jump the mouse pointer to the location given by arguments x and y. If the device does not have a mouse pointer, this does nothing.\n\n`duration` The time it will take to perform the move, in seconds. During this time, the mouse may be unresponsive."], "renpy.image_exists": ["internal", "function", "(name, expression, tag, precise=True)", "", "", "Checks a scene or show statement for image existence."], "renpy.loadable": ["internal", "function", "(filename)", "", "", "Returns True if the given filename is loadable, meaning that it can be loaded from the disk or from inside an archive. Returns False if this is not the case."], "renpy.block_rollback": ["internal", "function", "()", "", "", "Prevents the game from rolling back to before the current statement."], "renpy.version_tuple": ["other", "renpy.version_tuple", "", "", "var", "The version number of Ren'Py, as a tuple of the form (1, 2, 3, 456)."], "renpy.scene": ["internal", "function", "(layer='master')", "", "", "Removes all displayables from `layer`. This is equivalent to the scene statement, when the scene statement is not given an image to show.\n\nA full scene statement is equivalent to a call to renpy.scene followed by a call to :func:`renpy.show`. For example::\n\nscene bg beach\n\nis equivalent to::\n\n$ renpy.scene() $ renpy.show(\\bg beach\\)"], "renpy.Displayable.visit": ["cdd", "visit", "(self)", "renpy.Displayable", "method", "If the displayable has child displayables, this method should be overridden to return a list of those displayables. This ensures that the per_interact methods of those displayables are called, and also allows images used by those displayables to be predicted."], "renpy.sound.play": ["internal", "function", "(filenames, channel=\"sound\", loop=None, fadeout=None, synchro_start=False, fadein=0, tight=None, if_changed=False, relative_volume=1.0)", "", "", "This stops the music currently playing on the numbered channel, dequeues any queued music, and begins playing the specified file or files.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fade_music.\n\n`synchro_start` Ren'Py will ensure that all channels of with synchro_start set to true will start playing at exactly the same time. Synchro_start should be true when playing two audio files that are meant to be synchronized with each other.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`if_changed` If this is True, and the music file is currently playing, then it will not be stopped/faded out and faded back in again, but instead will be kept playing. (This will always queue up an additional loop of the music.)\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.get_available_image_tags": ["internal", "function", "()", "", "", "Returns a list of image tags that have been defined."], "renpy.get_displayable_properties": ["internal", "function", "(id, screen=None, layer=None)", "", "", "Returns the properties for the displayable with `id` in the `screen` on `layer`. If `screen` is None, returns the properties for the current screen. This can be used from Python or property code inside a screen.\n\nNote that this returns a dictionary containing the widget properties, and so to get an individual property, the dictionary must be accessed."], "renpy.request_permission": ["internal", "function", "(permission)", "", "", "Asks Android to grant a permission to this application. The user may be prompted to grant the permission.\n\n`permission` A string giving the name of the permission, for example, \\android.permission.WRITE_EXTERNAL_STORAGE\\.\n\nReturns true if the permission has been granted, false if not or if called on a non-Android platform."], "renpy.fsencode": ["internal", "function", "(s)", "", "", "Converts s from unicode to the filesystem encoding."], "renpy.music.get_pos": ["internal", "function", "(channel=\"music\")", "", "", "Returns the current position of the audio or video file on `channel`, in seconds. Returns None if no audio is playing on `channel`.\n\nAs this may return None before a channel starts playing, or if the audio channel involved has been muted, callers of this function should always handle a None value."], "renpy.mark_image_seen": ["internal", "function", "(name)", "", "", "Marks the named image as if it has been already displayed on the current user's system."], "renpy.return_statement": ["internal", "function", "(value=None)", "", "", "Causes Ren'Py to return from the current Ren'Py-level call."], "renpy.android": ["other", "renpy.android", "", "", "var", "Has a true value when running on Android."], "renpy.call_stack_depth": ["internal", "function", "()", "", "", "Returns the depth of the call stack of the current context - the number of calls that have run without being returned from or popped from the call stack."], "renpy.rollback": ["internal", "function", "(force=False, checkpoints=1, defer=False, greedy=True, label=None, abnormal=True)", "", "", "Rolls the state of the game back to the last checkpoint.\n\n`force` If true, the rollback will occur in all circumstances. Otherwise, the rollback will only occur if rollback is enabled in the store, context, and config.\n\n`checkpoints` Ren'Py will roll back through this many calls to renpy.checkpoint. It will roll back as far as it can, subject to this condition.\n\n`defer` If true, the call will be deferred until control returns to the main context.\n\n`greedy` If true, rollback will finish just after the previous checkpoint. If false, rollback finish just before the current checkpoint.\n\n`label` If not None, a label that is called when rollback completes.\n\n`abnormal` If true, the default, script executed after the transition is run in an abnormal mode that skips transitions that would have otherwise occured. Abnormal mode ends when an interaction begins."], "renpy.version_only": ["other", "renpy.version_only", "", "", "var", "The version number of Ren'Py, without the Ren'Py prefix. A string of the form \\1.2.3.456\\."], "renpy.get_image_bounds": ["internal", "function", "(tag, width=None, height=None, layer=None)", "", "", "If an image with `tag` exists on `layer`, returns the bounding box of that image. Returns None if the image is not found.\n\nThe bounding box is an (x, y, width, height) tuple. The components of the tuples are expressed in pixels, and may be floating point numbers.\n\n`width`, `height` The width and height of the area that contains the image. If None, defaults the width and height of the screen, respectively.\n\n`layer` If None, uses the default layer for `tag`."], "renpy.sound": ["basefile", "", "", "", "", "Most renpy.sound functions have aliases in renpy.music. These functions are similar, except they default to the music channel rather than the sound channel, and default to looping."], "renpy.quit_event": ["internal", "function", "()", "", "", "Triggers a quit event, as if the player clicked the quit button in the window chrome."], "renpy.screenshot_to_bytes": ["internal", "function", "(size)", "", "", "Returns a screenshot as a bytes object, that can be passed to im.Data(). The bytes will be a png-format image, such that\n```\n$ data = renpy.screenshot_to_bytes((640, 360))\nshow expression im.Data(data, \\screenshot.png\\):\nalign (0, 0)\n\nWill show the image. The bytes objects returned can be stored in save\nfiles and persistent data. However, these may be large, and care should\nbe taken to not include too many.\n\n`size`\nThe size the screenshot will be resized to. If None, the screenshot\nwill be resized, and hence will be the size of the player's window,\nwithout any letterbars.\n\nThis function may be slow, and so it's intended for save-like screenshots,\nand not realtime effects.\n```"], "renpy.check_permission": ["internal", "function", "(permission)", "", "", "Checks to see if an Android permission has been granted to this application.\n\n`permission` A string giving the name of the permission, for example, \\android.permission.WRITE_EXTERNAL_STORAGE\\.\n\nReturns true if the permission has been granted, false if it has not or if called on a non-Android platform."], "renpy.showing": ["internal", "function", "(layer, name, exact=False)", "", "", "Returns true if an image with the same tag as `name` is showing on `layer`.\n\n`image` May be a string giving the image name or a tuple giving each component of the image name. It may also be a string giving only the image tag.\n\n`layer` The layer to check. If None, uses the default layer for `tag`."], "renpy.sound.set_pause": ["internal", "function", "(value, channel=\"sound\")", "", "", "Sets the pause flag for `channel` to `value`. If True, the channel will pause, otherwise it will play normally."], "renpy.macintosh": ["other", "renpy.macintosh", "", "", "var", "Has a true value when running on macOS."], "renpy.show_layer_at": ["internal", "function", "(at_list, layer='master', reset=True, camera=False)", "", "", "The Python equivalent of the ``show layer`` `layer` ``at`` `at_list` statement. If `camera` is True, the equivalent of the ``camera`` statement.\n\n`reset` If true, the transform state is reset to the start when it is shown. If false, the transform state is persisted, allowing the new transform to update that state."], "renpy.copy_images": ["internal", "function", "(old, new)", "", "", "Copies images beginning with one prefix to images beginning with another. For example\n```\nrenpy.copy_images(\\eileen\\, \\eileen2\\)\n\nwill create an image beginning with \\eileen2\\ for every image beginning\nwith \\eileen\\. If \\eileen happy\\ exists, \\eileen2 happy\\ will be\ncreated.\n\n`old`\nA space-separated string giving the components of the old image\nname.\n\n`new`\nA space-separated string giving the components of the new image\nname.\n\n```"], "renpy.dynamic": ["internal", "function", "(*vars, **kwargs)", "", "", "This can be given one or more variable names as arguments. This makes the variables dynamically scoped to the current call. The variables will be reset to their original value when the call returns.\n\nIf the variables are given as keyword arguments, the value of the argument is assigned to the variable name.\n\nExample calls are\n```\n$ renpy.dynamic(\\x\\, \\y\\, \\z\\)\n$ renpy.dynamic(players=2, score=0)\n```"], "renpy.get_adjustment": ["internal", "function", "(bar_value)", "", "", "Given `bar_value`, a :class:`BarValue`, returns the :func:`ui.adjustment` if uses. The adjustment has the following to attributes defined:\n\n.. attribute:: value\n\nThe current value of the bar.\n\n.. attribute:: range\n\nThe current range of the bar."], "renpy.set_return_stack": ["internal", "function", "(stack)", "", "", "Sets the current return stack. The return stack is a list of statement names.\n\nStatement names may be strings (for labels) or opaque tuples (for non-label statements)."], "renpy.set_physical_size": ["internal", "function", "(size)", "", "", "Attempts to set the size of the physical window to `size`. This has the side effect of taking the screen out of fullscreen mode."], "renpy.music.set_volume": ["internal", "function", "(volume, delay=0, channel=\"music\")", "", "", "Sets the volume of this channel, as a fraction of the volume of the mixer controlling the channel.\n\n`volume` This is a number between 0.0 and 1.0, and is interpreted as a fraction of the mixer volume for the channel.\n\n`delay` It takes delay seconds to change/fade the volume from the old to the new value. This value is persisted into saves, and participates in rollback.\n\n`channel` The channel to be set"], "renpy.queue_event": ["internal", "function", "(name, up=False, **kwargs)", "", "", "Queues an event with the given name. `Name` should be one of the event names in :var:`config.keymap`, or a list of such names.\n\n`up` This should be false when the event begins (for example, when a keyboard button is pressed.) It should be true when the event ends (when the button is released.)\n\nThe event is queued at the time this function is called. This function will not work to replace an event with another - doing so will change event order. (Use :var:`config.keymap` instead.)\n\nThis method is threadsafe."], "renpy.load_module": ["internal", "function", "(name, **kwargs)", "", "", "This loads the Ren'Py module named name. A Ren'Py module consists of Ren'Py script that is loaded into the usual (store) namespace, contained in a file named name.rpym or name.rpymc. If a .rpym file exists, and is newer than the corresponding .rpymc file, it is loaded and a new .rpymc file is created.\n\nAll of the init blocks (and other init-phase code) in the module are run before this function returns. An error is raised if the module name cannot be found, or is ambiguous.\n\nModule loading may only occur from inside an init block."], "renpy.mode": ["internal", "function", "(mode)", "", "", "Causes Ren'Py to enter the named mode, or stay in that mode if it's already in it."], "renpy.suspend_rollback": ["internal", "function", "(flag)", "", "", "Rollback will skip sections of the game where rollback has been suspended.\n\n`flag`: When `flag` is true, rollback is suspended. When false, rollback is resumed."], "renpy.get_mouse_pos": ["internal", "function", "()", "", "", "Returns an (x, y) tuple giving the location of the mouse pointer or the current touch location. If the device does not support a mouse and is not currently being touched, x and y are numbers, but not meaningful."], "renpy.run": ["internal", "function", "(action)", "", "", "Run an action or list of actions. A single action is called with no arguments, a list of actions is run in order using this function, and None is ignored.\n\nReturns the result of the last action to return a value."], "renpy.version_name": ["other", "renpy.version_name", "", "", "var", "A human readable version name, of the form \\Example Version.\\"], "renpy.pause": ["internal", "function", "(delay=None, hard=False)", "", "", "Causes Ren'Py to pause. Returns true if the user clicked to end the pause, or false if the pause timed out or was skipped.\n\n`delay` If given, the number of seconds Ren'Py should pause for.\n\n`hard` This must be given as a keyword argument. When True, Ren'Py may prevent the user from clicking to interrupt the pause. If the player enables skipping, the hard pause will be skipped. There may be other circumstances where the hard pause ends early or prevents Ren'Py from operating properly, these will not be treated as bugs.\n\nIn general, using hard pauses is rude. When the user clicks to advance the game, it's an explicit request - the user wishes the game to advance. To override that request is to assume you understand what the player wants more than the player does.\n\nCalling renpy.pause guarantees that whatever is on the screen will be displayed for at least one frame, and hence has been shown to the player.\n\ntl;dr - Don't use renpy.pause with hard=True."], "renpy.add_layer": ["internal", "function", "(layer, above=None, below=None, menu_clear=True)", "", "", "Adds a new layer to the screen. If the layer already exists, this function does nothing.\n\nOne of `behind` or `above` must be given.\n\n`layer` A string giving the name of the new layer to add.\n\n`above` If not None, a string giving the name of a layer the new layer will be placed above.\n\n`below` If not None, a string giving the name of a layer the new layer will be placed below.\n\n`menu_clear` If true, this layer will be cleared when entering the game menu context, and restored when leaving the"], "renpy.variant": ["internal", "function", "(name)", "", "", "Returns true if a `name` is a screen variant that can be chosen by Ren'Py. See :ref:`screen-variants` for more details. This function can be used as the condition in a Python if statement to set up the appropriate styles for the selected screen variant.\n\n`name` can also be a list of variants, in which case this function returns True if any of the variants is selected."], "renpy.invoke_in_thread": ["internal", "function", "(fn, *args, **kwargs)", "", "", "Invokes the function `fn` in a background thread, passing it the provided arguments and keyword arguments. Restarts the interaction once the thread returns.\n\nThis function creates a daemon thread, which will be automatically stopped when Ren'Py is shutting down.\n\nThis thread is very limited in what it can do with the Ren'Py API. Changing store variables is allowed, as is calling the :func:`renpy.queue_event` function. Most other portions of the Ren'Py API are expected to be called from the main thread.\n\nThe primary use of this function is to place accesss to a web API in a second thread, and then update variables with the results of that call, by storing the result in variables and then relying on the interaction restart to cause screens to display those variables."], "renpy.predict_screen": ["internal", "function", "(_screen_name, *_args, **kwargs)", "", "", "Predicts the displayables that make up the given screen.\n\n`_screen_name` The name of the screen to show. `_widget_properties` A map from the id of a widget to a property name -> property value map. When a widget with that id is shown by the screen, the specified properties are added to it.\n\nKeyword arguments not beginning with underscore (_) are used to initialize the screen's scope."], "renpy.sound.stop": ["internal", "function", "(channel=\"sound\", fadeout=None)", "", "", "This stops the music that is currently playing, and dequeues all queued music. If fadeout is None, the music is faded out for the time given in config.fade_music, otherwise it is faded for fadeout seconds.\n\nThis sets the last queued file to None.\n\n`channel` The channel to stop the sound on.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fade_music."], "renpy.choice_for_skipping": ["internal", "function", "()", "", "", "Tells Ren'Py that a choice is coming up soon. This currently has two effects:\n\n* If Ren'Py is skipping, and the Skip After Choices preferences is set to stop skipping, skipping is terminated.\n\n* An auto-save is triggered."], "renpy.in_fixed_rollback": ["internal", "function", "()", "", "", "Returns true if rollback is currently occurring and the current context is before an executed renpy.fix_rollback() statement."], "renpy.sound.queue": ["internal", "function", "(filenames, channel=\"sound\", loop=None, clear_queue=True, fadein=0, tight=None, relative_volume=1.0)", "", "", "This queues the given filenames on the specified channel.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`clear_queue` If True, then the queue is cleared, making these files the files that are played when the currently playing file finishes. If it is False, then these files are placed at the back of the queue. In either case, if no music is playing these files begin playing immediately.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.hide_screen": ["internal", "function", "(tag, layer=None)", "", "", "The programmatic equivalent of the hide screen statement.\n\nHides the screen with `tag` on `layer`."], "renpy.Render.place": ["cdd", "place", "(d, x=0, y=0, width=None, height=None, st=None, at=None, render=None, main=True)", "renpy.Render", "method", "Renders `d` and places it into the rectangle defined by the `x`, `y`, `width`, and `height`, using Ren'Py's standard placement algorithm.\n\n`x`, `y`, `width`, `height` The rectangle to place in. If `width` or `height`, when None, are the width and height of this render, respectively.\n\n`st`, `at` The times passed to Render. If None, defaults to the times passed to the render method calling this method.\n\n`render` If not None, this is used instead of rendering `d`.\n\n`main` As for .blit()."], "renpy.music.stop": ["internal", "function", "(channel=\"music\", fadeout=None)", "", "", "This stops the music that is currently playing, and dequeues all queued music. If fadeout is None, the music is faded out for the time given in config.fade_music, otherwise it is faded for fadeout seconds.\n\nThis sets the last queued file to None.\n\n`channel` The channel to stop the sound on.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fade_music."], "renpy.copy_save": ["internal", "function", "(old, new)", "", "", "Copies the save at `old` to `new`. (Does nothing if `old` does not exist.)"], "renpy.get_renderer_info": ["internal", "function", "()", "", "", "Returns a dictionary, giving information about the renderer Ren'Py is currently using. Defined keys are:\n\n``\\renderer\\`` A string giving the name of the renderer that is in use.\n\n``\\resizable\\`` True if and only if the window is resizable.\n\n``\\additive\\`` True if and only if the renderer supports additive blending.\n\n``\\model\\`` Present and true if model-based rendering is supported.\n\nOther, renderer-specific, keys may also exist. The dictionary should be treated as immutable. This should only be called once the display has been started (that is, after the init phase has finished)."], "renpy.sound.set_pan": ["internal", "function", "(pan, delay, channel=\"sound\")", "", "", "Sets the pan of this channel.\n\n`pan` A number between -1 and 1 that control the placement of the audio. If this is -1, then all audio is sent to the left channel. If it's 0, then the two channels are equally balanced. If it's 1, then all audio is sent to the right ear.\n\n`delay` The amount of time it takes for the panning to occur.\n\n`channel` The channel the panning takes place on. This can be a sound or a music channel. Often, this is channel 7, the default music channel."], "renpy.end_replay": ["internal", "function", "()", "", "", "If we're in a replay, ends the replay immediately. Otherwise, does nothing."], "renpy.exists": ["internal", "function", "(filename)", "", "", "Returns true if the given filename can be found in the searchpath. This only works if a physical file exists on disk. It won't find the file if it's inside of an archive.\n\nYou almost certainly want to use :func:`renpy.loadable` in preference to this function."], "renpy.play": ["internal", "function", "(filename, channel=None, **kwargs)", "", "", "Plays a sound effect. If `channel` is None, it defaults to :var:`config.play_channel`. This is used to play sounds defined in styles, :propref:`hover_sound` and :propref:`activate_sound`."], "renpy.end_interaction": ["internal", "function", "(value)", "", "", "If `value` is not None, immediately ends the current interaction, causing the interaction to return `value`. If `value` is None, does nothing.\n\nThis can be called from inside the render and event methods of a creator-defined displayable."], "renpy.get_hidden_tags": ["internal", "function", "(layer)", "", "", "Returns the set of image tags on `layer` that are currently hidden, but still have attribute information associated with them."], "renpy.get_all_labels": ["internal", "function", "()", "", "", "Returns the set of all labels defined in the program, including labels defined for internal use in the libraries."], "renpy.mark_audio_unseen": ["internal", "function", "(filename)", "", "", "Marks the given filename as if it has not been played on the current user's system yet."], "renpy.cancel_gesture": ["internal", "function", "()", "", "", "Cancels the current gesture, preventing the gesture from being recognized. This should be called by displayables that have gesture-like behavior."], "renpy.has_live2d": ["internal", "function", "()", "", "", "Returns True if Live2d is supported on the current platform, and False otherwise."], "renpy.stop_predict_screen": ["internal", "function", "(name)", "", "", "Causes Ren'Py to stop predicting the screen named `name`."], "renpy.music.get_loop": ["internal", "function", "(channel=\"music\")", "", "", "Return a list of filenames that are being looped on `channel`, or None if no files are being looped. In the case where a loop is queued, but is not yet playing, the loop is returned, not the currently playing music."], "renpy.get_showing_tags": ["internal", "function", "(layer)", "", "", "Returns the set of image tags that are currently being shown on `layer`. If sort is true, returns a list of the tags from back to front."], "renpy.newest_slot": ["internal", "function", "(regexp=None)", "", "", "Returns the name of the newest save slot (the save slot with the most recent modification time), or None if there are no (matching) saves.\n\nIf `regexp` exists, only slots that begin with `regexp` are returned."], "renpy.get_sdl_window_pointer": ["internal", "function", "()", "", "", "Returns a pointer (of type ctypes.c_void_p) to the main window, or None if the main window is not displayed, or some other problem occurs."], "renpy.music": ["basefile", "", "", "", "", "Most renpy.music functions have aliases in renpy.sound. These functions are similar, except they default to the sound channel rather than the music channel, and default to not looping."], "renpy.is_seen": ["internal", "function", "(ever=True)", "", "", "Returns true if the current line has been seen by the player.\n\nIf `ever` is true, we check to see if the line has ever been seen by the player. If false, we check if the line has been seen in the current play-through."], "renpy.get_say_image_tag": ["internal", "function", "()", "", "", "Returns the tag corresponding to the currently speaking character (the `image` argument given to that character). Returns None if no character is speaking or the current speaking character does not have a corresponding image tag."], "renpy.substitute": ["internal", "function", "(s, scope=None, translate=True)", "", "", "Applies translation and new-style formatting to the string `s`.\n\n`scope` If not None, a scope which is used in formatting, in addition to the default store.\n\n`translate` Determines if translation occurs.\n\nReturns the translated and formatted string."], "renpy.get_screen": ["internal", "function", "(name, layer=None)", "", "", "Returns the ScreenDisplayable with the given `name` on layer. `name` is first interpreted as a tag name, and then a screen name. If the screen is not showing, returns None.\n\nThis can also take a list of names, in which case the first screen that is showing is returned.\n\nThis function can be used to check if a screen is showing\n```\nif renpy.get_screen(\\say\\):\ntext \\The say screen is showing.\\\nelse:\ntext \\The say screen is hidden.\\\n\n```"], "renpy.is_skipping": ["internal", "function", "()", "", "", "Returns True if Ren'Py is currently skipping (in fast or slow skip mode), or False otherwise."], "renpy.check_image_attributes": ["internal", "function", "(tag, attributes)", "", "", "Checks to see if there is a unique image with the given tag and attributes. If there is, returns the attributes in order. Otherwise, returns None."], "renpy.fsdecode": ["internal", "function", "(s)", "", "", "Converts s from filesystem encoding to unicode."], "renpy.load_image": ["internal", "function", "(im)", "", "", "Loads the image manipulator `im` using the image cache, and returns a render."], "renpy.take_screenshot": ["internal", "function", "(scale=None, background=False)", "", "", "Causes a screenshot to be taken. This screenshot will be saved as part of a save game."], "renpy.register_sl_statement": ["internal", "class", "(name, children=u'many', screen=None)", "", "", "Registers a custom screen language statement with Ren'Py.\n\n`name` This must be a word. It's the name of the custom screen language statement.\n\n`children` The number of children this custom statement takes. This should be 0, 1, or \\many\\, which means zero or more.\n\n`screen` The screen to use. If not given, defaults to `name`.\n\nReturns an object that can have positional arguments and properties added to it. This object has the same .add_ methods as the objects returned by :class:`renpy.register_sl_displayable`."], "renpy.input": ["internal", "function", "(prompt, default='', allow=None, exclude='{}', length=None, with_none=None, pixel_width=None, screen=\"input\", mask=None, **kwargs)", "", "", "Calling this function pops up a window asking the player to enter some text. It returns the entered text.\n\n`prompt` A string giving a prompt to display to the player.\n\n`default` A string giving the initial text that will be edited by the player.\n\n`allow` If not None, a string giving a list of characters that will be allowed in the text.\n\n`exclude` If not None, if a character is present in this string, it is not allowed in the text.\n\n`length` If not None, this must be an integer giving the maximum length of the input string.\n\n`pixel_width` If not None, the input is limited to being this many pixels wide, in the font used by the input to display text.\n\n`screen` The name of the screen that takes input. If not given, the ``input`` screen is used.\n\n`mask` If not None, a single-character string that replaces the input text that is shown to the player, such as to conceal a password.\n\nIf :var:`config.disable_input` is True, this function only returns `default`.\n\nKeywords prefixed with ``show_`` have the prefix stripped and are passed to the screen."], "renpy.get_say_attributes": ["internal", "function", "()", "", "", "Gets the attributes associated with the current say statement, or None if no attributes are associated with this statement.\n\nThis is only valid when executing or predicting a say statement."], "renpy.define_screen": ["internal", "function", "(name, function, modal=\"False\", zorder=\"0\", tag=None, variant=None)", "", "", "Defines a screen with `name`, which should be a string.\n\n`function` The function that is called to display the screen. The function is called with the screen scope as keyword arguments. It should ignore additional keyword arguments.\n\nThe function should call the ui functions to add things to the screen.\n\n`modal` A string that, when evaluated, determines of the created screen should be modal. A modal screen prevents screens underneath it from receiving input events.\n\n`zorder` A string that, when evaluated, should be an integer. The integer controls the order in which screens are displayed. A screen with a greater zorder number is displayed above screens with a lesser zorder number.\n\n`tag` The tag associated with this screen. When the screen is shown, it replaces any other screen with the same tag. The tag defaults to the name of the screen.\n\n`predict` If true, this screen can be loaded for image prediction. If false, it can't. Defaults to true.\n\n`variant` String. Gives the variant of the screen to use."], "renpy.music_stop": ["internal", "function", "(fadeout=None)", "", "", "Deprecated music start function, retained for compatibility. Use renpy.music.play() or .queue() instead."], "renpy.clear_game_runtime": ["internal", "function", "()", "", "", "Resets the game runtime counter."], "renpy.jump": ["internal", "function", "(label)", "", "", "Causes the current statement to end, and control to jump to the given label."], "renpy.Displayable.event": ["cdd", "event", "(ev, x, y, st)", "renpy.Displayable", "method", "The event method is called to pass a pygame event to the creator-defined displayable. If the event method returns a value other than None, that value is returned as the result of the interaction. If the event method returns None, the event is passed on to other displayables.\n\nTo ignore the event without returning None, raise :class:`renpy.IgnoreEvent`.\n\nThe event method exists on other displayables, allowing the creator-defined displayable to pass on the event.\n\n`ev` An `event object `_\n\n`x`, `y` The x and y coordinates of the event, relative to the upper-left corner of the displayable. These should be used in preference to position information found in the pygame event objects.\n\n`st` A float, the shown timebase, in seconds.\n\nAn event is generated at the start of each interaction, and :func:`renpy.timeout` can be used to cause another event to occur."], "renpy.start_predict": ["internal", "function", "(*args)", "", "", "This function takes one or more displayables as arguments. It causes Ren'Py to predict those displayables during every interaction until the displayables are removed by :func:`renpy.stop_predict`.\n\nIf a displayable name is a string containing one or more \\\\* characters, the asterisks are used as a wildcard pattern. If there is at least one . in the string, the pattern is matched against filenames, otherwise it is matched against image names.\n\nFor example::\n\n$ renpy.start_predict(\\eileen *\\)\n\nstarts predicting all images with the name eileen, while::\n\n$ renpy.start_predict(\\images/concert*.*\\)\n\nmatches all files starting with concert in the images directory."], "renpy.reload_script": ["internal", "function", "()", "", "", "Causes Ren'Py to save the game, reload the script, and then load the save."], "renpy.types": ["internal", "function", "()", "", "", "Define names for all type symbols known in the standard interpreter.\n\nTypes that are part of optional modules (e.g. array) are not listed."], "renpy.Displayable.per_interact": ["cdd", "per_interact", "(self)", "renpy.Displayable", "method", "This method is called at the start of each interaction. It can be used to trigger a redraw, and probably should be used to trigger a redraw if the object participates in rollback."], "renpy.load_surface": ["internal", "function", "(im)", "", "", "Loads the image manipulator `im` using the image cache, and returns a pygame Surface."], "renpy.music.get_duration": ["internal", "function", "(channel=\"music\")", "", "", "Returns the duration of the audio or video file on `channel`. Returns 0.0 if no file is playing on `channel`."], "renpy.can_load": ["internal", "function", "(filename, test=False)", "", "", "Returns true if `filename` exists as a save slot, and False otherwise."], "renpy.pop_call": ["internal", "function", "()", "", "", "Pops the current call from the call stack, without returning to the location.\n\nThis can be used if a label that is called decides not to return to its caller."], "renpy.run_unhovered": ["internal", "function", "(var)", "", "", "Calls the unhovered method on the variable, if it exists."], "renpy.redraw": ["cdd", "renpy.redraw", "(d, when)", "", "function", "Causes the displayable `d` to be redrawn after `when` seconds have elapsed."], "renpy.Render.zoom": ["cdd", "zoom", "(xzoom, yzoom)", "renpy.Render", "method", "Sets the zoom level of the children of this displayable in the horitzontal and vertical axes. Only the children of the displayable are zoomed \u2013 the width, height, and blit coordinates are not zoomed.\n\nThe following attributes and methods are only used when model-based rendering is enabled:"], "renpy.count_newly_seen_dialogue_blocks": ["internal", "function", "()", "", "", "Returns the number of dialogue blocks the user has seen for the first time during this session."], "renpy.register_shader": ["internal", "function", "(name, **kwargs)", "", "", "This registers a shader part. This takes `name`, and then keyword arguments.\n\n`name` A string giving the name of the shader part. Names starting with an underscore or \\renpy.\\ are reserved for Ren'Py.\n\n`variables` The variables used by the shader part. These should be listed one per line, a storage (uniform, attribute, or varying) followed by a type, name, and semicolon. For example\n```\nvariables='''\nuniform sampler2D tex0;\nattribute vec2 a_tex_coord;\nvarying vec2 v_tex_coord;\n'''\n\n`vertex_functions`\nIf given, a string containing functions that will be included in the\nvertex shader.\n\n`fragment_functions`\nIf given, a string containing functions that will be included in the\nfragment shader.\n\nOther keyword arguments should start with ``vertex_`` or ``fragment_``,\nand end with an integer priority. So \\fragment_200\\ or \\vertex_300\\. These\ngive text that's placed in the appropriate shader at the given priority,\nwith lower priority numbers inserted before higher priority numbers.\n```"], "renpy.iconify": ["internal", "function", "()", "", "", "Iconifies the game."], "renpy.is_sensitive": ["internal", "function", "(action)", "", "", "Returns true if `action` indicates it is sensitive, or False otherwise."], "renpy.is_mouse_visible": ["internal", "function", "()", "", "", "Returns True if the mouse cursor is visible, False otherwise."], "renpy.sound.get_pause": ["internal", "function", "(channel=\"sound\")", "", "", "Returns the pause flag for `channel`."], "renpy.get_displayable": ["internal", "function", "(screen, id, layer=None, base=False)", "", "", "From the `screen` on `layer`, returns the displayable with `id`. Returns None if the screen doesn't exist, or there is no widget with that id on the screen."], "renpy.file": ["internal", "function", "(fn)", "", "", "Returns a read-only file-like object that accesses the file named `fn`. The file is accessed using Ren'Py's standard search method, and may reside in an RPA archive. or as an Android asset.\n\nThe object supports a wide subset of the fields and methods found on Python's standard file object, opened in binary mode. (Basically, all of the methods that are sensible for a read-only file.)"], "renpy.slot_json": ["internal", "function", "(slotname)", "", "", "Returns the json information for `slotname`, or None if the slot is empty."], "renpy.sound.set_queue_empty_callback": ["internal", "function", "(callback, channel=\"sound\")", "", "", "This sets a callback that is called when the queue is empty. This callback is called when the queue first becomes empty, and at least once per interaction while the queue is empty.\n\nThe callback is called with no parameters. It can queue sounds by calling renpy.music.queue with the appropriate arguments. Please note that the callback may be called while a sound is playing, as long as a queue slot is empty."], "renpy.sound.get_playing": ["internal", "function", "(channel=\"sound\")", "", "", "If the given channel is playing, returns the playing file name. Otherwise, returns None."], "renpy.predict": ["internal", "function", "(self)", "", "", "This is called to predictively load images from this node. It should cause renpy.display.predict.displayable and renpy.display.predict.screen to be called as necessary."], "renpy.checkpoint": ["internal", "function", "(data=None)", "", "", "Makes the current statement a checkpoint that the user can rollback to. Once this function has been called, there should be no more interaction with the user in the current statement.\n\nThis will also clear the current screenshot used by saved games.\n\n`data` This data is returned by :func:`renpy.roll_forward_info` when the game is being rolled back.\n\n`hard` If true, this is a hard checkpoint that rollback will stop at. If false, this is a soft checkpoint that will not stop rollback."], "renpy.music.set_pause": ["internal", "function", "(value, channel=\"music\")", "", "", "Sets the pause flag for `channel` to `value`. If True, the channel will pause, otherwise it will play normally."], "renpy.vibrate": ["internal", "function", "(duration)", "", "", "Causes the device to vibrate for `duration` seconds. Currently, this is only supported on Android."], "renpy.change_zorder": ["internal", "function", "(layer, tag, zorder)", "", "", "Changes the zorder of `tag` on `layer` to `zorder`."], "renpy.can_rollback": ["internal", "function", "()", "", "", "Returns true if we can rollback."], "renpy.Displayable.__init__": ["cdd", "__init__", "(**properties)", "renpy.Displayable", "method", "A subclass may override the constructor, perhaps adding new parameters. If it does, it should pass all unknown keyword arguments to the renpy.Displayable constructor, with the call\n```\nsuper(MyDisplayable, self).__init__(**properties)\n\n```"], "renpy.Render.add_shader": ["cdd", "add_shader", "(shader)", "renpy.Render", "method", "This causes the shader part `shader` to be used when this Render or its children are drawn. The part should be a string, or can be a string beginning with \\-\\ to prevent a shader from being drawn."], "renpy.fix_rollback": ["internal", "function", "()", "", "", "Prevents the user from changing decisions made before the current statement."], "renpy.Keymap": ["internal", "class", "(replaces=None, activate_sound=None, **keymap)", "", "", "This is a behavior that maps keys to actions that are called when the key is pressed. The keys are specified by giving the appropriate k_constant from pygame.constants, or the unicode for the key."], "renpy.save": ["internal", "function", "(filename, extra_info='')", "", "", "Saves the list of shaders to the file."], "renpy.Render.blit": ["cdd", "blit", "(source, pos, main=True)", "renpy.Render", "method", "Draws another render object into this render object.\n\n`source` The render object to draw.\n\n`pos` The location to draw into. This is an (x, y) tuple with the coordinates being pixels relative to the upper-left corner of the target render.\n\n`main` A keyword-only parameter. If true, `source` will be displayed in the style inspector."], "renpy.notify": ["internal", "function", "(message)", "", "", "Causes Ren'Py to display the `message` using the notify screen. By default, this will cause the message to be dissolved in, displayed for two seconds, and dissolved out again.\n\nThis is useful for actions that otherwise wouldn't produce feedback, like screenshots or quicksaves.\n\nOnly one notification is displayed at a time. If a second notification is displayed, the first notification is replaced.\n\nThis function just calls :var:`config.notify`, allowing its implementation to be replaced by assigning a new function to that variable."], "renpy.get_zorder_list": ["internal", "function", "(layer)", "", "", "Returns a list of (tag, zorder) pairs for `layer`."], "renpy.windows": ["other", "renpy.windows", "", "", "var", "Has a true value when running on Windows."], "renpy.music.set_queue_empty_callback": ["internal", "function", "(callback, channel=\"music\")", "", "", "This sets a callback that is called when the queue is empty. This callback is called when the queue first becomes empty, and at least once per interaction while the queue is empty.\n\nThe callback is called with no parameters. It can queue sounds by calling renpy.music.queue with the appropriate arguments. Please note that the callback may be called while a sound is playing, as long as a queue slot is empty."], "renpy.Displayable.render": ["cdd", "render", "(width, height, st, at)", "renpy.Displayable", "method", "Subclasses must override this, to return a :class:`renpy.Render` object. The render object determines what, if anything, is shown on the screen.\n\n`width`, `height` The amount of space available to this displayable, in pixels.\n\n`st` A float, the shown timebase, in seconds. The shown timebase begins when this displayable is first shown on the screen.\n\n`at` A float, the animation timebase, in seconds. The animation timebase begins when an image with the same tag was shown, without being hidden. (When the displayable is shown without a tag, this is the same as the shown timebase.)\n\nThe render method is called when the displayable is first shown. It can be called again if :func:`renpy.redraw` is called on this object."], "renpy.lint": ["internal", "function", "()", "", "", "The master lint function, that's responsible for staging all of the other checks."], "renpy.get_game_runtime": ["internal", "function", "()", "", "", "Returns the game runtime counter.\n\nThe game runtime counter counts the number of seconds that have elapsed while waiting for user input in the top-level context. (It does not count time spent in the main or game menus.)"], "renpy.get_on_battery": ["internal", "function", "()", "", "", ":other:\n\nReturns True if Ren'Py is running on a device that is powered by an internal battery, or False if the device is being charged by some external source."], "renpy.linux": ["other", "renpy.linux", "", "", "var", "Has a true value when running on Linux or other POSIX-like operating systems."], "renpy.emscripten": ["other", "renpy.emscripten", "", "", "var", "Has a true value when running in the browser."], "renpy.get_at_list": ["internal", "function", "(name, layer=None, camera=False)", "", "", "Returns the list of transforms being applied to the image with tag `name` on `layer`. Returns an empty list if no transforms are being applied, or None if the image is not shown.\n\nIf `layer` is None, uses the default layer for the given tag."], "renpy.music.get_pause": ["internal", "function", "(channel=\"music\")", "", "", "Returns the pause flag for `channel`."], "renpy.is_init_phase": ["internal", "function", "()", "", "", "Returns True if Ren'Py is currently executing init code, or False otherwise."], "renpy.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "renpy.display_notify": ["internal", "function", "(message)", "", "", "The default implementation of :func:`renpy.notify`."], "renpy.Displayable": ["cdd", "renpy.Displayable", "", "", "class", "Base class for creator-defined displayables."], "renpy.set_style_preference": ["internal", "function", "(preference, alternative)", "", "", "Sets the selected alternative for the style preference.\n\n`preference` A string giving the name of the style preference.\n\n`alternative` A string giving the name of the alternative."], "renpy.roll_forward_info": ["internal", "function", "()", "", "", "When in rollback, returns the data that was supplied to :func:`renpy.checkpoint` the last time this statement executed. Outside of rollback, returns None."], "renpy.music_start": ["internal", "function", "(filename, loops=True, fadeout=None, fadein=0)", "", "", "Deprecated music start function, retained for compatibility. Use renpy.music.play() or .queue() instead."], "renpy.retain_after_load": ["internal", "function", "()", "", "", "Causes data modified between the current statement and the statement containing the next checkpoint to be retained when a load occurs."], "renpy.get_menu_args": ["internal", "function", "()", "", "", ":other:\n\nReturns a tuple giving the arguments (as a tuple) and the keyword arguments (as a dict) passed to the current menu statement."], "renpy.IgnoreEvent": ["cdd", "renpy.IgnoreEvent", "", "", "class", "This is an exception that, if raised, causes Ren'Py to ignore the event. To raise this inside the event method, write\n```\nraise renpy.IgnoreEvent()\n\n```"], "renpy.load_string": ["internal", "function", "(s, filename=\"\")", "", "", "Loads `s` as Ren'Py script that can be called.\n\nReturns the name of the first statement in s.\n\n`filename` is the name of the filename that statements in the string will appear to be from."], "renpy.get_transition": ["internal", "function", "(layer=None)", "", "", "Gets the transition for `layer`, or the entire scene if `layer` is None. This returns the transition that is queued up to run during the next interaction, or None if no such transition exists."], "renpy.seen_image": ["internal", "function", "(name)", "", "", "Returns True if the named image has been seen at least once on the user's system. An image has been seen if it's been displayed using the show statement, scene statement, or :func:`renpy.show` function. (Note that there are cases where the user won't actually see the image, like a show immediately followed by a hide.)"], "renpy.register_sl_displayable": ["internal", "function", "(name, displayable, style, nchildren=0, scope=False, replaces=False, default_keywords={}, default_properties=True)", "", "", "Registers a screen language statement that creates a displayable.\n\n`name` The name of the screen language statement, a string containing a Ren'Py keyword. This keyword is used to introduce the new statement.\n\n`displayable` This is a function that, when called, returns a displayable object. All position arguments, properties, and style properties are passed as arguments to this function. Other keyword arguments are also given to this function, a described below.\n\nThis must return a Displayable. If it returns multiple displayables, the _main attribute of the outermost displayable should be set to the \\main\\ displayable - the one that children should be added to.\n\n`style` The base name of the style of this displayable. If the style property is not given, this will have the style prefix added to it. The computed style is passed to the `displayable` function as the ``style`` keyword argument.\n\n`nchildren` The number of children of this displayable. One of:\n\n0 The displayable takes no children. 1 The displayable takes 1 child. If more than one child is given, the children are placed in a Fixed. \\many\\ The displayable takes more than one child.\n\n The following arguments should be passed in using keyword arguments:\n\n`replaces` If true, and the displayable replaces a prior displayable, that displayable is passed as a parameter to the new displayable.\n\n`default_keywords` The default set of keyword arguments to supply to the displayable.\n\n`default_properties` If true, the ui and position properties are added by default.\n\nReturns an object that can have positional arguments and properties added to it by calling the following methods. Each of these methods returns the object it is called on, allowing methods to be chained together.\n\n.. method:: add_positional(name)\n\nAdds a positional argument with `name`\n\n.. method:: add_property(name)\n\nAdds a property with `name`. Properties are passed as keyword arguments.\n\n.. method:: add_style_property(name)\n\nAdds a family of properties, ending with `name` and prefixed with the various style property prefixes. For example, if called with (\\size\\), this will define size, idle_size, hover_size, etc.\n\n.. method:: add_prefix_style_property(prefix, name)\n\nAdds a family of properties with names consisting of `prefix`, a style property prefix, and `name`. For example, if called with a prefix of `text_` and a name of `size`, this will create text_size, text_idle_size, text_hover_size, etc.\n\n.. method:: add_property_group(group, prefix='')\n\nAdds a group of properties, prefixed with `prefix`. `Group` may be one of the strings:\n\n* \\bar\\ * \\box\\ * \\button\\ * \\position\\ * \\text\\ * \\window\\\n\nThese correspond to groups of :ref:`style-properties`. Group can also be \\ui\\, in which case it adds the :ref:`common ui properties `."], "renpy.sound.is_playing": ["internal", "function", "(channel=\"sound\")", "", "", "Returns True if the channel is currently playing a sound, False if it is not, or if the sound system isn't working."], "renpy.is_start_interact": ["internal", "function", "()", "", "", "Returns true if restart_interaction has not been called during the current interaction. This can be used to determine if the interaction is just being started, or has been restarted."], "renpy.add_to_all_stores": ["internal", "function", "(name, value)", "", "", "Adds the `value` by the `name` to all creator defined namespaces. If the name already exist in that namespace - do nothing for it.\n\nThis function may only be run from inside an init block. It is an error to run this function once the game has started."], "renpy.full_restart": ["internal", "function", "(transition=False, label=\"_invoke_main_menu\", target=\"_main_menu\", save=False)", "", "", "Causes Ren'Py to restart, returning the user to the main menu.\n\n`transition` If given, the transition to run, or None to not run a transition. False uses :var:`config.end_game_transition`.\n\n`save` If true, the game is saved in :var:`_quit_slot` before Ren'Py restarts and returns the user to the main menu."], "renpy.count_displayables_in_layer": ["internal", "function", "(layer)", "", "", "Returns how many displayables are in the supplied layer."], "renpy.get_style_preference": ["internal", "function", "(preference)", "", "", "Returns a string giving the name of the selected alternative for the named style preference.\n\n`preference` A string giving the name of the style preference."], "renpy.slot_mtime": ["internal", "function", "(slotname)", "", "", "Returns the modification time for `slot`, or None if the slot is empty."], "renpy.seen_label": ["internal", "function", "(label)", "", "", "Returns true if the named label has executed at least once on the current user's system, and false otherwise. This can be used to unlock scene galleries, for example."], "renpy.set_focus": ["internal", "function", "(screen, id, layer=\"screens\")", "", "", "This attempts to focus the displayable with `id` in the screen `screen`. Focusing will fail if the displayable isn't found, the window isn't focused, or something else is grabbing focus.\n\nThe focus may change if the mouse moves, even slightly, after this call is processed."], "renpy.get_ordered_image_attributes": ["internal", "function", "(tag, attributes=(), sort=None)", "", "", "Returns a list of image tags, ordered in a way that makes sense to present to the user.\n\n`attributes` If present, only attributes that are compatible with the given attributes are considered. (Compatible means that the attributes can be in a single image at the same time.)\n\n`sort` If not None, the returned list of attributes is sorted. This is a function that should be used as a tiebreaker."], "renpy.image": ["internal", "function", "(name, d)", "", "", "Defines an image. This function is the Python equivalent of the image statement.\n\n`name` The name of the image to display, a string.\n\n`d` The displayable to associate with that image name.\n\nThis function may only be run from inside an init block. It is an error to run this function once the game has started."], "renpy.get_sdl_dll": ["internal", "function", "()", "", "", "This returns a ctypes.cdll object that refers to the library that contains the instance of SDL2 that Ren'Py is using.\n\nIf this can not be done, None is returned."], "renpy.hide": ["internal", "function", "(name, layer=None)", "", "", "Hides an image from a layer. The Python equivalent of the hide statement.\n\n`name` The name of the image to hide. Only the image tag is used, and any image with the tag is hidden (the precise name does not matter).\n\n`layer` The layer on which this function operates. If None, uses the default layer associated with the tag."], "renpy.music.get_playing": ["internal", "function", "(channel=\"music\")", "", "", "If the given channel is playing, returns the playing file name. Otherwise, returns None."], "renpy.sound.get_loop": ["internal", "function", "(channel=\"sound\")", "", "", "Return a list of filenames that are being looped on `channel`, or None if no files are being looped. In the case where a loop is queued, but is not yet playing, the loop is returned, not the currently playing music."], "renpy.get_image_load_log": ["internal", "function", "(age=None)", "", "", "A generator that yields a log of image loading activity. For the last 100 image loads, this returns:\n\n* The time the image was loaded (in seconds since the epoch). * The filename of the image that was loaded. * A boolean that is true if the image was preloaded, and false if the game stalled to load it.\n\nThe entries are ordered from newest to oldest.\n\n`age` If not None, only images that have been loaded in the past `age` seconds are included.\n\nThe image load log is only kept if config.developer = True."], "renpy.Render": ["cdd", "renpy.Render", "(width, height)", "", "class", "Creates a new Render object.\n\n`width`, `height` The width and height of the render object, in pixels."], "renpy.music.play": ["internal", "function", "(filenames, channel=\"music\", loop=None, fadeout=None, synchro_start=False, fadein=0, tight=None, if_changed=False, relative_volume=1.0)", "", "", "This stops the music currently playing on the numbered channel, dequeues any queued music, and begins playing the specified file or files.\n\n`filenames` This may be a single file, or a list of files to be played.\n\n`channel` The channel to play the sound on.\n\n`loop` If this is True, the tracks will loop while they are the last thing in the queue.\n\n`fadeout` If not None, this is a time in seconds to fade for. Otherwise the fadeout time is taken from config.fade_music.\n\n`synchro_start` Ren'Py will ensure that all channels of with synchro_start set to true will start playing at exactly the same time. Synchro_start should be true when playing two audio files that are meant to be synchronized with each other.\n\n`fadein` This is the number of seconds to fade the music in for, on the first loop only.\n\n`tight` If this is True, then fadeouts will span into the next-queued sound. If None, this is true when loop is True, and false otherwise.\n\n`if_changed` If this is True, and the music file is currently playing, then it will not be stopped/faded out and faded back in again, but instead will be kept playing. (This will always queue up an additional loop of the music.)\n\n`relative_volume` This is the volume relative to the current channel volume. The specified file will be played at that relative volume. If not specified, it will always default to 1.0, which plays the file at the original volume as determined by the mixer, channel and secondary volume.\n\nThis clears the pause flag for `channel`."], "renpy.version": ["internal", "function", "(tuple=False)", "", "", "If `tuple` is false, returns a string containing \\Ren'Py \\, followed by the current version of Ren'Py.\n\nIf `tuple` is true, returns a tuple giving each component of the version as an integer."], "renpy.jump_out_of_context": ["internal", "function", "(label)", "", "", "Causes control to leave the current context, and then to be transferred in the parent context to the given label."], "renpy.Render.subsurface": ["cdd", "subsurface", "(rect)", "renpy.Render", "method", "Returns a render consisting of a rectangle cut out of this render.\n\n`rect` A (x, y, width, height) tuple."], "renpy.Render.mesh": ["cdd", "mesh", "", "renpy.Render", "attribute", "This field enables model-based rendering for this Render. If true:\n\nIf set to True:\n\n* All of the children of this displayable are rendered to textures. * A mesh the size of the first child is assocated with this displayable. * A model is created with the mesh, shaders, uniforms, and properties associated with this Render.\n\nThe model will then be drawn in a single operation."], "renpy.display_menu": ["internal", "function", "(items, interact=True, screen=\"choice\")", "", "", "This displays a menu to the user. `items` should be a list of 2-item tuples. In each tuple, the first item is a textual label, and the second item is the value to be returned if that item is selected. If the value is None, the first item is used as a menu caption.\n\nThis function takes many arguments, of which only a few are documented. Except for `items`, all arguments should be given as keyword arguments.\n\n`interact` If false, the menu is displayed, but no interaction is performed.\n\n`screen` The name of the screen used to display the menu.\n\nNote that most Ren'Py games do not use menu captions, but use narration instead. To display a menu using narration, write\n```\n$ narrator(\\Which direction would you like to go?\\, interact=False)\n$ result = renpy.display_menu([ (\\East\\, \\east\\), (\\West\\, \\west\\) ])\n\n```"], "renpy.screenshot": ["internal", "function", "(filename)", "", "", "Saves a screenshot in `filename`.\n\nReturns True if the screenshot was saved successfully, False if saving failed for some reason.\n\nThe :var:`config.screenshot_pattern` and :var:`_screenshot_pattern` variables control the file the screenshot is saved in."], "renpy.show": ["internal", "function", "(name, at_list=[], layer='master', what=None, zorder=0, tag=None, behind=[])", "", "", "Shows an image on a layer. This is the programmatic equivalent of the show statement.\n\n`name` The name of the image to show, a string.\n\n`at_list` A list of transforms that are applied to the image. The equivalent of the ``at`` property.\n\n`layer` A string, giving the name of the layer on which the image will be shown. The equivalent of the ``onlayer`` property. If None, uses the default layer associated with the tag.\n\n`what` If not None, this is a displayable that will be shown in lieu of looking on the image. (This is the equivalent of the show expression statement.) When a `what` parameter is given, `name` can be used to associate a tag with the image.\n\n`zorder` An integer, the equivalent of the ``zorder`` property. If None, the zorder is preserved if it exists, and is otherwise set to 0.\n\n`tag` A string, used to specify the image tag of the shown image. The equivalent of the ``as`` property.\n\n`behind` A list of strings, giving image tags that this image is shown behind. The equivalent of the ``behind`` property."], "renpy.mark_label_seen": ["internal", "function", "(label)", "", "", "Marks the named label as if it has been already executed on the current user's system."], "renpy.count_dialogue_blocks": ["internal", "function", "()", "", "", "Returns the number of dialogue blocks in the game's original language."], "renpy.music.register_channel": ["audio", "renpy.music.register_channel", "(name, mixer=None, loop=None, stop_on_mute=True, tight=False, file_prefix=\"\", file_suffix=\"\", buffer_queue=True, movie=False, framedrop=True)", "", "", "This registers a new audio channel named `name`. Audio can then be played on the channel by supplying the channel name to the play or queue statements.\n\n`mixer` The name of the mixer the channel uses. By default, Ren'Py knows about the \\music\\, \\sfx\\, and \\voice\\ mixers. Using other names is possible, but may require changing the preferences screens.\n\n`loop` If true, sounds on this channel loop by default.\n\n`stop_on_mute` If true, music on the channel is stopped when the channel is muted.\n\n`tight` If true, sounds will loop even when fadeout is occurring. This should be set to True for a sound effects or seamless music channel, and False if the music fades out on its own.\n\n`file_prefix` A prefix that is prepended to the filenames of the sound files being played on this channel.\n\n`file_suffix` A suffix that is appended to the filenames of the sound files being played on this channel.\n\n`buffer_queue` Should we buffer the first second or so of a queued file? This should be True for audio, and False for movie playback.\n\n`movie` If true, this channel will be set up to play back videos.\n\n`framedrop` This controls what a video does when lagging. If true, frames will be dropped to keep up with realtime and the soundtrack. If false, Ren'Py will display frames late rather than dropping them."], "renpy.list_files": ["internal", "function", "(common=False)", "", "", "Lists the files in the game directory and archive files. Returns a list of files, with / as the directory separator.\n\n`common` If true, files in the common directory are included in the listing."]}, "config": {"config.menu_arguments_callback": ["config", "config.menu_arguments_callback", " = None", "", "var", "If not None, this should be a function that takes positional and/or keyword arguments. It's called whenever a menu statement runs, with the arguments to that menu statement.\n\nThis should return a pair, containing a tuple of positional arguments (almost always empty), and a dictionary of keyword arguments."], "config.new_substitutions": ["config", "config.new_substitutions", " = True", "", "var", "If True, Ren'Py will apply new-style (square-bracket) substitutions to all text displayed."], "config.tag_zorder": ["config", "config.tag_zorder", " = { }", "", "var", "A dictionary mapping image tag strings to zorders. When an image is newly-shown without a zorder clause, the image's tag is looked up in this dictionary to find a zorder to use. If no zorder is found, 0 is used."], "config.show": ["config", "config.show", " = renpy.show", "", "var", "A function that is used in place of renpy.show by the :ref:`show ` and :ref:`scene ` statements. This should have the same signature as renpy.show."], "config.enter_transition": ["config", "config.enter_transition", " = None", "", "var", "If not None, this variable should give a transition that will be used when entering the game menu."], "config.script_version": ["config", "config.script_version", " = None", "", "var", "If not None, this is interpreted as a script version. The library will use this script version to enable some compatibility features, if necessary. If None, we assume this is a latest-version script.\n\nThis is normally set in a file added by the Ren'Py launcher when distributions are built."], "config.exception_handler": ["config", "config.exception_handler", " = None", "", "var", "If not None, this should be a function that takes three arguments:\n\n* A string giving the text of a traceback, abbreviated so that it only includes creator-written files. * The full text of the traceback, including both creator-written and Ren'Py files. * The path to a file containing a traceback method.\n\nThis function can present the error to a user in any way fit. If it returns True, the exception is ignored and control is transferred to the next statement. If it returns False, the built-in exception handler is use. This function may also call :func:`renpy.jump` to transfer control to some other label."], "config.displayable_prefix": ["config", "config.displayable_prefix", " = { }", "", "var", "See :ref:`Displayable prefixes `."], "config.history_length": ["gui", "config.history_length", " = 250", "", "var", "The number of blocks of dialogue Ren'Py will keep at history."], "config.fade_music": ["config", "config.fade_music", " = 0.0", "", "var", "This is the amount of time in seconds to spend fading the old track out before a new music track starts. This should probably be fairly short, so the wrong music doesn't play for too long."], "config.voice_filename_format": ["config", "config.voice_filename_format", " = \"{filename}\"", "", "var", "A string that is formatted with the string argument to the voice statement to produce the filename that is played to the user. For example, if this is \\{filename}.ogg\\, the ``voice \\test\\`` statement will play test.ogg."], "config.after_load_transition": ["config", "config.after_load_transition", " = None", "", "var", "A transition that is used after loading, when entering the loaded game."], "config.mipmap_text": ["config", "config.mipmap_text", " = False", "", "var", "The default value of the mipmap argument to :func:`Text`, including text used in screen statements."], "config.scene": ["config", "config.scene", " = renpy.scene", "", "var", "A function that's used in place of renpy.scene by the :ref:`scene statement `. Note that this is used to clear the screen, and config.show is used to show a new image. This should have the same signature as renpy.scene."], "config.gl_resize": ["config", "config.gl_resize", " = True", "", "var", "Determines if the user is allowed to resize an OpenGL-drawn window."], "config.missing_background": ["config", "config.missing_background", " = \"black\"", "", "var", "This is the background that is used when :var:`config.developer` is True and an undefined image is used in a :ref:`scene statement `. This should be an image name (a string), not a displayable."], "config.log_gl_shaders": ["model", "config.log_gl_shaders", " = False", "", "var", "If true, source code for the GLSL shader programs will be written to log.txt on start."], "config.end_splash_transition": ["config", "config.end_splash_transition", " = None", "", "var", "The transition that is used to display the main menu after the end of the splashscreen."], "config.with_callback": ["config", "config.with_callback", " = None", "", "var", "If not None, this should be a function that is called when a :ref:`with statement ` occurs. This function can be responsible for putting up transient things on the screen during the transition. The function is called with a single argument, which is the transition that is occurring. It is expected to return a transition, which may or may not be the transition supplied as its argument."], "config.context_clear_layers": ["config", "config.context_clear_layers", " = [ 'screens' ]", "", "var", "A list of layers that are cleared when entering a new context."], "config.nvl_adv_transition": ["config", "config.nvl_adv_transition", " = None", "", "var", "A transition that is used when showing ADV-mode text directly after NVL-mode text."], "config.clear_layers": ["config", "config.clear_layers", " = []", "", "var", "A list of names of layers to clear when entering the main and game menus."], "config.enter_replay_transition": ["config", "config.enter_replay_transition", " = None", "", "var", "If not None, a transition that is used when entering a replay."], "config.history_callbacks": ["config", "config.history_callbacks", " = [ ... ]", "", "var", "This contains a list of callbacks that are called before Ren'Py adds a new object to _history_list. The callbacks are called with the new HistoryEntry object as the first argument, and can add new fields to that object.\n\nRen'Py uses history callbacks internally, so creators should append their own callbacks to this list, rather than replacing it entirely."], "config.enable_language_autodetect": ["config", "config.enable_language_autodetect", " = False", "", "var", "If true, Ren'Py will attempt to determine the name of the language to use based on the locale of the player's system. If successful, this language will be used as the default language."], "config.say_menu_text_filter": ["config", "config.say_menu_text_filter", " = None", "", "var", "If not None, then this is a function that is given the text found in strings in the :ref:`say ` and :ref:`menu ` statements. It is expected to return new (or the same) strings to replace them."], "config.archives": ["config", "config.archives", " = [ ]", "", "var", "A list of archive files that will be searched for images and other data. The entries in this should consist of strings giving the base names of archive files, without the .rpa extension.\n\nThe archives are searched in the order they are found in this list. A file is taken from the first archive it is found in.\n\nAt startup, Ren'Py will automatically populate this variable with the names of all archives found in the game directory, sorted in reverse ascii order. For example, if Ren'Py finds the files data.rpa, patch01.rpa, and patch02.rpa, this variable will be populated with ``['patch02', 'patch01', 'data']``."], "config.imagemap_auto_function": ["config", "config.imagemap_auto_function", " = ...", "", "var", "A function that expands the `auto` property of a screen language :ref:`imagebutton ` or :ref:`imagemap ` statement into a displayable. It takes the value of the auto property, and the desired image, one of: \\insensitive\\, \\idle\\, \\hover\\, \\selected_idle\\, \\selected_hover\\, or \\ground\\. It should return a displayable or None.\n\nThe default implementation formats the `auto` property with the desired image, and then checks if the computed filename exists."], "config.layer_clipping": ["config", "config.layer_clipping", " = { }", "", "var", "Controls layer clipping. This is a map from layer names to (x, y, height, width) tuples, where x and y are the coordinates of the upper-left corner of the layer, with height and width giving the layer size.\n\nIf a layer is not mentioned in config.layer_clipping, then it is assumed to take up the full screen."], "config.skip_sounds": ["config", "config.skip_sounds", " = False", "", "var", "If False, non-looping audio will not be played when Ren'Py is skipping."], "config.version": ["config", "config.version", " = \"\"", "", "var", "This should be a string giving the version of the game. This is included as part of tracebacks and other log files, helping to identify the version of the game being used."], "config.nearest_neighbor": ["config", "config.nearest_neighbor", " = False", "", "var", "Uses nearest-neighbor filtering by default, to support pixel art or melting players' eyes."], "config.idle_gc_count": ["config", "config.idle_gc_count", " = 2500", "", "var", "The net number of objects that triggers a collection when Ren'Py has reached a steady state. (The fourth frame or later after the screen has been updated.)"], "config.allow_screensaver": ["config", "config.allow_screensaver", " = True", "", "var", "If True, the screensaver may activite while the game is running. If False, the screensaver is disabled."], "config.gc_print_unreachable": ["config", "config.gc_print_unreachable", " = False", "", "var", "If True, Ren'Py will print to its console and logs information about the objects that are triggering collections."], "config.longpress_vibrate": ["config", "config.longpress_vibrate", " = .1", "", "var", "The amount of time the device will vibrate for after a longpress."], "config.say_arguments_callback": ["config", "config.say_arguments_callback", " = None", "", "var", "If not None, this should be a function that takes the speaking character, followed by positional and keyword arguments. It's called whenever a say statement occurs with the arguments to that say statement. This always includes an interact argument, and can include others provided in the say statement.\n\nThis should return a pair, containing a tuple of positional arguments (almost always empty), and a dictionary of keyword arguments (almost always with at least interact in it).\n\nFor example\n```\ndef say_arguments_callback(who, interact=True, color=\\#fff\\):\nreturn (), { \\interact\\ : interact, \\what_color\\ : color }\n\nconfig.say_arguments_callback = say_arguments_callback\n\n```"], "config.adjust_view_size": ["config", "config.adjust_view_size", " = None", "", "var", "If not None, this should be a function taking two arguments, the width and height of the physical window. It is expected to return a tuple giving the width and height of the OpenGL viewport, the portion of the screen that Ren'Py will draw pictures to.\n\nThis can be used to configure Ren'Py to only allow certain sizes of screen. For example, the following allows only integer multiples of the original screen size\n```\ninit python:\n\ndef force_integer_multiplier(width, height):\nmultiplier = min(width / config.screen_width, height / config.screen_height)\nmultiplier = max(int(multiplier), 1)\nreturn (multiplier * config.screen_width, multiplier * config.screen_height)\n\nconfig.adjust_view_size = force_integer_multiplier\n\n```"], "config.language": ["config", "config.language", " = None", "", "var", "If not None, this should be a string giving the default language that the game is translated into by the translation framework."], "config.profile": ["config", "config.profile", " = False", "", "var", "If set to True, some profiling information will be output to stdout."], "config.game_menu_music": ["config", "config.game_menu_music", " = None", "", "var", "If not None, a music file to play when at the game menu."], "config.enter_sound": ["config", "config.enter_sound", " = None", "", "var", "If not None, this is a sound file that is played when entering the game menu."], "config.side_image_change_transform": ["side_image", "config.side_image_change_transform", " = None", "", "var", "If not None, a transform that is used when the new side image does not share the name image tag (or one of the new or old side images does not exist)."], "config.window_icon": ["config", "config.window_icon", " = None", "", "var", "If not None, this is expected to be the filename of an image giving an icon that is used for the game's main window. This does not set the icon used by windows executables and mac apps, as those are controlled by :ref:`special-files`."], "config.side_image_prefix_tag": ["side_image", "config.side_image_prefix_tag", " = 'side'", "", "var", "The prefix that is used when searching for a side image."], "config.menu_window_subtitle": ["config", "config.menu_window_subtitle", " = \"\"", "", "var", "The :var:`_window_subtitle` variable is set to this value when entering the main or game menus."], "config.loadable_callback": ["config", "config.loadable_callback", " = None", "", "var", "When not None, a function that's called with a filename. It should return True if the file is loadable, and False if not. This can be used with :var:`config.file_open_callback` or :var:`config.missing_image_callback`."], "config.mouse_hide_time": ["config", "config.mouse_hide_time", " = 30", "", "var", "The mouse is hidden after this number of seconds has elapsed without any mouse input. This should be set to longer than the expected time it will take to read a single screen, so mouse users will not experience the mouse appearing then disappearing between clicks.\n\nIf None, the mouse will never be hidden."], "config.gestures": ["gesture", "config.gestures", " = { \"n_s_w_e_w_e\" : \"progress_screen\" }", "", "var", "A map from gesture to the event activated by the gesture."], "config.replace_text": ["config", "config.replace_text", " = None", "", "var", "If not None, a function that is called with a single argument, a text to be displayed to the user. The function can return the same text it was passed, or a replacement text that will be displayed instead.\n\nThe function is called after substitutions have been performed and after the text has been split on tags, so its argument contains nothing but actual text. All displayed text passes through the function: not only dialogue text, but also user interface text.\n\nThis can be used to replace specific ASCII sequences with corresponding Unicode characters, as demonstrated by the following\n```\ndef replace_text(s):\ns = s.replace(\\'\\, u'\\u2019') # apostrophe\ns = s.replace('--', u'\\u2014') # em dash\ns = s.replace('...', u'\\u2026') # ellipsis\nreturn s\nconfig.replace_text = replace_text\n\n```"], "config.screen_width": ["config", "config.screen_width", " = 800", "", "var", "The width of the screen. Usually set by :func:`gui.init`."], "config.cache_surfaces": ["config", "config.cache_surfaces", " = False", "", "var", "If True, the underlying data of an image is stored in RAM, allowing image manipulators to be applied to that image without reloading it from disk. If False, the data is dropped from the cache, but kept as a texture in video memory, reducing RAM usage."], "config.custom_text_tags": ["custom_text_tags", "config.custom_text_tags", "", "", "var", "Maps text tag names to text tag functions, when the text tag can wrap other text."], "config.predict_statements": ["config", "config.predict_statements", " = 32", "", "var", "This is the number of statements, including the current one, to consider when doing predictive image loading. A breadth-first search from the current statement is performed until this number of statements is considered, and any image referenced in those statements is potentially predictively loaded. Setting this to 0 will disable predictive loading of images."], "config.play_channel": ["config", "config.play_channel", " = \"audio\"", "", "var", "The name of the audio channel used by :func:`renpy.play`, :propref:`hover_sound`, and :propref:`activate_sound`."], "config.transform_uses_child_position": ["config", "config.transform_uses_child_position", " = True", "", "var", "If True, transforms will inherit :ref:`position properties ` from their child. If not, they won't."], "config.after_load_callbacks": ["config", "config.after_load_callbacks", " = [ ... ]", "", "var", "A list of functions that are called (with no arguments) when a load occurs."], "config.save_physical_size": ["config", "config.save_physical_size", " = True", "", "var", "If True, the physical size of the window will be saved in the preferences, and restored when the game resumes."], "config.say_attribute_transition": ["config", "config.say_attribute_transition", " = None", "", "var", "If not None, a transition to use when the image is changed by a say statement with image attributes."], "config.lint_hooks": ["config", "config.lint_hooks", " = ...", "", "var", "This is a list of functions that are called, with no arguments, when lint is run. The functions are expected to check the script data for errors, and print any they find to standard output (using the Python ``print`` statement is fine in this case)."], "config.side_image_same_transform": ["side_image", "config.side_image_same_transform", " = None", "", "var", "If not None, a transform that is used when the new side image shares the same image tag as the previous side image."], "config.context_copy_remove_screens": ["config", "config.context_copy_remove_screens", " = [ 'notify' ]", "", "var", "Contains a list of screens that are removed when a context is copied for rollback or saving."], "config.sound": ["config", "config.sound", " = True", "", "var", "If True, sound works. If False, the sound/mixer subsystem is completely disabled."], "config.searchpath": ["config", "config.searchpath", " = [ 'common', 'game' ]", "", "var", "A list of directories that are searched for images, music, archives, and other media, but not scripts. This is initialized to a list containing \\common\\ and the name of the game directory."], "config.window": ["config", "config.window", " = None", "", "var", "This controls the default method of dialogue window management. If not None, this should be one of \\show\\, \\hide\\, or \\auto\\.\n\nWhen set to \\show\\, the dialogue window is shown at all times. When set to \\hide\\, the dialogue window is hidden when not in a say statement or other statement that displays dialogue. When set to \\auto\\, the dialogue window is hidden before scene statements, and shown again when dialogue is shown.\n\nThis sets the default. Once set, the default can be changed using the ``window show``, ``window hide`` and ``window auto`` statements. See :ref:`dialogue-window-management` for more information."], "config.window_auto_hide": ["config", "config.window_auto_hide", " = [ 'scene', 'call screen', 'menu', \"say-centered\" ]", "", "var", "A list of statements that cause ``window auto`` to hide the empty dialogue window."], "config.say_layer": ["config", "config.say_layer", " = \"screens\"", "", "var", "The layer the say screen is shown on."], "config.exit_replay_transition": ["config", "config.exit_replay_transition", " = None", "", "var", "If not None, a transition that is used when exiting a replay."], "config.autosave_on_input": ["config", "config.autosave_on_input", " = True", "", "var", "If True, Ren'Py will autosave when the user inputs text. (When :func:`renpy.input` is called.)"], "config.default_sfx_volume": ["preferences", "config.default_sfx_volume", " = 1.0", "", "var", "The default volume of the sfx mixer, which is used for the sound audio channel. This should be a number between 0.0 and 1.0, with 1.0 being full volume."], "config.developer": ["config", "config.developer", " = \"auto\"", "", "var", "If set to True, developer mode is enabled. Developer mode gives access to the shift+D developer menu, shift+R reloading, and various other features that are not intended for end users.\n\nThis can be True, False, or \\auto\\. If \\auto\\, Ren'Py will detect if the game has been packaged into a distribution, and set config.developer as appropriate."], "config.intra_transition": ["config", "config.intra_transition", " = None", "", "var", "The transition that is used between screens of the game menu."], "config.end_game_transition": ["config", "config.end_game_transition", " = None", "", "var", "The transition that is used to display the main menu after the game ends normally, either by invoking return with no place to return to, or by calling :func:`renpy.full_restart`."], "config.narrator_menu": ["config", "config.narrator_menu", " = False", "", "var", "(This is set to True by the default screens.rpy file.) If true, then narration inside a menu is displayed using the narrator character. Otherwise, narration is displayed as captions within the menu itself."], "config.nvl_paged_rollback": ["nvl_mode", "config.nvl_paged_rollback", " = False", "", "var", "If true, NVL-mode rollback will occur a full page at a time."], "config.after_replay_callback": ["config", "config.after_replay_callback", " = None", "", "var", "If not None, a function that is called with no arguments after a replay completes."], "config.movie_mixer": ["config", "config.movie_mixer", " = \"music\"", "", "var", "The mixer that is used when a :func:`Movie` automatically defines a channel for video playback."], "config.keep_running_transform": ["config", "config.keep_running_transform", " = True", "", "var", "If True, showing an image without supplying a transform or ATL block will cause the image to continue the previous transform an image with that tag was using, if any. If False, the transform is stopped."], "config.mouse": ["config", "config.mouse", " = None", "", "var", "This variable controls the use of user-defined mouse cursors. If None, the system mouse is used, which is usually a black-and-white mouse cursor.\n\nOtherwise, this should be a dictionary giving the mouse animations for various mouse types. Keys used by the default library include \\default\\, \\say\\, \\with\\, \\menu\\, \\prompt\\, \\imagemap\\, \\pause\\, \\mainmenu\\, and \\gamemenu\\. The \\default\\ key should always be present, as it is used when a more specific key is absent.\n\nEach value in the dictionary should be a list of (`image`, `xoffset`, `yoffset`) tuples, representing frames.\n\n`image` The mouse cursor image. The maximum size for this image varies based on the player's hardware. 32x32 is guaranteed to work everywhere, while 64x64 works on most hardware. Larger images may not work.\n\n`xoffset` The offset of the hotspot pixel from the left side of the cursor.\n\n`yoffset` The offset of the hotspot pixel from the top of the cursor.\n\nThe frames are played back at 20Hz, and the animation loops after all frames have been shown."], "config.game_main_transition": ["config", "config.game_main_transition", " = None", "", "var", "The transition that is used to display the main menu after leaving the game menu. This is used when the load and preferences screens are invoked from the main menu, and it's also used when the user picks \\Main Menu\\ from the game menu."], "config.file_open_callback": ["config", "config.file_open_callback", " = None", "", "var", "If not None, this is a function that is called with the file name when a file needs to be opened. It should return a file-like object, or None to load the file using the usual Ren'Py mechanisms. Your file-like object must implement at least the read, seek, tell, and close methods.\n\nOne may want to also define a :var:`config.loadable_callback` that matches this."], "config.per_frame_screens": ["config", "config.per_frame_screens", " = [ ... ]", "", "var", "This is a list of strings giving the name of screens that are updated once per frame, rather than once per interaction. Ren'Py uses this internally, so if you add a screen, append the name rather than replacing the list in its entirety."], "config.mouse_displayable": ["config", "config.mouse_displayable", " = None", "", "var", "If not None, this should either be a displayable, or a callable that returns a displayable. The callable may return None, in which case Ren'Py proceeds if the displayable is None.\n\nIf a displayable is given, the mouse cursor is hidden, and the displayable is shown above anything else. This displayable is responsible for positioning and drawing a sythetic mouse cursor, and so should probably be a :func:`MouseDisplayable` or something very similar."], "config.skip_delay": ["config", "config.skip_delay", " = 75", "", "var", "The amount of time that dialogue will be shown for, when skipping statements using ctrl, in milliseconds. (Although it's nowhere near that precise in practice.)"], "config.nvl_page_ctc": ["nvl_mode", "config.nvl_page_ctc", " = None", "", "var", "If not None, this is the click-to-continue indicator that is used for NVL mode characters that are at the end of a page. (That is, immediately followed by an nvl clear statement.) This replaces the ctc parameter of :func:`Character`."], "config.screenshot_pattern": ["config", "config.screenshot_pattern", " = \"screenshot%04d.png\"", "", "var", "The pattern used to create screenshot files. This pattern is applied (using Python's %-formatting rules) to the natural numbers to generate a sequence of filenames. The filenames may be absolute, or relative to config.renpy_base. The first filename that does not exist is used as the name of the screenshot.\n\nDirectories are created if they do not exist.\n\nSee also :var:`_screenshot_pattern`, which is used in preference to this variable if not None."], "config.controller_blocklist": ["config", "config.controller_blocklist", " = [ ... ]", "", "var", "A list of strings, where each string is matched against the GUID of a game controller. These strings are mached as a prefix to the controller GUID (which cand be found in log.txt), and if matched, prevent the controller from being initialized."], "config.locale_to_language_function": ["config", "config.locale_to_language_function", " = ...", "", "var", "A function that determines the language the game should use, based on the the user's locale. It takes 2 string arguments that give the ISO code of the locale and the ISO code of the region.\n\nIt should return a string giving the name of a translation to use, or None to use the default translation."], "config.overlay_screens": ["config", "config.overlay_screens", " = [ ... ]", "", "var", "A list of screens that are displayed when the overlay is enabled, and hidden when the overlay is suppressed. (The screens are shown on the screens layer, not the overlay layer.)"], "config.afm_characters": ["config", "config.afm_characters", " = 250", "", "var", "The number of characters in a string it takes to cause the amount of time specified in the auto forward mode preference to be delayed before auto-forward mode takes effect."], "config.adv_nvl_transition": ["config", "config.adv_nvl_transition", " = None", "", "var", "A transition that is used when showing NVL-mode text directly after ADV-mode text."], "config.window_hide_transition": ["config", "config.window_hide_transition", " = None", "", "var", "The transition used by the window hide statement when no transition has been explicitly specified."], "config.keep_side_render_order": ["config", "config.keep_side_render_order", " = True", "", "var", "If True, the order of substrings in the Side positions will be determine the order of children render."], "config.gl2": ["model", "config.gl2", " = False", "", "var", "If true, Ren'Py will default to using a model-based renderer."], "config.imagemap_cache": ["config", "config.imagemap_cache", " = True", "", "var", "If True, imagemap hotspots will be cached to PNG files, reducing time and memory usage, but increasing the size of the game on disk. Set this to False to disable this behavior."], "config.longpress_duration": ["config", "config.longpress_duration", " = 0.5", "", "var", "The amount of time the player must press the screen for a longpress to be recognized on a touch device."], "config.rollback_enabled": ["config", "config.rollback_enabled", " = True", "", "var", "Should the user be allowed to rollback the game? If set to False, the user cannot interactively rollback."], "config.longpress_radius": ["config", "config.longpress_radius", " = 15", "", "var", "The number of pixels the touch must remain within for a press to be recognized as a longpress."], "config.defer_styles": ["config", "config.defer_styles", " = False", "", "var", "When true, the execution of style statements is deferred until after all ``translate python`` blocks have executed. This lets a ``translate python`` block update variables that are then used in style (not translate style) statements.\n\nWhile this defaults to False, it's set to True when :func:`gui.init` is called."], "config.descriptive_text_character": ["self_voicing", "config.descriptive_text_character", " = None", "", "var", "If not None, this should be a character object that is used to display the descriptive text."], "config.side_image_only_not_showing": ["side_image", "config.side_image_only_not_showing", " = False", "", "var", "When set to true, the side image will only show if an image with that tag is not already being shown on the screen."], "config.say_allow_dismiss": ["config", "config.say_allow_dismiss", " = None", "", "var", "If not None, this should be a function. The function is called with no arguments when the user attempts to dismiss a :ref:`say statement `. If this function returns True, the dismissal is allowed, otherwise it is ignored."], "config.missing_label_callback": ["config", "config.missing_label_callback", " = None", "", "var", "If not None, this function is called when Ren'Py attempts to access a label that does not exist in the game. The callback should take a single parameter, the name of the missing label. It should return the name of a label to use as a replacement for the missing label, or None to cause Ren'Py to raise an exception."], "config.game_menu": ["config", "config.game_menu", " = [ ... ]", "", "var", "This is used to customize the choices on the game menu. Please read Main and Game Menus for more details on the contents of this variable.\n\nThis is not used when the game menu is defined using screens."], "config.all_character_callbacks": ["config", "config.all_character_callbacks", " = [ ]", "", "var", "A list of callbacks that are called by all characters. This list is prepended to the list of character-specific callbacks."], "config.autosave_frequency": ["config", "config.autosave_frequency", " = 200", "", "var", "Roughly, the number of interactions that will occur before an autosave occurs. To disable autosaving, set :var:`config.has_autosave` to False, don't change this variable."], "config.nvl_page_ctc_position": ["nvl_mode", "config.nvl_page_ctc_position", " = \"nestled\"", "", "var", "If not None, this is the click-to-continue indicator position that is used for NVL mode characters that are at the end of a page. (That is, immediately followed by an nvl clear statement.) This replaces the ctc_position parameter of :func:`Character`."], "config.default_music_volume": ["preferences", "config.default_music_volume", " = 1.0", "", "var", "The default volume of the music mixer, which is used for the music and movie audio channels. This should be a number between 0.0 and 1.0, with 1.0 being full volume."], "config.minimum_presplash_time": ["config", "config.minimum_presplash_time", " = 0.0", "", "var", "The minimum amount of time, in seconds, a presplash, Android presplash, or iOS LaunchImage is displayed for. If Ren'Py initializes before this amount of time has been reached, it will sleep to ensure the image is shown for at least this amount of time. The image may be shown longer if Ren'Py takes longer to start up."], "config.overlay_functions": ["config", "config.overlay_functions", " = [ ]", "", "var", "A list of functions. When called, each function is expected to use ui functions to add displayables to the overlay layer."], "config.reload_modules": ["config", "config.reload_modules", " = [ ]", "", "var", "A list of strings giving the names of python modules that should be reloaded along with the game. Any submodules of these modules will also be reloaded."], "config.quit_callbacks": ["config", "config.quit_callbacks", " = ...", "", "var", "A list of functions that are called (without any arguments) when Ren'Py terminates. This is intended to free resources, such as opened files or started threads."], "config.context_callback": ["config", "config.context_callback", " = None", "", "var", "This is a callback that is called when Ren'Py enters a new context, such as a menu context."], "config.pause_after_rollback": ["config", "config.pause_after_rollback", " = False", "", "var", "If False, the default, rolling back will skip any pauses (timed or not) and stop only at other interactions such as dialogues, menus... If True, renpy will include timeless pauses to the valid places a rollback can take the user."], "config.image_cache_size_mb": ["config", "config.image_cache_size_mb", " = 300", "", "var", "This is used to set the size of the :ref:`image cache `, in megabytes. If :var:`config.cache_surfaces` is False, an image takes 4 bytes per pixel, otherwise it takes 8 bytes per pixel.\n\nIf set too large, this can waste memory. If set too small, images can be repeatedly loaded, hurting performance. If not none, :var:`config.image_cache_size` is used instead of this variable."], "config.name": ["config", "config.name", " = \"\"", "", "var", "This should be a string giving the name of the game. This is included as part of tracebacks and other log files, helping to identify the version of the game being used."], "config.nvl_list_length": ["nvl_mode", "config.nvl_list_length", " = None", "", "var", "If not None, the maximum length of the the list of NVL dialogue. This can be set (often in conjuction with forcing the dialogue to have a fixed height) in order to emulate an infinite scrolling NVL window."], "config.emphasize_audio_volume": ["config", "config.emphasize_audio_volume", " = 0.5", "", "var", "See above."], "config.mipmap_dissolves": ["config", "config.mipmap_dissolves", " = False", "", "var", "The default value of the mipmap argument to :func:`Dissolve`, :func:`ImageDissolve`, :func:`AlphaDissolve`, and :func:`AlphaMask`."], "config.missing_image_callback": ["config", "config.missing_image_callback", " = None", "", "var", "If not None, this function is called when an attempt to load an image fails. It may return None, or it may return an image manipulator. If an image manipulator is returned, that image manipulator is loaded in the place of the missing image.\n\nOne may want to also define a :var:`config.loadable_callback`, especially if this is used with a :func:`DynamicImage`."], "config.implicit_with_none": ["config", "config.implicit_with_none", " = True", "", "var", "If True, then by default the equivalent of a :ref:`with None ` statement will be performed after interactions caused by dialogue, menus input, and imagemaps. This ensures that old screens will not show up in transitions."], "config.disable_input": ["config", "config.disable_input", " = False", "", "var", "When true, :func:`renpy.input` terminates immediately and returns its `default` argument."], "config.afm_voice_delay": ["config", "config.afm_voice_delay", " = .5", "", "var", "The number of seconds after a voice file finishes playing before AFM can advance text."], "config.keymap": ["config", "config.keymap", " = dict(...)", "", "var", "This variable contains a keymap giving the keys and mouse buttons assigned to each possible operation. Please see the section on Keymaps for more information."], "config.auto_choice_delay": ["config", "config.auto_choice_delay", " = None", "", "var", "If not None, this variable gives a number of seconds that Ren'Py will pause at an in-game menu before picking a random choice from that menu. We'd expect this variable to always be set to None in released games, but setting it to a number will allow for automated demonstrations of games without much human interaction."], "config.profile_init": ["config", "config.profile_init", " = 0.25", "", "var", "``init`` and ``init python`` blocks taking longer than this amount of time to run are reported to log file."], "config.load_before_transition": ["config", "config.load_before_transition", " = True", "", "var", "If True, the start of an interaction will be delayed until all images used by that interaction have loaded. (Yeah, it's a lousy name.)"], "config.save_on_mobile_background": ["config", "config.save_on_mobile_background", " = True", "", "var", "If True, the mobile app will save its state when it loses focus. The state is saved in a way that allows it to be automatically loaded (and the game to resume its place) when the app starts again."], "config.hide": ["config", "config.hide", " = renpy.hide", "", "var", "A function that is called when the :ref:`hide statement ` is executed. This should take the same arguments as renpy.hide."], "config.auto_channels": ["config", "config.auto_channels", " = { \"audio\" : ( \"sfx\", \"\", \"\" ) }", "", "var", "This is used to define automatic audio channels. It's a map the channel name to a tuple containing 3 components:\n\n* The mixer the channel uses. * A prefix that is given to files played on the channel. * A suffix that is given to files played on the channel."], "config.exit_yesno_transition": ["config", "config.exit_yesno_transition", " = None", "", "var", "If not None, a transition that is used when exiting the yes/no prompt screen."], "config.audio_filename_callback": ["config", "config.audio_filename_callback", " = None", "", "var", "If not None, this is a function that is called with an audio filename, and is expected to return a second audio filename, the latter of which will be played.\n\nThis is intended for use when an a games has audio file formats changed, but it's not destired to update the game script."], "config.conditionswitch_predict_all": ["config", "config.conditionswitch_predict_all", " = False", "", "var", "The default value of the predict_all argument for :func:`ConditionSwitch` and :func:`ShowingSwitch`, which determines if all possible displayables are shown."], "config.tag_layer": ["config", "config.tag_layer", " = { }", "", "var", "A dictionary mapping image tag strings to layer name strings. When an image is shown without a specific layer name, the image's tag is looked up in this dictionary to get the layer to show it on. If the tag is not found here, :var:`config.default_tag_name` is used."], "config.save_directory": ["config", "config.save_directory", " = \"...\"", "", "var", "This is used to generate the directory in which games and persistent information are saved. The name generated depends on the platform:\n\nWindows %APPDATA%/RenPy/`save_directory`\n\nMac OS X ~/Library/RenPy/`save_directory`\n\nLinux/Other ~/.renpy/`save_directory`\n\nSetting this to None creates a \\saves\\ directory underneath the game directory. This is not recommended, as it prevents the game from being shared between multiple users on a system. It can also lead to problems when a game is installed as Administrator, but run as a user.\n\nThis must be set with either the define statement, or in a ``python early`` block. In either case, this will be run before any other statement, and so it should be set to a string, not an expression.\n\nTo locate the save directory, read :var:`config.savedir` instead of this variable."], "config.label_callback": ["config", "config.label_callback", " = None", "", "var", "If not None, this is a function that is called whenever a label is reached. It is called with two parameters. The first is the name of the label. The second is True if the label was reached through jumping, calling, or creating a new context, and False otherwise."], "config.allow_underfull_grids": ["config", "config.allow_underfull_grids", " = False", "", "var", "If True, Ren'Py will not require grids to be full in order to display."], "config.thumbnail_width": ["config", "config.thumbnail_width", " = 100", "", "var", "The width of the thumbnails that are taken when the game is saved. These thumbnails are shown when the game is loaded. Please note that the thumbnail is shown at the size it was taken at, rather than the value of this setting when the thumbnail is shown to the user.\n\nThis is changed by the default GUI."], "config.steam_appid": ["achievement", "config.steam_appid", " = None", "", "var", "If not None, this should be the Steam appid. Ren'Py will automatically set this appid when it starts. This needs to be set using the define statement\n\ndefine config.steam_appid = 12345"], "config.input_caret_blink": ["config", "config.input_caret_blink", " = 1.0", "", "var", "If not False, sets the blinking period of the default caret, in seconds."], "config.main_menu_music_fadein": ["config", "config.main_menu_music_fadein", " = 0.0", "", "var", "The number of seconds to take to fade in :var:`config.main_menu_music`."], "config.exit_sound": ["config", "config.exit_sound", " = None", "", "var", "If not None, this is a sound file that is played when exiting the game menu."], "config.overlay_layers": ["config", "config.overlay_layers", " = [ 'overlay' ]", "", "var", "This is a list of all of the overlay layers. Overlay layers are cleared before the overlay functions are called. \\overlay\\ should always be in this list."], "config.character_callback": ["config", "config.character_callback", " = None", "", "var", "The default value of the callback parameter of Character."], "config.has_autosave": ["config", "config.has_autosave", " = True", "", "var", "If true, the game will autosave. If false, no autosaving will occur."], "config.context_fadein_music": ["config", "config.context_fadein_music", " = 0", "", "var", "The amount of time in seconds Ren'Py spends fading in music when the music is played due to a context change. (Usually, when the game is loaded.)"], "config.python_callbacks": ["config", "config.python_callbacks", " = [ ]", "", "var", "A list of functions. The functions in this list are called, without any arguments, whenever a Python block is run outside of the init phase.\n\nOne possible use of this would be to have a function limit a variable to within a range each time it is adjusted.\n\nThe functions may be called while Ren'Py is starting up, before the start of the game proper, and potentially before the variables the function depends on are initialized. The functions are required to deal with this, perhaps by using ``hasattr(store, 'varname')`` to check if a variable is defined."], "config.skip_indicator": ["config", "config.skip_indicator", " = True", "", "var", "If True, the library will display a skip indicator when skipping through the script."], "config.side_image_null": ["side_image", "config.side_image_null", " = Null()", "", "var", "The Null displayable to use when not displaying a side image. This be changed, but only to other Null objects. One reason for doing so would be to set the side of the Null (eg. ``Null(width=200, height=150)``) to prevent dissolves from being cut off."], "config.exit_transition": ["config", "config.exit_transition", " = None", "", "var", "If not None, this variable should give a transition that will be performed when exiting the game menu."], "config.adjust_attributes": ["config", "config.adjust_attributes", " = { }", "", "var", "If not None, this is a dictionary. When a statement or function that contains image attributes executes or is predicted, the tag is looked up in this dictionary. If it is not found, the None key is looked up in this dictionary.\n\nIf either is found, they're expected to be a function. The function is given an image name, a tuple consisting of the tag and any attributes. It should return an adjusted tuple, which contains and a potential new set of attributes.\n\nAs this function may be called during prediction, it should not rely on the image's state."], "config.label_overrides": ["config", "config.label_overrides", " = { }", "", "var", "This variable gives a way of causing jumps and calls of labels in Ren'Py script to be redirected to other labels. For example, if you add a mapping from \\start\\ to \\mystart\\, all jumps and calls to \\start\\ will go to \\mystart\\ instead."], "config.variants": ["config", "config.variants", " = [ ... ]", "", "var", "A list of screen variants that are searched when choosing a screen to display to the user. This should always end with None, to ensure that the default screens are chosen. See :ref:`screen-variants`."], "config.log_live2d_loading": ["live2d", "config.log_live2d_loading", " = False", "", "var", "If True, loaded path and used motions and expressions will be written to log.txt on start."], "config.log_width": ["config", "config.log_width", " = 78", "", "var", "The width of lines logged when :var:`config.log` is used."], "config.window_overlay_functions": ["config", "config.window_overlay_functions", " = []", "", "var", "A list of overlay functions that are only called when the window is shown."], "config.rollback_length": ["config", "config.rollback_length", " = 128", "", "var", "When there are more than this many statements in the rollback log, Ren'Py will consider trimming the log. This also covers how many steps Ren'Py will rollback when trying to load a save when the script has changed.\n\nDecreasing this below the default value may cause Ren'Py to become unstable."], "config.sound_sample_rate": ["config", "config.sound_sample_rate", " = 48000", "", "var", "The sample rate that the sound card will be run at. If all of your wav files are of a lower rate, changing this to that rate may make things more efficient."], "config.return_not_found_label": ["config", "config.return_not_found_label", " = None", "", "var", "If not None, a label that is jumped to when a return site is not found. The call stack is cleared before this jump occurs."], "config.debug_image_cache": ["config", "config.debug_image_cache", " = False", "", "var", "If True, Ren'Py will write information about the :ref:`image cache ` to image_cache.txt."], "config.search_prefixes": ["config", "config.search_prefixes", " = [ \"\", \"images/\" ]", "", "var", "A list of prefixes that are prepended to filenames that are searched for."], "config.default_voice_volume": ["preferences", "config.default_voice_volume", " = 1.0", "", "var", "The default volume of the voice mixer, which is used for the voice audio channel (And hence the voice statement, auto-voice, etc.). This should be a number between 0.0 and 1.0, with 1.0 being full volume."], "config.choice_layer": ["config", "config.choice_layer", " = \"screens\"", "", "var", "The layer the choice screen (used by the menu statement) is shown on."], "config.default_transform": ["config", "config.default_transform", " = ...", "", "var", "When a displayable is shown using the show or scene statements, the transform properties are taken from this transform and used to initialize the values of the displayable's transform.\n\nThe default transform is :var:`center`."], "config.tts_voice": ["config", "config.tts_voice", " = None", "", "var", "If not None, a string giving a non-default voice that is used to play back text-to-speech for self voicing. The possible choices are platform specific, and so this should be set in a platform-specific manner. (It may make sense to change this in translations, as well.)"], "config.say_sustain_callbacks": ["config", "config.say_sustain_callbacks", " = ...", "", "var", "A list of functions that are called, without arguments, before the second and later interactions caused by a line of dialogue with pauses in it. Used to sustain voice through pauses."], "config.say_attribute_transition_layer": ["config", "config.say_attribute_transition_layer", " = None", "", "var", "If not None, this must be a string giving the name of a layer. (Almost always \\master\\.) The say attribute is applied to the named layer, and Ren'Py will not pause to wait for the transition to occur. This will have the effect of transitioning in the attribute as dialogue is shown."], "config.character_id_prefixes": ["config", "config.character_id_prefixes", " = [ ]", "", "var", "This specifies a list of style property prefixes that can be given to a :func:`Character`. When a style prefixed with one of the given prefix is given, it is applied to the displayable with that prefix as its ID.\n\nFor example, the default GUI adds \\namebox\\ to this. When a Character is given the `namebox_background` property, it sets :propref:`background` on the displayable in the say screen with the id \\namebox\\."], "config.interact_callbacks": ["config", "config.interact_callbacks", " = ...", "", "var", "A list of functions that are called (without any arguments) when an interaction is started or restarted."], "config.replay_scope": ["config", "config.replay_scope", " = { \"_game_menu_screen\" : \"preferences\" }", "", "var", "A dictionary mapping variables in the default store to the values the variables will be given when entering a replay."], "config.window_show_transition": ["config", "config.window_show_transition", " = None", "", "var", "The transition used by the window show statement when no transition has been explicitly specified."], "config.dispatch_gesture": ["gesture", "config.dispatch_gesture", " = None", "", "var", "The function that is used to dispatch gestures. This function is passed the raw gesture string. If it returns non-None, the interaction ends. If this variable is None, a default dispatch function is used."], "config.load_failed_label": ["config", "config.load_failed_label", " = None", "", "var", "If a string, this is a label that is jumped to when a load fails because the script has changed so much that Ren'Py can't recover. Before performing the load, Ren'Py will revert to the start of the last statement, then it will clear the call stack.\n\nThis may also be a function. If it is, the function is called with no arguments, and is expected to return a string giving the label."], "config.savedir": ["config", "config.savedir", " = ...", "", "var", "The complete path to the directory in which the game is saved. This should only be set in a ``python early`` block. See also config.save_directory, which generates the default value for this if it is not set during a ``python early`` block."], "config.side_image_tag": ["side_image", "config.side_image_tag", " = None", "", "var", "If this is given, then the side image will track the given image tag, rather than the image associated with currently speaking character. For example,\n```\ndefine e = Character(\\Eileen\\, image=\\eileen\\)\n\ninit python:\n config.side_image_tag = \\eileen\\\n\nWill make the side image track the \\eileen\\ image tag, which is associated\nwith the ``e`` character.\n\n```"], "config.autosave_slots": ["config", "config.autosave_slots", " = 10", "", "var", "The number of slots used by autosaves."], "config.manage_gc": ["config", "config.manage_gc", " = True", "", "var", "If True, Ren'Py will manage the GC itself. This means that it will apply the settings below."], "config.hyperlink_protocol": ["config", "config.hyperlink_protocol", " = \"call_in_new_context\"", "", "var", "The protocol that is used for hyperlinks that do not have a protocol assigned to them. See :ref:`the a text tag ` for a description as to what the possible protocols mean."], "config.hyperlink_handlers": ["config", "config.hyperlink_handlers", " = { ... }", "", "var", "A dictionary mapping a hyperlink protocol to the handler for that protocol. A handler is a function that takes the value (everything after the :) and performs some action. If a value is returned, the interaction ends. Otherwise, the click is ignored and the interaction continues."], "config.focus_crossrange_penalty": ["config", "config.focus_crossrange_penalty", " = 1024", "", "var", "This is the amount of penalty to apply to moves perpendicular to the selected direction of motion, when moving focus with the keyboard."], "config.overlay_during_with": ["config", "config.overlay_during_with", " = True", "", "var", "True if we want overlays to be shown during :ref:`with statements `, or False if we'd prefer that they be hidden during the with statements."], "config.tag_transform": ["config", "config.tag_transform", " = { }", "", "var", "A dictionary mapping image tag strings to transforms or lists of transforms. When an image is newly-shown without an at clause, the image's tag is looked up in this dictionary to find a transform or list of transforms to use."], "config.save_dump": ["config", "config.save_dump", " = False", "", "var", "If set to True, Ren'Py will create the file save_dump.txt whenever it saves a game. This file contains information about the objects contained in the save file. Each line consists of a relative size estimate, the path to the object, information about if the object is an alias, and a representation of the object."], "config.gl_test_image": ["config", "config.gl_test_image", " = \"black\"", "", "var", "The name of the image that is used when running the OpenGL performance test. This image will be shown for 5 frames or .25 seconds, on startup. It will then be automatically hidden."], "config.periodic_callback": ["config", "config.periodic_callback", " = None", "", "var", "If not None, this should be a function. The function is called, with no arguments, at around 20Hz."], "config.quicksave_slots": ["config", "config.quicksave_slots", " = 10", "", "var", "The number of slots used by quicksaves."], "config.empty_window": ["config", "config.empty_window", " = ...", "", "var", "This is called when _window is True, and no window has been shown on the screen. (That is, no call to :func:`renpy.shown_window` has occurred.) It's expected to show an empty window on the screen, and return without causing an interaction.\n\nThe default implementation of this uses the narrator character to display a blank line without interacting."], "config.fast_skipping": ["config", "config.fast_skipping", " = False", "", "var", "Set this to True to allow fast skipping outside of developer mode."], "config.old_substitutions": ["config", "config.old_substitutions", " = False", "", "var", "If True, Ren'Py will apply old-style (percent) substitutions to text displayed by the :ref:`say ` and :ref:`menu ` statements."], "config.auto_voice": ["config", "config.auto_voice", " = None", "", "var", "This may be a string, a function, or None. If None, auto-voice is disabled.\n\nIf a string, this is formatted with the ``id`` variable bound to the identifier of the current line of dialogue. If this gives an existing file, that file is played as voice audio.\n\nIf a function, the function is called with a single argument, the identifier of the current line of dialogue. The function is expected to return a string. If this gives an existing file, that file is played as voice audio.\n\nSee :ref:`Automatic Voice ` for more details."], "config.auto_movie_channel": ["config", "config.auto_movie_channel", " = True", "", "var", "If True, and the `play` argument is give to :func:`Movie`, an audio channel name is automatically generated for each movie.\n\n:var:`config.single_movie_channel` takes precendece over this variable."], "config.gl_clear_color": ["config", "config.gl_clear_color", " = \"#000\"", "", "var", "The color that the window is cleared to before images are drawn. This is mainly seen as the color of the letterbox or pillarbox edges drawn when aspect ratio of the window or monitor in fullscreen mode) does not match the aspect ratio of the game."], "config.quit_on_mobile_background": ["config", "config.quit_on_mobile_background", " = False", "", "var", "If True, the mobile app will quit when it loses focus."], "config.pause_with_transition": ["config", "config.pause_with_transition", " = False", "", "var", "If false, :func:`renpy.pause` is always, used by the ``pause`` statement. If true, when given a delay, ``pause`` is equivalent to ``with Pause(...)``."], "config.menu_include_disabled": ["config", "config.menu_include_disabled", " = False", "", "var", "When this variable is set, choices disables with the if statement are included as disabled buttons."], "config.autosave_on_choice": ["config", "config.autosave_on_choice", " = True", "", "var", "If True, Ren'Py will autosave upon encountering an in-game choice. (When :func:`renpy.choice_for_skipping` is called.)"], "config.window_title": ["config", "config.window_title", " = None", "", "var", "The static portion of the title of the window containing the Ren'Py game. :var:`_window_subtitle` is appended to this to get the full title of the window.\n\nIf None, the default, this defaults to the value of :var:`config.name`."], "config.hard_rollback_limit": ["config", "config.hard_rollback_limit", " = 100", "", "var", "This is the number of steps that Ren'Py will let the user interactively rollback. Set this to 0 to disable rollback entirely, although we don't recommend that, as rollback is useful to let the user see text he skipped by mistake."], "config.screenshot_callback": ["config", "config.screenshot_callback", " = ...", "", "var", "A function that is called when a screenshot is taken. The function is called with a single parameter, the full filename the screenshot was saved as."], "config.help": ["config", "config.help", " = None", "", "var", "This controls the functionality of the help system invoked by the help button on the main and game menus, or by pressing F1 or Command-?.\n\nIf None, the help system is disabled and does not show up on menus. If a string corresponding to a label found in the script, that label is invoked in a new context. This allows you to define an in-game help-screen. Otherwise, this is interpreted as a filename relative to the base directory, that is opened in a web browser. If the file is not exist, the action is ignored."], "config.start_interact_callbacks": ["config", "config.start_interact_callbacks", " = ...", "", "var", "A list of functions that are called (without any arguments) when an interaction is started. These callbacks are not called when an interaction is restarted."], "config.new_translate_order": ["config", "config.new_translate_order", " = True", "", "var", "Enables the new order of style and translate statements introduced in :ref:`Ren'Py 6.99.11 `."], "config.automatic_images_strip": ["config", "config.automatic_images_strip", " = [ ]", "", "var", "A list of strings giving prefixes that are stripped out when defining automatic images. This can be used to remove directory names, when directories contain images."], "config.main_game_transition": ["config", "config.main_game_transition", " = None", "", "var", "The transition used when entering the game menu from the main menu, as is done when clicking \\Load Game\\ or \\Preferences\\."], "config.enter_yesno_transition": ["config", "config.enter_yesno_transition", " = None", "", "var", "If not None, a transition that is used when entering the yes/no prompt screen."], "config.font_replacement_map": ["config", "config.font_replacement_map", " = { }", "", "var", "This is a map from (font, bold, italics) to (font, bold, italics), used to replace a font with one that's specialized as having bold and/or italics. For example, if you wanted to have everything using an italic version of \\Vera.ttf\\ use \\VeraIt.ttf\\ instead, you could write\n```\ninit python:\nconfig.font_replacement_map[\\Vera.ttf\\, False, True] = (\\VeraIt.ttf\\, False, False)\n\nPlease note that these mappings only apply to specific variants of\na font. In this case, requests for a bold italic version of vera\nwill get a bold italic version of vera, rather than a bold version\nof the italic vera.\n\n```"], "config.image_cache_size": ["config", "config.image_cache_size", " = None", "", "var", "If not None, this is used to set the size of the :ref:`image cache `, as a multiple of the screen size. This number is multiplied by the size of the screen, in pixels, to get the size of the image cache in pixels.\n\nIf set too large, this can waste memory. If set too small, images can be repeatedly loaded, hurting performance."], "config.debug_text_overflow": ["config", "config.debug_text_overflow", " = False", "", "var", "When true, Ren'Py will log text overflows to text_overflow.txt. A text overflow occurs when a :class:`Text` displayable renders to a size larger than that allocated to it. By setting this to True and setting the :propref:`xmaximum` and :propref:`ymaximum` style properties of the dialogue window to the window size, this can be used to report cases where the dialogue is too large for its window."], "config.autoreload": ["config", "config.autoreload", " = True", "", "var", "If True, Shift+R will toggle automatic reloading. When automatic reloading is enabled, Ren'Py will reload the game whenever a used file is modified.\n\nIf False, Ren'Py will reload the game once per press of Shift+R."], "config.notify": ["config", "config.notify", " = ...", "", "var", "This is called by :func:`renpy.notify` or :func:`Notify` with a single `message` argument, to display the notification. The default implementation is :func:`renpy.display_notify`. This is intended to allow creators to intercept notifications."], "config.afm_callback": ["config", "config.afm_callback", " = None", "", "var", "If not None, a Python function that is called to determine if it is safe to auto-forward. The intent is that this can be used by a voice system to disable auto-forwarding when a voice is playing."], "config.optimize_texture_bounds": ["config", "config.optimize_texture_bounds", " = False", "", "var", "When True, Ren'Py will scan images to find the bounding box of the non-transparent pixels, and only load those pixels into a texture."], "config.nvl_layer": ["nvl_mode", "config.nvl_layer", " = \"screens\"", "", "var", "The layer the nvl screens are shown on."], "config.say_attribute_transition_callback": ["config", "config.say_attribute_transition_callback", " = ...", "", "var", "This is a function that return a transition to apply and a layer to apply it on\n\nThis should be a function that takes four arguments, the image tag being shown, a `mode` parameter, a `set` containing pre-transition tags and a `set` containing post-transition tags. Where the value of the `mode` parameter is one of:\n\n* \\permanent\\, for permanent attribute change (one that lasts longer than the current say statement). * \\temporary\\, for a temporary attribute change (one that is restored at the end of the current say statement). * \\both\\, for a simultaneous permanent and temporary attribute change (one that in part lasts longer than the current say statement, and in part is restored at the end of the current say statement). * \\restore\\, for when a temporary (or both) change is being restored.\n\nThis should return a 2-component tuple, consisting of:\n\n* The transition to use, or None if no transition should occur. * The layer the transition should be on, either a string or None. This is almost always None.\n\nThe default implementation of this returns (config.say_attribute_transition, config.say_attribute_transition_layer)."], "config.emphasize_audio_time": ["config", "config.emphasize_audio_time", " = 0.5", "", "var", "See above."], "config.gl_blend_func": ["model", "config.gl_blend_func", " = { ... }", "", "var", "A dictionaryt used to map a blend mode name to a blend function. The blend modes are suppled to the blend func property, given below."], "config.debug": ["config", "config.debug", " = False", "", "var", "Enables debugging functionality (mostly by turning some missing files into errors.) This should always be turned off in a release."], "config.hw_video": ["config", "config.hw_video", " = False", "", "var", "If true, hardware video playback will be used on mobile platforms. This may be faster, but only some formats are supported and only fullscreen video is available. If false, software playback will be used."], "config.gl_lod_bias": ["config", "config.gl_lod_bias", " = -0.5", "", "var", "The default value of the :ref:`u_lod_bias ` uniform, which controls the mipmap level Ren'Py uses."], "config.layers": ["config", "config.layers", " = [ 'master', 'transient', 'screens', 'overlay' ]", "", "var", "This variable gives a list of all of the layers that Ren'Py knows about, in the order that they will be displayed to the screen. (The lowest layer is the first entry in the list.) Ren'Py uses the layers \\master\\, \\transient\\, \\screens\\, and \\overlay\\ internally, so they should always be in this list."], "config.log": ["config", "config.log", " = None", "", "var", "If not None, this is expected to be a filename. Much of the text shown to the user by :ref:`say ` or :ref:`menu ` statements will be logged to this file."], "config.rollback_side_size": ["config", "config.rollback_side_size", " = .2", "", "var", "If the rollback side is enabled, the fraction of the screen on the rollback side that, when clicked or touched, causes a rollback to occur."], "config.window_auto_show": ["config", "config.window_auto_show", " = [ 'say', 'menu-with-caption' ]", "", "var", "A list of statements that cause ``window auto`` to show the empty dialogue window."], "config.start_callbacks": ["config", "config.start_callbacks", " = [ ... ]", "", "var", "A list of callbacks functions that are called with no arguments after the init phase, but before the game (including the splashscreen) starts. This is intended to be used by frameworks to initialize variables that will be saved.\n\nThe default value of this variable includes callbacks that Ren'Py uses internally to implement features such as nvl-mode. New callbacks can be appended to this list, but the existing callbacks should not be removed."], "config.transition_screens": ["config", "config.transition_screens", " = True", "", "var", "If True, screens will participate in transitions, dissolving from the old state of the screen to the new state of the screen. If False, only the latest state of the screen will be shown."], "config.main_menu": ["config", "config.main_menu", " = [ ... ]", "", "var", "The default main menu, when not using screens. For more details, see Main and Game Menus."], "config.emphasize_audio_channels": ["config", "config.emphasize_audio_channels", " = [ 'voice' ]", "", "var", "A list of strings giving audio channel names.\n\nIf the \\emphasize audio\\ preference is enabled, when one of the audio channels listed starts playing a sound, all channels that are not listed in this variable have their secondary audio volume reduced to :var:`config.emphasize_audio_volume` over :var:`config.emphasize_audio_time` seconds.\n\nWhen no channels listed in this variable are playing audio, all channels that are not listed have their secondary audio volume raised to 1.0 over :var:`config.emphasize_audio_time` seconds.\n\nFor example, setting this to ``[ 'voice' ]]`` will lower the volume of all non-voice channels when a voice is played."], "config.speaking_attribute": ["config", "config.speaking_attribute", " = None", "", "var", "If not None, this should be a string giving the name of an image attribute. The image attribute is added to the image when the character's image tag when the character is speaking, and removed when the character stops.\n\nThis is applied to the image on the default layer for the tag, which can be set using :var:`config.tag_layer`."], "config.translate_clean_stores": ["config", "config.translate_clean_stores", " = [ \"gui\" ]", "", "var", "A list of named stores that are cleaned to their state at the end of the init phase when the translation language changes."], "config.automatic_images": ["config", "config.automatic_images", " = None", "", "var", "If not None, this causes Ren'Py to automatically define images.\n\nWhen not set to None, this should be set to a list of separators. (For example, ``[ ' ', '_', '/' ]``.)\n\nRen'Py will scan through the list of files on disk and in archives. When it finds a file ending with .png or .jpg, it will strip the extension, then break the name at separators, to create an image name. If the name consists of at least two components, and no image with that name already is defined, Ren'Py will define that image to refer to a filename.\n\nWith the example list of separators, if your game directory contains:\n\n* eileen_happy.png, Ren'Py will define the image \\eileen happy\\. * lucy/mad.png, Ren'Py will define the image \\lucy mad\\. * mary.png, Ren'Py will do nothing. (As the image does not have two components.)"], "config.afm_bonus": ["config", "config.afm_bonus", " = 25", "", "var", "The number of bonus characters added to every string when auto-forward mode is in effect."], "config.mode_callbacks": ["config", "config.mode_callbacks", " = [ ... ]", "", "var", "A list of callbacks called when entering a mode. For more documentation, see the section on :ref:`Modes`.\n\nThe default value includes a callback that implements :var:`config.adv_nvl_transition` and :var:`config.nvl_adv_transition`."], "config.transient_layers": ["config", "config.transient_layers", " = [ 'transient' ]", "", "var", "This variable gives a list of all of the transient layers. Transient layers are layers that are cleared after each interaction. \\transient\\ should always be in this list."], "config.gc_thresholds": ["config", "config.gc_thresholds", " = (25000, 10, 10)", "", "var", "The GC thresholds that Ren'Py uses when not idle. These are set to try to ensure that garbage collection doesn't happen. The three numbers are:\n\n* The net number of objects that need to be allocated before a level-0 collection. * The number of level-0 collections that trigger a level-1 collection. * The number of level-1 collections that trigger a level-2 collection.\n\n(Level-0 collections should be fast enough to not cause a frame drop, level-1 collections might, level-2 will.)"], "config.fix_rollback_without_choice": ["config", "config.fix_rollback_without_choice", " = False", "", "var", "This option determines how the built in menus or imagemaps behave during fixed rollback. The default value is False, which means that menu only the previously selected option remains clickable. If set to True, the selected option is marked but no options are clickable. The user can progress forward through the rollback buffer by clicking."], "config.mipmap_movies": ["config", "config.mipmap_movies", " = False", "", "var", "The default value of the mipmap argument to :func:`Movie`."], "config.screenshot_crop": ["config", "config.screenshot_crop", " = None", "", "var", "If not None, this should be a (`x`, `y`, `height`, `width`) tuple. Screenshots are cropped to this rectangle before being saved."], "config.quit_action": ["config", "config.quit_action", " = ...", "", "var", "The action that is called when the user clicks the quit button on a window. The default action prompts the user to see if he wants to quit the game."], "config.thumbnail_height": ["gui", "config.thumbnail_height", " = 216", "", "var", "The width and height of the save thumbnails. Note that these live in the config namespace, not the gui namespace. These do not take effect until the file is saved and loaded."], "config.context_fadeout_music": ["config", "config.context_fadeout_music", " = 0", "", "var", "The amount of time in seconds Ren'Py spends fading out music when the music is played due to a context change. (Usually, when the game is loaded.)"], "config.top_layers": ["config", "config.top_layers", " = [ ]", "", "var", "This is a list of names of layers that are displayed above all other layers, and do not participate in a transition that is applied to all layers. If a layer name is listed here, it should not be listed in config.layers."], "config.default_tag_layer": ["config", "config.default_tag_layer", " = \"master\"", "", "var", "The layer an image is shown on if its tag is not found in config.tag_layer."], "config.screen_height": ["config", "config.screen_height", " = 600", "", "var", "The height of the screen. Usually set by :func:`gui.init`."], "config.preload_fonts": ["config", "config.preload_fonts", " = [ ]", "", "var", "A list of the names of TrueType and OpenType fonts that Ren'Py should load when starting up. Including the name of a font here can prevent Ren'Py from pausing when introducing a new typeface."], "config.allow_skipping": ["config", "config.allow_skipping", " = True", "", "var", "If set to False, the user is not able to skip over the text of the game. See :var:`_skipping`."], "config.save_json_callbacks": ["config", "config.save_json_callbacks", " = [ ]", "", "var", "A list of callback functions that are used to create the json object that is stored with each save and marked accessible through :func:`FileJson` and :func:`renpy.slot_json`.\n\nEach callback is called with a Python dictionary that will eventually be saved. Callbacks should modify that dictionary by adding JSON-compatible Python types, such as numbers, strings, lists, and dicts. The dictionary at the end of the last callback is then saved as part of the save slot.\n\nThe dictionary passed to the callbacks may have already have keys beginning with an underscore ``_``. These keys are used by Ren'Py, and should not be changed."], "config.auto_load": ["config", "config.auto_load", " = None", "", "var", "If not None, the name of a save file to automatically load when Ren'Py starts up. This is intended for developer use, rather than for end users. Setting this to \\1\\ will automatically load the game in save slot 1."], "config.main_menu_music": ["config", "config.main_menu_music", " = None", "", "var", "If not None, a music file to play when at the main menu."], "config.debug_sound": ["config", "config.debug_sound", " = False", "", "var", "Enables debugging of sound functionality. This disables the suppression of errors when generating sound. However, if a sound card is missing or flawed, then such errors are normal, and enabling this may prevent Ren'Py from functioning normally. This should always be False in a released game."], "config.menu_clear_layers": ["config", "config.menu_clear_layers", " = []", "", "var", "A list of layer names (as strings) that are cleared when entering the game menu."], "config.single_movie_channel": ["config", "config.single_movie_channel", " = None", "", "var", "If not None, and the `play` argument is give to :func:`Movie`, this is the name used for the channel the movie is played on. This should not be \\movie\\, as that name is reserved for Ren'Py's internal use."], "config.autosave_on_quit": ["config", "config.autosave_on_quit", " = True", "", "var", "If True, Ren'Py will attempt to autosave when the user attempts to quit, return to the main menu, or load a game over the existing game. (To save time, the autosave occurs while the user is being prompted to confirm his or her decision.)"], "config.self_closing_custom_text_tags": ["custom_text_tags", "config.self_closing_custom_text_tags", "", "", "var", "Maps text tag names to a self-closing text tag functions, when the text tag does not wrap other text."]}, "internal": {"InputValue.enter": ["screen_python", "enter", "(self)", "InputValue", "method", "Called when the user presses enter. If this returns a non-None value, that value is returned from the interacton. This may also raise renpy.IgnoreEvent() to ignore the press. Otherwise, the enter-press is propagated to other displayables.\n\nThe following actions are available as methods on InputValue:"], "director.director_spacing": ["director", "director.director_spacing", " = 0", "", "var", "The spacing between two consecutive director lines."], "gui.TogglePreference": ["internal", "class", "(name, a, b, rebuild=True)", "", "Action", "This Action toggles the gui preference with `name` between value `a` and value `b`. It is selected if the value is equal to `a`.\n\n`rebuild` If true, the default, :func:`gui.rebuild` is called to make the changes take effect. This should generally be true, except in the case of multiple gui.SetPreference actions, in which case it should be False in all but the last one.\n\nThis is a very slow action, and probably not suitable for use when a button is hovered."], "gui.slider_tile": ["gui", "gui.slider_tile", " = True", "", "var", "If true, the frame containing the bar of a slider is tiled. If False, if it scaled."], "ui.Action": ["obsolete", "class", "()", "", "", "This can be passed to the clicked method of a button or hotspot. It is called when the action is selected. The other methods determine if the action should be displayed insensitive or disabled."], "AnimatedValue": ["internal", "class", "(value=0.0, range=1.0, delay=1.0, old_value=None)", "", "Action", "This animates a value, taking `delay` seconds to vary the value from `old_value` to `value`.\n\n `value` The value itself, a number.\n\n `range` The range of the value, a number.\n\n `delay` The time it takes to animate the value, in seconds. Defaults to 1.0.\n\n `old_value` The old value. If this is None, then the value is taken from the AnimatedValue we replaced, if any. Otherwise, it is initialized to `value`."], "Live2D": ["internal", "class", "(filename, zoom=None, top=0.0, base=1.0, height=1.0, loop=False, aliases={}, fade=None, motions=None, expression=None, nonexclusive=None, used_nonexclusive=None, seamless=None, sustain=False, attribute_function=None, attribute_filter=None, update_function=None, default_fade=1.0, **properties)", "", "", "This displayable displays a Live2D animation.\n\nOnly filename should be given positionally, and all other arguments should be given as keyword arguments."], "Matrix.identity": ["matrix", "Matrix.identity", "()", "", "function", "Returns an identity matrix."], "moveouttop": ["transitions", "moveouttop", "", "", "var", "Also: **moveoutleft, moveoutright, moveoutbottom**\n\nThese move leaving images off the screen via the appropriate side, taking 0.5 seconds to do so."], "alt": ["internal", "function", "(what, interact=True)", "", "", ""], "FactorZoom": ["internal", "function", "()", "", "", ""], "preferences.set_volume": ["preferences", "preferences.set_volume", "(mixer, volume)", "", "function", "Sets `mixer` to `volume`.\n\n`mixer` A string giving the name of the mixer. By default, the mixers are \\music\\, \\sfx\\, and \\voice\\.\n\n`volume` A number between 0.0 and 1.0."], "RoundRect": ["internal", "function", "(color, small=False)", "", "", ""], "iap.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "im.Rotozoom": ["obsolete", "class", "(im, angle, zoom, **properties)", "", "", "This is an image manipulator that is a smooth rotation and zoom of another image manipulator."], "nvl_show": ["internal", "function", "(with_)", "", "", "The Python equivalent of the ``nvl show`` statement.\n\n`with_` The transition to use to show the NVL-mode window."], "easeinbottom": ["transitions", "easeinbottom", "", "", "var", "Also: **easeinright, easeinleft, easeintop, ease, easeoutright, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "build.classify_renpy": ["internal", "function", "(pattern, groups)", "", "", "Classifies files in the Ren'Py base directory according to pattern."], "BarValue.get_tooltip": ["screen_python", "get_tooltip", "(self)", "BarValue", "method", "This gets a default tooltip for this button, if a specific tooltip is not assigned. It should return the tooltip value, or None if a tooltip is not known.\n\nThis defaults to returning None."], "SetDict": ["internal", "class", "(dict, key, value)", "", "Action", "Causes the value of `key` in `dict` to be set to `value`."], "gui.slot_button_borders": ["gui", "gui.slot_button_borders", " = Borders(15, 15, 15, 15)", "", "var", "The borders applied to each save slot."], "DisableAllInputValues": ["internal", "class", "()", "", "Action", "Disables all active InputValue. This will re-focus the default InputValue, if there is one. Otherwise, no InputValue will be focused."], "_quit_slot": ["store_variables", "_quit_slot", " = None", "store", "var", "If not None, this should be a string giving the name of a file slot. When Ren'Py quits, the game will be saved in this slot."], "division": ["internal", "function", "()", "", "", ""], "pushright": ["transitions", "pushright", "", "", "var", "Also: **pushleft, pushup, pushdown**\n\nThese use the new scene to slide the old scene out the named side. Instances of the :func:`PushMove` transition class."], "ui.child_or_fixed": ["obsolete", "function", "()", "", "", "Causes the current widget to be given child-fixed semantics. This means that we will queue up children added to it. If there is one child, that child will be added to the widget directly. Otherwise, a fixed will be created, and the children will be added to that."], "SpriteManager": ["internal", "class", "(update=None, event=None, predict=None, ignore_time=False, **properties)", "", "", "This displayable manages a collection of sprites, and displays them at the fastest speed possible."], "im.ImageBase": ["obsolete", "class", "(*args, **properties)", "", "", "This is the base class for all of the various kinds of images that we can possibly have."], "gui.dialogue_text_xalign": ["gui", "gui.dialogue_text_xalign", " = 0.0", "", "var", "The horizontal alignment of dialogue text. 0.0 is left aligned, 0.5 is centered, and 1.0 is right-aligned."], "LiveCrop": ["obsolete", "function", "(rect, child, **properties)", "", "", "LiveCrop is now :func:`Crop`."], "preferences.voice_sustain": ["preferences", "preferences.voice_sustain", " = False", "", "var", "If True, voice keeps playing until finished, or another voice line replaces it. If False, the voice line ends when the line of dialogue advances. The equivalent of the \\voice sustain\\ preference."], "SetMixer": ["internal", "class", "(mixer, volume)", "", "Action", "Sets the volume of `mixer` to `value`.\n\n`mixer` The mixer to set the volume of. A string, usually one of \\music\\, \\sfx\\, or \\voice\\. `value` The value to set the volume to. A number between 0.0 and 1.0, inclusive."], "updater": ["internal", "function", "()", "", "", ""], "Fixed": ["internal", "function", "(*args, **properties)", "", "", "A box that fills the screen. Its members are laid out from back to front, with their position properties controlling their position."], "FileNewest": ["internal", "function", "(name, page=None, slot=False)", "", "Action", "Returns True if this is the newest file slot, or False otherwise."], "truecenter": ["transforms", "truecenter", "", "", "var", "Centers both horizontally and vertically."], "AlphaBlend": ["internal", "function", "(control, old, new, alpha=False)", "", "", "This transition uses a `control` displayable (almost always some sort of animated transform) to transition from one displayable to another. The transform is evaluated. The `new` displayable is used where the transform is opaque, and the `old` displayable is used when it is transparent.\n\n`alpha` If true, the image is composited with what's behind it. If false, the default, the image is opaque and overwrites what's behind it."], "gui": ["internal", "function", "()", "", "", ""], "list": ["internal", "class", "(*args)", "", "", ""], "TintMatrix": ["internal", "class", "(color)", "", "", "A ColorMatrix can be used with :tpref:`matrixcolor` to tint an image, while leaving the alpha channel alone.\n\n`color` The color that the matrix will tint things to. This is passed to :func:`Color`, and so may be anything that Color supports as its first argument."], "Matrix.is_unit_aligned": ["internal", "function", "()", "", "", "Returns true if exactly one of abs(xdx) or abs(xdy) is 1.0, and the same for xdy and ydy. This is intended to report if a matrix is aligned to the axes."], "build.documentation": ["internal", "function", "(pattern)", "", "", "Declares a pattern that matches documentation. In a mac app build, files matching the documentation pattern are stored twice - once inside the app package, and again outside of it."], "Lexer.match": ["cds", "match", "(re)", "Lexer", "method", "Matches an arbitrary regexp string.\n\nAll of the statements in the lexer that match things are implemented in terms of this function. They first skip whitespace, then attempt to match against the line. If the match succeeds, the matched text is returned. Otherwise, None is returned, and the state of the lexer is unchanged."], "VariableInputValue": ["internal", "class", "(variable, default=True, returnable=False)", "", "Action", "An input value that updates `variable`.\n\n`variable` A string giving the name of the variable to update.\n\n`default` If true, this input can be editable by default.\n\n`returnable` If true, the value of this input will be returned when the user presses enter."], "ScreenVariableInputValue": ["internal", "class", "(variable, default=True, returnable=False)", "", "Action", "An input value that updates variable.\n\n`variable` A string giving the name of the variable to update.\n\n`default` If true, this input can be editable by default.\n\n`returnable` If true, the value of this input will be returned when the user presses enter."], "MusicRoom": ["internal", "class", "(channel=u'music', fadeout=0.0, fadein=0.0, loop=True, single_track=False, shuffle=False, stop_action=None)", "", "", "A music room that contains a series of songs that can be unlocked by the user, and actions that can play entries from the list in order."], "build.allow_integrated_gpu": ["build", "build.allow_integrated_gpu", " = True", "", "var", "Allows Ren'Py to run on the integrated GPU on platforms that have both integrated and discrete GPUs. Right now, this is only supported on Mac OS X."], "ComposeTransition": ["transitions", "function", "(trans, before, after)", "", "", "Returns a transition that composes up to three transitions. If not None, the `before` and `after` transitions are applied to the old and new scenes, respectively. These updated old and new scenes are then supplied to the `trans` transition.\n```\n# Move the images in and out while dissolving. (This is a fairly expensive transition.)\ndefine moveinoutdissolve = ComposeTransition(dissolve, before=moveoutleft, after=moveinright)\n```"], "build.classify": ["internal", "function", "(pattern, file_list)", "", "", "Classifies files that match `pattern` into `file_list`."], "InputValue.set_text": ["screen_python", "set_text", "(s)", "InputValue", "method", "Called when the text of the input is changed, with the new text. This must be implemented."], "SnowBlossom": ["internal", "function", "(d, count=10, border=50, xspeed=(20, 50), yspeed=(100, 200), start=0, fast=False, horizontal=False)", "", "", ""], "wipedown": ["transitions", "wipedown", "", "", "var", "Also: **wiperight, wipeup, wipeleft**\n\nWipes the scene in the given direction. Instances of the :func:`CropMove` transition class."], "iap.with_background": ["internal", "function", "(f, *args, **kwargs)", "", "", "Displays the background, then invokes `f`."], "wiperight": ["transitions", "wiperight", "", "", "var", "Also: **wipeleft, wipeup, wipedown**\n\nWipes the scene in the given direction. Instances of the :func:`CropMove` transition class."], "director.transforms": ["director", "director.transforms", " = [ \"left\", \"center\", \"right\" ]", "", "var", "A list of transforms that will be presented as part of the editor. In addition to these, any transform defined using the transform statement outside of Ren'Py itself will be added to the list of transforms, which is then sorted."], "FileTakeScreenshot": ["internal", "class", "(*args, **kwargs)", "", "Action", "Take a screenshot to be used when the game is saved. This can be used to ensure that the screenshot is accurate, by taking a picture of the screen before a file save screen is shown."], "ui.frame": ["obsolete", "ui.frame", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "preferences": ["internal", "function", "()", "", "", ""], "Lexer.catch_error": ["cds", "catch_error", "()", "Lexer", "method", "This is a context decorator, used in conjunction with the with statement, that catches and reports lexer errors inside its context block, then continues after the block.\n\nHere's an example of how it can be used to report multiple errors in a single subblock.\n```\ndef mystatement_parse(l):\n\nl.require(':')\nl.expect_eol()\nl.expect_block(\\mystatement\\)\n\nstrings = [ ]\nll = l.subblock_lexer()\n\nwhile ll.advance():\nwith ll.catch_errors():\nstrings.append(ll.require(ll.string))\nll.expect_noblock(\\string inside mystatement\\)\nll.expect_eol()\n\nreturn { \\strings\\ : strings }\n\n\n\n\n\n\n```"], "build.archive": ["internal", "function", "(name, file_list=\"all\")", "", "", "Declares the existence of an archive. If one or more files are classified with `name`, `name`.rpa is build as an archive. The archive is included in the named file lists."], "DragGroup": ["internal", "class", "(*children, **properties)", "", "", "Represents a group of Drags. A Drag is limited to the boundary of its DragGroup. Dropping only works between Drags that are in the same DragGroup. Drags may only be raised when they are inside a DragGroup.\n\nA DragGroup is laid out like a :func:`Fixed`.\n\nAll positional parameters to the DragGroup constructor should be Drags, that are added to the DragGroup.\n\n `min_overlap` An integer which means the minimum number of pixels at the overlap so that drop will be allow."], "default_mouse": ["store_variables", "default_mouse", "", "store", "var", "This is undefined by default. If defined, and if :var:`config.mouse` is set at game startup, this is a key that is used to look up a mouse cursor in config.mouse when the current cursor does not exist, or is the default."], "Grid": ["internal", "function", "(cols, rows, *args, **properties)", "", "", "Lays out displayables in a grid. The first two positional arguments are the number of columns and rows in the grid. This must be followed by `columns * rows` positional arguments giving the displayables that fill the grid."], "preferences.show_empty_window": ["preferences", "preferences.show_empty_window", " = True", "", "var", "If True, the window show and window auto statements will function. If False, those statements are disabled. The equivalent of the \\show empty window\\ preference."], "BarValue": ["internal", "class", "()", "", "", "This can be passed to the value method of bar and hotbar."], "Lexer.arguments": ["cds", "arguments", "()", "Lexer", "method", "This must be called before the parentheses with the arguments list, if they are not specified returns None, otherwise returns an object representing the arguments to a function call. This object has an ``evaluate`` method on it that takes an optional `scope` dictionary, and returns a tuple in which the first component is a tuple of positional arguments, and the second component is a dictionary of keyword arguments."], "SetField": ["internal", "class", "(object, field, value)", "", "Action", "Causes the a field on an object to be set to a given value. `object` is the object, `field` is a string giving the name of the field to set, and `value` is the value to set it to."], "Viewport": ["internal", "class", "(child=None, child_size=(None, None), offsets=(None, None), xadjustment=None, yadjustment=None, set_adjustments=True, mousewheel=False, draggable=False, edgescroll=None, style=u'viewport', xinitial=None, yinitial=None, replaces=None, arrowkeys=False, pagekeys=False, **properties)", "", "", ""], "layeredimage.parse_property": ["internal", "function", "(l, o, names)", "", "", "Parses a property, returns True if one is found."], "Zoom": ["internal", "function", "()", "", "", ""], "layeredimage.python_object": ["internal", "class", "()", "", "", "The most base type"], "gui.skip_frame_borders": ["gui", "gui.skip_frame_borders", " = Borders(24, 8, 75, 8)", "", "var", "The borders of the frame that is used by the skip screen."], "nvl_window": ["internal", "function", "()", "", "", ""], "gui.title_text_size": ["gui", "gui.title_text_size", " = 75", "", "var", "The size of the game's title."], "layout": ["internal", "function", "()", "", "", ""], "director.viewport_height": ["director", "director.viewport_height", " = 280", "", "var", "The maximum height of scrolling viewports used by the director."], "im.ramp": ["obsolete", "function", "(start, end)", "", "", "Returns a 256 character linear ramp, where the first character has the value start and the last character has the value end. Such a ramp can be used as a map argument of im.Map."], "pushleft": ["transitions", "pushleft", "", "", "var", "Also: **pushright, pushup, pushdown**\n\nThese use the new scene to slide the old scene out the named side. Instances of the :func:`PushMove` transition class."], "layeredimage.ConditionGroup": ["internal", "class", "(conditions)", "", "", "Combines a list of conditions into a single ConditionSwitch."], "voice": ["internal", "function", "(filename, tag=None)", "", "", "Plays `filename` on the voice channel. The equivalent of the voice statement.\n\n`filename` The filename to play. This is used with :var:`config.voice_filename_format` to produce the filename that will be played.\n\n`tag` If this is not None, it should be a string giving a voice tag to be played. If None, this takes its default value from the voice_tag of the Character that causes the next interaction.\n\nThe voice tag is used to specify which character is speaking, to allow a user to mute or unmute the voices of particular characters."], "hpunch": ["transitions", "hpunch", "", "", "var", "When invoked, this transition shakes the screen horizontally for a quarter second."], "ui.key": ["obsolete", "ui.key", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "preferences.get_mute": ["preferences", "preferences.get_mute", "(mute):", "", "function", "Gets the mute setting for `mixer`."], "ToggleScreenVariable": ["internal", "class", "(name, true_value=None, false_value=None)", "", "Action", "Toggles the value of the variable `name` in the current screen.\n\n `true_value` If not None, then this is the true value used. `false_value` If not None, then this is the false value used."], "_version": ["store_variables", "_version", " = ...", "store", "var", "This is set to :var:`config.version` when a new game is started. It can be used by the ``after_load`` label or :var:`config.after_load_callbacks` to determine which upgrades need to be done.\n\nThis is only set once, upon the initial start. After that, the game is responsible for updating _version as necessary."], "FilePageNameInputValue": ["internal", "class", "(pattern=u'Page {}', auto=u'Automatic saves', quick=u'Quick saves', page=None, default=False)", "", "Action", "An input value that updates the name of a file page.\n\n`pattern` This is used for the default name of a page. Python-style substition is performed, such that {} is replaced with the number of the page.\n\n`auto` The name of the autosave page.\n\n`quick` The name of the quicksave page.\n\n`page` If given, the number of the page to display. This should usually be left as None, to give the current page.\n\n`default` If true, this input can be editable by default."], "FilePagePrevious": ["internal", "class", "(max=None, wrap=False, auto=True, quick=True)", "", "Action", "Goes to the previous file page, if possible.\n\n`max` If set, this should be an integer that gives the number of the maximum file page we can go to. This is required to enable wrap.\n\n`wrap` If true, we can go to the last page when on the first file page if max is set.\n\n`auto` If true, this can bring the player to the page of automatic saves.\n\n`quick` If true, this can bring the player to the page of automatic saves."], "director.audio_patterns": ["director", "director.audio_patterns", " = [ \"*.opus\", \"*.ogg\", \"*.mp3\" ]", "", "var", "The default list of audio patterns that are used to match the files available in an audio channel."], "gui.selected_color": ["gui", "gui.selected_color", " = '#555555'", "", "var", "The color used by the text of selected buttons. (This takes priority over the hover and idle colors.)"], "Matrix.texture_projection": ["internal", "function", "()", "", "", "This generates a matrix that project the Ren'Py space, where (0, 0) is the top left and (`w`, `h`) is the bottom right, into the OpenGL render-to-texture space, where (-1.0, -1.0) is the top left and (1.0, 1.0) is the bottom.\n\nGenerates the matrix that projects the Ren'Py screen to the OpenGL screen."], "ShowTransient": ["internal", "function", "(screen, transition=None, *args, **kwargs)", "", "Action", "Shows a transient screen. A transient screen will be hidden when the current interaction completes. The arguments are passed to the screen being shown.\n\n If not None, `transition` is use to show the new screen."], "Null": ["internal", "class", "(width=0, height=0, **properties)", "", "", "A displayable that creates an empty box on the screen. The size of the box is controlled by `width` and `height`. This can be used when a displayable requires a child, but no child is suitable, or as a spacer inside a box.\n```\nimage logo spaced = HBox(\\logo.png\\, Null(width=100), \\logo.png\\)\n\n```"], "define.move_transitions": ["internal", "function", "(prefix, delay, time_warp=None, in_time_warp=None, out_time_warp=None, old=False, layers=[ 'master' ], **kwargs)", "", "", "This defines a family of move transitions, similar to the move and ease transitions. For a given `prefix`, this defines the transitions:\n\n* *prefix*- A transition that takes `delay` seconds to move images that changed positions to their new locations.\n\n* *prefix*\\ inleft, *prefix*\\ inright, *prefix*\\ intop, *prefix*\\ inbottom - Transitions that take `delay` seconds to move images that changed positions to their new locations, with newly shown images coming in from the appropriate side.\n\n* *prefix*\\ outleft, *prefix*\\ outright, *prefix*\\ outtop, *prefix*\\ outbottom - Transitions that take `delay` seconds to move images that changed positions to their new locations, with newly hidden images leaving via the appropriate side.\n\n`time_warp`, `in_time_warp`, `out_time_warp` Time warp functions that are given a time from 0.0 to 1.0 representing the fraction of the move that is complete, and return a value in the same range giving the fraction of a linear move that is complete.\n\nThis can be used to define functions that ease the images around, rather than moving them at a constant speed.\n\nThe three arguments are used for images remaining on the screen, newly shown images, and newly hidden images, respectively.\n\n`old` If true, the transitions to move the old displayables, rather than the new ones.\n\n`layers` The layers the transition will apply to.\n```\n# This defines all of the pre-defined transitions beginning\n# with \\move\\.\ninit python:\ndefine.move_transitions(\\move\\, 0.5)\n\n```"], "achievement.progress": ["internal", "function", "(name, complete)", "", "", "Reports progress towards the achievement with `name`, if that achievement has not been granted. The achievement must be defined with a completion amount.\n\n`name` The name of the achievement. This should be the name of the achievement, and not the stat.\n\n`complete` An integer giving the number of units completed towards the achievement."], "Style": ["internal", "class", "()", "", "", "`parent` The parent of this style. One of:\n\n * A Style object. * A string giving the name of a style. * A tuple giving the name of an indexed style. * None, to indicate there is no parent.\n\n`properties` A map from style property to its value.\n\n`name` If given, a tuple that will be the name of this style.\n\n`help` Help information for this style.\n\n`heavy` Ignored, but retained for compatibility."], "Matrix": ["internal", "class", "(l)", "", "", "This represents a 4x4 matrix, that is used in various places in Ren'Py.\n\nWhen used to transform coordinates, the 16 elements of this matrix are::\n\n xdx, xdy, xdz, xdw, ydx, ydy, ydz, ydw, zdx, zdy, zdz, zdw, wdx, wdy, wdz, wdw\n\nwhere x' = xdx * x + xdy * y + xdz * z + xdw * w, where x is the original value of x and x' is the transformed value, and similarly for x, y, z, and w. This is usually applied to a position where w is 1, allowing any combination of translation, rotation, and scaling to be expressed in a single matrix.\n\nWhen used to transform colors, the 16 elements of this matrix are::\n\n rdr, rdg, rdb, rda, gdr, gdg, gdg, gda, bdr, bdg, bdb, bda, adr, adg, adb, ada,\n\nFor the red, green, blue, and alpha channels.\n\nMatrix objects can be multiplied using the Python multiplication operator, to generate a matrix that performs both operations. The order in which the matrixes appear can matter. Assuming `v` is a position or color being transformed::\n\n (step2 * step1) * v\n\nis equivalent to::\n\n step2 * (step1 * v)\n\n`l` This can be a list of 4, 9, or 16 numbers that is used to introduce this matrix. If not the full 16, the top-left corner of the matrix is initialized, with zdz and wdw set to 1.0 if not given. For example::\n\n Matrix([ 1, 2, 3, 4 ])\n\n would result in the Matrix::\n\n 1.0, 2.0, 0.0, 0.0, 3.0, 4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0,"], "style.rebuild": ["style", "style.rebuild", "()", "", "function", "This causes named styles to be rebuilt, allowing styles to be changed after the init phase has finished.\n\n.. warning\n```\nNamed styles are not saved as part of the per-game data. This\n means that changes to them will not be persisted through a save\n and load cycle.\n```"], "gui.skip_ypos": ["gui", "gui.skip_ypos", " = 15", "", "var", "The vertical position of the skip indicator, in pixels from the top of the window."], "ColorizeMatrix": ["internal", "class", "(black_color, white_color)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to colorize black and white displayables. It uses the color of each pixel in the black and white to interpolate between the black color and the white color.\n\nThe alpha channel is not touched.\n\nThis is inteded for use with a black and white image (or one that has been desaturated with :func:`SaturationMatrix`), and will yield strange results when used with images that are not black and white.\n\n`black_color`, `white_color` The colors used in the interpolation."], "MainMenu": ["internal", "class", "(confirm=True, save=True)", "", "Action", "Causes Ren'Py to return to the main menu.\n\n`confirm` If true, causes Ren'Py to ask the user if he wishes to return to the main menu, rather than returning directly.\n\n`save` If true, the game is saved in :var:`_quit_slot` before Ren'Py restarts and returns the user to the main menu. The game is not saved if :var:`_quit_slot` is None."], "director.scene_tags": ["director", "director.scene_tags", " = { \"bg\" }", "", "var", "The set of tags that will be presented for the scene statement, and hidden from the show statement."], "OffsetMatrix": ["internal", "class", "(x, y, z)", "", "", "A TransformMatrix that returns a matrix that offsets the vertex by a fixed amount."], "offscreenleft": ["transforms", "offscreenleft", "", "", "var", "Places the displayable off the left side of the screen, aligned to the bottom of the screen."], "FileJson": ["internal", "function", "(name, key=None, empty=None, missing=None, page=None, slot=False)", "", "Action", "Accesses the Json information associated with `name`.\n\nIf `key` is None, returns the entire Json other object, or `empty` if the slot is empty.\n\nOtherwise, this returns json[key] if `key` is defined on the json object of the save, `missing` if there is a save with the given name, but it does not contain `key`, or `empty` if the save slot is empty.\n\nJson is added to a save slot by callbacks registered using :var:`config.save_json_callbacks`."], "ui.label": ["obsolete", "ui.label", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "Transform.hide_response": ["trans_trans_python", "hide_response", "", "Transform", "attribute", "If hide request is true, this can be set to false to prevent the transform from being hidden."], "SetVoiceMute": ["internal", "class", "(voice_tag, mute)", "", "Action", "If `mute` is true, mutes voices that are played with the given `voice_tag`. If `mute` is false, unmutes voices that are played with `voice_tag`."], "LiveTile": ["internal", "class", "(child, style=u'tile', **properties)", "", "", ""], "slideup": ["transitions", "slideup", "", "", "var", "Also: **slideright, slideleft, slidedown**\n\nSlides the new scene in the given direction. Instances of the :func:`CropMove` transition class."], "VBox": ["internal", "function", "(*args, **properties)", "", "", "A layout that lays out its members from top to bottom."], "ui.combine_style": ["obsolete", "function", "(style_prefix, style_suffix)", "", "", "Combines a style prefix and style suffix to create a style name, then returns the style object corresoinding to that name."], "Drag": ["internal", "class", "(d=None, drag_name=None, draggable=True, droppable=True, drag_raise=True, dragged=None, dropped=None, drag_handle=(0.0, 0.0, 1.0, 1.0), drag_joined=..., clicked=None, hovered=None, unhovered=None, mouse_drop=False, **properties)", "", "", "A displayable that represents an object that can be dragged around its enclosing area. A Drag can also represent an area that other Drags can be dropped on.\n\nA Drag can be moved around inside is parent. Generally, its parent should be either a :func:`Fixed` or :class:`DragGroup`.\n\nA Drag has one child. The child's state reflects the status of the drag and drop operation:\n\n* ``selected_hover`` - when it is being dragged. * ``selected_idle`` - when it can be dropped on. * ``hover`` - when the draggable will be dragged when the mouse is clicked. * ``idle`` - otherwise.\n\nThe drag handle is a rectangle inside the child. The mouse must be over a non-transparent pixel inside the drag handle for dragging or clicking to occur.\n\nA newly-created draggable is added to the default DragGroup. A draggable can only be in a single DragGroup - if it's added to a second group, it's removed from the first.\n\nWhen a Drag is first rendered, if it's position cannot be determined from the DragGroup it is in, the position of its upper-left corner is computed using the standard layout algorithm. Once that position has been computed, the layout properties are ignored in favor of the position stored inside the Drag.\n\n`d` If present, the child of this Drag. Drags use the child style in preference to this, if it's not None.\n\n`drag_name` If not None, the name of this draggable. This is available as the `name` property of draggable objects. If a Drag with the same name is or was in the DragGroup, the starting position of this Drag is taken from that Draggable.\n\n`draggable` If true, the Drag can be dragged around the screen with the mouse.\n\n`droppable` If true, other Drags can be dropped on this Drag.\n\n`drag_raise` If true, this Drag is raised to the top when it is dragged. If it is joined to other Drags, all joined drags are raised.\n\n`activated` A callback (or list of callbacks) that is called when the mouse is pressed down on the drag. It is called with one argument, a a list of Drags that are being dragged. The return value of this callback is ignored.\n\n`dragged` A callback (or list of callbacks) that is called when the Drag has been dragged. It is called with two arguments. The first is a list of Drags that are being dragged. The second is either a Drag that is being dropped onto, or None of a drop did not occur. If the callback returns a value other than None, that value is returned as the result of the interaction.\n\n`dropped` A callback (or list of callbacks) that is called when this Drag is dropped onto. It is called with two arguments. The first is the Drag being dropped onto. The second is a list of Drags that are being dragged. If the callback returns a value other than None, that value is returned as the result of the interaction.\n\nWhen a dragged and dropped callback are triggered for the same event, the dropped callback is only called if dragged returns None.\n\n`clicked` A callback this is called, with no arguments, when the Drag is clicked without being moved. A droppable can also be focused and clicked. If the callback returns a value other than None, that value is returned as the result of the interaction.\n\n`alternate` An action that is run when the Drag is right-clicked (on the desktop) or long-pressed without moving (on mobile). It may be necessary to increase :var:`config.longpress_duration` if this triggers to early on mobile platforms.\n\n`drag_handle` A (x, y, width, height) tuple, giving the position of the drag handle within the child. In this tuple, integers are considered to be a literal number of pixels, while floats are relative to the size of the child.\n\n`drag_joined` This is called with the current Drag as an argument. It's expected to return a list of [ (drag, x, y) ] tuples, giving the draggables to drag as a unit. `x` and `y` are the offsets of the drags relative to each other, they are not relative to the corner of this drag.\n\n`drag_offscreen` If true, this draggable can be moved offscreen. This can be dangerous to use with drag_joined or drags that can change size, as the drags can leave the screen entirely, with no way to get them back on the screen.\n\n`mouse_drop` If true, the drag is dropped on the first droppable under the cursor. If false, the default, the drag is dropped onto the droppable with the largest degree of overlap.\n\n`drop_allowable` A callback that is called to determine whether this drop allow the current drags dropped onto. It is called with two arguments. The first is the Drag which determines its sensitivity. The second is a list of Drags that are being dragged.\n\nExcept for `d`, all of the parameters are available as fields (with the same name) on the Drag object. In addition, after the drag has been rendered, the following fields become available:\n\n`x`, `y` The position of the Drag relative to its parent, in pixels.\n\n`w`, `h` The width and height of the Drag's child, in pixels."], "nvl_list": ["internal", "function", "()", "", "", ""], "gui.file_slot_rows": ["gui", "gui.file_slot_rows", " = 2", "", "var", "The number of columns and rows in the grid of save slots."], "dict": ["internal", "class", "(*args, **kwargs)", "", "", ""], "gui.button_text_insensitive_color": ["gui", "gui.button_text_insensitive_color", " = gui.insensitive_color", "", "var", "The color of the button text in various states."], "ui.at": ["obsolete", "function", "(transform)", "", "", "Specifies a transform that is applied to the next displayable to be created. This is largely obsolete, as all UI functions now take an `at` argument."], "gui.scrollbar_size": ["gui", "gui.scrollbar_size", " = 24", "", "var", "The height of horizontal scrollbars, and width of vertical scrollbars."], "_screenshot_pattern": ["store_variables", "_screenshot_pattern", " = None", "store", "var", "If not None, this string is used in preference to :var:`config.screenshot_pattern` to determine the filename of a screenshot. Please see the documentation for that variable for the format of the string."], "preferences.gl_framerate": ["preferences", "preferences.gl_framerate", " = None", "", "var", "This is either an integer, or None. If not None, it's a target framerate that Ren'Py will attempt to achieve. If this is set low (for example, to 30), on a monitor with a high framerate (say, 60 frames per second), Ren'Py will only draw on every other frame.\n\nIf None, Ren'Py will attempt to draw at the monitor's full framerate."], "Lexer.has_block": ["cds", "has_block", "()", "Lexer", "method", "True if the current line has a non-empty block."], "gui.bar_tile": ["gui", "gui.bar_tile", " = False", "", "var", "If true, the bar images are tiled. If false, the images are linearly scaled."], "im.Map": ["obsolete", "class", "(im, rmap='\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;NotSet?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff', gmap='\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;NotSet?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff', bmap='\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;NotSet?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff', amap='\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;NotSet?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff', force_alpha=False, **properties)", "", "", "This adjusts the colors of the image that is its child. It takes as arguments 4 256 character strings. If a pixel channel has a value of 192, then the value of the 192nd character in the string is used for the mapped pixel component."], "ui.imagebutton": ["obsolete", "ui.imagebutton", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "nvl_narrator": ["internal", "function", "()", "", "", ""], "FileUsedSlots": ["internal", "function", "(page=None, highest_first=True)", "", "Action", "Returns a list of used numeric file slots on the page.\n\n`page` The name of the page that will be scanned. If None, the current page is used.\n\n`highest_first` If true, the highest-numbered file slot is listed first. Otherwise, the lowest-numbered slot is listed first."], "nvl_show_core": ["internal", "function", "(who=None, what=None, multiple=None)", "", "", ""], "Matrix.offset": ["matrix", "Matrix.offset", "(x, y, z)", "", "function", "Returns a matrix that offsets the vertex by a fixed amount."], "ui.ChildOrFixed": ["obsolete", "class", "(style_prefix)", "", "", "If one widget is added, then it is added directly to our parent. Otherwise, a fixed is added to our parent, and all the widgets are added to that."], "Text": ["internal", "class", "(text, slow=None, scope=None, substitute=None, slow_done=None, mipmap=None, **properties)", "", "", "A displayable that displays text on the screen.\n\n`text` The text to display on the screen. This may be a string, or a list of strings and displayables.\n\n`slow` Determines if the text is displayed slowly, being typed out one character at the time. If None, slow text mode is determined by the :propref:`slow_cps` style property. Otherwise, the truth value of this parameter determines if slow text mode is used.\n\n`scope` If not None, this should be a dictionary that provides an additional scope for text interpolation to occur in.\n\n`substitute` If true, text interpolation occurs. If false, it will not occur. If None, they are controlled by :var:`config.new_substitutions`."], "Frame": ["internal", "class", "(image, left=0, top=0, right=None, bottom=None, tile=False, **properties)", "", "", "A displayable that resizes an image to fill the available area, while preserving the width and height of its borders. It is often used as the background of a window or button.\n\n Using a frame to resize an image to double its size.\n\n`image` An image manipulator that will be resized by this frame.\n\n`left` The size of the border on the left side. This can also be a :func:`Borders` object, in which case that object is used in place of the other parameters.\n\n`top` The size of the border on the top.\n\n`right` The size of the border on the right side. If None, defaults to `left`.\n\n`bottom` The side of the border on the bottom. If None, defaults to `top`.\n\n`tile` If set to True, tiling is used to resize sections of the image, rather than scaling. If set to the string \\integer\\, the nearest integer number of tiles will be used in each direction. That set of full tiles will then be scaled up or down to fit the required area.\n```\n# Resize the background of the text window if it's too small.\n init python:\n style.window.background = Frame(\\frame.png\\, 10, 10)\n```"], "VoiceReplay": ["internal", "class", "(*args, **kwargs)", "", "Action", "Replays the most recently played voice."], "FieldEquality": ["internal", "class", "(*args, **kwargs)", "", "", "Declares two objects equal if their types are the same, and the listed fields are equal."], "updater.update": ["internal", "function", "(url, base=None, force=False, public_key=None, simulate=None, add=[], restart=True, confirm=True, patch=True)", "", "", "Updates this Ren'Py game to the latest version.\n\n`url` The URL to the updates.json file.\n\n`base` The base directory that will be updated. Defaults to the base of the current game. (This can usually be ignored.)\n\n`force` Force the update to occur even if the version numbers are the same. (Used for testing.)\n\n`public_key` The path to a PEM file containing a public key that the update signature is checked against. (This can usually be ignored.)\n\n`simulate` This is used to test update guis without actually performing an update. This can be:\n\n* None to perform an update. * \\available\\ to test the case where an update is available. * \\not_available\\ to test the case where no update is available. * \\error\\ to test an update error.\n\n`add` A list of packages to add during this update. This is only necessary for dlc.\n\n`restart` Restart the game after the update.\n\n`confirm` Should Ren'Py prompt the user to confirm the update? If False, the update will proceed without confirmation.\n\n`patch` If true, Ren'Py will attempt to patch the game, downloading only changed data. If false, Ren'Py will download a complete copy of the game, and update from that. This is set to false automatically when the url does not begin with \\http:\\."], "ui.Imagemap": ["obsolete", "class", "(insensitive, idle, selected_idle, hover, selected_hover, selected_insensitive, alpha, cache)", "", "", "Stores information about the images used by an imagemap."], "Flatten": ["internal", "class", "(child, **properties)", "", "", "This flattens `child`, which may be made up of multiple textures, into a single texture.\n\nCertain operations, like the alpha transform property, apply to every texture making up a displayable, which can yield incorrect results when the textures overlap on screen. Flatten creates a single texture from multiple textures, which can prevent this problem.\n\nFlatten is a relatively expensive operation, and so should only be used when absolutely required."], "dissolve": ["transitions", "dissolve", "", "", "var", "Takes 0.5 seconds to dissolve from the old to the new screen. An instance of the :func:`Dissolve` transition class."], "Lexer.float": ["cds", "float", "()", "Lexer", "method", "Matches a floating point number, returns a string containing the floating point number."], "renpy": ["internal", "function", "()", "", "", "To allow Ren'Py to be scripted in Python, each Ren'Py statement has a Python equivalent. This usually consists of a Python function, but may also consist of a pattern of Python calls that perform an action equivalent to the statement."], "SetMute": ["internal", "class", "(mixer, mute)", "", "Action", "Sets the mute status of one or more mixers. When a mixer is muted, audio channels associated with that mixer will stop playing audio.\n\n`mixer` Either a single string giving a mixer name, or a list of strings giving a list of mixers. The strings should be mixer names, usually \\music\\, \\sfx\\, or \\voice\\.\n\n`mute` True to mute the mixer, False to ummute it."], "Lexer.word": ["cds", "word", "()", "Lexer", "method", "Matches any word, including keywords. Returns the text of the matched word."], "Tooltip": ["internal", "class", "(default)", "", "Action", "A tooltip object can be used to define a portion of a screen that is updated when the mouse hovers an area.\n\nA tooltip object has a ``value`` field, which is set to the `default` value passed to the constructor when the tooltip is created. When a button using an action created by the tooltip is hovered, the value field changes to the value associated with the action."], "Lexer.integer": ["cds", "integer", "()", "Lexer", "method", "Matches an integer, returns a string containing the integer."], "_confirm_quit": ["store_variables", "_confirm_quit", " = True", "store", "var", "This determines if quitting the game asks for confirmation. It is set to False during the splashscreen, and is ignored when in the main menu."], "layeredimage.format_function": ["internal", "function", "(what, name, group, variant, attribute, image, image_format, **kwargs)", "", "", "This is called to format the information about an attribute or condition into a displayable. This can be replaced by a creator, but the new function should ignore unknown kwargs.\n\n`what` A string giving a description of the thing being formatted, which is used to create better error messages.\n\n`name` The name of the layeredimage.\n\n`group` The group of an attribute, None if not supplied or if it's part of a condition.\n\n`variant` The variant argument to the group, or None if it is not supplied.\n\n`attribute` The attribute itself.\n\n`image` Either a displayable or string.\n\n`image_format` The image_format argument of the LayeredImage.\n\nIf `image` is None, then `name`, `group` (if not None), `variant` (if not None), and `attribute` are combined with underscores to create `image`, which will then be a string.\n\nIf `images` is a string, and `image_format` is not None, `image` is formatted into the string to get the final displayable.\n\nSo if `name` is \\eileen\\, `group` is \\expression\\, and `attribute` is \\happy\\, `image` would be set to \\eileen_expression_happy\\. If `image_format` is \\images/{image}.png\\, the final image Ren'Py finds is \\images/eileen_expression_happy.png\\. But note that it would have found the same image without the format argument."], "Speaker": ["internal", "function", "(name=NotSet, kind=None, **properties)", "", "", ""], "GamepadCalibrate": ["internal", "function", "()", "", "Action", "An action that invokes the gamepad calibration routine."], "build.change_icon_i686": ["build", "build.change_icon_i686", " = True", "", "var", "If True, and icon.ico exists, the icon of the 32-bit Windows executable will be changed. If False, the icon will not be changed. Setting this to False may prevent some antivirus programs from producing a false positive for your game."], "RotateMatrix": ["internal", "class", "(x, y, z)", "", "", "A TransformMatrix that returns a matrix that rotates the displayable around the origin.\n\n`x`, `y`, `z` The amount to rotate around the origin, in degrees.\n\n The rotations are applied in order:\n\n* A clockwise rotation by `x` degrees in the Y/Z plane. * A clockwise rotation by `y` degrees in the Z/X plane. * A clockwise rotation by `z` degrees in the X/Y plane."], "PauseAudio": ["internal", "class", "(channel, value=True)", "", "Action", "Sets the pause flag for `channel`.\n\nIf `value` is True, the channel is paused. If False, the channel is unpaused. If \\toggle\\, the pause flag will be toggled."], "moveinright": ["transitions", "moveinright", "", "", "var", "Also: **moveinleft, moveintop, moveinbottom**\n\nThese move entering images onto the screen from the appropriate side, taking 0.5 seconds to do so."], "LayeredImage": ["internal", "class", "(attributes, at=[], name=None, image_format=None, format_function=None, attribute_function=None, **kwargs)", "", "", "This is an image-like object that, when shown with the proper set of attributes, shows a displayable created by compositing together the displayables associated with those attribute.\n\n`attributes` This must be a list of Attribute objects. Each Attribute object reflects a displayable that may or may not be displayed as part of the image. The items in this list are in back-to-front order, with the first item further from the viewer and the last closest.\n\n`at` A transform or list of transforms that are applied to the displayable after it is parameterized.\n\n`name` The name of the layeredimage. This is used as part of the names of image components.\n\n`image_format` When a given image is a string, and this is supplied, the image name is interpolated into `image_format` to make an image file. For example, \\sprites/eileen/{image}.png\\ will look for the image in a subdirectory of sprites. (This is not used by auto groups, which look for images and not image files.)\n\n`format_function` A function that is used instead of `layeredimage.format_function` to format the image information into a displayable.\n\n`attribute_function` If not None, a function that's called with a set of attributes supplied to the image, and returns the set of attributes used to select layers. This is called when determining the layers to display, after the attribute themselves have been chosen. It can be used to express complex dependencies between attributes or select attributes at random.\n\nAdditional keyword arguments may contain transform properties. If any are present, a transform is created that wraps the result image. Remaining keyword arguments are passed to a Fixed that is created to hold the layer. Unless explicitly overridden, xfit and yfit are set to true on the Fixed, which means it will shrink to the smallest size that fits all of the layer images it is showing.\n\nA LayeredImage is not a displayable, and can't be used in all the places a displayable can be used. This is because it requires an image name (generally including image attributes) to be provided. As such, it should either be displayed through a scene or show statement, or by an image name string used as a displayable."], "MultipleTransition": ["transitions", "function", "(args)", "", "", "Returns a transition that allows multiple transitions to be displayed, one after the other.\n\n`args` A *list* containing an odd number of items. The first, third, and other odd-numbered items must be scenes, and the even items must be transitions. A scene can be one of:\n\n* A displayable. * False, to use the old scene. * True, to use the new scene.\n\nAlmost always, the first argument will be False and the last True.\n\nThe transitions in `args` are applied in order. For each transition, the old scene is the screen preceding it, and the new scene is the scene following it. For example\n```\ndefine logodissolve = MultipleTransition([\nFalse, Dissolve(0.5),\n\\logo.jpg\\, Pause(1.0),\n\\logo.jpg\\, dissolve,\nTrue])\n\nThis example will dissolve to logo.jpg, wait 1 second, and then\ndissolve to the new scene.\n```"], "updater.get_installed_packages": ["internal", "function", "(base=None)", "", "", "Returns a list of installed DLC package names.\n\n`base` The base directory to update. Defaults to the current project's base directory."], "Play": ["internal", "class", "(channel, file, selected=None, **kwargs)", "", "Action", "Causes an audio file to be played on a given channel.\n\n `channel` The channel to play the sound on. `file` The file to play. `selected` If True, buttons using this action will be marked as selected if the file is playing on the channel. If False, this action will not cause the button to start playing. If None, the button is marked selected if the channel is a music channel, and not otherwise.\n\n Any other keyword arguments are passed to :func:`renpy.music.play`."], "vpunch": ["transitions", "vpunch", "", "", "var", "When invoked, this transition shakes the screen vertically for a quarter second."], "MoveTransition": ["internal", "function", "()", "", "", ""], "NVLCharacter": ["internal", "class", "(who=NotSet, kind=None, **properties)", "", "", ""], "im.Flip": ["obsolete", "class", "(im, horizontal=False, vertical=False, **properties)", "", "", "An image manipulator that flips `im` (an image manipulator) vertically or horizontally. `vertical` and `horizontal` control the directions in which the image is flipped.\n```\nimage eileen flip = im.Flip(\\eileen_happy.png\\, vertical=True)\n\nThe same effect can now be achieved by setting\n:tpref:`xzoom` (for horizontal flip)\nor :tpref:`yzoom` (for vertical flip) to a negative value.\n```"], "ui.ChoiceJump": ["obsolete", "class", "(label, value, location=None, block_all=None, sensitive=True, args=None, kwargs=None)", "", "", "A menu choice action that returns `value`, while managing the button state in a manner consistent with fixed rollback. (See block_all for a description of the behavior.)\n\n `label` The label text of the button. For imagebuttons and hotspots this can be anything. This label is used as a unique identifier of the options within the current screen. Together with `location` it is used to store whether this option has been chosen.\n\n`value` The location to jump to.\n\n`location` A unique location identifier for the current choices screen.\n\n`block_all` If false, the button is given the selected role if it was the chosen choice, and insensitive if it was not selected.\n\nIf true, the button is always insensitive during fixed rollback.\n\nIf None, the value is taken from the :var:`config.fix_rollback_without_choice` variable.\n\nWhen true is given to all items in a screen, it will become unclickable (rolling forward will still work). This can be changed by calling :func:`ui.saybehavior` before the call to :func:`ui.interact`."], "Preference": ["internal", "function", "(name, value=None, range=None)", "", "Action", "This constructs the appropriate action or value from a preference. The preference name should be the name given in the standard menus, while the value should be either the name of a choice, \\toggle\\ to cycle through choices, a specific value, or left off in the case of buttons.\n\n Actions that can be used with buttons and hotspots are:\n\n * Preference(\\display\\, \\fullscreen\\) - displays in fullscreen mode. * Preference(\\display\\, \\window\\) - displays in windowed mode at 1x normal size. * Preference(\\display\\, 2.0) - displays in windowed mode at 2.0x normal size. * Preference(\\display\\, \\any window\\) - displays in windowed mode at the previous size. * Preference(\\display\\, \\toggle\\) - toggle display mode.\n\n * Preference(\\transitions\\, \\all\\) - show all transitions. * Preference(\\transitions\\, \\none\\) - do not show transitions. * Preference(\\transitions\\, \\toggle\\) - toggle transitions.\n\n * Preference(\\video sprites\\, \\show\\) - show all video sprites. * Preference(\\video sprites\\, \\hide\\) - fall back to images where possible. * Preference(\\video sprites\\, \\toggle\\) - toggle image fallback behavior.\n\n * Preference(\\show empty window\\, \\show\\) - Allow the \\window show\\ and \\window auto\\ statement to show an empty window outside of the say statement. * Preference(\\show empty window\\, \\hide\\) - Prevent the above. * Preference(\\show empty window\\, \\toggle\\) - Toggle the above.\n\n * Preference(\\text speed\\, 0) - make text appear instantaneously. * Preference(\\text speed\\, 142) - set text speed to 142 characters per second.\n\n * Preference(\\joystick\\) - Show the joystick preferences.\n\n * Preference(\\skip\\, \\seen\\) - Only skip seen messages. * Preference(\\skip\\, \\all\\) - Skip unseen messages. * Preference(\\skip\\, \\toggle\\) - Toggle between skip seen and skip all.\n\n * Preference(\\begin skipping\\) - Starts skipping.\n\n * Preference(\\after choices\\, \\skip\\) - Skip after choices. * Preference(\\after choices\\, \\stop\\) - Stop skipping after choices. * Preference(\\after choices\\, \\toggle\\) - Toggle skipping after choices.\n\n * Preference(\\auto-forward time\\, 0) - Set the auto-forward time to infinite. * Preference(\\auto-forward time\\, 10) - Set the auto-forward time (unit is seconds per 250 characters).\n\n * Preference(\\auto-forward\\, \\enable\\) - Enable auto-forward mode. * Preference(\\auto-forward\\, \\disable\\) - Disable auto-forward mode. * Preference(\\auto-forward\\, \\toggle\\) - Toggle auto-forward mode.\n\n * Preference(\\auto-forward after click\\, \\enable\\) - Remain in auto-forward mode after a click. * Preference(\\auto-forward after click\\, \\disable\\) - Disable auto-forward mode after a click. * Preference(\\auto-forward after click\\, \\toggle\\) - Toggle auto-forward after click.\n\n * Preference(\\automatic move\\, \\enable\\) - Enable automatic mouse mode. * Preference(\\automatic move\\, \\disable\\) - Disable automatic mouse mode. * Preference(\\automatic move\\, \\toggle\\) - Toggle automatic mouse mode.\n\n * Preference(\\wait for voice\\, \\enable\\) - Wait for the currently playing voice to complete before auto-forwarding. * Preference(\\wait for voice\\, \\disable\\) - Do not wait for the currently playing voice to complete before auto-forwarding. * Preference(\\wait for voice\\, \\toggle\\) - Toggle wait voice.\n\n * Preference(\\voice sustain\\, \\enable\\) - Sustain voice past the current interaction. * Preference(\\voice sustain\\, \\disable\\) - Don't sustain voice past the current interaction. * Preference(\\voice sustain\\, \\toggle\\) - Toggle voice sustain.\n\n * Preference(\\music mute\\, \\enable\\) - Mute the music mixer. * Preference(\\music mute\\, \\disable\\) - Un-mute the music mixer. * Preference(\\music mute\\, \\toggle\\) - Toggle music mute.\n\n * Preference(\\sound mute\\, \\enable\\) - Mute the sound mixer. * Preference(\\sound mute\\, \\disable\\) - Un-mute the sound mixer. * Preference(\\sound mute\\, \\toggle\\) - Toggle sound mute.\n\n * Preference(\\voice mute\\, \\enable\\) - Mute the voice mixer. * Preference(\\voice mute\\, \\disable\\) - Un-mute the voice mixer. * Preference(\\voice mute\\, \\toggle\\) - Toggle voice mute.\n\n * Preference(\\mixer mute\\, \\enable\\) - Mute the specified mixer. * Preference(\\mixer mute\\, \\disable\\) - Unmute the specified mixer. * Preference(\\mixer mute\\, \\toggle\\) - Toggle mute of specified mixer.\n\n * Preference(\\all mute\\, \\enable\\) - Mute all mixers. * Preference(\\all mute\\, \\disable\\) - Unmute all mixers. * Preference(\\all mute\\, \\toggle\\) - Toggle mute of all mixers.\n\n * Preference(\\music volume\\, 0.5) - Set the music volume. * Preference(\\sound volume\\, 0.5) - Set the sound volume. * Preference(\\voice volume\\, 0.5) - Set the voice volume. * Preference(\\mixer volume\\, 0.5) - Set the specified mixer volume.\n\n * Preference(\\emphasize audio\\, \\enable\\) - Emphasize the audio channels found in :var:`config.emphasize_audio_channels`. * Preference(\\emphasize audio\\, \\disable\\) - Do not emphasize audio channels. * Preference(\\emphasize audio\\, \\toggle\\) - Toggle emphasize audio.\n\n * Preference(\\self voicing\\, \\enable\\) - Enables self-voicing. * Preference(\\self voicing\\, \\disable\\) - Disable self-voicing. * Preference(\\self voicing\\, \\toggle\\) - Toggles self-voicing.\n\n * Preference(\\self voicing volume drop\\, 0.5) - Drops the volume of non-voice mixers when self voicing is active.\n\n * Preference(\\clipboard voicing\\, \\enable\\) - Enables clipboard-voicing. * Preference(\\clipboard voicing\\, \\disable\\) - Disable clipboard-voicing. * Preference(\\clipboard voicing\\, \\toggle\\) - Toggles clipboard-voicing.\n\n * Preference(\\debug voicing\\, \\enable\\) - Enables self-voicing debug * Preference(\\debug voicing\\, \\disable\\) - Disable self-voicing debug. * Preference(\\debug voicing\\, \\toggle\\) - Toggles self-voicing debug.\n\n * Preference(\\rollback side\\, \\left\\) - Touching the left side of the screen causes rollback. * Preference(\\rollback side\\, \\right\\) - Touching the right side of the screen causes rollback. * Preference(\\rollback side\\, \\disable\\) - Touching the screen will not cause rollback.\n\n * Preference(\\gl powersave\\, True) - Drop framerate to allow for power savings. * Preference(\\gl powersave\\, False) - Do not drop framerate to allow for power savings. * Preference(\\gl powersave\\, \\auto\\) - Enable powersave when running on battery.\n\n * Preference(\\gl framerate\\, None) - Runs at the display framerate. * Preference(\\gl framerate\\, 60) - Runs at the given framerate.\n\n * Preference(\\gl tearing\\, True) - Tears rather than skipping frames. * Preference(\\gl tearing\\, False) - Skips frames rather than tearing.\n\n * Preference(\\font transform\\, \\opendyslexic\\) - Sets the accessibility font transform to opendyslexic. * Preference(\\font transform\\, \\dejavusans\\) - Sets the accessibility font transform to deja vu sans. * Preference(\\font transform\\, None) - Disables the accessibility font transform.\n\n * Preference(\\font size\\, 1.0) - Sets the accessibility font size scaling factor. * Preference(\\font line spacing\\, 1.0) - Sets the accessibility font vertical spacing scaling factor.\n\n * Preference(\\system cursor\\, \\enable\\) - Use system cursor ignoring config.mouse. * Preference(\\system cursor\\, \\disable\\) - Use cursor defined in config.mouse. * Preference(\\system cursor\\, \\toggle\\) - Toggle system cursor.\n\n * Preference(\\high contrast text\\, \\enable\\) - Enables white text on a black background. * Preference(\\high contrast text\\, \\disable\\) - Disables high contrast text. * Preference(\\high contrast text\\, \\toggle\\) - Toggles high contrast text.\n\n\n\n Values that can be used with bars are:\n\n * Preference(\\text speed\\) * Preference(\\auto-forward time\\) * Preference(\\music volume\\) * Preference(\\sound volume\\) * Preference(\\voice volume\\) * Preference(\\mixer volume\\) * Preference(\\self voicing volume drop\\) * Preference(\\font size\\) * Preference(\\font line spacing\\)\n\n The `range` parameter can be given to give the range of certain bars. For \\text speed\\, it defaults to 200 cps. For \\auto-forward time\\, it defaults to 30.0 seconds per chunk of text. (These are maximums, not defaults.)\n\n Actions that can be used with buttons are:\n\n * Preference(\\renderer menu\\) - Show the renderer menu. * Preference(\\accessibility menu\\) - Show the accessibility menu.\n\n These screens are intended for internal use, and are not customizable."], "absolute": ["internal", "class", "()", "", "", ""], "FilePageNext": ["internal", "class", "(max=None, wrap=False, auto=True, quick=True)", "", "Action", "Goes to the next file page.\n\n`max` If set, this should be an integer that gives the number of the maximum file page we can go to.\n\n`wrap` If true, we can go to the first page when on the last file page if `max` is set.\n\n`auto` If true and wrap is set, this can bring the player to the page of automatic saves.\n\n`quick` If true and wrap is set, this can bring the player to the page of automatic saves."], "iap.is_deferred": ["internal", "function", "(product)", "", "", "Returns True if the user has asked to purchase `product`, but that request has to be approved by a third party, such as a parent or guardian."], "DynamicImage": ["internal", "class", "(name)", "", "", "A DynamicImage is a displayable that has text interpolation performed on it to yield a string giving a new displayable. Such interpolation is performed at the start of each interaction."], "NVLSpeaker": ["internal", "class", "(who=NotSet, kind=None, **properties)", "", "", ""], "Matrix.rotate": ["matrix", "Matrix.rotate", "(x, y, z)", "", "function", "Returns a matrix that rotates the displayable around the origin.\n\n`x`, `y`, `z` The amount to rotate around the origin, in degrees.\n\n The rotations are applied in order:\n\n* A clockwise rotation by `x` degrees in the Y/Z plane. * A clockwise rotation by `y` degrees in the Z/X plane. * A clockwise rotation by `z` degrees in the X/Y plane."], "Lexer.name": ["cds", "name", "()", "Lexer", "method", "Matches a name. This does not match built-in keywords."], "im.math": ["obsolete", "function", "()", "", "", "This module is always available. It provides access to the mathematical functions defined by the C standard."], "_history_list": ["store_variables", "_history_list", " = [ ]", "store", "var", "This is a list of history objects, corresponding to each line of history from oldest to newest. See the :ref:`History ` section for more information."], "preferences.text_cps": ["preferences", "preferences.text_cps", " = 0", "", "var", "The speed of text display. 0 is infinite, otherwise this is the number of characters per second to show. The equivalent of the \\text speed\\ preference."], "director": ["internal", "function", "()", "", "", ""], "gui.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "ui.hotbar": ["obsolete", "ui.hotbar", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "Model": ["internal", "class", "(size=None, **properties)", "", "", "This is a displayable that causes Ren'Py to create a 2D or 3D model for use with the model-based renderer, that will be drawn in a single operation with the shaders given here, or selected by an enclosing Transform or Displayable.\n\n`size` If not None, this should be a width, height tuple, that's used to give the size of the Model. If not given, the model is the size of the area provided to it. The fit parameter to a texture takes precedence.\n\nIf no mesh method is called, a mesh that sets a_position and a_tex_coord to match the way Ren'Py loads textures is created if at least one texture is supplied. Otherwise, a mesh that only sets a_position is used.\n\nAll methods on this calls return the displayable the method is called on, making it possible to chain calls."], "gui.interface_text_font": ["gui", "gui.interface_text_font", " = \"ArchitectsDaughter.ttf\"", "", "var", "The font used for text for user interface elements, like the main and game menus, buttons, and so on."], "im.expands_bounds": ["obsolete", "function", "(bounds, size, amount)", "", "", "This expands the rectangle bounds by amount, while ensure it fits inside size."], "TextButton": ["internal", "function", "(text, style=u'button', text_style=u'button_text', clicked=None, **properties)", "", "", ""], "AddToSet": ["internal", "class", "(set, value)", "", "Action", "Adds `value` to `set`.\n\n`set` The set to add to. This may be a Python set or list, in which case the value is appended to the list. `value` The value to add or append."], "sv": ["internal", "function", "(what, interact=True)", "", "", ""], "gui.confirm_frame_borders": ["gui", "gui.confirm_frame_borders", " = Borders(60, 60, 60, 60)", "", "var", "The borders applied to the fame used in the confirm screen."], "gui.slider_size": ["gui", "gui.slider_size", " = 64", "", "var", "The height of horizontal sliders, and width of vertical sliders."], "gui.math": ["internal", "function", "()", "", "", "This module is always available. It provides access to the mathematical functions defined by the C standard."], "director.audio_channels": ["director", "director.audio_channels", " = [ \"music\", \"sound\", \"audio\" ]", "", "var", "The name of the audio channels that can be used with the play, show and stop statements."], "iap.restore": ["internal", "function", "(interact=True)", "", "", "Contacts the app store and restores any missing purchases.\n\n`interact` If True, renpy.pause will be called while waiting for the app store to respond."], "RollForward": ["internal", "class", "(*args, **kwargs)", "", "Action", "This action causes a rollforward to occur, if a roll forward is possible. Otherwise, it is insensitive."], "QuickLoad": ["internal", "function", "(confirm=True)", "", "Action", "Performs a quick load.\n\n`confirm` If true and not at the main menu, prompt for confirmation before loading the file."], "Hide": ["internal", "class", "(screen, transition=None, _layer=None)", "", "Action", "This causes the screen named `screen` to be hidden, if it is shown.\n\n`transition` If not None, a transition that occurs when hiding the screen.\n\n`_layer` This is passed as the layer argument to :func:`renpy.hide_screen`."], "gui.notify_ypos": ["gui", "gui.notify_ypos", " = 68", "", "var", "The vertical position of the notify message, in pixels from the top of the window."], "layeredimage.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "Action.unhovered": ["screen_python", "unhovered", "(self)", "Action", "method", "When the action is used as the `hovered` parameter to a button (or similar object), this method is called when the object loses focus."], "move": ["transitions", "move", "", "", "var", "Takes 0.5 seconds to the move images that have changed location to their new locations. An instance of the :func:`MoveTransition` transition class."], "gui.nvl_thought_xpos": ["gui", "gui.nvl_thought_xpos", " = 0.5", "", "var", "The positioning of character names, dialogue text, and thought/narration text, relative to the left side of the entry. This can be a number of pixels, or 0.5 to represent the center of the entry."], "ui.layer": ["obsolete", "function", "(name)", "", "", "Adds displayables to the layer named `name`. The later must be closed with :func:`ui.close`."], "SetScreenVariable": ["internal", "class", "(name, value)", "", "Action", "Causes the variable `name` associated with the current screen to be set to `value`."], "build.android_permissions": ["android", "build.android_permissions", " = [ ]", "", "var", "This is a list of strings, with each string giving the full name of an Android permission. For example, \\android.permission.WRITE_EXTERNAL_STORAGE\\. This simply declares that the application might request these permissions, it's necessary to use renpy.check_permission and renpy.request_permission as necessary to request the permission."], "Style.clear": ["style", "clear", "()", "Style", "method", "This removes all style properties from this object. Values will be inherited from this object's parent."], "achievement.Sync": ["internal", "class", "()", "", "Action", "An action that calls achievement.sync(). This is only sensitive if achievements are out of sync."], "gui.idle_color": ["gui", "gui.idle_color", " = '#606060'", "", "var", "The color used for most buttons when not focused or selected."], "style": ["internal", "function", "()", "", "", "The object exported as style in the store."], "FieldInputValue": ["internal", "class", "(object, field, default=True, returnable=False)", "", "Action", "An input value that updates `field` on `object`.\n\n`field` A string giving the name of the field.\n\n`default` If true, this input can be editable by default.\n\n`returnable` If true, the value of this input will be returned when the user presses enter."], "im.threading": ["obsolete", "function", "()", "", "", "Thread module emulating a subset of Java's threading model."], "Matrix.inverse": ["internal", "function", "()", "", "", "Returns the inverse of this matrix."], "FileLoadable": ["internal", "function", "(name, page=None, slot=False)", "", "Action", "This is a function that returns true if the file is loadable, and false otherwise."], "fade": ["transitions", "fade", "", "", "var", "Takes 0.5 seconds to fade to black, and then 0.5 seconds to fade to the new screen. An instance of the :func:`Fade` transition class."], "ToggleField": ["internal", "class", "(object, field, true_value=None, false_value=None)", "", "Action", "Toggles `field` on `object`. Toggling means to invert the boolean value of that field when the action is performed.\n\n `true_value` If not None, then this is the true value we use. `false_value` If not None, then this is the false value we use."], "Lexer.require": ["cds", "require", "(thing, name=None)", "Lexer", "method", "Tries to parse `thing`, and reports an error if it cannot be done.\n\nIf `thing` is a string, tries to parse it using :func:`match`. Otherwise, thing must be a other method on this lexer object, which is called without arguments. If `name` is not specified, the name of the method will be used in the message (or `thing` if it's a string), otherwise the `name` will be used."], "wipeleft": ["transitions", "wipeleft", "", "", "var", "Also: **wiperight, wipeup, wipedown**\n\nWipes the scene in the given direction. Instances of the :func:`CropMove` transition class."], "achievement.clear": ["internal", "function", "(name)", "", "", "Clears the achievement with `name`."], "anim": ["internal", "function", "()", "", "", ""], "ToggleScreen": ["internal", "class", "(screen, transition=None, *args, **kwargs)", "", "Action", "This toggles the visibility of `screen`. If it is not currently shown, the screen is shown with the provided arguments. Otherwise, the screen is hidden.\n\nIf not None, `transition` is use to show and hide the screen."], "HistoryEntry.window_args": ["history", "window_args", "", "HistoryEntry", "attribute", "A dictionary giving the properties that were supplied to the dialogue window when the dialogue was originally shown."], "Solid": ["internal", "class", "(color, **properties)", "", "", "A displayable that fills the area its assigned with `color`.\n```\nimage white = Solid(\\#fff\\)\n\n```"], "BarValue.get_adjustment": ["screen_python", "get_adjustment", "(self)", "BarValue", "method", "This method is called to get an adjustment object for the bar. It should create the adjustment with :func:`ui.adjustment`, and then return the object created this way.\n\nThis method must be overridden, as the default method will raise NotImplemented (and hence cause Ren'Py to report an error)."], "im.zipfile": ["obsolete", "function", "()", "", "", "Read and write ZIP files."], "Motion": ["internal", "function", "()", "", "", "This is used to move a child displayable around the screen. It works by supplying a time value to a user-supplied function, which is in turn expected to return a pair giving the x and y location of the upper-left-hand corner of the child, or a 4-tuple giving that and the xanchor and yanchor of the child.\n\nThe time value is a floating point number that ranges from 0 to 1. If repeat is True, then the motion repeats every period sections. (Otherwise, it stops.) If bounce is true, the time value varies from 0 to 1 to 0 again.\n\nThe function supplied needs to be pickleable, which means it needs to be defined as a name in an init block. It cannot be a lambda or anonymous inner function. If you can get away with using Pan or Move, use them instead.\n\nPlease note that floats and ints are interpreted as for xpos and ypos, with floats being considered fractions of the screen."], "updater.UpdateCancelled": ["internal", "class", "()", "", "", "Used to report the update being cancelled."], "Action.periodic": ["screen_python", "periodic", "(st)", "Action", "method", "This method is called once at the start of each interaction, and then is called periodically thereafter. If it returns a number, it will be called before that many seconds elapse, but it might be called sooner.\n\nThe main use of this is to call :func:`renpy.restart_interaction` if the value of get_selected or get_sensitive should change.\n\nIt takes one argument:\n\n`st` The number of seconds since the screen or displayable this action is associated with was first shown."], "sorted": ["internal", "function", "(*args, **kwargs)", "", "", ""], "gui.dialogue_ypos": ["gui", "gui.dialogue_ypos", " = 75", "", "var", "The horizontal and vertical positions of the actual dialogue. These are usually a number of pixels from the left or top side of the textbox. Setting a variable to 0.5 centers the dialogue in the textbox (see below)."], "ui.transform": ["obsolete", "ui.transform", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "ui.Many": ["obsolete", "class", "(displayable, imagemap, style_prefix)", "", "", "A widget that takes many children."], "Help": ["internal", "class", "(help=None)", "", "Action", "Displays help.\n\nIf a screen named ``help`` is defined, that screen is displayed using :func:`ShowMenu` and `help` is ignored.\n\n`help` A string that is used to find help. This is used in the following way:\n\n* If a label with this name exists, the label is called in a new context. * Otherwise, this is interpreted as giving the name of a file that should be opened in a web browser.\n\nIf `help` is None, :var:`config.help` is used as the default value."], "build.exclude_empty_directories": ["build", "build.exclude_empty_directories", " = True", "", "var", "If true, empty directories (including directories left empty by file archiving) will be removed from generated packages. If false, empty directories will be included."], "Skip": ["internal", "class", "(fast=False, confirm=False)", "", "Action", "Causes the game to begin skipping. If the game is in a menu context, then this returns to the game. Otherwise, it just enables skipping.\n\n `fast` If true, skips directly to the next menu choice.\n\n `confirm` If true, asks for confirmation before beginning skipping."], "preferences.skip_after_choices": ["preferences", "preferences.skip_after_choices", " = False", "", "var", "If True, skipping will resume after a choice. If False, a choice will prevent Ren'Py from skipping. The equivalent of the \\after choices\\ preference."], "InputValue.Enable": ["screen_python", "Enable", "()", "InputValue", "method", "Returns an action that enables text editing on the input."], "MultiPersistent.save": ["persistent", "save", "()", "MultiPersistent", "method", "Saves the multipersistent data to disk. This must be called after the data is modified."], "MoveFactory": ["internal", "function", "()", "", "", ""], "gui.history_text_xpos": ["gui", "gui.history_text_xpos", " = 0.5", "", "var", "The horizontal positions of the name label and dialogue text. These can be a number of pixels from the left side of the history entry, or 0.5 to center."], "ui.textbutton": ["obsolete", "ui.textbutton", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "SetCharacterVolume": ["internal", "function", "(voice_tag, volume=None)", "", "", "This allows the volume of each characters to be adjusted. If `volume` is None, this returns a BarValue that controls the value of `voice_tag`. Otherwise, this set it to `volume`.\n\n`volume` is a number between 0.0 and 1.0, and is interpreted as a fraction of the mixer volume for `voice` channel."], "gui.vbar_borders": ["gui", "gui.vbar_borders", " = Borders(10, 10, 10, 10)", "", "var", "The borders that are used with the Frames containing the bar images."], "with_statement": ["internal", "function", "()", "", "", ""], "topright": ["transforms", "topright", "", "", "var", "Aligns to the top-right corner of the screen."], "gui.button_image_extension": ["gui", "gui.button_image_extension", " = \".png\"", "", "var", "The extension for button images. This could be changed to .webp to use WEBP button images instead of png ones."], "ADVSpeaker": ["internal", "class", "(name=NotSet, kind=None, **properties)", "", "", ""], "build.display_name": ["internal", "function", "()", "", "", "The name that will be displayed in the title bar."], "Lexer.label_name": ["cds", "label_name", "(declare=False)", "Lexer", "method", "Matches a label name, either absolute or relative. If `declare` is true, then the global label name is set. (Note that this does not actually declare the label - the statement is required to do that by returning it from the `label` function.)"], "MouseDisplayable": ["internal", "class", "(cursor, x, y)", "", "", "A displayable that wraps a mouse cursor displayable, and causes it to move across the screen when the player moves their mouse.\n\n`cursor` A displayable that is used to draw the mouse.\n\n`x`, `y` The coordinates of the hotspot, relative to the upper left corner of the mouse, in virtual pixels.\n\n.. method MouseDisplayable.add(name, cursor, x, y)\n\nThis adds a second cursor, that is used when the `name` mouse is displayed. This returns the MouseDisplayable, so that calls to this method can be chained."], "toggle_skipping": ["internal", "function", "()", "", "", ""], "StaticValue": ["internal", "class", "(value=0.0, range=1.0)", "", "Action", "This allows a value to be specified statically.\n\n `value` The value itself, a number.\n\n `range` The range of the value."], "gui.button_text_size": ["gui", "gui.button_text_size", " = gui.interface_text_size", "", "var", "The font and size of the button text."], "slideleft": ["transitions", "slideleft", "", "", "var", "Also: **slideright, slideup, slidedown**\n\nSlides the new scene in the given direction. Instances of the :func:`CropMove` transition class."], "DictValue": ["internal", "class", "(dict, key, range, max_is_zero=False, style=u'bar', offset=0, step=None, action=None, force_step=False)", "", "Action", "A value that allows the user to adjust the value of a key in a dict.\n\n `dict` The dict. `key` The key. `range` The range to adjust over. `max_is_zero` If True, then when the value of a key is zero, the value of the bar will be range, and all other values will be shifted down by 1. This works both ways - when the bar is set to the maximum, the value of a key is set to 0.\n\n `style` The styles of the bar created. `offset` An offset to add to the value. `step` The amount to change the bar by. If None, defaults to 1/10th of the bar. `action` If not None, an action to call when the field has changed."], "pixellate": ["transitions", "pixellate", "", "", "var", "Pixellates the old scene for .5 seconds, and the new scene for another .5 seconds. An instance of the :func:`Pixellate` transition class."], "print": ["internal", "function", "(*args, **kwargs)", "", "", ""], "Revolve": ["internal", "function", "()", "", "", ""], "squares": ["transitions", "squares", "", "", "var", "Transitions the screen in a squares effect lasting 1 second."], "DictInputValue": ["internal", "class", "(dict, key, default=True, returnable=False)", "", "Action", "An input value that updates `key` in `dict`.\n\n`default` If true, this input can be editable by default.\n\n`returnable` If true, the value of this input will be returned when the user presses enter."], "OpacityMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to change the opacity of an image, while leaving color channels alone.\n\n`value` The amount the alpha channel should be multiplied by, a number between 0.0 and 1.0."], "moveoutright": ["transitions", "moveoutright", "", "", "var", "Also: **moveoutleft, moveouttop, moveoutbottom**\n\nThese move leaving images off the screen via the appropriate side, taking 0.5 seconds to do so."], "ScaleMatrix": ["internal", "class", "(x, y, z)", "", "", "A TransformMatrix that returns a matrix that scales the displayable.\n\n`x`, `y`, `z` The factor to scale each axis by."], "VoiceInfo": ["internal", "class", "(self)", "", "", "An object returned by VoiceInfo and get_voice_info()."], "nvl_menu": ["internal", "function", "(items)", "", "", "A Python function that displays a menu in NVL style. This is rarely used directly. Instead, it's assigned to the :var:`menu` variable, using something like\n```\ndefine menu = nvl_menu\n```"], "tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "main_menu": ["store_variables", "main_menu", " = False", "store", "var", "Ren'Py sets this variable to True while in the main menu. This can be used to have screens display differently while in the main menu."], "SetVariable": ["internal", "function", "(name, value)", "", "Action", "Causes the variable with `name` to be set to `value`.\n\nThe `name` argument must be a string, and can be a simple name like \\strength\\, or one with dots separating the variable from fields, like \\hero.strength\\ or \\persistent.show_cutscenes\\."], "topleft": ["transforms", "topleft", "", "", "var", "Aligns to the top-left corner of the screen."], "ui.text": ["obsolete", "ui.text", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "gui.history_text_ypos": ["gui", "gui.history_text_ypos", " = 60", "", "var", "The vertical positions of the name label and dialogue text, relative to the top of a history entry, in pixels."], "Action.__call__": ["screen_python", "__call__", "(self)", "Action", "method", "This is the method that is called when the action is activated. In many cases, returning a non-None value from the action will cause the current interaction to end.\n\nThis method must be overridden, as the default method will raise NotImplemented (and hence cause Ren'Py to report an error)."], "Jump": ["internal", "class", "(label)", "", "Action", "Causes control to transfer to `label`."], "swing": ["internal", "function", "()", "", "", ""], "SideImage": ["internal", "function", "()", "", "", "Returns the side image associated with the currently speaking character, or a Null displayable if no such side image exists."], "MultiPersistent": ["internal", "function", "(name, save_on_quit=False)", "", "", ""], "InvertSelected": ["internal", "class", "(action)", "", "Action", "This inverts the selection state of the provided action, while proxying over all of the other methods."], "gui.python_object": ["internal", "class", "()", "", "", "The most base type"], "Pause": ["transitions", "function", "(delay)", "", "", "Returns a transition that only displays the new screen for `delay` seconds. It can be useful as part of a MultipleTransition."], "build.executable_name": ["build", "build.executable_name", " = \"...\"", "", "var", "This variable controls the name of the executables that the user clicks on to start the game.\n\nThis variable should not contain special characters like spaces, colons, and semicolons. If not set, it defaults to :var:`build.name`.\n\nFor example, if this is set to \\mygame\\, the user will be able to run mygame.exe on Windows, mygame.app on Macintosh, and mygame.sh on Linux."], "gui.nvl_thought_ypos": ["gui", "gui.nvl_thought_ypos", " = 0", "", "var", "The position of character names, dialogue text, and thought/narration text, relative to the top of the entry. This should be a number of pixels from the top."], "gui.namebox_tile": ["gui", "gui.namebox_tile", " = False", "", "var", "These variables control the display of the frame containing the namebox."], "Start": ["internal", "class", "(label=u'start')", "", "Action", "Causes Ren'Py to jump out of the menu context to the named label. The main use of this is to start a new game from the main menu. Common uses are:\n\n * Start() - Start at the start label. * Start(\\foo\\) - Start at the \\foo\\ label."], "gui.interface_text_color": ["gui", "gui.interface_text_color", " = '#404040'", "", "var", "The color used by static text in the game interface, such as text on the help and about screens."], "Tile": ["internal", "class", "(child, style=u'tile', **properties)", "", "", "Tiles `child` until it fills the area allocated to this displayable.\n```\nimage bg tile = Tile(\\bg.png\\)\n\n```"], "preferences.mobile_rollback_side": ["preferences", "preferences.mobile_rollback_side", " = \"disable\"", "", "var", "When on a mobile platform, touches or clicks to this side of the window cause rollback to occur. One of \\left\\, \\right\\, or \\disable\\. This is the equivalend of the \\rollback side\\ preference when on a mobile platform."], "open": ["internal", "function", "(*args, **kwargs)", "", "", ""], "easeintop": ["transitions", "easeintop", "", "", "var", "Also: **easeinright, easeinleft, ease, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "_rollback": ["store_variables", "_rollback", " = True", "store", "var", "Controls if rollback is allowed."], "Lexer.expect_noblock": ["cds", "expect_noblock", "(stmt)", "Lexer", "method", "Called to indicate this statement does not expect a block. If a block is found, raises an error. `stmt` should be a string, it will be added to the message with an error."], "FileSaveName": ["internal", "function", "(name, empty=u'', page=None, slot=False)", "", "Action", "Return the save_name that was in effect when the file was saved, or `empty` if the file does not exist."], "Screenshot": ["internal", "class", "(*args, **kwargs)", "", "Action", "Takes a screenshot."], "preferences.mouse_move": ["preferences", "preferences.mouse_move", " = False", "", "var", "If True, the mouse will automatically move to a selected button. If False, it will not. The equivalent of the \\automatic mouse move\\ preference."], "top": ["transforms", "top", "", "", "var", "Centers horizontally, and aligns to the top of the screen."], "Lexer.renpy_block": ["cds", "renpy_block", "(empty=False)", "Lexer", "method", "This parses all of the remaining lines in the current block as Ren'Py script, and returns a SubParse corresponding to the first statement in the block. The block is chained together such that all statements in the block are run, and then control is transferred to the statement after this creator-defined statement.\n\nNote that this parses the current block. In the more likely case that you'd like to parse the subblock of the current statement, the correct way to do that is\n```\ndef mystatement_parse(l):\n\nl.require(':')\nl.expect_eol()\nl.expect_block(\\mystatement\\)\n\nchild = l.subblock_lexer().renpy_block()\n\nreturn { \\child\\ : child }\n\n`empty`\nIf True, allows an empty block to be parsed. (An empty block\nis equivalent to a block with a single ``pass`` statement.)\n\nIf False, an empty block triggers an error.\n\n\n```"], "layeredimage": ["internal", "function", "()", "", "", ""], "build.python_object": ["internal", "class", "()", "", "", "The most base type"], "im.Recolor": ["obsolete", "class", "(im, rmul=255, gmul=255, bmul=255, amul=255, force_alpha=False, **properties)", "", "", "This adjusts the colors of the image that is its child. It takes as an argument 4 numbers between 0 and 255, and maps each channel of the image linearly between 0 and the supplied color."], "HueMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to rotate the hue by `value` degrees. While `value` can be any number, positive or negative, 360 degrees makes a complete rotation. The alpha channel is left alone."], "iap": ["internal", "function", "()", "", "", "Ren'Py includes a high-level in-app purchasing framework. This framework currently only supports unlock-style purchases from the Apple App Store, Google Play, and the Amazon Appstore."], "slidedown": ["transitions", "slidedown", "", "", "var", "Also: **slideright, slideup, slideleft**\n\nSlides the new scene in the given direction. Instances of the :func:`CropMove` transition class."], "ui.ChoiceReturn": ["obsolete", "class", "(label, value, location=None, block_all=None, sensitive=True, args=None, kwargs=None)", "", "", "A menu choice action that returns `value`, while managing the button state in a manner consistent with fixed rollback. (See block_all for a description of the behavior.)\n\n `label` The label text of the button. For imagebuttons and hotspots this can be anything. This label is used as a unique identifier of the options within the current screen. Together with `location` it is used to store whether this option has been chosen.\n\n`value` The value this is returned when the choice is chosen.\n\n`location` A unique location identifier for the current choices screen.\n\n`block_all` If false, the button is given the selected role if it was the chosen choice, and insensitive if it was not selected.\n\nIf true, the button is always insensitive during fixed rollback.\n\nIf None, the value is taken from the :var:`config.fix_rollback_without_choice` variable.\n\nWhen true is given to all items in a screen, it will become unclickable (rolling forward will still work). This can be changed by calling :func:`ui.saybehavior` before the call to :func:`ui.interact`."], "im.Color": ["obsolete", "function", "(im, color)", "", "", "This recolors the supplied image, mapping colors such that black is black and white is the supplied color."], "gui.nvl_thought_width": ["gui", "gui.nvl_thought_width", " = 740", "", "var", "The width of each kind of text, in pixels."], "Language": ["internal", "class", "(language)", "", "Action", "Changes the language of the game to `language`.\n\n`language` A string giving the language to translate to, or None to use the default language of the game script."], "centered": ["internal", "function", "()", "", "", ""], "gui.text_size": ["gui", "gui.text_size", " = 33", "", "var", "Sets the size of the dialogue text. This may need to be increased or decreased to fit the selected font in the space allotted."], "ImageDissolve": ["transitions", "function", "(image, time, ramplen=8, reverse=False, alpha=True, time_warp=None)", "", "", "Returns a transition that dissolves the old scene into the new scene, using an image to control the dissolve process. This means that white pixels will dissolve in first, and black pixels will dissolve in last.\n\n`image` A control image to use. If `config.gl2` is True, then this can be any displayable, else it needs to be either an image file or an image manipulator. The control image should be the size of the scenes being dissolved, and if `reverse=True`, it should be fully opaque.\n\n`time` The time the dissolve will take.\n\n`ramplen` The length of the ramp to use. This must be an integer power of 2. When this is the default value of 8, when a white pixel is fully dissolved, a pixel 8 shades of gray darker will have completed one step of dissolving in.\n\n`reverse` If True, black pixels will dissolve in before white pixels.\n\n`alpha` Ignored.\n\n`time_warp` A function that adjusts the timeline. If not None, this should be a function that takes a fractional time between 0.0 and 1.0, and returns a number in the same range.\n```\ndefine circirisout = ImageDissolve(\\circiris.png\\, 1.0)\ndefine circirisin = ImageDissolve(\\circiris.png\\, 1.0, reverse=True)\ndefine circiristbigramp = ImageDissolve(\\circiris.png\\, 1.0, ramplen=256)\n```"], "preferences.afm_after_click": ["preferences", "preferences.afm_after_click", " = False", "", "var", "If True, auto-forward move will be continue after a click. If False, a click will end auto-forward mode. The equivalent of the \\auto-forward after click\\ preference."], "DictEquality": ["internal", "class", "(*args, **kwargs)", "", "", "Declares two objects equal if their types are the same, and their internal dictionaries are equal."], "InputValue.Toggle": ["screen_python", "Toggle", "()", "InputValue", "method", "Returns an action that toggles text editing on the input."], "LayeredImageProxy": ["internal", "class", "(name, transform=None)", "", "", "This is an image-like object that proxies attributes passed to it to another layered image.\n\n`name` A string giving the name of the layered image to proxy to.\n\n`transform` If given, a transform or list of transforms that are applied to the image after it has been proxied."], "director.voice_channel": ["director", "director.voice_channel", " = \"voice\"", "", "var", "The name of the audio channel used by voice."], "Stop": ["internal", "class", "(channel, **kwargs)", "", "Action", "Causes an audio channel to be stopped.\n\n `channel` The channel to stop the sound on.\n\n Any keyword arguments are passed to :func:`renpy.music.stop`"], "nvl_clear_next": ["internal", "function", "()", "", "", ""], "ToggleMute": ["internal", "class", "(mixer)", "", "Action", "Toggles the mute status of one or more mixers.\n\n`mixer` Either a single string giving a mixer name, or a list of strings giving a list of mixers. The strings should be mixer names, usually \\music\\, \\sfx\\, or \\voice\\."], "translate_define": ["translating_renpy", "translate_define", "(language, define, value, help=None)", "", "function", "This is used to set a define when generating a game. For example, it can be used to change the size of a font.\n\n`language` The language involved.\n\n`define` The name of the define.\n\n`value` A string giving the value the define should be set to. (ie. \\10\\, \\False\\, or \\'Font.ttf'\\).\n\n`comment` If not None, a comment that will be generated before the define. The comment will only be generated if the define does not exist in gui.rpy. There is no need to use \\## \\, as the comment will be added and wrapped automatically.\n\nFor example, the following changes the size of dialogue text\n```\ntranslate_define(\\martian\\, \\gui.text_size\\, 12)\n\n```"], "voice_can_replay": ["internal", "function", "()", "", "", "Returns true if it's possible to replay the current voice."], "Set": ["internal", "class", "(*args)", "", "", ""], "gui.dialogue_width": ["gui", "gui.dialogue_width", " = 1116", "", "var", "This variable gives the maximum width of a line of dialogue, in pixels. When dialogue reaches this width, it will be wrapped by Ren'Py."], "ui.interact": ["obsolete", "function", "(roll_forward=None, mouse='default')", "", "", "Causes an interaction with the user, and returns the result of that interaction. This causes Ren'Py to redraw the screen and begin processing input events. When a displayable returns a value in response to an event, that value is returned from ui.interact, and the interaction ends.\n\nThis function is rarely called directly. It is usually called by other parts of Ren'Py, including the say statement, menu statement, with statement, pause statement, call screen, :func:`renpy.input`, among many other functions. However, it can be called directly if necessary.\n\nWhen an interaction ends, the transient layer and all screens shown with transient=True are cleared from the scene lists.\n\nThe following arguments are documented. As other, undocumented arguments exist for Ren'Py's internal use, please pass all arguments as keyword arguments.\n\n`roll_forward` The information that will be returned by this function when a roll forward occurs. (If None, the roll forward is ignored.) This should usually be passed the result of the :func:`renpy.roll_forward_info` function.\n\n`mouse` The style of mouse cursor to use during this function."], "zoomout": ["transitions", "zoomout", "", "", "var", "This zooms out leaving images, taking 0.5 seconds to do so."], "voice_sustain": ["internal", "function", "(ignored=u'', **kwargs)", "", "", "The equivalent of the voice sustain statement."], "RestartStatement": ["internal", "class", "(*args, **kwargs)", "", "Action", "This action causes Ren'Py to rollback to before the current statement, and then re-run the current statement. This may be used when changing a persistent variable that affects how the statement is displayed.\n\nIf run in a menu context, this waits until the player exits to a top-level context before performing the rollback."], "iap.init_android": ["internal", "function", "()", "", "", "Initialize IAP on Android."], "ImageReference": ["internal", "class", "(name, **properties)", "", "", "ImageReference objects are used to reference images by their name, which is a tuple of strings corresponding to the name used to define the image in an image statment."], "ContrastMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to change the brightness of an image, while leaving the Alpha channel alone.\n\n`value` The contrast value. Values between 0.0 and 1.0 decrease the contrast, while values above 1.0 increase the contrast."], "RevolveInOut": ["internal", "function", "()", "", "", ""], "iap.get_store_name": ["internal", "function", "()", "", "", "Returns the name of the enabled store for in-app purchase. This currently returns one of \\amazon\\, \\play\\ (for Google Play), \\ios\\ or None if no store is available."], "build.pattern_list": ["internal", "function", "(l)", "", "", "Apply file_lists to the second argument of each tuple in a list."], "ui.fixed": ["obsolete", "ui.fixed", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "preferences.get_volume": ["preferences", "preferences.get_volume", "(mixer):", "", "function", "Gets the volume for `mixer`. If the mixer is muted, this returns 0.0."], "Movie": ["internal", "class", "(fps=24, size=None, channel=u'movie', play=None, mask=None, mask_channel=None, image=None, play_callback=None, side_mask=False, loop=True, start_image=None, **properties)", "", "", "This is a displayable that shows the current movie.\n\n`fps` The framerate that the movie should be shown at. (This is currently ignored, but the parameter is kept for backwards compatibility. The framerate is auto-detected.)\n\n`size` This should be specified as either a tuple giving the width and height of the movie, or None to automatically adjust to the size of the playing movie. (If None, the displayable will be (0, 0) when the movie is not playing.)\n\n`channel` The audio channel associated with this movie. When a movie file is played on that channel, it will be displayed in this Movie displayable. If this is left at the default of \\movie\\, and `play` is provided, a channel name is automatically selected, using :var:`config.single_movie_channel` and :var:`config.auto_movie_channel`.\n\n`play` If given, this should be the path to a movie file. The movie file will be automatically played on `channel` when the Movie is shown, and automatically stopped when the movie is hidden.\n\n`side_mask` If true, this tells Ren'Py to use the side-by-side mask mode for the Movie. In this case, the movie is divided in half. The left half is used for color information, while the right half is used for alpha information. The width of the displayable is half the width of the movie file.\n\nWhere possible, `side_mask` should be used over `mask` as it has no chance of frames going out of sync.\n\n`mask` If given, this should be the path to a movie file that is used as the alpha channel of this displayable. The movie file will be automatically played on `movie_channel` when the Movie is shown, and automatically stopped when the movie is hidden.\n\n`mask_channel` The channel the alpha mask video is played on. If not given, defaults to `channel`\\ _mask. (For example, if `channel` is \\sprite\\, `mask_channel` defaults to \\sprite_mask\\.)\n\n`start_image` An image that is displayed when playback has started, but the first frame has not yet been decoded.\n\n`image` An image that is displayed when `play` has been given, but the file it refers to does not exist. (For example, this can be used to create a slimmed-down mobile version that does not use movie sprites.) Users can also choose to fall back to this image as a preference if video is too taxing for their system. The image will also be used if the video plays, and then the movie ends.\n\n`play_callback` If not None, a function that's used to start the movies playing. (This may do things like queue a transition between sprites, if desired.) It's called with the following arguments:\n\n`old` The old Movie object, or None if the movie is not playing. `new` The new Movie object.\n\nA movie object has the `play` parameter available as ``_play``, while the ``channel``, ``loop``, ``mask``, and ``mask_channel`` fields correspond to the given parameters.\n\nGenerally, this will want to use :func:`renpy.music.play` to start the movie playing on the given channel, with synchro_start=True. A minimal implementation is\n```\ndef play_callback(old, new):\n\nrenpy.music.play(new._play, channel=new.channel, loop=new.loop, synchro_start=True)\n\nif new.mask:\nrenpy.music.play(new.mask, channel=new.mask_channel, loop=new.loop, synchro_start=True)\n\n`loop`\nIf False, the movie will not loop. If `image` is defined, the image\nwill be displayed when the movie ends. Otherwise, the displayable will\nbecome transparent.\n```"], "gui.button_borders": ["gui", "gui.button_borders", " = Borders(10, 10, 10, 10)", "", "var", "The borders surrounding a button, in left, top, right, bottom order."], "Particles": ["internal", "class", "(factory, **properties)", "", "", "Supports particle motion, using the old API."], "DynamicDisplayable": ["internal", "class", "(function, *args, **kwargs)", "", "", "A displayable that can change its child based on a Python function, over the course of an interaction.\n\n`function` A function that is called with the arguments:\n\n* The amount of time the displayable has been shown for. * The amount of time any displayable with the same tag has been shown for. * Any positional or keyword arguments supplied to DynamicDisplayable.\n\nand should return a (d, redraw) tuple, where:\n\n* `d` is a displayable to show. * `redraw` is the maximum amount of time to wait before calling the function again, or None to not require the function be called again before the start of the next interaction.\n\n`function` is called at the start of every interaction.\n\nAs a special case, `function` may also be a python string that evaluates to a displayable. In that case, function is run once per interaction.\n```\n# Shows a countdown from 5 to 0, updating it every tenth of\n# a second until the time expires.\ninit python:\n\ndef show_countdown(st, at):\nif st > 5.0:\nreturn Text(\\0.0\\), None\nelse:\nd = Text(\\{:.1f}\\.format(5.0 - st))\nreturn d, 0.1\n\nimage countdown = DynamicDisplayable(show_countdown)\n```"], "Window": ["internal", "class", "(child=None, style=u'window', **properties)", "", "", "A window that has padding and margins, and can place a background behind its child. `child` is the child added to this displayable. All other properties are as for the :ref:`Window` screen language statement."], "Animation": ["internal", "function", "(*args, **kwargs)", "", "", ""], "Call": ["internal", "class", "(label, *args, **kwargs)", "", "Action", "Ends the current statement, and calls `label`. Arguments and keyword arguments are passed to :func:`renpy.call`."], "VariableValue": ["internal", "function", "(variable, range, max_is_zero=False, style=u'bar', offset=0, step=None, action=None, force_step=False)", "", "Action", "A bar value that allows the user to adjust the value of a variable in the default store.\n\n `variable` A string giving the name of the variable to adjust. `range` The range to adjust over. `max_is_zero` If True, then when the field is zero, the value of the bar will be range, and all other values will be shifted down by 1. This works both ways - when the bar is set to the maximum, the field is set to 0.\n\n This is used internally, for some preferences. `style` The styles of the bar created. `offset` An offset to add to the value. `step` The amount to change the bar by. If None, defaults to 1/10th of the bar. `action` If not None, an action to call when the field has changed."], "Pan": ["internal", "function", "()", "", "", ""], "gui.kind_text_size": ["gui", "gui.kind_text_size", "", "", "var", "If present, the size of the text."], "moveoutleft": ["transitions", "moveoutleft", "", "", "var", "Also: **moveoutright, moveouttop, moveoutbottom**\n\nThese move leaving images off the screen via the appropriate side, taking 0.5 seconds to do so."], "Rollback": ["internal", "class", "(*args, **kwargs)", "", "Action", "This action causes a rollback to occur, when a rollback is possible. Otherwise, nothing happens.\n\nThe arguments are given to :func:`renpy.rollback`, except that the `force` argument defaults to \\menu\\."], "Sprite": ["internal", "class", "()", "", "", "This represents a sprite that is managed by the SpriteManager. It contains fields that control the placement of the sprite on the screen. Sprites should not be created directly. Instead, they should be created by calling :meth:`SpriteManager.create`.\n\nThe fields of a sprite object are:\n\n`x`, `y` The x and y coordinates of the upper-left corner of the sprite, relative to the SpriteManager.\n\n`zorder` An integer that's used to control the order of this sprite in the relative to the other sprites in the SpriteManager. The larger the number is, the closer to the viewer the sprite is.\n\n`events` If True, then events are passed to child. If False, the default, the children ignore events (and hence don't spend time processing them).\n\nThe methods of a Sprite object are:"], "iap.register": ["internal", "function", "(product, identifier=None, amazon=None, google=None, ios=None, consumable=False)", "", "", "Registers a product with the in-app purchase system.\n\n`product` A string giving the high-level name of the product. This is the string that will be passed to :func:`iap.purchase`, :func:`iap.Purchase`, and :func:`iap.has_purchased` to represent this product.\n\n`identifier` A string that's used to identify the product internally. Once used to represent a product, this must never change. These strings are generally of the form \\com.domain.game.product\\.\n\nIf None, defaults to `product`.\n\n`amazon` A string that identifies the product in the Amazon app store. If not given, defaults to `identifier`.\n\n`google` A string that identifies the product in the Google Play store. If not given, defaults to `identifier`.\n\n`ios` A string that identifies the product in the Apple App store for iOS. If not given, defaults to `identifier`.\n\n`consumable` True if this is a consumable purchase. Right now, consumable purchases are only supported on iOS."], "im.io": ["obsolete", "function", "()", "", "", "The io module provides the Python interfaces to stream handling. The builtin open function is defined in this module.\n\nAt the top of the I/O hierarchy is the abstract base class IOBase. It defines the basic interface to a stream. Note, however, that there is no separation between reading and writing to streams; implementations are allowed to raise an IOError if they do not support a given operation.\n\nExtending IOBase is RawIOBase which deals simply with the reading and writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide an interface to OS files.\n\nBufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer streams that are readable, writable, and both respectively. BufferedRandom provides a buffered interface to random access streams. BytesIO is a simple stream of in-memory bytes.\n\nAnother IOBase subclass, TextIOBase, deals with the encoding and decoding of streams into text. TextIOWrapper, which extends it, is a buffered text interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO is an in-memory stream for text.\n\nArgument names are not part of the specification, and only the arguments of open() are intended to be used as keyword arguments.\n\ndata:\n\nDEFAULT_BUFFER_SIZE\n\n An int containing the default buffer size used by the module's buffered I/O classes. open() uses the file's blksize (as obtained by os.stat) if possible."], "HistoryEntry.who": ["history", "who", "", "HistoryEntry", "attribute", "A string giving the name of the character that is speaking, or None if no such string exists."], "RotoZoom": ["internal", "function", "()", "", "", ""], "Editor.open": ["editor", "open", "( filename, line=None, **kwargs)", "Editor", "method", "Opens a `filename` in the editor.\n\nIf `line` is not None, attempts to position the editing cursor at `line`."], "build": ["internal", "function", "()", "", "", ""], "BarValue.replaces": ["screen_python", "replaces", "(other)", "BarValue", "method", "This is called when a BarValue replaces another BarValue, such as when a screen is updated. It can be used to update this BarValue from the other. It is called before get_adjustment.\n\nNote that `other` is not necessarily the same type as `self`."], "gui.label_text_size": ["gui", "gui.label_text_size", " = 45", "", "var", "The size of section labels in the game's user interface."], "Alpha": ["internal", "function", "()", "", "", ""], "With": ["internal", "class", "(transition)", "", "Action", "Causes `transition` to occur."], "Gallery": ["internal", "class", "(self)", "", "", "This class supports the creation of an image gallery by handling the locking of images, providing an action that can show one or more images, and a providing method that creates buttons that use that action.\n\n.. attribute:: transition\n\nThe transition that is used when changing images.\n\n.. attribute:: locked_button\n\nThe default displayable used by make_button for a locked button.\n\n.. attribute:: hover_border\n\nThe default hover border used by make_button.\n\n.. attribute:: idle_border\n\nThe default idle border used by make_button.\n\n.. attribute:: unlocked_advance\n\nIf true, the gallery will only advance through unlocked images.\n\n.. attribute:: navigation\n\nIf true, the gallery will display navigation and slideshow buttons on top of the images.\n\nTo customize the look of the navigation, you may override the gallery_navigation screen. The default screen is defined in common/00gallery.rpy\n\n.. attribute:: span_buttons\n\nIf true, the gallery will advance between buttons.\n\n.. attribute:: slideshow_delay\n\nThe time it will take for the gallery to advance between images in slideshow mode."], "HistoryEntry.kind": ["history", "kind", "", "HistoryEntry", "attribute", "The kind of character that created this history. Ren'Py sets this to either \\adv\\ or \\nvl\\."], "_live2d_fade": ["live2d", "_live2d_fade", " = True", "", "var", "If true, Live2D animations use motion fading. If False, animations are transitioned abruptly."], "Button": ["internal", "class", "(child=None, style=u'button', clicked=None, hovered=None, unhovered=None, action=None, role=None, time_policy=None, keymap={}, alternate=None, selected=None, sensitive=None, keysym=None, alternate_keysym=None, **properties)", "", "", ""], "object": ["internal", "class", "(*args, **kwargs)", "", "", ""], "FileCurrentScreenshot": ["internal", "class", "(empty=None, **properties)", "", "", "A displayable that shows the screenshot that will be saved with the current file, if a screenshot has been taken when entering a menu or with :func:`FileTakeScreenshot`.\n\nIf there is no current screenshot, `empty` is shown in its place. (If `empty` is None, it defaults to :func:`Null`.)"], "director.spacing": ["director", "director.spacing", " = 1", "", "var", "The spacing between a director (scene, show, hide, with, play, queue, and voice) line and a non-director line, or vice versa. These spacings should be 0 or 1 lines, a higher spacing may not work."], "build.directory_name": ["build", "build.directory_name", " = \"...\"", "", "var", "This is used to create the names of directories in the archive files. For example, if this is set to \\mygame-1.0\\, the Linux version of the project will unpack to \\mygame-1.0-linux\\.\n\nThis is also used to determine the name of the directory in which the package files are placed. For example, if you set build.directory_name to mygame-1.0, the archive files will be placed in mygame-1.0-dists in the directory above the base directory.\n\nThis variable should not contain special characters like spaces, colons, and semicolons. If not set, it defaults to :var:`build.name` a dash, and :var:`config.version`."], "GetCharacterVolume": ["internal", "function", "(voice_tag)", "", "Action", "This returns the volume associated with voice tag, a number between 0.0 and 1.0, which is interpreted as a fraction of the mixer volume for the `voice` channel."], "achievement": ["internal", "function", "()", "", "", "The Achievement module allows the developer to grant achievements to the player, to clear achievements, and to determine if an achievement has been granted. It also allows the recording of progress towards an achievement.\n\nBy default, the achievement stores information in the persistent file. If Steam support is available and enabled, achievement information is automatically synchronized with Steam."], "icon": ["internal", "function", "()", "", "", ""], "ui.close": ["obsolete", "function", "()", "", "", "Closes a displayable created with by a UI function. When a displayable is closed, we add new displayables to its parent, or to the layer if no displayable is open."], "audio": ["internal", "function", "()", "", "", ""], "gui.REGULAR_BOLD": ["translating_renpy", "gui.REGULAR_BOLD", " = False", "", "var", "If True, heavy-weight text is bolded."], "doc": ["internal", "function", "()", "", "", ""], "shaderdoc": ["internal", "function", "()", "", "", ""], "easeinright": ["transitions", "easeinright", "", "", "var", "Also: **ease, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "Crop": ["internal", "function", "(rect, child, **properties)", "", "", "This creates a displayable by cropping `child` to `rect`, where `rect` is an (x, y, width, height) tuple.\n```\nimage eileen cropped = Crop((0, 0, 300, 300), \\eileen happy\\)\n```"], "Sample": ["language_basics", "Sample", "(name, delay, position=(0, 0), **properties)", "", "function", "A sample function that doesn't actually exist in Ren'Py, but is used only in documentation."], "Lexer.rest": ["cds", "rest", "()", "Lexer", "method", "Skips whitespace, then returns the rest of the line."], "YScrollValue": ["internal", "class", "(viewport)", "", "Action", "The value of an adjustment that vertically scrolls the viewport with the given id, on the current screen. The viewport must be defined before a bar with this value is."], "ADVCharacter": ["internal", "class", "(name=NotSet, kind=None, **properties)", "", "", "The character object contains information about a character. When passed as the first argument to a say statement, it can control the name that is displayed to the user, and the style of the label showing the name, the text of the dialogue, and the window containing both the label and the dialogue."], "iap.Product": ["internal", "class", "(product, identifier, google, amazon, ios, consumable)", "", "", "A data object representing a product."], "left": ["transforms", "left", "", "", "var", "Aligns to the bottom-left corner of the screen."], "ui.timer": ["obsolete", "ui.timer", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "gui.accent_color": ["gui", "gui.accent_color", " = '#000060'", "", "var", "The accent color is used in many places in the GUI, including titles and labels."], "layeredimage.OrderedDict": ["internal", "class", "(*args, **kwds)", "", "", "Dictionary that remembers insertion order\n\nInitialize an ordered dictionary. The signature is the same as regular dictionaries, but keyword arguments are not recommended because their insertion order is arbitrary."], "Character": ["internal", "function", "(name=..., kind=adv, **args)", "", "", "Creates and returns a Character object, which controls the look and feel of dialogue and narration.\n\n`name` If a string, the name of the character for dialogue. When `name` is None, display of the name is omitted, as for narration. If no name is given, the name is taken from `kind`, and otherwise defaults to None.\n\n`kind` The Character to base this Character off of. When used, the default value of any argument not supplied to this Character is the value of that argument supplied to ``kind``. This can be used to define a template character, and then copy that character with changes.\n\n**Linked Image.** An image tag may be associated with a Character. This allows a say statement involving this character to display an image with the tag, and also allows Ren'Py to automatically select a side image to show when this character speaks.\n\n`image` A string giving the image tag that is linked with this character.\n\n**Voice Tag.** If a voice tag is assign to a Character, the voice files that are associated with it, can be muted or played in the preference screen.\n\n`voice_tag` A String that enables the voice file associated with the Character to be muted or played in the 'voice' channel.\n\n**Prefixes and Suffixes.** These allow a prefix and suffix to be applied to the name of the character, and to the text being shown. This can be used, for example, to add quotes before and after each line of dialogue.\n\n`what_prefix` A string that is prepended to the dialogue being spoken before it is shown.\n\n`what_suffix` A string that is appended to the dialogue being spoken before it is shown.\n\n`who_prefix` A string that is prepended to the name of the character before it is shown.\n\n`who_suffix` A string that is appended to the name of the character before it is shown.\n\n**Changing Name Display.** These options help to control the display of the name.\n\n`dynamic` If true, then `name` should either be a string containing a Python expression, a function, or a callable object. If it's a string, That string will be evaluated before each line of dialogue, and the result used as the name of the character. Otherwise, the function or callable object will be called with no arguments before each line of dialogue, and the return value of the call will be used as the name of the character.\n\n**Controlling Interactions.** These options control if the dialogue is displayed, if an interaction occurs, and the mode that is entered upon display.\n\n`condition` If given, this should be a string containing a Python expression. If the expression is false, the dialogue does not occur, as if the say statement did not happen.\n\n`interact` If true, the default, an interaction occurs whenever the dialogue is shown. If false, an interaction will not occur, and additional elements can be added to the screen.\n\n`advance` If true, the default, the player can click to advance through the statement, and other means of advancing (such as skip and auto-forward mode) will also work. If false, the player will be unable to move past the say statement unless an alternate means (such as a jump hyperlink or screen) is provided.\n\n`mode` A string giving the mode to enter when this character speaks. See the section on :ref:`modes ` for more details.\n\n`callback` A function that is called when events occur while the character is speaking. See the section on :ref:`character-callbacks` fore more information.\n\n**Click-to-continue.** A click-to-continue indicator is displayed once all the text has finished displaying, to prompt the user to advance.\n\n`ctc` A displayable to use as the click-to-continue indicator, unless a more specific indicator is used.\n\n`ctc_pause` A displayable to use a the click-to-continue indicator when the display of text is paused by the {p} or {w} text tags.\n\n`ctc_timedpause` A displayable to use a the click-to-continue indicator when the display of text is paused by the {p=} or {w=} text tags. When None, this takes its default from `ctc_pause`, use ``Null()`` when you want a `ctc_pause` but no `ctc_timedpause`.\n\n`ctc_position` Controls the location of the click-to-continue indicator. If ``\\nestled\\``, the indicator is displayed as part of the text being shown, immediately after the last character. ``\\nestled-close\\`` is similar, except a break is not allowed between the text and the CTC indicator. If ``\\fixed\\``, the indicator is added to the screen, and its position is controlled by the position style properties.\n\n **Screens.** The display of dialogue uses a :ref:`screen `. These arguments allow you to select that screen, and to provide arguments to it.\n\n`screen` The name of the screen that is used to display the dialogue.\n\nKeyword arguments beginning with ``show_`` have the prefix stripped off, and are passed to the screen as arguments. For example, the value of ``show_myflag`` will become the value of the ``myflag`` variable in the screen. (The ``myflag`` variable isn't used by default, but can be used by a custom say screen.)\n\nOne show variable is, for historical reasons, handled by Ren'Py itself:\n\n`show_layer` If given, this should be a string giving the name of the layer to show the say screen on.\n\n**Styling Text and Windows.** Keyword arguments beginning with ``who_``, ``what_``, and ``window_`` have their prefix stripped, and are used to :ref:`style ` the character name, the spoken text, and the window containing both, respectively.\n\nFor example, if a character is given the keyword argument ``who_color=\\#c8ffc8\\``, the color of the character's name is changed, in this case to green. ``window_background=\\frame.png\\`` sets the background of the window containing this character's dialogue.\n\nThe style applied to the character name, spoken text, and window can also be set this way, using the ``who_style``, ``what_style``, and ``window_style`` arguments, respectively.\n\nSetting :var:`config.character_id_prefixes` makes it possible to style other displayables as well. For example, when the default GUI is used, styles prefixed with ``namebox_`` are used to style the name of the speaking character."], "build.include_old_themes": ["build", "build.include_old_themes", " = True", "", "var", "When true, files required to support themes that existed before Ren'Py 6.99.9 will be included in the build. When false, such files are excluded.\n\nThis is set to False when :func:`gui.init` is called."], "FilePage": ["internal", "class", "(page)", "", "Action", "Sets the file page to `page`, which should be one of \\auto\\, \\quick\\, or an integer."], "_ignore_action": ["store_variables", "_ignore_action", " = None", "store", "var", "When this is not None, it's an action that is run after clicking Ignore on the error handling screen. The action is usually :func:`Jump`, to jump the game to a place that can recover from an error. If None, control continues with the next Ren'Py statement."], "iap.missing_products": ["internal", "function", "()", "", "", "Determines if any products are missing from persistent._iap_purchases"], "ui.add": ["obsolete", "ui.add", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "ui.screen_id": ["obsolete", "function", "(id_, d)", "", "", "Assigns the displayable `d` the screen widget id `id_`, as if it had been created by a screen statement with that id."], "mouse_visible": ["store_variables", "mouse_visible", " = True", "store", "var", "Controls if the mouse is visible. This is automatically set to true when entering the standard game menus."], "gui.interface_text_size": ["gui", "gui.interface_text_size", " = 36", "", "var", "The size of static text in the game's user interface, and the default size of button text in the game's interface."], "preferences.afm_time": ["preferences", "preferences.afm_time", " = 15", "", "var", "The amount of time to wait for auto-forward mode. Bigger numbers are slower, though the conversion to wall time is complicated, as the speed takes into account line length. The equivalent of the \\auto-forward\\ preference."], "theme": ["internal", "function", "()", "", "", ""], "black": ["internal", "image", " = Solid(\"#000\")", "", "image", ""], "gui.SetPreference": ["internal", "class", "(name, value, rebuild=True)", "", "Action", "This Action sets the gui preference with `name` to `value`.\n\n`rebuild` If true, the default, :func:`gui.rebuild` is called to make the changes take effect. This should generally be true, except in the case of multiple gui.SetPreference actions, in which case it should be False in all but the last one.\n\nThis is a very slow action, and probably not suitable for use when a button is hovered."], "blinds": ["transitions", "blinds", "", "", "var", "Transitions the screen in a vertical blinds effect lasting 1 second. An instance of the :func:`ImageDissolve` transition class."], "director.audio_channel_patterns": ["director", "director.audio_channel_patterns", " = { }", "", "var", "A map from a channel name to the list of audio patterns that are available in that audio channel. For example, if this is set to ``{ 'sound' : [ 'sound/*.opus' ], 'music' : [ 'music/*.opus' ] }`` the music and sound channels get their own lists of patterns."], "ToggleDict": ["internal", "class", "(dict, key, true_value=None, false_value=None)", "", "Action", "Toggles the value of `key` in `dict`. Toggling means to invert the value when the action is performed.\n\n `true_value` If not None, then this is the true value used. `false_value` If not None, then this is the false value used."], "im.Alpha": ["obsolete", "function", "(image, alpha, **properties)", "", "", "Returns an alpha-mapped version of the image. Alpha is the maximum alpha that this image can have, a number between 0.0 (fully transparent) and 1.0 (opaque).\n\nIf an image already has an alpha channel, values in that alpha channel are reduced as appropriate."], "iap.has_purchased": ["internal", "function", "(product)", "", "", "Returns True if the user has purchased `product` in the past, and False otherwise."], "gui.insensitive_color": ["gui", "gui.insensitive_color", " = '#8888887f'", "", "var", "The color used by the text of buttons that are insensitive to user input. (For example, the rollback button when no rollback is possible.)"], "AudioPositionValue": ["internal", "class", "(channel=u'music', update_interval=0.1)", "", "Action", "A value that shows the playback position of the audio file playing in `channel`.\n\n`update_interval` How often the value updates, in seconds."], "Lexer.checkpoint": ["cds", "checkpoint", "()", "Lexer", "method", "Returns an opaque object representing the current state of the lexer."], "HistoryEntry.rollback_identifier": ["history", "rollback_identifier", "", "HistoryEntry", "attribute", "This is an identifier that can be passed to the :func:`RollbackToIdentifier` action, to cause a rollback to the line of script that generated this history entry. The rollback only occurs if the location is still in the script log, otherwise the action is insensitive."], "iap.AndroidBackend": ["internal", "class", "(store, store_name)", "", "", "The IAP backend that is used when IAP is supported."], "im.Data": ["obsolete", "class", "(data, filename, **properties)", "", "", "This image manipulator loads an image from binary data.\n\n`data` A string of bytes, giving the compressed image data in a standard file format.\n\n`filename` A \\filename\\ associated with the image. This is used to provide a hint to Ren'Py about the format of `data`. (It's not actually loaded from disk.)"], "build.remove": ["internal", "function", "(l, pattern)", "", "", "Removes the pattern from the list."], "default_transition": ["internal", "function", "()", "", "", ""], "ToggleVariable": ["internal", "function", "(variable, true_value=None, false_value=None)", "", "Action", "Toggles `variable`.\n\nThe `variable` argument must be a string, and can be a simple name like \\strength\\, or one with dots separating the variable from fields, like \\hero.strength\\ or \\persistent.show_cutscenes\\.\n\n `true_value` If not None, then this is the true value used. `false_value` If not None, then this is the false value used."], "im.Image": ["obsolete", "class", "(filename, **properties)", "", "", "This image manipulator loads an image from a file."], "Matrix.perspective": ["matrix", "Matrix.perspective", "(w, h, n, p, f)", "", "function", "Returns a matrix suitable for the perspective projection of an image in the Ren'Py coordinate system. This is a view into the a coordinate system where, where when z=0, (0, 0) corresponds to the top-left corner of the screen, and (w, h) corresponds to the bottom-right corner of the screen.\n\n`w`, `h` The width and height of the input plane, in pixels.\n\n`n` The distance of the near plane from the camera.\n\n`p` How far the z=0 plane is from the camera. This is also where one virtual pixel is one coordinate unit in x and y.\n\n`f` The distance of the far plane from the camera."], "voice_replay": ["internal", "function", "()", "", "", "Replays the current voice, if possible."], "Move": ["internal", "function", "()", "", "", ""], "irisout": ["transitions", "irisout", "", "", "var", "Also: **irisin**\n\nUse a rectangular iris to display the new screen, or hide the old screen. Instances of the :func:`CropMove` transition class."], "Editor": ["editor", "Editor", "", "", "class", ""], "build.tobytes": ["internal", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "BrightnessMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to change the brightness of an image, while leaving the Alpha channel alone.\n\n`value` The amount of change in image brightness. This should be a number between -1 and 1, with -1 the darkest possible image and 1 the brightest."], "gui.preference": ["internal", "function", "(name, default=not_set)", "", "", "This function returns the value of the gui preference with `name`.\n\n`default` If given, this value becomes the default value of the gui preference. The default value should be given the first time the preference is used."], "irisin": ["transitions", "irisin", "", "", "var", "Also: **irisout**\n\nUse a rectangular iris to display the new screen, or hide the old screen. Instances of the :func:`CropMove` transition class."], "Lexer.expect_eol": ["cds", "expect_eol", "()", "Lexer", "method", "If we are not at the end of the line, raise an error."], "build.name": ["build", "build.name", " = \"...\"", "", "var", "This is used to automatically generate build.directory_name and build.executable_name, if neither is set. This should not contain spaces, colons, or semicolons."], "set": ["internal", "class", "(*args)", "", "", ""], "director.other_spacing": ["director", "director.other_spacing", " = 0", "", "var", "The spacing between two consecutive non-director lines."], "ui.hbox": ["obsolete", "ui.hbox", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "slideawayleft": ["transitions", "slideawayleft", "", "", "var", "Also: **slideawayright, slideawayup, slideawaydown**\n\nSlides the old scene in the given direction. Instances of the :func:`CropMove` transition class."], "MixerValue": ["internal", "class", "(mixer)", "", "Action", "The value of an audio mixer.\n\n `mixer` The name of the mixer to adjust. This is usually one of \\music\\, \\sfx\\, or \\voice\\, but creators can create new mixers."], "Action.get_sensitive": ["screen_python", "get_sensitive", "(self)", "Action", "method", "This is called to determine if the button with this action should be sensitive. It should return true if the button is sensitive.\n\nNote that __call__ can be called, even if this returns False.\n\nThe default implementation returns True."], "AlphaDissolve": ["transitions", "function", "(control, delay=0.0, alpha=False, reverse=False)", "", "", "Returns a transition that uses a control displayable (almost always some sort of animated transform) to transition from one screen to another. The transform is evaluated. The new screen is used where the transform is opaque, and the old image is used when it is transparent.\n\n`control` The control transform.\n\n`delay` The time the transition takes, before ending.\n\n`alpha` Ignored.\n\n`reverse` If true, the alpha channel is reversed. Opaque areas are taken from the old image, while transparent areas are taken from the new image."], "_game_menu_screen": ["store_variables", "_game_menu_screen", " = \"save\"", "store", "var", "This is the screen that is displayed when entering the game menu with no more specific screen selected. (For example, when right-clicking, pressing escape, or when :func:`ShowMenu` is not given an argument.) If None, entry to the game menu is disallowed.\n\nThis is set to None at the start of the splashscreen, and restored to its original value when the splashscreen ends."], "easeouttop": ["transitions", "easeouttop", "", "", "var", "Also: **easeinright, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, ease, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "InputValue.default": ["screen_python", "default", "", "InputValue", "attribute", "If true, the input is eligible to be editable by default. (That is, it may be given the caret when the screen is shown.)"], "slideawaydown": ["transitions", "slideawaydown", "", "", "var", "Also: **slideawayright, slideawayup, slideawayleft**\n\nSlides the old scene in the given direction. Instances of the :func:`CropMove` transition class."], "nvl_hide": ["internal", "function", "(with_)", "", "", "The Python equivalent of the ``nvl hide`` statement.\n\n`with_` The transition to use to hide the NVL-mode window."], "nvl_clear": ["internal", "function", "()", "", "", "The Python equivalent of the ``nvl clear`` statement."], "achievement.clear_all": ["internal", "function", "()", "", "", "Clears all achievements."], "Input": ["internal", "class", "(default=u'', length=None, style=u'input', allow=None, exclude=None, prefix=u'', suffix=u'', changed=None, button=None, replaces=None, editable=True, pixel_width=None, value=None, copypaste=False, caret_blink=None, **properties)", "", "", "This is a Displayable that takes text as input."], "slideright": ["transitions", "slideright", "", "", "var", "Also: **slideleft, slideup, slidedown**\n\nSlides the new scene in the given direction. Instances of the :func:`CropMove` transition class."], "FileCurrentPage": ["internal", "function", "()", "", "Action", "Returns the current file page as a string."], "EndReplay": ["internal", "class", "(confirm=True)", "", "Action", "Ends the current replay.\n\n`confirm` If true, prompts the user for confirmation before ending the replay."], "extend": ["internal", "function", "(what, interact=True, *args, **kwargs)", "", "", ""], "Matrix.scale": ["matrix", "Matrix.scale", "(x, y, z)", "", "function", "Returns a matrix that scales the displayable.\n\n`x`, `y`, `z` The factor to scale each axis by."], "Style.take": ["style", "take", "(other)", "Style", "method", "This takes all style properties from `other`. `other` must be a style object."], "FileTime": ["internal", "function", "(name, format=u'%b %d, %H:%M', empty=u'', page=None, slot=False)", "", "Action", "Returns the time the file was saved, formatted according to the supplied `format`. If the file is not found, `empty` is returned.\n\n The return value is a string."], "Queue": ["internal", "class", "(channel, file, **kwargs)", "", "Action", "Causes an audio file to be queued on a given channel.\n\n `channel` The channel to play the sound on. `file` The file to play.\n\n Any keyword arguments are passed to :func:`renpy.music.queue`"], "RemoveFromSet": ["internal", "class", "(set, value)", "", "Action", "Removes `value` from `set`.\n\n`set` The set to remove from. This may be a set or list. `value` The value to remove."], "gui.navigation_button_width": ["gui", "gui.navigation_button_width", " = 290", "", "var", "Increases the width of navigation buttons."], "InputValue.get_text": ["screen_python", "get_text", "(self)", "InputValue", "method", "Returns the default text of the input. This must be implemented."], "blend_parameter": ["live2d", "blend_parameter", "(name, blend, value, weight=1.0)", "", "method", "This method blends the current value of the parameter with passed. This have no effect outside of `update_function`.\n\n`name` Name of parameter to change defined for this model.\n\n`blend` One of \\Add\\, \\Multiply\\ or \\Overwrite\\. The blend kind that will be used.\n\n`value` The value to be used.\n\n`weight` Float from 0.0 to 1.0, the weight by which the new value will change the current value."], "HBox": ["internal", "function", "(*args, **properties)", "", "", "A box that lays out its members from left to right."], "Lexer.image_name_component": ["cds", "image_name_component", "()", "Lexer", "method", "Matches an image name component. Unlike a word, a image name component can begin with a number."], "ui.vbar": ["obsolete", "ui.vbar", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "store": ["internal", "function", "()", "", "", ""], "preferences.set_mute": ["preferences", "preferences.set_mute", "(mixer, mute):", "", "function", "Sets the mute setting for `mixer`. If `mute` is true, the mixer is muted."], "moveoutbottom": ["transitions", "moveoutbottom", "", "", "var", "Also: **moveoutleft, moveouttop, moveoutright**\n\nThese move leaving images off the screen via the appropriate side, taking 0.5 seconds to do so."], "gui.bar_size": ["gui", "gui.bar_size", " = 64", "", "var", "The height of horizontal bars, and width of vertical bars."], "gui.slot_button_height": ["gui", "gui.slot_button_height", " = 309", "", "var", "The width and height of the save slot button."], "gui.notify_text_size": ["gui", "gui.notify_text_size", " = 24", "", "var", "The size of notification text."], "iap.init": ["internal", "function", "()", "", "", "Called to initialize the IAP system."], "Scroll": ["internal", "class", "(id, direction, amount=u'step')", "", "Action", "Causes a Bar, Viewport, or Vpgrid to scroll.\n\n`id` The id of a bar, viewport, or vpgrid in the current screen.\n\n`direction` For a vbar, one of \\increase\\ or \\decrease\\. For a viewport or vpgrid, one of \\horizontal increase\\, \\vertical increase\\, \\horizontal decrease\\, or \\vertical decrease\\.\n\n`amount` The amount to scroll by. This can be a number of pixels, or else \\step\\ or \\page\\."], "gui.text_font": ["gui", "gui.text_font", " = \"ArchitectsDaughter.ttf\"", "", "var", "This sets the font that is used for dialogue text, menus, inputs, and other in-game text. The font file should exist in the game directory."], "name_only": ["internal", "function", "()", "", "", "This is a template character that is used when a string is given as the character name in a say statement."], "color": ["internal", "class", "()", "", "", ""], "Transform": ["internal", "class", "(child=None, function=None, style=u'default', focus=None, default=False, _args=None, **kwargs)", "", "", "A transform applies operations such as cropping, rotation, scaling, and alpha-blending to its child. A transform object has fields corresponding to the transform properties, which it applies to its child."], "gui.hover_color": ["gui", "gui.hover_color", " = '#3284d6'", "", "var", "The color used by focused items in the GUI, including the text of of buttons and the thumbs (movable areas) of sliders and scrollbars."], "updater.UpdateError": ["internal", "class", "()", "", "", "Used to report known errors."], "FileSave": ["internal", "class", "(name, confirm=True, newest=True, page=None, cycle=False, slot=False)", "", "Action", "Saves the file.\n\n The button with this slot is selected if it's marked as the newest save file.\n\n `name` The name of the slot to save to. If None, an unused slot (a large number based on the current time) will be used.\n\n `confirm` If true, then we will prompt before overwriting a file.\n\n `newest` Ignored.\n\n `page` The name of the page that the slot is on. If None, the current page is used.\n\n `cycle` If true, then saves on the supplied page will be cycled before being shown to the user. :var:`config.quicksave_slots` slots are used in the cycle.\n\n `slot` If True, `name` is taken to be a slot name, and `page` is ignored."], "Borders": ["internal", "class", "(left, top, right, bottom, pad_left=0, pad_top=0, pad_right=0, pad_bottom=0)", "", "", "This object provides border size and tiling information to a :func:`Frame`. It can also provide padding information that can be supplied to the :propref:`padding` style property of a window or frame.\n\n`left`, `top`, `right`, `bottom` These provide the size of the insets used by a frame, and are added to the padding on each side. They should zero or a positive integer.\n\n`pad_left`, `pad_top`, `pad_right`, `pad_bottom` These are added to the padding on each side, and may be positive or negative. (For example, if `left` is 5 and `pad_left` is -3, the final padding is 2.)\n\nThe padding information is supplied via a field:\n\n.. attribute\n```\npadding\n\nThis is a four-element tuple containing the padding on each of the\nfour sides.\n```"], "im.Twocolor": ["obsolete", "class", "(im, white, black, force_alpha=False, **properties)", "", "", "This takes as arguments two colors, white and black. The image is mapped such that pixels in white have the white color, pixels in black have the black color, and shades of gray are linearly interpolated inbetween. The alpha channel is mapped linearly between 0 and the alpha found in the white color, the black color's alpha is ignored."], "ShowMenu": ["internal", "class", "(screen=None, *args, **kwargs)", "", "Action", "Causes us to enter the game menu, if we're not there already. If we are in the game menu, then this shows a screen or jumps to a label.\n\n `screen` is usually the name of a screen, which is shown using the screen mechanism. If the screen doesn't exist, then \\_screen\\ is appended to it, and that label is jumped to.\n\n If the optional keyword argument `_transition` is given, the menu will change screens using the provided transition. If not manually specified, the default transition is `config.intra_transition`.\n\n * ShowMenu(\\load\\) * ShowMenu(\\save\\) * ShowMenu(\\preferences\\)\n\n This can also be used to show user-defined menu screens. For example, if one has a \\stats\\ screen defined, one can show it as part of the game menu using:\n\n * ShowMenu(\\stats\\)\n\n ShowMenu without an argument will enter the game menu at the default screen, taken from _game_menu_screen.\n\n Extra arguments and keyword arguments are passed on to the screen"], "ConditionSwitch": ["internal", "function", "(*args, predict_all=None, **properties)", "", "", "This is a displayable that changes what it is showing based on Python conditions. The positional arguments should be given in groups of two, where each group consists of:\n\n* A string containing a Python condition. * A displayable to use if the condition is true.\n\nThe first true condition has its displayable shown, at least one condition should always be true.\n\nThe conditions uses here should not have externally-visible side-effects.\n\n`predict_all` If True, all of the possible displayables will be predicted when the displayable is shown. If False, only the current condition is predicted. If None, :var:`config.conditionswitch_predict_all` is used.\n```\nimage jill = ConditionSwitch(\n\\jill_beers > 4\\, \\jill_drunk.png\\,\n\\True\\, \\jill_sober.png\\)\n```"], "BarValue.periodic": ["screen_python", "periodic", "(st)", "BarValue", "method", "This method is called once at the start of each interaction. If it returns a number of seconds, it will be called before that many seconds elapse, but it might be called sooner. It is called after get_adjustment.\n\nIt can be used to update the value of the bar over time, like :func:`AnimatedValue` does. To do this, get_adjustment should store the adjustment, and periodic should call the adjustment's changed method."], "Style.set_parent": ["style", "set_parent", "(parent)", "Style", "method", "Sets the parent of this style object to `parent`."], "gui.button_text_xalign": ["gui", "gui.button_text_xalign", " = 0.0", "", "var", "The horizontal alignment of the button text. 0.0 is left-aligned, 0.5 is centered, and 1.0 is right-aligned."], "FileLoad": ["internal", "class", "(name, confirm=True, page=None, newest=True, cycle=False, slot=False)", "", "Action", "Loads the file.\n\n `name` The name of the slot to load from. If None, an unused slot will be used, and hence the file will not be loadable.\n\n `confirm` If true and not at the main menu, prompt for confirmation before loading the file.\n\n `page` The page that the file will be loaded from. If None, the current page is used.\n\n `newest` If true, the button is selected if this is the newest file.\n\n `cycle` Ignored.\n\n `slot` If True, `name` is taken to be a slot name, and `page` is ignored."], "im.MatrixColor": ["obsolete", "class", "(im, matrix, **properties)", "", "", "An image operator that uses `matrix` to linearly transform the image manipulator `im`.\n\n`Matrix` should be a list, tuple, or :func:`im.matrix` that is 20 or 25 elements long. If the object has 25 elements, then elements past the 20th are ignored.\n\nWhen the four components of the source color are R, G, B, and A, which range from 0.0 to 1.0; the four components of the transformed color are R', G', B', and A', with the same range; and the elements of the matrix are named::\n\n[ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ]\n\nthe transformed colors can be computed with the formula::\n\nR' = (a * R) + (b * G) + (c * B) + (d * A) + e G' = (f * R) + (g * G) + (h * B) + (i * A) + j B' = (k * R) + (l * G) + (m * B) + (n * A) + o A' = (p * R) + (q * G) + (r * B) + (s * A) + t\n\nThe components of the transformed color are clamped to the range [0.0, 1.0]."], "gui.name_text_size": ["gui", "gui.name_text_size", " = 45", "", "var", "Sets the size of character names."], "slideawayup": ["transitions", "slideawayup", "", "", "var", "Also: **slideawayright, slideawayleft, slideawaydown**\n\nSlides the old scene in the given direction. Instances of the :func:`CropMove` transition class."], "gui.nvl_spacing": ["gui", "gui.nvl_spacing", " = 15", "", "var", "The spacing between entries when gui.nvl_height is None, and the spacing between NVL-mode menu buttons."], "gui.init": ["internal", "function", "(width, height, fov=75)", "", "", "Initializes the gui.\n\n`width` The width of the default window.\n\n`height` The height of the default window.\n\n`fov` The field of view of the 3d stage."], "_dismiss_pause": ["store_variables", "_dismiss_pause", " = True", "store", "var", "If True, the player can dismiss pauses and transitions."], "build.clear": ["internal", "function", "()", "", "", "Clears the list of patterns used to classify files."], "gui.hover_muted_color": ["gui", "gui.hover_muted_color", " = '#8080f0'", "", "var", "Muted colors, used for the sections of bars, scrollbars, and sliders that do not represent the value or visible area. (These are only used when generating images, and will not take effect until images are regenerated in the launcher.)"], "makeJson": ["internal", "function", "()", "", "", ""], "gui.unscrollable": ["gui", "gui.unscrollable", " = \"hide\"", "", "var", "This controls what to do if the bar is unscrollable. \\hide\\ hides the bar, while None keeps it shown."], "im.free_memory": ["obsolete", "function", "()", "", "", "Frees some memory."], "im.Tile": ["obsolete", "class", "(im, size=None, **properties)", "", "", "An image manipulator that tiles the image manipulator `im`, until it is `size`.\n\n`size` If not None, a (width, height) tuple. If None, this defaults to (:var:`config.screen_width`, :var:`config.screen_height`).\n\nThe same effect can now be achieved with Tile(im, size=size)"], "Action": ["internal", "class", "()", "", "", "Returns an action that is generally used as the hovered property of a button. When the button is hovered, the value field of this tooltip is set to `value`. When the button loses focus, the value field of this tooltip reverts to the default."], "im.FactorScale": ["obsolete", "class", "(im, width, height=None, bilinear=True, **properties)", "", "", "An image manipulator that scales `im` (a second image manipulator) to `width` times its original `width`, and `height` times its original height. If `height` is omitted, it defaults to `width`.\n\nIf `bilinear` is true, then bilinear interpolation is used for the scaling. Otherwise, nearest neighbor interpolation is used.\n```\nimage logo doubled = im.FactorScale(\\logo.png\\, 1.5)\n\nThe same effect can now be achieved with the :tpref:`zoom` or the\n:tpref:`xzoom` and :tpref:`yzoom` transform properties.\n```"], "preferences.system_cursor": ["preferences", "preferences.system_cursor", " = False", "", "var", "If True, the system cursor is forced to be used, ignoring the :var:`config.mouse` value. If False, it will not. The equivalent of the \\system cursor\\ preference."], "MoveOut": ["internal", "function", "()", "", "", ""], "preferences.emphasize_audio": ["preferences", "preferences.emphasize_audio", " = False", "", "var", "If True, Ren'Py will emphasize the audio channels found in :var:`config.emphasize_audio_channels` by reducing the volume of other channels. (For example, reducing the music volume when voice is playing.) If False, this doesn't happen."], "iap.purchase": ["internal", "function", "(product, interact=True)", "", "", "This function requests the purchase of `product`.\n\nIt returns true if the purchase succeeds, or false if the purchase fails. If the product has been registered as consumable, the purchase is consumed before this call returns."], "im.Sepia": ["obsolete", "function", "(im, **properties)", "", "", "An image manipulator that creates a sepia-toned version of the image manipulator `im`.\n\nThe same effect can now be achieved by supplying SepiaMatrix() to the :tpref:`matrixcolor` transform property."], "StylePreference": ["internal", "class", "(preference, alternative)", "", "Action", "An action that causes `alternative` to become the selected alternative for the given style preference.\n\n`preference` A string giving the name of the style preference.\n\n`alternative` A string giving the name of the alternative."], "ui.null": ["obsolete", "ui.null", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "Action.get_tooltip": ["screen_python", "get_tooltip", "(self)", "Action", "method", "This gets a default tooltip for this button, if a specific tooltip is not assigned. It should return the tooltip value, or None if a tooltip is not known.\n\nThis defaults to returning None."], "_window_subtitle": ["store_variables", "_window_subtitle", " = ''", "store", "var", "This is appended to :var:`config.window_title` to produce the caption for the game window. This is automatically set to :var:`config.menu_window_subtitle` while in the game menu."], "gui.idle_small_color": ["gui", "gui.idle_small_color", " = '#404040'", "", "var", "The color used for small text (like the date and name of a save slot, and quick menu buttons) when not hovered. This color often needs to be a bit lighter or darker than idle_color to compensate for the smaller size of the font."], "gui.textbox_height": ["gui", "gui.textbox_height", " = 278", "", "var", "The height of the textbox. This should be the same height as the height of gui/textbox.png."], "save_name": ["internal", "function", "()", "", "", "A save name that is included with saves."], "im.Crop": ["obsolete", "class", "(im, rect)", "", "", "An image manipulator that crops `rect`, a (x, y, width, height) tuple, out of `im`, an image manipulator.\n```\nimage logo crop = im.Crop(\\logo.png\\, (0, 0, 100, 307))\n\nThe same effect can now be achieved by setting the :tpref:`crop` transform property.\n```"], "gui.FONT_SCALE": ["translating_renpy", "gui.FONT_SCALE", " = 1.0", "", "var", "A scaling factor that is applied to all text in the launcher."], "achievement.sync": ["internal", "function", "()", "", "", "Synchronizes registered achievements between local storage and other backends. (For example, Steam.)"], "SetLocalVariable": ["internal", "function", "(name, value)", "", "Action", "Causes the variable `name` to be set to `value` in the current local context.\n\nThis function is only useful in a screen that has been use by another scene, as it provides a way of setting the value of a variable inside the used screen. In all other cases, :func:`SetScreenVariable` should be preferred, as it allows more of the screen to be cached.\n\nThis must be created in the context that the variable is set in - it can't be passed in from somewhere else."], "director.tag_blacklist": ["director", "director.tag_blacklist", " = { \"black\", \"text\", \"vtext\" }", "", "var", "A blacklist of tags that will not be shown for the show, scene, or hide statements."], "PlayCharacterVoice": ["internal", "class", "(voice_tag, sample, selected=False)", "", "Action", "This plays `sample` on the voice channel, as if said by a character with `voice_tag`.\n\n`sample` The full path to a sound file. No voice-related handling of this file is done.\n\n`selected` If True, buttons using this action will be marked as selected while the sample is playing."], "ui.prefixed_style": ["obsolete", "function", "(style_suffix)", "", "", "Combines the default style prefix with a style suffix."], "Fade": ["transitions", "function", "(out_time, hold_time, in_time, color=\"#000\")", "", "", "Returns a transition that takes `out_time` seconds to fade to a screen filled with `color`, holds at that screen for `hold_time` seconds, and then takes `in_time` to fade to then new screen.\n```\n# Fade to black and back.\ndefine fade = Fade(0.5, 0.0, 0.5)\n\n# Hold at black for a bit.\ndefine fadehold = Fade(0.5, 1.0, 0.5)\n\n# Camera flash - quickly fades to white, then back to the scene.\ndefine flash = Fade(0.1, 0.0, 0.5, color=\\#fff\\)\n```"], "ui.vbox": ["obsolete", "ui.vbox", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "GetTooltip": ["internal", "function", "(screen=None)", "", "Action", "Returns the tooltip of the currently focused displayable, or None if no displatable is focused.\n\n`screen` If not None, this should be the name or tag of a screen. If given, this function only returns the tooltip if the focused displayable is part of the screen."], "unicode_literals": ["internal", "function", "()", "", "", ""], "build.mac_info_plist": ["build", "build.mac_info_plist", " = { }", "", "var", "This is a dictionary mapping strings to strings, that can be used to add or override keys in the mac's Info.plist file."], "ShowingSwitch": ["internal", "function", "(*args, predict_all=None, **properties)", "", "", "This is a displayable that changes what it is showing based on the images are showing on the screen. The positional argument should be given in groups of two, where each group consists of:\n\n* A string giving an image name, or None to indicate the default. * A displayable to use if the condition is true.\n\nA default image should be specified.\n\n`predict_all` If True, all of the possible displayables will be predicted when the displayable is shown. If False, only the current condition is predicted. If None, :var:`config.conditionswitch_predict_all` is used.\n\nOne use of ShowingSwitch is to have images change depending on the current emotion of a character. For example\n```\nimage emotion_indicator = ShowingSwitch(\n\\eileen concerned\\, \\emotion_indicator concerned\\,\n\\eileen vhappy\\, \\emotion_indicator vhappy\\,\nNone, \\emotion_indicator happy\\)\n\n```"], "gui.button_tile": ["gui", "gui.button_tile", " = True", "", "var", "If true, the sides and center of the button background are tiled to increase or decrease their size. If false, the sides and center are scaled."], "im": ["obsolete", "function", "()", "", "", "An image manipulator is a displayable that takes an image or image manipulator, and either loads it or performs an operation on it. Image manipulators can only take images or other image manipulators as input.\n\nWith the few exceptions listed below, the use of image manipulators is historic. A number of image manipulators that had been documented in the past should no longer be used, as they suffer from inherent problems. In any case except for im.Data, the Transform() displayable provides similar functionality in a more general manner, while fixing the problems, although it sometimes requires gl2 to be enabled."], "achievement.register": ["internal", "function", "(name, **kwargs)", "", "", "Registers an achievement. Achievements are not required to be registered, but doing so allows one to pass information to the backends.\n\n`name` The name of the achievement to register.\n\nThe following keyword parameters are optional.\n\n`steam` The name to use on steam. If not given, defaults to `name`.\n\n`stat_max` The integer value of the stat at which the achievement unlocks.\n\n`stat_modulo` If the progress modulo `stat_max` is 0, progress is displayed to the user. For example, if stat_modulo is 10, progress will be displayed to the user when it reaches 10, 20, 30, etc. If not given, this defaults to 0."], "pushdown": ["transitions", "pushdown", "", "", "var", "Also: **pushleft, pushup, pushright**\n\nThese use the new scene to slide the old scene out the named side. Instances of the :func:`PushMove` transition class."], "Bar": ["internal", "class", "(range=None, value=None, width=None, height=None, changed=None, adjustment=None, step=None, page=None, bar=None, style=None, vertical=False, replaces=None, hovered=None, unhovered=None, released=None, **properties)", "", "", "Implements a bar that can display an integer value, and respond to clicks on that value."], "ConditionGroup": ["internal", "class", "(conditions)", "", "", "Combines a list of conditions into a single ConditionSwitch."], "FieldValue": ["internal", "class", "(object, field, range, max_is_zero=False, style=u'bar', offset=0, step=None, action=None, force_step=False)", "", "Action", "A bar value that allows the user to adjust the value of a field on an object.\n\n `object` The object. `field` The field, a string. `range` The range to adjust over. `max_is_zero` If True, then when the field is zero, the value of the bar will be range, and all other values will be shifted down by 1. This works both ways - when the bar is set to the maximum, the field is set to 0.\n\n This is used internally, for some preferences. `style` The styles of the bar created. `offset` An offset to add to the value. `step` The amount to change the bar by. If None, defaults to 1/10th of the bar. `action` If not None, an action to call when the field has changed."], "gui.button_properties": ["internal", "function", "(kind)", "", "", "Given a `kind` of button, returns a dictionary giving standard style properties for that button. This sets:\n\n:propref:`background` As described below.\n\n:propref:`padding` To gui.kind_borders.padding (if it exists).\n\n:propref:`xsize` To gui.kind_width (if it exists).\n\n:propref:`ysize` To gui.kind_height (if it exists).\n\n(Note that if `kind` is the string \\nvl_button\\, this will look for the gui.nvl_button_background variable.)\n\nThe background is a frame that takes its background picture from the first existing one of:\n\n* gui/button/kind_[prefix\\_].background.png * gui/button/[prefix\\_].background.png\n\nIf a gui variables named gui.kind_borders exists, it's used. Otherwise, :var:`gui.button_borders` is used. If gui.kind_tile exists, it determines if the borders are tiled, else :var:`gui.button_tile` controls tiling.\n\nFor what [prefix\\_] means, check out the :ref:`style prefix search ` documentation."], "Return": ["internal", "class", "(value=None)", "", "Action", "Causes the current interaction to return the supplied value, which must not be None. This is often used with menus and imagemaps, to select what the return value of the interaction is. If the screen was called using the ``call screen`` statement, the return value is placed in the `_return` variable.\n\n When in a menu, this returns from the menu. (The value should be None in this case.)"], "_history": ["store_variables", "_history", " = True", "store", "var", "If true, Ren'Py will record dialogue history when a line is shown. (Note that :var:`config.history_list_length` must be set as well.)"], "gui.choice_text_hover_color": ["gui", "gui.choice_text_hover_color", " = '#0066cc'", "", "var", "The color used for the text of focused choice buttons."], "NullAction": ["internal", "class", "(*args, **kwargs)", "", "Action", "Does nothing.\n\nThis can be used to make a button responsive to hover/unhover events, without actually doing anything."], "ui.grid": ["obsolete", "ui.grid", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "achievement.has": ["internal", "function", "(name)", "", "", "Returns true if the player has been granted the achievement with `name`."], "build.executable": ["internal", "function", "(pattern)", "", "", "Adds a pattern marking files as executable on platforms that support it. (Linux and Macintosh)"], "define.old_move_transitions": ["internal", "function", "(delay=1.0, vertical=False, reverse=False, background=\"#000\", flatten=True)", "", "", "A transitions that rotates the old scene 90 degrees around an axis, so that it is edge on with the viewer, switches to the new scene, and then rotates that scene another 90 degrees to show the new scene to the viewer.\n\n`delay` How long the transition should take.\n\n`vertical` If true, the scene is rotate around the x-axis (pixels move vertically). If false, the scene is roated around the y axis, pixels moving horizontally.\n\n`reverse` When true, the rotation occurs in the reverse direction.\n\n`background` A displayable that is placed behind the scene as it rotates.\n\n`flatten` If true, the scenes are flattened into images the size of the screen before being rotated. Use this if images being not entirely on the screen causes undesired effects."], "HistoryEntry": ["history", "HistoryEntry", "", "", "class", "The _history_list variable stores the actual history, as a list of HistoryEntry objects."], "_in_replay": ["rooms", "_in_replay", "", "", "var", "When in replay mode, this is sent to the label at which replay mode was started. Outside of replay mode, this is None."], "RollbackToIdentifier": ["internal", "class", "(identifier)", "", "Action", "This causes a rollback to an identifier to occur. Rollback identifiers are returned as part of HistoryEntry objects."], "SaturationMatrix": ["internal", "class", "(value, desat=(0.2126, 0.7152, 0.0722))", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` that alters the saturation of an image, while leaving the alpha channel alone.\n\n`value` The amount of saturation in the resulting image. 1.0 is the unaltered image, while 0.0 is grayscale.\n\n`desat` This is a 3-element tuple that controls how much of the red, green, and blue channels will be placed into all three channels of a fully desaturated image. The default is based on the constants used for the luminance channel of an NTSC television signal. Since the human eye is mostly sensitive to green, more of the green channel is kept then the other two channels."], "MouseMove": ["internal", "class", "(x, y, duration=0)", "", "Action", "Move the mouse pointer to `x`, `y`. If the device does not have a mouse pointer or _preferences.mouse_move is False, this does nothing.\n\n`duration` The time it will take to perform the move, in seconds. During this time, the mouse may be unresponsive."], "Lexer.simple_expression": ["cds", "simple_expression", "()", "Lexer", "method", "Matches a simple Python expression, returns it as a string. This is often used when you expect a variable name. It is not recommended to change the result. The correct action is to evaluate the result in the future."], "PushMove": ["transitions", "function", "(time, mode=\"pushright\")", "", "", "Returns a transition that works by taking the new scene and using it to \\push\\ the old scene off the screen.\n\n`time` The time the transition takes.\n\n`mode` There are four possible modes: \\pushright\\, \\pushleft\\, \\pushup\\, and \\pushdown\\, which push the old scene off the screen in the direction indicated.\n```\ndefine pushright = PushMove(1.0, \\pushright\\)\ndefine pushleft = PushMove(1.0, \\pushleft\\)\ndefine pushup = PushMove(1.0, \\pushup\\)\ndefine pushdown = PushMove(1.0, \\pushdown\\)\n```"], "ui.imagemap": ["obsolete", "ui.imagemap", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "FileScreenshot": ["internal", "function", "(name, empty=None, page=None, slot=False)", "", "Action", "Returns the screenshot associated with the given file. If the file is not loadable, then `empty` is returned, unless it's None, in which case, a Null displayable is created.\n\n The return value is a displayable."], "iap.NoneBackend": ["internal", "class", "(*args, **kwargs)", "", "", "The IAP backend that is used when IAP is not supported."], "IdentityMatrix": ["internal", "class", "()", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` that does not change the color or alpha of what is supplied to it.\n\n`value` Is ignored."], "im.AlphaMask": ["obsolete", "class", "(base, mask, **properties)", "", "", "An image manipulator that takes two image manipulators, `base` and `mask`, as arguments. It replaces the alpha channel of `base` with the red channel of `mask`.\n\nThis is used to provide an image's alpha channel in a second image, like having one jpeg for color data, and a second one for alpha. In some cases, two jpegs can be smaller than a single png file.\n\nNote that this takes different arguments from :func:`AlphaMask`, which uses the mask's alpha channel."], "zoomin": ["transitions", "zoomin", "", "", "var", "This zooms in entering images, taking 0.5 seconds to do so."], "_skipping": ["store_variables", "_skipping", " = True", "store", "var", "Controls if skipping is allowed."], "ui.input": ["obsolete", "ui.input", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "center": ["transforms", "center", "", "", "var", "Centers horizontally, and aligns to the bottom of the screen."], "director.transitions": ["director", "director.transitions", " = [ \"dissolve\", \"pixellate\" ]", "", "var", "A list of transitions that are available to the with statement. Since transitions can't be auto-detected, these must be added manually."], "SelectedIf": ["internal", "class", "(expression)", "", "Action", "This indicates that one action in a list of actions should be used to determine if a button is selected. This only makes sense when the button has a list of actions. For example\n```\n# The button is selected only if mars_flag is True\ntextbutton \\Marsopolis\\:\naction [ SelectedIf(SetVariable(\\mars_flag\\, True)), SetVariable(\\on_mars\\, True) ]\n\nThe action inside SelectedIf is run normally when the button is clicked.\n```"], "pygame_sdl2": ["internal", "function", "()", "", "", ""], "SensitiveIf": ["internal", "class", "(expression)", "", "Action", "This indicates that one action in a list of actions should be used to determine if a button is sensitive. This only makes sense when the button has a list of actions. For example\n```\n# The button is sensitive only if mars_flag is True\ntextbutton \\Marsopolis\\:\naction [ SensitiveIf(SetVariable(\\mars_flag\\, True)), SetVariable(\\on_mars\\, True) ]\n\nThe action inside SensitiveIf is run normally when the button is clicked.\n```"], "hyperlink_function": ["internal", "function", "(target)", "", "", ""], "gui.button_height": ["gui", "gui.button_height", " = 64", "", "var", "The width and height of a button, in pixels. If None, the size is automatically determined based on the size of the text inside a button, and the borders given below."], "ui.button": ["obsolete", "ui.button", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "gui.check_button_borders": ["gui", "gui.check_button_borders", " = Borders(40, 10, 10, 10)", "", "var", "Increases the width of radio and check button borders, leaving extra space on the left for the check mark."], "build.destination": ["build", "build.destination", " = \"{directory_name}-dists\"", "", "var", "Gives the path to the directory the archive files will be placed in. This may be an absolute or a relative path. A relative path is considered to be relative to the projects directory.\n\nThe following values are substituted in using Python's ``str.format`` function.\n\n``{directory_name}`` The value of build.directory_name.\n\n``{executable_name}`` The value of build.executable_name.\n\n``{version}`` The value of build.version."], "offscreenright": ["transforms", "offscreenright", "", "", "var", "Places the displayable off the left side of the screen, aligned to the bottom of the screen."], "If": ["internal", "function", "(expression, true=None, false=None)", "", "Action", "This returns `true` if `expression` is true, and `false` otherwise. Use this to select an action based on an expression. Note that the default, None, can be used as an action that causes a button to be disabled."], "iap.Purchase": ["internal", "class", "(product, success=None)", "", "Action", "An action that attempts the purchase of `product`. This action is sensitive if and only if the product is purchasable (a store is enabled, and the product has not already been purchased.)\n\n`success` If not None, this is an action or list of actions that are run when the purchase succeeds."], "ui.side": ["obsolete", "ui.side", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "ToggleSetMembership": ["internal", "class", "(set, value)", "", "Action", "Toggles the membership of `value` in `set`. If the value is not in the set, it's added. Otherwise, it is removed.\n\nButtons with this action are marked as selected if and only if the value is in the set.\n\n`set` The set to add to or remove from. This may be a set or list. In the case of a list, new items are appended. `value` The value to add or append."], "nvl_variant": ["internal", "function", "()", "", "", ""], "absolute_import": ["internal", "function", "()", "", "", ""], "iap.get_price": ["internal", "function", "(product)", "", "", "Returns a string giving the price of the `product` in the user's local currency. Returns None if the price of the product is unknown - which indicates the product cannot be purchased."], "InputValue": ["internal", "class", "()", "", "", ""], "iap.Restore": ["internal", "class", "()", "", "Action", "An Action that contacts the app store and restores any missing purchases."], "config": ["internal", "function", "()", "", "", "Configuration variables control the behavior of Ren'Py's implementation, allowing Ren'Py itself to be customized in a myriad of ways. These range from the common (such as changing the screen size) to the obscure (adding new kinds of archive files).\n\nRen'Py's implementation makes the assumption that, once the GUI system has initialized, configuration variables will not change. Changing configuration variables outside of init blocks can lead to undefined behavior. Configuration variables are not part of the save data."], "ZoomInOut": ["internal", "function", "()", "", "", ""], "XScrollValue": ["internal", "class", "(viewport)", "", "Action", "The value of an adjustment that horizontally scrolls the viewport with the given id, on the current screen. The viewport must be defined before a bar with this value is."], "adv": ["internal", "function", "()", "", "", "This is a template ADV-mode character, and the default character kind that is used when `Character()` is called."], "nvl": ["internal", "function", "()", "", "", ""], "AlphaMask": ["internal", "class", "(child, mask, **properties)", "", "", "This displayable takes its colors from `child`, and its alpha channel from the multiplication of the alpha channels of `child` and `mask`. The result is a displayable that has the same colors as `child`, is transparent where either `child` or `mask` is transparent, and is opaque where `child` and `mask` are both opaque.\n\nThe `child` and `mask` parameters may be arbitrary displayables. The size of the AlphaMask is the size of `child`.\n\nNote that this takes different arguments from :func:`im.AlphaMask`, which uses the mask's red channel."], "SubTransition": ["internal", "function", "()", "", "", "Applies a transition to a subset of the screen. Not documented."], "ease": ["transitions", "ease", "", "", "var", "Also: **easeinright, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "gui.nvl_button_xalign": ["gui", "gui.nvl_button_xalign", " = 0.5", "", "var", "The position and alignment of NVL-mode menu buttons."], "build.include_update": ["build", "build.include_update", " = False", "", "var", "When true, Ren'Py will produce the files required for the :ref:`updater ` to work."], "gui.frame_borders": ["gui", "gui.frame_borders", " = Borders(15, 15, 15, 15)", "", "var", "The borders applied to frame windows."], "FileAction": ["internal", "function", "(name, page=None, **kwargs)", "", "Action", "\\Does the right thing\\ with the file. This means loading it if the load screen is showing (current screen is named \\load\\), and saving otherwise.\n\n `name` The name of the slot to save to or load from. If None, an unused slot (a large number based on the current time) will be used.\n\n `page` The page that the file will be saved to or loaded from. If None, the current page is used.\n\n Other keyword arguments are passed to FileLoad or FileSave."], "SizeZoom": ["internal", "function", "()", "", "", ""], "easeoutleft": ["transitions", "easeoutleft", "", "", "var", "Also: **easeinright, easeinleft, easeintop, easeinbottom, easeoutright, ease, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "SplineMotion": ["internal", "function", "(points, time, child=None, anchors=(0.5, 0.5), repeat=False, bounce=False, anim_timebase=False, style=u'default', time_warp=None, **properties)", "", "", ""], "_window_auto": ["store_variables", "_window_auto", " = False", "store", "var", "This is set to true by ``window auto`` and to false by ``window show`` and ``window hide``. If true, the window auto behavior occurs."], "vcentered": ["internal", "function", "()", "", "", ""], "HistoryEntry.what_args": ["history", "what_args", "", "HistoryEntry", "attribute", "A dictionary giving the properties that were supplied to the what text widget when the dialogue was originally shown."], "NoRollback": ["internal", "class", "()", "", "", "Instances of classes inheriting from this class do not participate in rollback. Objects reachable through an instance of a NoRollback class only participate in rollback if they are reachable through other paths."], "OpenURL": ["internal", "class", "(url)", "", "Action", "Causes `url` to be opened in a web browser."], "preferences.language": ["preferences", "preferences.language", " = None", "", "var", "The language that the player has selected to use when running the game. This is None for the default language or a string containing a language the game is translated to.\n\nThis can be used to set the default language, and can be read to determine the current language. The :func:`Language` action can be used to change the language."], "Show": ["internal", "class", "(screen, transition=None, *args, **kwargs)", "", "Action", "This causes another screen to be shown. `screen` is a string giving the name of the screen. The arguments are passed to the screen being shown.\n\n If not None, `transition` is use to show the new screen."], "ImageButton": ["internal", "class", "(idle_image, hover_image=None, insensitive_image=None, activate_image=None, selected_idle_image=None, selected_hover_image=None, selected_insensitive_image=None, selected_activate_image=None, style=u'image_button', clicked=None, hovered=None, **properties)", "", "", "Used to implement the guts of an image button."], "HistoryEntry.who_args": ["history", "who_args", "", "HistoryEntry", "attribute", "A dictionary giving the properties that were supplied to the who text widget when the dialogue was originally shown."], "updater.can_update": ["internal", "function", "(base=None)", "", "", "Returns true if it's possible that an update can succeed. Returns false if updating is totally impossible. (For example, if the update directory was deleted.)\n\n Note that this does not determine if an update is actually available. To do that, use :func:`updater.UpdateVersion`."], "ui.window": ["obsolete", "ui.window", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "ToggleVoiceMute": ["internal", "class", "(voice_tag, invert=False)", "", "Action", "Toggles the muting of `voice_tag`. This is selected if the given voice tag is muted, unless `invert` is true, in which case it's selected if the voice is unmuted."], "gui.name_xalign": ["gui", "gui.name_xalign", " = 0.0", "", "var", "The horizontal alignment of the character's name. This can be 0.0 for left- aligned, 0.5 for centered, and 1.0 for right-aligned. (It's almost always 0.0 or 0.5.) This is used for both the position of the namebox relative to gui.name_xpos, and to select the side of of the namebox that is aligned with xpos."], "Transform.set_child": ["trans_trans_python", "set_child", "(child)", "Transform", "method", "Call this method with a new `child` to change the child of this transform."], "moveinleft": ["transitions", "moveinleft", "", "", "var", "Also: **moveinright, moveintop, moveinbottom**\n\nThese move entering images onto the screen from the appropriate side, taking 0.5 seconds to do so."], "QuickSave": ["internal", "function", "(message=u'Quick save complete.', newest=False)", "", "Action", "Performs a quick save.\n\n`message` A message to display to the user when the quick save finishes.\n\n`newest` Set to true to mark the quicksave as the newest save."], "Quit": ["internal", "class", "(confirm=None)", "", "Action", "Quits the game.\n\n `confirm` If true, prompts the user if he wants to quit, rather than quitting directly. If None, asks if and only if the user is not at the main menu."], "right": ["transforms", "right", "", "", "var", "Aligns to the bottom-right corner of the screen."], "build.itch_project": ["build", "build.itch_project", " = None", "", "var", "Setting this allows the Ren'Py launcher to upload your project to itch.io. This should be set to the name of a project registered with itch. (For example, \\renpytom/the-question\\).\n\nOnce this is set, after the distributions have been built, you can click \\Build distributions\\, \\Upload to itch.io\\ to cause an upload to occur."], "ui.drag": ["obsolete", "ui.drag", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "FilePageName": ["internal", "function", "(auto=u'a', quick=u'q')", "", "Action", "Returns the name of the current file page, as a string. If a normal page, this returns the page number. Otherwise, it returns `auto` or `quick`."], "Confirm": ["internal", "class", "(prompt, yes, no=None, confirm_selected=False)", "", "Action", "Prompts the user for confirmation of an action. If the user clicks yes, the yes action is performed. Otherwise, the `no` action is performed.\n\n`prompt` The prompt to display to the user.\n\n`confirm_selected` If true, the prompt will be displayed even if the `yes` action is already selected. If false (the default), the prompt will not be displayed if the `yes` action is selected.\n\nThe sensitivity and selectedness of this action match those of the `yes` action."], "python_object": ["internal", "class", "()", "", "", "The most base type"], "library": ["internal", "function", "()", "", "", ""], "preferences.gl_powersave": ["preferences", "preferences.gl_powersave", " = \"auto\"", "", "var", "This determines how often Ren'Py will redraw an unchanging screen. If True, Ren'Py will only draw the screen 5 times a second. If False, it will always draw at the full framerate possible. If \\auto\\, it will draw at full speed when the device is powered, and 5hz when it is running on battery."], "Pixellate": ["transitions", "function", "(time, steps)", "", "", "Returns a transition that pixellates out the old screen, and then pixellates in the new screen.\n\n`time` The total time the transition will take, in seconds.\n\n`steps` The number of steps that will occur, in each direction. Each step creates pixels about twice the size of those in the previous step, so a 5-step pixellation will create 32x32 pixels."], "SepiaMatrix": ["internal", "function", "(tint=u'#ffeec2', desat=(0.2126, 0.7152, 0.0722))", "", "", "A function that returns a ColorMatrix that can be used with :tpref:`matrixcolor` to sepia-tone a displayable. This is the equivalent of\n```\nTintMatrix(tint) * SaturationMatrix(0.0, desat)\n```"], "director.show_tags": ["director", "director.show_tags", " = set()", "", "var", "If not empty, only the tags present in this set will be presented for the show statement."], "im.Blur": ["obsolete", "class", "(im, xrad, yrad=None, **properties)", "", "", "An image manipulator that blurs the image manipulator `im` using an elliptical kernel described by `xrad` and optionally `yrad`.\n\nIf `yrad` is None, it will take the value of `xrad` resulting in a circular kernel being used.\n```\nimage logo blurred = im.Blur(\\logo.png\\, 1.5)\n\nThe same effect can now be achieved with the :tpref:`blur` transform property.\n```"], "ToggleLocalVariable": ["internal", "function", "(name, true_value=None, false_value=None)", "", "Action", "Toggles the value of `name` in the current local context.\n\nThis function is only useful in a screen that has been use by another scene, as it provides a way of setting the value of a variable inside the used screen. In all other cases, :func:`ToggleScreenVariable` should be preferred, as it allows more of the screen to be cached.\n\nThis must be created in the context that the variable is set in - it can't be passed in from somewhere else.\n\n`true_value` If not None, then this is the true value used. `false_value` If not None, then this is the false value used."], "bord": ["internal", "function", "(s)", "", "", ""], "Lexer.keyword": ["cds", "keyword", "(s)", "Lexer", "method", "Matches `s` as a keyword."], "gui.history_text_width": ["gui", "gui.history_text_width", " = 1110", "", "var", "The width of the name label and dialogue text, in pixels."], "iap.python_object": ["internal", "class", "()", "", "", "The most base type"], "DynamicCharacter": ["internal", "function", "(name_expr, **properties)", "", "", "Creates and returns a `Character` object that has the `dynamic` property set to `True`.\n\n`name_expr` should either be a string containing a Python expression, a function, or a callable object. If it's a string, that string will be evaluated before each line of dialogue, and the result used as the name of the character. Otherwise, the function or callable object will be called with no arguments before each line of dialogue, and the return value of the call will be used as the name of the character."], "ParameterizedText": ["internal", "class", "(style=u'default', **properties)", "", "", "This is a displayable that can be shown with an additional string parameter, which then shows that string as if it was an image. This is usually used as part of the pre-defined ``text`` image.\n\nFor example, one can do::\n\nshow text \\Hello, World\\ at truecenter with dissolve pause 1 hide text with dissolve\n\nYou can use ParameterizedText directly to define similar images with different style properties. For example, one can write::\n\nimage top_text = ParameterizedText(xalign=0.5, yalign=0.0)"], "easeoutright": ["transitions", "easeoutright", "", "", "var", "Also: **easeinright, easeinleft, easeintop, easeinbottom, ease, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "Notify": ["internal", "class", "(message)", "", "Action", "Displays `message` using :func:`renpy.notify`."], "Transform.hide_request": ["trans_trans_python", "hide_request", "", "Transform", "attribute", "This is set to true when the function is called, to indicate that the transform is being hidden."], "FileSlotName": ["internal", "function", "(slot, slots_per_page, auto=u'a', quick=u'q', format=u'%s%d')", "", "Action", "Returns the name of the numbered slot. This assumes that slots on normal pages are numbered in a linear order starting with 1, and that page numbers start with 1. When slot is 2, and slots_per_page is 10, and the other variables are the defaults:\n\n * When the first page is showing, this returns \\2\\. * When the second page is showing, this returns \\12\\. * When the auto page is showing, this returns \\a2\\. * When the quicksave page is showing, this returns \\q2\\.\n\n `slot` The number of the slot to access.\n\n `slots_per_page` The number of slots per page.\n\n `auto` A prefix to use for the auto page.\n\n `quick` A prefix to use for the quick page.\n\n `format` The formatting code to use. This is given two arguments: A string giving the page prefix, and an integer giving the slot number."], "im.tobytes": ["obsolete", "function", "(s)", "", "", "Encodes to latin-1 (where the first 256 chars are the same as ASCII.)"], "OldMoveTransition": ["internal", "function", "()", "", "", ""], "Lexer.error": ["cds", "error", "(msg)", "Lexer", "method", "Adds a `msg` (with the current position) in the list of detected parsing errors. This interrupts the parsing of the current statement, but does not prevent further parsing."], "ui.hotspot": ["obsolete", "ui.hotspot", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "easeoutbottom": ["transitions", "easeoutbottom", "", "", "var", "Also: **easeinright, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, ease**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "Lexer": ["cds", "Lexer", "", "", "class", "The parse method of renpy.register_statement takes a Lexer object"], "ui.detached": ["obsolete", "function", "()", "", "", "Do not add the next displayable to any later or container. Use this if you want to assign the result of a ui function to a variable."], "gui.kind_text_font": ["gui", "gui.kind_text_font", "", "", "var", "If present, the font used for the text."], "BarValue.get_style": ["screen_python", "get_style", "(self)", "BarValue", "method", "This is used to determine the style of bars that use this value. It should return a tuple of two style names or style objects. The first is used for a bar, and the second for vbar.\n\nThis defaults to (\\bar\\, \\vbar\\)."], "CropMove": ["transitions", "function", "(time, mode=\"slideright\", startcrop=(0.0, 0.0, 0.0, 1.0), startpos=(0.0, 0.0), endcrop=(0.0, 0.0, 1.0, 1.0), endpos=(0.0, 0.0), topnew=True)", "", "", "Returns a transition that works by cropping a scene and positioning it on the screen. This can be used to implement a variety of effects, all of which involve changing rectangular slices of scenes.\n\n`time` The time the transition takes.\n\n`mode` The name of the mode of the transition. There are three groups of modes: wipes, slides, and other. This can also be \\custom\\, to allow a custom mode to be defined.\n\nIn a wipe, the image stays fixed, and more of it is revealed as the transition progresses. For example, in \\wiperight\\, a wipe from left to right, first the left edge of the image is revealed at the left edge of the screen, then the center of the image, and finally the right side of the image at the right of the screen. Other supported wipes are \\wipeleft\\, \\wipedown\\, and \\wipeup\\.\n\nIn a slide, the image moves. So in a \\slideright\\, the right edge of the image starts at the left edge of the screen, and moves to the right as the transition progresses. Other slides are \\slideleft\\, \\slidedown\\, and \\slideup\\.\n\nThere are also slideaways, in which the old image moves on top of the new image. Slideaways include \\slideawayright\\, \\slideawayleft\\, \\slideawayup\\, and \\slideawaydown\\.\n\nWe also support a rectangular iris in with \\irisin\\ and a rectangular iris out with \\irisout\\.\n\nThe following parameters are only respected if the mode is \\custom\\. Positions are relative to the size of the screen, while the crops are relative to the size of the image. So a crop of (0.25, 0.0, 0.5, 1.0) takes the middle half of an image.\n\n`startcrop` The starting rectangle that is cropped out of the top image. A 4-element tuple containing x, y, width, and height.\n\n`startpos` The starting place that the top image is drawn to the screen at, a 2-element tuple containing x and y.\n\n`endcrop` The ending rectangle that is cropped out of the top image. A 4-element tuple containing x, y, width, and height.\n\n`endpos` The ending place that the top image is drawn to the screen at, a 2-element tuple containing x and y.\n\n`topnew` If true, the scene that is cropped and moved (and is on top of the other scene) is the new scene. If false, it is the old scene.\n```\ndefine wiperight = CropMove(1.0, \\wiperight\\)\ndefine wipeleft = CropMove(1.0, \\wipeleft\\)\ndefine wipeup = CropMove(1.0, \\wipeup\\)\ndefine wipedown = CropMove(1.0, \\wipedown\\)\n\ndefine slideright = CropMove(1.0, \\slideright\\)\ndefine slideleft = CropMove(1.0, \\slideleft\\)\ndefine slideup = CropMove(1.0, \\slideup\\)\ndefine slidedown = CropMove(1.0, \\slidedown\\)\n\ndefine slideawayright = CropMove(1.0, \\slideawayright\\)\ndefine slideawayleft = CropMove(1.0, \\slideawayleft\\)\ndefine slideawayup = CropMove(1.0, \\slideawayup\\)\ndefine slideawaydown = CropMove(1.0, \\slideawaydown\\)\n\ndefine irisout = CropMove(1.0, \\irisout\\)\ndefine irisin = CropMove(1.0, \\irisin\\)\n```"], "gui.nvl_borders": ["gui", "gui.nvl_borders", " = Borders(0, 15, 0, 30)", "", "var", "The borders around the background of the NVL-mode. Since the background is not a frame, this is only used to pad out the NVL-mode to prevent it from pressing up against the sides of the screen."], "Lexer.subblock_lexer": ["cds", "subblock_lexer", "()", "Lexer", "method", "Return a Lexer for the block associated with the current line."], "Swing": ["transitions", "function", "(delay=1.0, vertical=False, reverse=False, background=\"#000\", flatten=True)", "", "", "A transitions that rotates the old scene 90 degrees around an axis, so that it is edge on with the viewer, switches to the new scene, and then rotates that scene another 90 degrees to show the new scene to the viewer.\n\n`delay` How long the transition should take.\n\n`vertical` If true, the scene is rotate around the x-axis (pixels move vertically). If false, the scene is roated around the y axis, pixels moving horizontally.\n\n`reverse` When true, the rotation occurs in the reverse direction.\n\n`background` A displayable that is placed behind the scene as it rotates.\n\n`flatten` If true, the scenes are flattened into images the size of the screen before being rotated. Use this if images being not entirely on the screen causes undesired effects."], "print_function": ["internal", "function", "()", "", "", ""], "ui.draggroup": ["obsolete", "ui.draggroup", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "gui.history_height": ["gui", "gui.history_height", " = 210", "", "var", "The height of a history entry, in pixels. This can be None to allow the height of a history entry to vary at the cost of performance \u2013 config.history_length may need to be lowered significantly when this is None."], "preferences.skip_unseen": ["preferences", "preferences.skip_unseen", " = False", "", "var", "When True, Ren'Py will skip all text. When False, Ren'Py will only skip text that has been read by the player in any session. The equivalent of the \\skip\\ preference."], "updater.Updater": ["internal", "class", "(url, base=None, force=False, public_key=None, simulate=None, add=[], restart=True, check_only=False, confirm=True, patch=True)", "", "", "Applies an update.\n\nFields on this object are used to communicate the state of the update process.\n\nself.state The state that the updater is in.\n\nself.message In an error state, the error message that occured.\n\nself.progress If not None, a number between 0.0 and 1.0 giving some sort of progress indication.\n\nself.can_cancel A boolean that indicates if cancelling the update is allowed."], "Image": ["internal", "function", "(arg, loose=False, **properties)", "", "", "Loads an image from a file. filename is a string giving the name of the file.\n\nfilename should be a JPEG or PNG file with an appropriate extension.\n\nIf optimize_bounds is True, only the portion of the image inside the bounding box of non-transparent pixels is loaded into GPU memory. (The only reason to set this to False is when using an image as input to a shader.)"], "achievement.get_progress": ["internal", "function", "(name)", "", "", "Returns the current progress towards the achievement identified with `name`, or 0 if no progress has been registered for it or if the achievement is not known."], "ui.bar": ["obsolete", "ui.bar", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "_window": ["store_variables", "_window", " = False", "store", "var", "This set by the ``window show`` and ``window hide`` statements, and indirectly by ``window auto``. If true, the dialogue window is shown during non-dialogue statements."], "range": ["internal", "function", "(*args)", "", "", ""], "Replay": ["internal", "class", "(label, scope={}, locked=None)", "", "Action", "An action that starts `label` as a replay.\n\n`scope` A dictionary mapping variable name to value. These variables are set when entering the replay.\n\n`locked` If true, this replay is locked. If false, it is unlocked. If None, the replay is locked if the label has not been seen in any playthrough."], "FontGroup": ["internal", "class", "()", "", "", "A group of fonts that can be used as a single font."], "ui.spritemanager": ["obsolete", "ui.spritemanager", "", "", "ui", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "updater.UpdateVersion": ["internal", "function", "(url, check_interval=3600*6, simulate=None, **kwargs)", "", "", "This function contacts the server at `url`, and determines if there is a newer version of software available at that url. If there is, this function returns the new version. Otherwise, it returns None.\n\nSince contacting the server can take some time, this function launches a thread in the background, and immediately returns the version from the last time the server was contacted, or None if the server has never been contacted. The background thread will restart the current interaction once the server has been contacted, which will cause screens that call this function to update.\n\nEach url will be contacted at most once per Ren'Py session, and not more than once every `check_interval` seconds. When the server is not contacted, cached data will be returned.\n\nAdditional keyword arguments (including `simulate`) are passed to the update mechanism as if they were given to :func:`updater.update`."], "build.version": ["internal", "function", "()", "", "", "The version used by the build system."], "gui.kind_text_color": ["gui", "gui.kind_text_color", "", "", "var", "If present, the color of the text."], "FileDelete": ["internal", "class", "(name, confirm=True, page=None, slot=False)", "", "Action", "Deletes the file.\n\n `name` The name of the slot to delete.\n\n `confirm` If true and not at the main menu, prompt for confirmation before loading the file.\n\n `page` The page that the file will be loaded from. If None, the current page is used.\n\n `slot` If True, `name` is taken to be a slot name, and `page` is ignored."], "bchr": ["internal", "function", "(s)", "", "", ""], "im.matrix": ["obsolete", "class", "()", "", "", "Constructs an im.matrix object from `matrix`. im.matrix objects support The operations supported are matrix multiplication, scalar multiplication, element-wise addition, and element-wise subtraction. These operations are invoked using the standard mathematical operators (\\\\*, \\\\*, +, and -, respectively). If two im.matrix objects are multiplied, matrix multiplication is performed, otherwise scalar multiplication is used.\n\n`matrix` is a 20 or 25 element list or tuple. If it is 20 elements long, it is padded with (0, 0, 0, 0, 1) to make a 5x5 matrix, suitable for multiplication."], "gui.frame_tile": ["gui", "gui.frame_tile", " = True", "", "var", "If true, the sides and center of the confirm screen are tiled. If false, they are scaled."], "HistoryEntry.show_args": ["history", "show_args", "", "HistoryEntry", "attribute", "A dictionary giving the properties that were supplied to the say screen when the dialogue was originally shown."], "Editor.end": ["editor", "end", "(**kwargs)", "Editor", "method", "Ends a transaction."], "build.make_file_lists": ["internal", "function", "(s)", "", "", "Turns `s` into a (perhaps empty) list of file_lists.\n\nIf `s` is a list or None, then returns it. If it's a string, splits it on whitespace. Otherwise, errors out."], "preferences.transitions": ["preferences", "preferences.transitions", " = 2", "", "var", "Determines which transitions should be shown. 2 shows all transitions, 0 shows no transitions. (1 is reserved.) The equivalent of the \\transitions\\ preference."], "Transform.update": ["trans_trans_python", "update", "()", "Transform", "method", "This should be called when a transform property field is updated outside of the callback method, to ensure that the change takes effect."], "zoominout": ["transitions", "zoominout", "", "", "var", "This zooms in entering images and zooms out leaving images, taking 0.5 seconds to do so."], "Lexer.eol": ["cds", "eol", "()", "Lexer", "method", "True if the lexer is at the end of the line."], "iap.IOSBackend": ["internal", "class", "(self)", "", "", "Returns the identifier for a store purchase."], "gui.REGULAR_FONT": ["translating_renpy", "gui.REGULAR_FONT", " = \"Roboto-Regular.ttf\"", "", "var", "The path to the font used for heavy-weight text in the launcher."], "Lexer.revert": ["cds", "revert", "(o)", "Lexer", "method", "When `o` is the object returned from checkpoint(), reverts the state of the lexer to what it was when checkpoint() was called. (This is used for backtracking.)"], "Editor.begin": ["editor", "begin", "(new_window=False, **kwargs)", "Editor", "method", "Starts an editor transaction.\n\nIf `new_window` is true, the editor should attempt to open a new window. Otherwise, it should attempt to perform the transaction in an existing editor window."], "gui.rebuild": ["internal", "function", "()", "", "", "Rebuilds the GUI.\n\nNote: This is a very slow function."], "Composite": ["internal", "function", "(size, *args, **properties)", "", "", "This creates a new displayable of `size`, by compositing other displayables. `size` is a (width, height) tuple.\n\nThe remaining positional arguments are used to place images inside the Composite. The remaining positional arguments should come in groups of two, with the first member of each group an (x, y) tuple, and the second member of a group is a displayable that is composited at that position.\n\nDisplayables are composited from back to front.\n```\nimage eileen composite = Composite(\n(300, 600),\n(0, 0), \\body.png\\,\n(0, 0), \\clothes.png\\,\n(50, 50), \\expression.png\\)\n```"], "ui.One": ["obsolete", "class", "(displayable, style_prefix)", "", "", "A widget that expects exactly one child."], "preferences.fullscreen": ["preferences", "preferences.fullscreen", " = False", "", "var", "This is True when Ren'Py is in fullscreen mode, and False when it is running in a window. The equivalent of the \\display\\ preference."], "build.include_i686": ["build", "build.include_i686", " = True", "", "var", "If true, files necessary to run on 32-bit x86 processors will be included in the Linux and Mac builds. If False, these files will not be included."], "Action.get_selected": ["screen_python", "get_selected", "(self)", "Action", "method", "This should return true if the button should be rendered as a selected button, and false otherwise.\n\nThe default implemention returns False."], "HideInterface": ["internal", "class", "(*args, **kwargs)", "", "Action", "Causes the interface to be hidden until the user clicks."], "Condition": ["internal", "class", "(condition, image, **kwargs)", "", "", "This is used to represent a layer of an LayeredImage that is controlled by a condition. When the condition is true, the layer is displayed. Otherwise, nothing is displayed.\n\n`condition` This should be a string giving a Python condition that determines if the layer is displayed.\n\n`image` If not None, this should be a displayable that is displayed when the condition is true.\n\n`if_all` An attribute or list of attributes. The condition is only evaluated if all of these are showing.\n\n`if_any` An attribute or list of attributes. If not empty, the condition is only evaluated if any of these are showing.\n\n`if_not` An attribute or list of attributes. The condition is only evaluated if none of these are showing.\n\n`at` A transform or list of transforms that are applied to the image.\n\nOther keyword arguments are interpreted as transform properties. If any are present, a transform is created that wraps the image. (For example, pos=(100, 200) can be used to offset the image by 100 pixels horizontally and 200 vertically.)"], "persistent._clear": ["persistent", "persistent._clear", "(progress=False)", "", "function", "Resets the persistent data.\n\n`progress` If true, also resets progress data that Ren'Py keeps.\n\nNote that this will delete all persistent data, and will not re-apply defaults until Ren'Py restarts."], "director.button": ["director", "director.button", " = True", "", "var", "If True, the director displays a screen with a button to access the director window. If False, the game can provide it's own access, by making available the director.Start action."], "Lexer.expect_block": ["cds", "expect_block", "(stmt)", "Lexer", "method", "Called to indicate that the statement requires that a non-empty block is present. `stmt` should be a string, it will be added to the message with an error."], "QueueEvent": ["internal", "class", "(event, up=False)", "", "Action", "Queues the given event using :func:`renpy.queue_event`."], "translate_font": ["translating_renpy", "translate_font", "(language, font)", "", "function", "This is used to set a font for `language`. The font is used in the launcher, and also used to in games generated in that language. The font file should be placed in game/fonts.\n\n`font` A string giving the name of the font file."], "wipeup": ["transitions", "wipeup", "", "", "var", "Also: **wiperight, wipeleft, wipedown**\n\nWipes the scene in the given direction. Instances of the :func:`CropMove` transition class."], "preferences.gl_tearing": ["preferences", "preferences.gl_tearing", " = False", "", "var", "This determines if tearing (True) or frameskip (False) is the preferred behavior when the game can't keep up with its intended framerate."], "gui.nvl_height": ["gui", "gui.nvl_height", " = 173", "", "var", "The height of a single NVL-mode entry. Setting this to a fixed height makes it possible to have NVL-mode without paging, showing a fixed number of entries at once. Setting this to None allows entries to be of a variable size."], "gui.vscrollbar_borders": ["gui", "gui.vscrollbar_borders", " = Borders(6, 10, 6, 10)", "", "var", "The borders that are used with the Frame containing the bar image."], "reset": ["transforms", "reset", "", "", "var", "Resets the transform. Places the displayable in the top-left corner of the screen, and also eliminates any zoom, rotation, or other effects."], "gui.scrollbar_tile": ["gui", "gui.scrollbar_tile", " = True", "", "var", "If true, the frame containing the bar of a scrollbar is tiled. If False, if it scaled."], "Attribute": ["internal", "class", "(group, attribute, image=None, default=False, group_args={}, **kwargs)", "", "", "This is used to represent a layer of an LayeredImage that is controlled by an attribute. A single attribute can control multiple layers, in which case all layers corresponding to that attribute will be displayed.\n\n`group` A string giving the group the attribute is part of. This may be None, in which case a group with the same name as the attribute is created.\n\n`attribute` A string giving the name of the attribute.\n\n`image` If not None, this should be a displayable that is displayed when this attribute is shown.\n\n`default` If True, and no other attribute for the group is selected, this attribute is.\n\nThe following keyword arguments are also known:\n\n`at` A transform or list of transforms that are applied to the image.\n\n`if_all` An attribute or list of attributes. The displayable is only shown if all of these are showing.\n\n`if_any` An attribute or list of attributes. if not empty, the displayable is only shown if any of these are showing.\n\n`if_not` An attribute or list of attributes. The displayable is only shown if none of these are showing.\n\nOther keyword arguments are interpreted as transform properties. If any are present, a transform is created that wraps the image. (For example, pos=(100, 200) can be used to offset the image by 100 pixels horizontally and 200 vertically.)\n\nIf the `image` parameter is omitted or None, and the LayeredImage has been given the `image_format` parameter, the image_format is used to generate an image filename."], "preferences.video_image_fallback": ["preferences", "preferences.video_image_fallback", " = False", "", "var", "If True, images are displayed instead of videosprites. If False, video sprites are displayed normally. The equivalent (inverted) of the \\video sprites\\ preference."], "ui.Detached": ["obsolete", "class", "(style_prefix)", "", "", "Used to indicate a widget is detached from the stack."], "preferences.wait_voice": ["preferences", "preferences.wait_voice", " = True", "", "var", "If True, auto-forward mode will wait for voice files and self-voicing to finish before advancing. If False, it will not. The equivalent of the \\wait for voice\\ preference."], "ui": ["obsolete", "function", "()", "", "", "**Note**\n\nThe implementation of Ren'Py has changed, and UI functions that create displayables can now be far slower than their screen language equivalents.\n\nThe UI functions are Python equivalents of the screen language statements. For each screen language statement, there is a ui function with the same name. For example, ui.text corresponds to the text statement, and ui.add corresponds to the add statement."], "HistoryEntry.what": ["history", "what", "", "HistoryEntry", "attribute", "A string giving the dialogue text."], "gui.text_color": ["gui", "gui.text_color", " = \"#402000\"", "", "var", "This sets the color of the dialogue text."], "gui.LIGHT_FONT": ["translating_renpy", "gui.LIGHT_FONT", " = \"Roboto-Light.ttf\"", "", "var", "The path to the font used for normal text in the launcher."], "achievement.grant": ["internal", "function", "(name)", "", "", "Grants the achievement with `name`, if it has not already been granted."], "gui.choice_button_text_idle_color": ["gui", "gui.choice_button_text_idle_color", " = '#888888'", "", "var", "The color used for the text of unfocused choice buttons."], "HistoryEntry.image_tag": ["history", "image_tag", "", "HistoryEntry", "attribute", "The image tag given to the :func:`Character`, or None if no such tag was given."], "ui.ChoiceActionBase": ["obsolete", "class", "(label, value, location=None, block_all=None, sensitive=True, args=None, kwargs=None)", "", "Action", "Base class for choice actions. The choice is identified by a label and value. The class will automatically determine the rollback state and supply correct \\sensitive\\ and \\selected\\ information to the widget. If a location is supplied, it will check whether the choice was previously visited and mark it so if it is chosen."], "persistent": ["internal", "function", "()", "", "", "The persistent variable allows access to the Persistent object's fields, which contains saved data that is not associated with a particular point in a game."], "ScreenVariableValue": ["internal", "class", "(variable, range, max_is_zero=False, style=u'bar', offset=0, step=None, action=None, force_step=False)", "", "Action", "A bar value that adjusts the value of a variable in a screen.\n\n`variable` A string giving the name of the variable to adjust. `range` The range to adjust over. `max_is_zero` If True, then when the field is zero, the value of the bar will be range, and all other values will be shifted down by 1. This works both ways - when the bar is set to the maximum, the field is set to 0.\n\nThis is used internally, for some preferences. `style` The styles of the bar created. `offset` An offset to add to the value. `step` The amount to change the bar by. If None, defaults to 1/10th of the bar. `action` If not None, an action to call when the field has changed."], "file": ["internal", "function", "(*args, **kwargs)", "", "", "Returns a read-only file-like object that accesses the file named `fn`. The file is accessed using Ren'Py's standard search method, and may reside in an RPA archive. or as an Android asset.\n\nThe object supports a wide subset of the fields and methods found on Python's standard file object, opened in binary mode. (Basically, all of the methods that are sensible for a read-only file.)"], "gui.text_properties": ["internal", "function", "(kind=None, accent=False)", "", "", "Given a `kind` of button, returns a dictionary giving standard style properties for that button. This sets:\n\n:propref:`font` To gui.kind_text_font, if it exists.\n\n:propref:`size` To gui.kind_text_size, if it exists.\n\n:propref:`xalign` To gui.kind_text_xalign, if it exists.\n\n:propref:`text_align` To gui.kind_text_xalign, if it exists.\n\n:propref:`layout` To \\subtitle\\ if gui.kind_text_xalign is greater than zero and less than one.\n\nThere are also a number of variables that set the text :propref:`color` style property:\n\ncolor To gui.kind_text_color, if it exists. If the variable is not set, and `accent` is True, sets the text color to the default accent color.\n\ninsensitive_color To gui.kind_text_insensitive_color, if it exists.\n\nidle_color To gui.kind_text_idle_color, if it exists.\n\nhover_color To gui.kind_text_hover_color, if it exists.\n\nselected_color To gui.kind_text_selected_color, if it exists.\n\nAll other :ref:`text style properties ` are also available. For example, gui.kind_text_outlines sets the outlines style property, gui.kind_text_kerning sets kerning, and so on."], "Lexer.delimited_python": ["cds", "delimited_python", "(delim)", "Lexer", "method", "Matches a Python expression that ends in a `delim`, for example ':'. This is often used when you expect a condition until the delimiter. It is not recommended to change the result. The correct action is to evaluate the result in the future. This raises an error if end of line is reached before the delimiter."], "narrator": ["internal", "function", "()", "", "", "This is the character that speaks narration (say statements that do not give a character or character name)."], "Lexer.advance": ["cds", "advance", "()", "Lexer", "method", "In a subblock lexer, advances to the next line. This must be called before the first line, so the first line can be parsed. Returns True if we've successfully advanced to a line in the block, or False if we have advanced beyond all lines in the block."], "GamepadExists": ["internal", "function", "(developer=True)", "", "Action", "A function that returns true if a gamepad is present, and false otherwise.\n\n`developer` Forces this function to always return true while :var:`config.developer` is true."], "im.Grayscale": ["obsolete", "function", "(im, **properties)", "", "", "An image manipulator that creates a desaturated version of the image manipulator `im`.\n\nThe same effect can now be achieved by supplying SaturationMatrix(0) to the :tpref:`matrixcolor` transform property."], "preferences.afm_enable": ["preferences", "preferences.afm_enable", " = False", "", "var", "If True, auto-forward move is enabled, otherwise False. The equivalent of the \\auto-forward\\ preference."], "Function": ["internal", "class", "(callable, *args, **kwargs)", "", "Action", "This Action calls `callable` with `args` and `kwargs`.\n\n`callable` Callable object. `args` position arguments to be passed to `callable`. `kwargs` keyword arguments to be passed to `callable`.\n\nThis Action takes an optional _update_screens keyword argument, which defaults to true. When it is true, the interaction restarts and the screens are updated after the function returns.\n\nIf the function returns a non-None value, the interaction stops and returns that value. (When called using the call screen statement, the result is placed in the `_return` variable.)"], "Lexer.string": ["cds", "string", "()", "Lexer", "method", "Matches a Ren'Py string."], "pushup": ["transitions", "pushup", "", "", "var", "Also: **pushleft, pushright, pushdown**\n\nThese use the new scene to slide the old scene out the named side. Instances of the :func:`PushMove` transition class."], "slideawayright": ["transitions", "slideawayright", "", "", "var", "Also: **slideawayleft, slideawayup, slideawaydown**\n\nSlides the old scene in the given direction. Instances of the :func:`CropMove` transition class."], "moveinbottom": ["transitions", "moveinbottom", "", "", "var", "Also: **moveinleft, moveintop, moveinright**\n\nThese move entering images onto the screen from the appropriate side, taking 0.5 seconds to do so."], "Lexer.renpy_statement": ["cds", "renpy_statement", "()", "Lexer", "method", "When called, this parses the current line as a Ren'Py script statement, generating an error if this is not possible. This method returns an opaque object that can be returned from get_next() or passed to :func:`renpy.jump` or :func:`renpy.call`. This object should not be stored except as part of the parse result of the statement.\n\nWhen the statement returned from this completes, control is transfered to the statement after the creator-defined statement. (Which might be the statement created using post_execute)."], "HistoryEntry.voice": ["history", "voice", "", "HistoryEntry", "attribute", "This is the object returned from :func:`_get_voice_info`, storing information about the voice that is being played."], "Placeholder": ["internal", "class", "(base=None, full=False, flip=None, **properties)", "", "", "This displayable can be used to display a placeholder character or background."], "gui.nvl_thought_xalign": ["gui", "gui.nvl_thought_xalign", " = 0.5", "", "var", "The alignment of the text. This controls both the alignment of the text, and the side of the text that is placed at xpos. This can be 0.0 for left, 0.5 for center, and 1.0 for right."], "InvertMatrix": ["internal", "class", "(value=1.0)", "", "", "A ColorMatrix that can be used with :tpref:`matrixcolor` to invert each of the color channels. The alpha channel is left alone.\n\n`value` The amount to inverty by. 0.0 is not inverted, 1.0 is fully inverted. Used to animate inversion."], "easeinleft": ["transitions", "easeinleft", "", "", "var", "Also: **easeinright, ease, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom**\n\nThese are similar to the move- family of transitions, except that they use a cosine-based curve to slow down the start and end of the transition."], "gui.vslider_borders": ["gui", "gui.vslider_borders", " = Borders(6, 6, 6, 6)", "", "var", "The borders that are used with the Frame containing the bar image."], "gui.notify_frame_borders": ["gui", "gui.notify_frame_borders", " = Borders(24, 8, 60, 8)", "", "var", "The borders of the frame that is used by the notify screen."], "ui.BarValue": ["obsolete", "class", "()", "", "", "This can be passed to the value method of bar and hotbar."], "updater.Update": ["internal", "class", "(*args, **kwargs)", "", "Action", "An action that calls :func:`updater.update`. All arguments are stored and passed to that function."], "gui.name_ypos": ["gui", "gui.name_ypos", " = 0", "", "var", "The horizontal and vertical positions of the name and namebox. These are usually a number of pixels from the left or top side of the textbox. Setting a variable to 0.5 centers the name in the textbox (see below). These numbers can also be negative \u2013 for example, setting gui.name_ypos to -22 causes it to be places 22 pixels above the top of the textbox."], "eval": ["internal", "function", "(code, globals=None, locals=None)", "", "", ""], "MoveIn": ["internal", "function", "()", "", "", ""], "hyperlink_sensitive": ["internal", "function", "(target)", "", "", "Returns true of the hyperlink is sensitive, False otherwise."], "Dissolve": ["transitions", "function", "(time, alpha=False, time_warp=None)", "", "", "Returns a transition that dissolves from the old scene to the new scene.\n\n`time` The time the dissolve will take.\n\n`alpha` Ignored.\n\n`time_warp` A function that adjusts the timeline. If not None, this should be a function that takes a fractional time between 0.0 and 1.0, and returns a number in the same range."], "LiveComposite": ["obsolete", "function", "(size, *args, **properties)", "", "", "LiveComposite is now :func:`Composite`."], "_autosave": ["store_variables", "_autosave", " = True", "store", "var", "This variable can be set to False to disable autosave."], "hyperlink_styler": ["internal", "function", "(target)", "", "", ""], "_menu": ["store_variables", "_menu", " = False", "store", "var", "Ren'Py sets this variable to True when entering a main menu or game menu context."], "AudioData": ["internal", "class", "(data, filename)", "", "", "This class wraps a bytes object containing audio data, so it can be passed to the audio playback system. The audio data should be contained in some format Ren'Py supports. (For examples RIFF WAV format headers, not unadorned samples.)\n\n`data` A bytes object containing the audio file data.\n\n`filename` A synthetic filename associated with this data. It can be used to suggest the format `data` is in, and is reported as part of error messages.\n\nOnce created, this can be used wherever an audio filename is allowed. For example\n```\ndefine audio.easteregg = AudioData(b'...', 'sample.wav')\nplay sound easteregg\n```"], "Color": ["internal", "class", "(color=None, hls=None, hsv=None, rgb=None, alpha=1.0)", "", "", "The Color class is used to represent and manipulate colors and convert between various color spaces. It also represents opacity in the form of an alpha.\n\nWhen creating a Color, at one of the `color`, `hls`, `hsv`, or `rgb` arguments should be supplied. (If all are None, None is returned.)\n\n`color` The color, in one of the standard formats Ren'Py understands. These are:\n\n* A Color object. * An (r, g, b) or (r, g, b, a) tuple, in which all the numbers are between 0 and 255. * A string giving a hexadecimal color, in the form \\#rgb\\, \\#rgba\\, \\#rrggbb\\, or \\#rrggbbaa\\.\n\n`hls` A color in the hue-lightness-saturation color space. This should be supplied a three-component tuple, where each component is between 0.0 and 1.0.\n\n`hsv` A color in the hue-saturation-value color space. This should be supplied a three-component tuple, where each component is between 0.0 and 1.0.\n\n`rgb` A color in the red-green-blue color space. This should be supplied a three-component tuple, where each component is between 0.0 and 1.0.\n\nIf the supplied color does not contain an alpha value, `alpha` is used. `alpha` must be between 0.0 and 1.0.\n\nColor objects can be used as 4-component tuples, where the components are (red, green, blue, and alpha). When used as a tuple, the value of each component is between 0 and 255.\n\nColor objects support the +, -, and * operators, representing component-wise addition, subtraction, and multiplication. Some uses of these operators can cause the creation of colors with components that are not in the supported range. Such colors should not be passed to other parts of Ren'Py. (The normalize method can be called to return a new color with the components limited to the proper range.)\n\nA Color object has the following properties:\n\n.. attribute:: hls\n\nReturns the color as a tuple of three floating point numbers giving hue, lightness, and saturation. Each component ranges between 0.0 and 1.0.\n\n.. attribute:: hsv\n\nReturns the color as a tuple of three floating point numbers giving hue, saturation, and value. Each component ranges between 0.0 and 1.0.\n\n.. attribute:: rgb\n\nReturns the color as a tuple of three floating point numbers giving the red, green, and blue components. Each component ranges between 0.0 and 1.0.\n\n.. attribute:: rgba\n\nReturns the color as a tuple of four floating point numbers giving the red, green, blue and alpha components as 0.0 to 1.0 values.\n\n.. attribute:: alpha\n\nReturns the alpha (opacity) of this Color as a number between 0.0 and 1.0, where 0.0 is transparent and 1.0 is opaque.\n\n.. attribute:: hexcode\n\nReturns a string containing a hex color code of the form #rrggbbaa or #rrggbb.\n\nColor objects have the following methods. Since Colors are immutable, these methods always return a new Color object."], "preferences.desktop_rollback_side": ["preferences", "preferences.desktop_rollback_side", " = \"disable\"", "", "var", "When on a desktop platform, touches or clicks to this side of the window cause rollback to occur. One of \\left\\, \\right\\, or \\disable\\. This is the equivalend of the \\rollback side\\ preference when on a desktop platform."], "Matrix.screen_projection": ["internal", "function", "()", "", "", "This generates a matrix that projects the Ren'Py space, where (0, 0) is the top left and (`w`, `h`) is the bottom right, into the OpenGL viewport, where (-1.0, 1.0) is the top left and (1.0, -1.0) is the bottom.\n\nGenerates the matrix that projects the Ren'Py screen to the OpenGL screen."], "InputValue.Disable": ["screen_python", "Disable", "()", "InputValue", "method", "Returns an action that disables text editing on the input."], "moveintop": ["transitions", "moveintop", "", "", "var", "Also: **moveinleft, moveinright, moveinbottom**\n\nThese move entering images onto the screen from the appropriate side, taking 0.5 seconds to do so."], "gui.history_text_xalign": ["gui", "gui.history_text_xalign", " = 0.5", "", "var", "This controls the alignment of text and the side of the text that is aligned with xpos. 0.0 is left-aligned, 0.5 is center-aligned, 1.0 is right-aligned."], "At": ["internal", "function", "(d, *args)", "", "", "Given a displayable `d`, applies each of the transforms in `args` to it. The transforms are applied in left-to-right order, so that the outermost transform is the rightmost argument.\n```\ntransform birds_transform:\n xpos -200\n linear 10 xpos 800\n pause 20\n repeat\n\nimage birds = At(\\birds.png\\, birds_transform)\n```"], "build.package": ["internal", "function", "(name, format, file_lists, description=None, update=True, dlc=False, hidden=False)", "", "", "Declares a package that can be built by the packaging tool.\n\n`name` The name of the package.\n\n`format` The format of the package. A string containing a space separated list of:\n\nzip A zip file. tar.bz2 A tar.bz2 file. directory A directory containing the files. dmg A Macintosh DMG containing the files. app-zip A zip file containing a macintosh application. app-directory A directory containing the mac app. app-dmg A macintosh drive image containing a dmg. (Mac only.)\n\nThe empty string will not build any package formats (this makes dlc possible).\n\n`file_lists` A list containing the file lists that will be contained within the package.\n\n`description` An optional description of the package to be built.\n\n`update` If true and updates are being built, an update will be built for this package.\n\n`dlc` If true, any zip or tar.bz2 file will be built in standalone DLC mode, without an update directory.\n\n`hidden` If true, this will be hidden from the list of packages in the launcher."], "gui.glyph_font": ["gui", "gui.glyph_font", " = \"DejaVuSans.ttf\"", "", "var", "A font used for certain glyphs, such as the arrow glyphs used by the skip indicator. DejaVuSans is a reasonable default for these glyphs, and is automatically included with every Ren'Py game."]}} \ No newline at end of file +{ + "config": { + "config.adjust_attributes": [ + "renpy", + "var", + "= { }", + "", + "var", + "If not None, this is a dictionary. When a statement or function that\ncontains image attributes executes or is predicted, the tag is\nlooked up in this dictionary. If it is not found, the None key\nis looked up in this dictionary.\n\nIf either is found, they're expected to be a function. The function\nis given an image name, a tuple consisting of the tag and any\nattributes. It should return an adjusted tuple, which contains\nand a potential new set of attributes.\n\nAs this function may be called during prediction, it must not rely\non any state.\n\n" + ], + "config.adjust_view_size": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this should be a function taking two arguments, the width\nand height of the physical window. It is expected to return a tuple\ngiving the width and height of the OpenGL viewport, the portion of the\nscreen that Ren'Py will draw pictures to.\n\nThis can be used to configure Ren'Py to only allow certain sizes of\nscreen. For example, the following allows only integer multiples\nof the original screen size\n\n```\ninit python:\n\n def force_integer_multiplier(width, height):\n multiplier = min(width / config.screen_width, height / config.screen_height)\n multiplier = max(int(multiplier), 1)\n return (multiplier * config.screen_width, multiplier * config.screen_height)\n \n config.adjust_view_size = force_integer_multiplier\n \n```\n\n" + ], + "config.adv_nvl_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "A transition that is used to show the NVL-mode window when\nshowing ADV-mode text directly after NVL-mode text.\n\n" + ], + "config.afm_bonus": [ + "renpy", + "var", + "= 25", + "", + "var", + "The number of bonus characters added to every string when\nauto-forward mode is in effect.\n\n" + ], + "config.afm_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a Python function that is called to determine if it\nis safe to auto-forward. The intent is that this can be used by a\nvoice system to disable auto-forwarding when a voice is playing.\n\n" + ], + "config.afm_characters": [ + "renpy", + "var", + "= 250", + "", + "var", + "The number of characters in a string it takes to cause the amount\nof time specified in the auto forward mode preference to be\ndelayed before auto-forward mode takes effect.\n\n" + ], + "config.afm_voice_delay": [ + "renpy", + "var", + "= .5", + "", + "var", + "The number of seconds after a voice file finishes playing\nbefore AFM can advance text.\n\n" + ], + "config.after_default_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of functions that are called (with no arguments) whenever\ndefault statements are processed. The default statements are\nrun after the init phase, but before the game starts; when the\na save is loaded; after rollback; before lint; and potentially at\nother times.\n\nSimilar to the default statement, these callbacks are a good place\nto add data to the game that does not exist, but needs to.\n\n" + ], + "config.after_load_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of functions that are called (with no arguments) when a load\noccurs.\n\nIf these callbacks change data (for example, migrating data from an\nold version of the game), renpy.block_rollback should be\ncalled to prevent the player from rolling back and reverting\nthe changes.\n\n" + ], + "config.after_load_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "A transition that is used after loading, when entering the loaded\ngame.\n\n" + ], + "config.after_replay_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a function that is called with no arguments after a\nreplay completes.\n\n" + ], + "config.all_character_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of callbacks that are called by all characters. This list\nis prepended to the list of character-specific callbacks. Ren'Py\nincludes its own callbacks at the start of this list.\n\n" + ], + "config.allow_screensaver": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, the screensaver may activite while the game is running. If\nFalse, the screensaver is disabled.\n\n" + ], + "config.allow_skipping": [ + "renpy", + "var", + "= True", + "", + "var", + "If set to False, the user is not able to skip over the text of the\ngame. See _skipping.\n\n" + ], + "config.always_shown_screens": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of names of screens that Ren'Py will always show, even in menus,\nand when the interface is hidden. If a screen in this list is ever not\nshown, that screen will be re-shown. This is used by Ren'Py, which may modify the list.\n\nSetting config.overlay_screens is usually more appropriate.\n\n" + ], + "config.archives": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of archive files that will be searched for images and other\ndata. The entries in this should consist of strings giving the\nbase names of archive files, without the .rpa extension.\n\nThe archives are searched in the order they are found in this list.\nA file is taken from the first archive it is found in.\n\nAt startup, Ren'Py will automatically populate this variable with\nthe names of all archives found in the game directory, sorted in\nreverse ascii order. For example, if Ren'Py finds the files\ndata.rpa, patch01.rpa, and patch02.rpa,\nthis variable will be populated with ``['patch02', 'patch01', 'data']``.\n\n" + ], + "config.audio_filename_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is a function that is called with an audio filename,\nand is expected to return a second audio filename, the latter of which\nwill be played.\n\nThis is intended for use when an a games has audio file formats changed,\nbut it's not destired to update the game script.\n\n" + ], + "config.auto_channels": [ + "renpy", + "var", + "= { \"audio\" : ( \"sfx\", \"\", \"\" ), ... }", + "", + "var", + "This is used to define automatic audio channels. It's a map the\nchannel name to a tuple containing 3 components:\n\n* The mixer the channel uses.\n* A prefix that is given to files played on the channel.\n* A suffix that is given to files played on the channel.\n\n" + ], + "config.auto_choice_delay": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this variable gives a number of seconds that Ren'Py\nwill pause at an in-game menu before picking a random choice from\nthat menu. We'd expect this variable to always be set to None in\nreleased games, but setting it to a number will allow for\nautomated demonstrations of games without much human interaction.\n\n" + ], + "config.auto_load": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, the name of a save file to automatically load when\nRen'Py starts up. This is intended for developer use, rather than\nfor end users. Setting this to \"1\" will automatically load the\ngame in save slot 1.\n\n" + ], + "config.auto_movie_channel": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, and the `play` argument is given to Movie, an\naudio channel name is automatically generated for each movie.\n\nconfig.single_movie_channel takes precendece over this\nvariable.\n\n" + ], + "config.auto_voice": [ + "renpy", + "var", + "= None", + "", + "var", + "This may be a string, a function, or None. If None, auto-voice is\ndisabled.\n\nIf a string, this is formatted with the ``id`` variable bound to the\nidentifier of the current line of dialogue. If this gives an existing\nfile, that file is played as voice audio.\n\nIf a function, the function is called with a single argument, the\nidentifier of the current line of dialogue. The function is expected to\nreturn a string. If this gives an existing file, that file is played as\nvoice audio.\n\nSee Automatic Voice for more details.\n\n" + ], + "config.autoreload": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, Shift+R will toggle automatic reloading. When automatic\nreloading is enabled, Ren'Py will reload the game whenever a used\nfile is modified.\n\nIf False, Ren'Py will reload the game once per press of Shift+R.\n\n" + ], + "config.autosave_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "A callback or list of callbacks or Actions that will be called after\neach time a background autosave happens. Although actions may be used,\nthe Return action will not function.\n\nIf a non-Action callback shows a displayable or screen,\nrenpy.restart_interaction should be called.\n\n\n\n```\ndefine config.autosave_callback = Notify(\"Autosaved.\")\n\n```\n\n" + ], + "config.autosave_frequency": [ + "renpy", + "var", + "= 200", + "", + "var", + "Roughly, the number of interactions that will occur before an\nautosave occurs. To disable autosaving, set config.has_autosave to\nFalse, don't change this variable.\n\n" + ], + "config.autosave_on_choice": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, Ren'Py will autosave upon encountering an in-game choice.\n(When renpy.choice_for_skipping is called.)\n\n" + ], + "config.autosave_on_input": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, Ren'Py will autosave when the user inputs text.\n(When renpy.input is called.)\n\n" + ], + "config.autosave_on_quit": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, Ren'Py will attempt to autosave when the user attempts to quit,\nreturn to the main menu, or load a game over the existing game. (To\nsave time, the autosave occurs while the user is being prompted to confirm\nhis or her decision.)\n\n" + ], + "config.autosave_prefix_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is a function that is called with no arguments, and\nreturn the prefix of autosave files. The default prefix used is \"auto-\",\nwhich means the autosave slots will be \"auto-1\", \"auto-2\", etc.\n\n" + ], + "config.autosave_slots": [ + "renpy", + "var", + "= 10", + "", + "var", + "The number of slots used by autosaves.\n\n" + ], + "config.bottom_layers": [ + "renpy", + "var", + "= [ \"bottom\", ... ]", + "", + "var", + "This is a list of names of layers that are displayed above all\nother layers, and do not participate in a transition that is\napplied to all layers. If a layer name is listed here, it should\nnot be listed in config.layers` or config.top_layers.\n\n" + ], + "config.cache_surfaces": [ + "renpy", + "var", + "= False", + "", + "var", + "If True, the underlying data of an image is stored in RAM, allowing\nimage manipulators to be applied to that image without reloading it\nfrom disk. If False, the data is dropped from the cache, but kept as\na texture in video memory, reducing RAM usage.\n\n" + ], + "config.call_screen_roll_forward": [ + "renpy", + "var", + "= False", + "", + "var", + "The value is used when the `roll_forward` property of\na screen is None.\n\n" + ], + "config.character_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "The default value of the `callback` parameter of Character.\n\n" + ], + "config.character_id_prefixes": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "This specifies a list of style property prefixes that can be given\nto a Character. When a style prefixed with one of the given\nprefix is given, it is applied to the displayable with that prefix\nas its ID.\n\nFor example, the default GUI adds \"namebox\" to this. When a Character\nis given the `namebox_background` property, it sets background\non the displayable in the say screen with the id \"namebox\".\n\n" + ], + "config.choice_empty_window": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, and a choice menu (usually invoked with the ``menu``\nstatement) does not have a caption, this function is called with\nthe arguments (\"\", interact=False).\n\nThe expected use of this is\n\n```\ndefine config.choice_empty_window = extend\n\n```\n\nDoing this displays repeats the last line of dialogue as the\ncaption of the menu, if no other caption is given.\n\nOther implementations are possible, but it's assumed that this will\nalways display a dialogue window.\n\n" + ], + "config.choice_layer": [ + "renpy", + "var", + "= \"screens\"", + "", + "var", + "The layer the choice screen (used by the menu statement) is shown on.\n\n" + ], + "config.clear_layers": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of names of layers to clear when entering the main and game\nmenus.\n\n" + ], + "config.clear_log": [ + "renpy", + "var", + "= False", + "", + "var", + "If true, the log created by config.log is cleared each time\nRen'Py starts.\n\n" + ], + "config.conditionswitch_predict_all": [ + "renpy", + "var", + "= False", + "", + "var", + "The default value of the predict_all argument for ConditionSwitch\nand ShowingSwitch, which determines if all possible displayables\nare shown.\n\n" + ], + "config.console": [ + "renpy", + "var", + "= False", + "", + "var", + "This enables the console in the case config.developer is not true.\n\n" + ], + "config.context_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "This is a callback that is called with no arguments when Ren'Py enters a\nnew context, such as a menu context.\n\n" + ], + "config.context_clear_layers": [ + "renpy", + "var", + "= [ 'screens', 'top', 'bottom', ... ]", + "", + "var", + "A list of layers that are cleared when entering a new context.\n\n" + ], + "config.context_copy_remove_screens": [ + "renpy", + "var", + "= [ 'notify', ... ]", + "", + "var", + "Contains a list of screens that are removed when a context is copied\nfor rollback or saving.\n\n" + ], + "config.context_fadein_music": [ + "renpy", + "var", + "= 0", + "", + "var", + "The amount of time in seconds Ren'Py spends fading in music when the music is\nplayed due to a context change. (Usually, when the game is loaded.)\n\n" + ], + "config.context_fadeout_music": [ + "renpy", + "var", + "= 0", + "", + "var", + "The amount of time in seconds Ren'Py spends fading out music when the music is\nplayed due to a context change. (Usually, when the game is loaded.)\n\n" + ], + "config.controller_blocklist": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of strings, where each string is matched against the GUID\nof a game controller. These strings are mached as a prefix to the\ncontroller GUID (which cand be found in log.txt), and if matched,\nprevent the controller from being initialized.\n\n" + ], + "config.debug_image_cache": [ + "renpy", + "var", + "= False", + "", + "var", + "If True, Ren'Py will write information about the image cache\nto image_cache.txt.\n\n" + ], + "config.debug_prediction": [ + "renpy", + "var", + "= False", + "", + "var", + "If True, Ren'Py will will write information about and errors that\noccur during prediction (of execution flow, images, and screens) to\nlog.txt and the console.\n\n" + ], + "config.debug_sound": [ + "renpy", + "var", + "= False", + "", + "var", + "Enables debugging of sound functionality. This disables the\nsuppression of errors when generating sound. However, if a sound\ncard is missing or flawed, then such errors are normal, and\nenabling this may prevent Ren'Py from functioning normally. This\nshould always be False in a released game.\n\n" + ], + "config.debug_text_overflow": [ + "renpy", + "var", + "= False", + "", + "var", + "When true, Ren'Py will log text overflows to text_overflow.txt. A text\noverflow occurs when a Text displayable renders to a size\nlarger than that allocated to it. By setting this to True and setting\nthe xmaximum and ymaximum style properties of the dialogue\nwindow to the window size, this can be used to report cases where the\ndialogue is too large for its window.\n\n" + ], + "config.default_attribute_callbacks": [ + "renpy", + "var", + "= { }", + "", + "var", + "When a statement or function that contains image attributes executes or is\npredicted, and the tag is not currently being shown, it's looked up in this\ndictionary. If it is not found, the None key is looked up instead.\n\nIf either is found, they're expected to be a function. The function is\ngiven an image name, a tuple consisting of the tag and any attributes. It\nshould return an iterable which contains any additional attributes to be\napplied when an image is first shown.\n\nThe results of the function are treated as additive-only, and any explicit\nconflicting or negative attributes will still take precedence.\n\nAs this function may be called during prediction, it must not rely on any\nstate.\n\n" + ], + "config.default_language": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this should be a string giving the default language\nthat the game is translated into by the translation framework.\n\nSee translation for more details.\n\n" + ], + "config.default_tag_layer": [ + "renpy", + "var", + "= \"master\"", + "", + "var", + "The layer an image is shown on if its tag is not found in config.tag_layer.\n\n" + ], + "config.default_transform": [ + "renpy", + "var", + "= ...", + "", + "var", + "When a displayable is shown using the show or scene statements,\nthe transform properties are taken from this transform and used to\ninitialize the values of the displayable's transform.\n\nThe default transform is center.\n\n" + ], + "config.defer_styles": [ + "renpy", + "var", + "= False", + "", + "var", + "When true, the execution of style statements is deferred until after\nall ``translate python`` blocks have executed. This lets a ``translate\npython`` block update variables that are then used in style (not\ntranslate style) statements.\n\nWhile this defaults to False, it's set to True when gui.init\nis called.\n\n" + ], + "config.defer_tl_scripts": [ + "renpy", + "var", + "= Fasle", + "", + "var", + "When True, avoids loading scripts in the tl directory until the\nlanguage is selected. See deferred-translations.\n\n" + ], + "config.detached_layers": [ + "renpy", + "var", + "= [ ]", + "", + "var", + "These are layers which do not get automatically added to scenes.\nThey are always treated as sticky and\nintended for use with the Layer displayable for embedding.\n\n" + ], + "config.developer": [ + "renpy", + "var", + "= \"auto\"", + "", + "var", + "If set to True, developer mode is enabled. Developer mode gives\naccess to the shift+D developer menu, shift+R reloading, and\nvarious other features that are not intended for end users.\n\nThis can be True, False, or \"auto\". If \"auto\", Ren'Py will\ndetect if the game has been packaged into a distribution, and\nset config.developer as appropriate.\n\n" + ], + "config.disable_input": [ + "renpy", + "var", + "= False", + "", + "var", + "When true, renpy.input terminates immediately and returns its\n`default` argument.\n\n" + ], + "config.display_start_callbacks": [ + "renpy", + "var", + "= [ ]", + "", + "var", + "This contains a list of functions that are called after Ren'Py\ndisplays a window, but before the first frame is rendered. The\nmain use of this is to allow libraries to gain access to resources\nthat need an initializd gui, like OpenGL functions.\n\n" + ], + "config.displayable_prefix": [ + "renpy", + "var", + "= { }", + "", + "var", + "See Displayable prefixes.\n\n" + ], + "config.emphasize_audio_channels": [ + "renpy", + "var", + "= [ 'voice' ]", + "", + "var", + "A list of strings giving audio channel names.\n\nIf the \"emphasize audio\" preference is enabled, when one of the audio\nchannels listed starts playing a sound, all channels that are not\nlisted in this variable have their secondary audio volume reduced\nto config.emphasize_audio_volume over config.emphasize_audio_time\nseconds.\n\nWhen no channels listed in this variable are playing audio, all channels\nthat are not listed have their secondary audio volume raised to 1.0 over\nconfig.emphasize_audio_time seconds.\n\nFor example, setting this to ``[ 'voice' ]`` will lower the volume of all\nnon-voice channels when a voice is played.\n\n" + ], + "config.emphasize_audio_time": [ + "renpy", + "var", + "= 0.5", + "", + "var", + "See above.\n\n" + ], + "config.emphasize_audio_volume": [ + "renpy", + "var", + "= 0.5", + "", + "var", + "See above.\n\n" + ], + "config.empty_window": [ + "renpy", + "var", + ": Callable", + "", + "var", + "This is called with no arguments when _window is True, and no window has been shown\non the screen. (That is, no call to renpy.shown_window has\noccurred.) It's expected to show an empty window on the screen, and\nreturn without causing an interaction.\n\nThe default implementation of this uses the narrator character to\ndisplay a blank line without interacting.\n\n" + ], + "config.enable_language_autodetect": [ + "renpy", + "var", + "= False", + "", + "var", + "If true, Ren'Py will attempt to determine the name of the language\nto use based on the locale of the player's system. If successful,\nthis language will be used as the default language.\n\n" + ], + "config.end_game_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "The transition that is used to display the main menu after the\ngame ends normally, either by invoking return with no place to\nreturn to, or by calling renpy.full_restart.\n\n" + ], + "config.end_splash_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "The transition that is used to display the main menu after the end\nof the splashscreen.\n\n" + ], + "config.enter_replay_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a transition that is used when entering a replay.\n\n" + ], + "config.enter_sound": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is a sound file that is played when entering the\ngame menu.\n\n" + ], + "config.enter_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this variable should give a transition that will be\nused when entering the game menu.\n\n" + ], + "config.enter_yesno_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a transition that is used when entering the yes/no\nprompt screen.\n\n" + ], + "config.ex_rollback_classes": [ + "renpy", + "var", + "= [ ]", + "", + "var", + "A list of class objects that should not generate a warning that\nthe object supported rollback in the past, but do not now. If you\nhave intentionally removed rollack support from a class, place\nthe class object in this list and the warning will be suppressed.\n\nChances are, you don't want to use this - you want to add ``object``\nto the list of base types for your class.\n\n" + ], + "config.exception_handler": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this should be a function that takes three arguments:\n\n* A string giving the text of a traceback, abbreviated so that it only includes\ncreator-written files.\n* The full text of the traceback, including both creator-written and Ren'Py\nfiles.\n* The path to a file containing a traceback method.\n\nThis function can present the error to a user in any way fit. If it returns True,\nthe exception is ignored and control is transferred to the next statement. If it\nreturns False, the built-in exception handler is use. This function may also call\nrenpy.jump to transfer control to some other label.\n\n" + ], + "config.exit_replay_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a transition that is used when exiting a replay.\n\n" + ], + "config.exit_sound": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is a sound file that is played when exiting the\ngame menu.\n\n" + ], + "config.exit_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this variable should give a transition that will be\nperformed when exiting the game menu.\n\n" + ], + "config.exit_yesno_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a transition that is used when exiting the yes/no\nprompt screen.\n\n" + ], + "config.fadeout_audio": [ + "renpy", + "var", + "= 0.016", + "", + "var", + "The default audio fadeout time that's used to fade out audio, when\naudio is stopped with the ``stop`` statement or renpy.music.stop,\nor when a new audio track is started with the ``play`` statement or\nrenpy.music.play. This is not used when queued audio beings.\n\nA short fadeout is the default to prevent clicks and pops when\naudio is stopped or changed.\n\n" + ], + "config.fast_skipping": [ + "renpy", + "var", + "= False", + "", + "var", + "Set this to True to allow fast skipping outside of developer mode.\n\n" + ], + "config.file_open_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is a function that is called with the file name\nwhen a file needs to be opened. It should return a file-like\nobject, or None to load the file using the usual Ren'Py\nmechanisms. Your file-like object must implement at least the\nread, seek, tell, and close methods.\n\nOne may want to also define a config.loadable_callback that\nmatches this.\n\n" + ], + "config.file_slotname_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is a function that is used by the file actions\nto convert a page and name into a slot name that can be passed to\nthe save functions.\n\n`page`\nThis is a string containing the name of the page that is being\naccessed. This is a string, usually containing a number, but it\nalso may contain special values like \"quick\" or \"auto\".\n\n`name`\nThe is a string that contains the name of the slot on the page.\nIt may also contain a regular expression pattern\n(like r'\\d+'), in which case the same pattern should be included\nin the result.\n\nThe default behavior is equivalent to\n\n```\ndef file_slotname_callback(page, name):\n return page + \"-\" + name\n \nconfig.file_slotname_callback = file_slotname_callback\n\n```\n\nOne use of this is to allow the the game to apply a prefix to\nsave files.\n\nSee also config.autosave_prefix_callback.\n\n" + ], + "config.fix_rollback_without_choice": [ + "renpy", + "var", + "= False", + "", + "var", + "This option determines how the built-in menus or imagemaps behave\nduring fixed rollback. The default value is False, which means that\nonly the previously selected menu option remains clickable. If set\nto True, the selected option is marked but no options are clickable.\nThe user can progress forward through the rollback buffer by\nclicking.\n\n" + ], + "config.focus_crossrange_penalty": [ + "renpy", + "var", + "= 1024", + "", + "var", + "This is the amount of penalty to apply to moves perpendicular to\nthe selected direction of motion, when moving focus with the\nkeyboard.\n\n" + ], + "config.font_hinting": [ + "renpy", + "var", + "= { None : \"auto\" }", + "", + "var", + "This is a dictionary from a string containing the font filename to a string\ngiving one of the font hinting modes in hinting. When\nhinting is True, the value is looked up in this dictionary,\nand the resulting mode is used.\n\nIf no key is found, None is looked up, and the resulting mode is used.\n\n" + ], + "config.font_name_map": [ + "renpy", + "var", + "= { }", + "", + "var", + "This is a map from (font name) to (font filepath/fontgroup). Font names\nsimplify and shorten ``{font}`` tags, and gives them access to the\nfontgroup feature.\n\n" + ], + "config.font_replacement_map": [ + "renpy", + "var", + "= { }", + "", + "var", + "This is a map from (font, bold, italics) to (font, bold, italics),\nused to replace a font with one that's specialized as having bold\nand/or italics. For example, if you wanted to have everything\nusing an italic version of Vera.ttf use VeraIt.ttf\ninstead, you could write\n\n```\ninit python:\n config.font_replacement_map[\"Vera.ttf\", False, True] = (\"VeraIt.ttf\", False, False)\n \n```\n\nPlease note that these mappings only apply to specific variants of\na font. In this case, requests for a bold italic version of vera\nwill get a bold italic version of vera, rather than a bold version\nof the italic vera.\n\n" + ], + "config.game_main_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a transition that is used when returning to the main\nmenu from the game menu, using the MainMenu action.\n\n" + ], + "config.game_menu_music": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a music file to play when at the game menu.\n\n" + ], + "config.gamedir": [ + "renpy", + "var", + "= ...", + "", + "var", + "The full path leading to the game's game/ directory. This is a\nread-only variable. There is no guarantee that any file will be there,\ntypically on platforms such as android.\n\n" + ], + "config.gc_print_unreachable": [ + "renpy", + "var", + "= False", + "", + "var", + "If True, Ren'Py will print to its console and logs information about the\nobjects that are triggering collections.\n\n" + ], + "config.gc_thresholds": [ + "renpy", + "var", + "= (25000, 10, 10)", + "", + "var", + "The GC thresholds that Ren'Py uses when not idle. These are set to try\nto ensure that garbage collection doesn't happen. The three numbers are:\n\n* The net number of objects that need to be allocated before a level-0\ncollection.\n* The number of level-0 collections that trigger a level-1 collection.\n* The number of level-1 collections that trigger a level-2 collection.\n\n(Level-0 collections should be fast enough to not cause a frame drop,\nlevel-1 collections might, level-2 will.)\n\n" + ], + "config.gl_clear_color": [ + "renpy", + "var", + "= \"#000\"", + "", + "var", + "The color that the window is cleared to before images are drawn.\nThis is mainly seen as the color of the letterbox or pillarbox\nedges drawn when aspect ratio of the window (or monitor in\nfullscreen mode) does not match the aspect ratio of the game.\n\n" + ], + "config.gl_lod_bias": [ + "renpy", + "var", + "= -0.5", + "", + "var", + "The default value of the u_lod_bias uniform,\nwhich controls the mipmap level Ren'Py uses.\n\n" + ], + "config.gl_resize": [ + "renpy", + "var", + "= True", + "", + "var", + "Determines if the user is allowed to resize an OpenGL-drawn window.\n\n" + ], + "config.gl_test_image": [ + "renpy", + "var", + "= \"black\"", + "", + "var", + "The name of the image that is used when running the OpenGL\nperformance test. This image will be shown for 5 frames or .25\nseconds, on startup. It will then be automatically hidden.\n\n" + ], + "config.hard_rollback_limit": [ + "renpy", + "var", + "= 100", + "", + "var", + "This is the number of steps that Ren'Py will let the user\ninteractively rollback. Set this to 0 to disable rollback\nentirely, although we don't recommend that, as rollback is useful\nto let the user see text he skipped by mistake.\n\n" + ], + "config.has_autosave": [ + "renpy", + "var", + "= True", + "", + "var", + "If true, the game will autosave. If false, no autosaving will\noccur.\n\n" + ], + "config.help": [ + "renpy", + "var", + "= None", + "", + "var", + "The default value for the Help action.\n\n" + ], + "config.help_screen": [ + "renpy", + "var", + "= \"help\"", + "", + "var", + "The name of the screen shown by pressing f1 on the keyboard, or by\nthe Help action under certain circumstances.\n\n" + ], + "config.hide": [ + "renpy", + "var", + "= renpy.hide", + "", + "var", + "A function that is called when the hide statement\nis executed. This should take the same arguments as renpy.hide.\n\n" + ], + "config.history_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "This contains a list of callbacks that are called before Ren'Py adds\na new object to _history_list. The callbacks are called with the\nnew HistoryEntry object as the first argument, and can add new fields\nto that object.\n\nRen'Py uses history callbacks internally, so creators should append\ntheir own callbacks to this list, rather than replacing it entirely.\n\n" + ], + "config.history_current_dialogue": [ + "renpy", + "var", + "= True", + "", + "var", + "If true, the current dialogue will appear in the history screen.\n\n" + ], + "config.history_length": [ + "renpy", + "var", + "= None", + "", + "var", + "The number of entries of dialogue history Ren'Py keeps. This is\nset to 250 by the default gui.\n\n" + ], + "config.hyperlink_handlers": [ + "renpy", + "var", + "= { ... }", + "", + "var", + "A dictionary mapping a hyperlink protocol to the handler for that\nprotocol. A handler is a function that takes the value (everything after\nthe :) and performs some action. If a value is returned, the interaction\nends. Otherwise, the click is ignored and the interaction continues.\n\n" + ], + "config.hyperlink_protocol": [ + "renpy", + "var", + "= \"call_in_new_context\"", + "", + "var", + "The protocol that is used for hyperlinks that do not have a protocol\nassigned to them. See the a text tag for a description\nas to what the possible protocols mean.\n\n" + ], + "config.idle_gc_count": [ + "renpy", + "var", + "= 2500", + "", + "var", + "The net number of objects that triggers a collection when Ren'Py has\nreached a steady state. (The fourth frame or later after the screen has been\nupdated.)\n\n" + ], + "config.image_cache_size": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is used to set the size of the image cache, as a\nmultiple of the screen size. This number is multiplied by the size of\nthe screen, in pixels, to get the size of the image cache in pixels.\n\nIf set too large, this can waste memory. If set too small, images\ncan be repeatedly loaded, hurting performance.\n\n" + ], + "config.image_cache_size_mb": [ + "renpy", + "var", + "= 300", + "", + "var", + "This is used to set the size of the image cache, in\nmegabytes. If config.cache_surfaces is False, an image takes\n4 bytes per pixel, otherwise it takes 8 bytes per pixel.\n\nIf set too large, this can waste memory. If set too small, images\ncan be repeatedly loaded, hurting performance. If not none,\nconfig.image_cache_size is used instead of this variable.\n\n" + ], + "config.imagemap_auto_function": [ + "renpy", + "var", + ": Callable", + "", + "var", + "A function that expands the `auto` property of a screen language\nimagebutton or imagemap\nstatement into a displayable. It takes the value of the auto property,\nand the desired image, one of: \"insensitive\", \"idle\", \"hover\",\n\"selected_idle\", \"selected_hover\", or \"ground\". It should return a\ndisplayable or None.\n\nThe default implementation formats the `auto` property with\nthe desired image, and then checks if the computed filename exists.\n\n" + ], + "config.implicit_with_none": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, then by default the equivalent of a with None\nstatement will be performed after interactions caused by dialogue, menus\ninput, and imagemaps. This ensures that old screens will not show\nup in transitions.\n\n" + ], + "config.input_caret_blink": [ + "renpy", + "var", + "= 1.0", + "", + "var", + "If not False, sets the blinking period of the default caret, in seconds.\n\n" + ], + "config.interact_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of functions that are called (without any arguments) when\nan interaction is started or restarted.\n\n" + ], + "config.intra_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "The transition that is used between screens of the game and main\nmenu. (That is, when the screen is changed with ShowMenu.)\n\n" + ], + "config.keep_running_transform": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, showing an image without supplying a transform or ATL\nblock will cause the image to continue the previous transform\nan image with that tag was using, if any. If False, the transform\nis stopped.\n\n" + ], + "config.keep_side_render_order": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, the order of substrings in the Side positions will be\ndetermine the order of children render.\n\n" + ], + "config.keymap": [ + "renpy", + "var", + "= { ... }", + "", + "var", + "This variable contains a keymap giving the keys and mouse buttons\nassigned to each possible operation. Please see the section on\nKeymaps for more information.\n\n" + ], + "config.label_callbacks": [ + "renpy", + "var", + "= [ ]", + "", + "var", + "This is a list of callbacks that are called whenever a labels is\nreached. The callbacks are called with two arguments. The first is the name\nof the label. The second is True if the label was reached through\njumping, calling, or creating a new context, and False otherwise.\n\n" + ], + "config.label_overrides": [ + "renpy", + "var", + "= { }", + "", + "var", + "This variable gives a way of causing jumps and calls of labels in\nRen'Py script to be redirected to other labels. For example, if you\nadd a mapping from \"start\" to \"mystart\", all jumps and calls to\n\"start\" will go to \"mystart\" instead.\n\n" + ], + "config.layer_clipping": [ + "renpy", + "var", + "= { ... }", + "", + "var", + "Controls layer clipping. This is a map from layer names to (x, y,\nheight, width) tuples, where x and y are the coordinates of the\nupper-left corner of the layer, with height and width giving the\nlayer size.\n\nIf a layer is not mentioned in config.layer_clipping, then it will\ntake up the full size of its container. Typically this will be the\nscreen, unless being shown inside a Layer displayable.\n\n" + ], + "config.layer_transforms": [ + "renpy", + "var", + "= { }", + "", + "var", + "A dictionary mapping layer names to lists of transforms. These transforms\nare applied last, after ``show layer`` and ``camera`` transforms have\nalready been applied.\n\nIf the layer name is None, then the transforms are applied to to the\ncombination of all layers in config.layers, after any\ntransition has been applied.\n\n" + ], + "config.layeredimage_offer_screen": [ + "renpy", + "var", + "= True", + "", + "var", + "This variable sets the default value for the ``offer_screen`` property\nof layeredimages. See the related section\nfor more information.\n\n" + ], + "config.layers": [ + "renpy", + "var", + "= [ 'master', 'transient', 'screens', 'overlay', ... ]", + "", + "var", + "This variable gives a list of all of the layers that Ren'Py knows\nabout, in the order that they will be displayed to the\nscreen. (The lowest layer is the first entry in the list.) Ren'Py\nuses the layers \"master\", \"transient\", \"screens\", and \"overlay\"\ninternally (and possibly others in future versions), so they should\nalways be in this list.\n\nThe renpy.add_layer can add layers to this variable without\nneeding to know the original contents.\n\n" + ], + "config.lint_character_statistics": [ + "renpy", + "var", + "= True", + "", + "var", + "If true, and config.developer is true, the lint report will include\nstatistics about the number of dialogue blocks spoken for each character.\nThe chanracter statistics are disabled when the game is packaged, to\nprevent spoilers.\n\n" + ], + "config.lint_hooks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "This is a list of functions that are called, with no arguments,\nwhen lint is run. The functions are expected to check the script\ndata for errors, and print any they find to standard output (using\nthe Python ``print`` statement is fine in this case).\n\n" + ], + "config.load_before_transition": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, the start of an interaction will be delayed until all\nimages used by that interaction have loaded. (Yeah, it's a lousy\nname.)\n\n" + ], + "config.load_failed_label": [ + "renpy", + "var", + "= None", + "", + "var", + "If a string, this is a label that is jumped to when a load fails because\nthe script has changed so much that Ren'Py can't recover.\nBefore performing the load, Ren'Py will revert to the start of the\nlast statement, then it will clear the call stack.\n\nThis may also be a function. If it is, the function is called with\nno arguments, and is expected to return a string giving the label.\n\n" + ], + "config.loadable_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "When not None, a function that's called with a filename. It should return\nTrue if the file is loadable, and False if not. This can be used with\nconfig.file_open_callback or config.missing_image_callback.\n\n" + ], + "config.locale_to_language_function": [ + "renpy", + "var", + ": Callable", + "", + "var", + "A function that determines the language the game should use,\nbased on the the user's locale.\nIt takes 2 string arguments that give the ISO code of the locale\nand the ISO code of the region.\n\nIt should return a string giving the name of a translation to use, or\nNone to use the default translation.\n\n" + ], + "config.log": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is expected to be a filename. Much of the text\nshown to the user by say or :doc:`menu\n` statements will be logged to this file.\n\n" + ], + "config.log_events": [ + "renpy", + "var", + "= False", + "", + "var", + "If true, Ren'Py will log pygame-style events to the log.txt file. This will hurt performance, but might be\nuseful for debugging certain problems.\n\n" + ], + "config.log_width": [ + "renpy", + "var", + "= 78", + "", + "var", + "The width of lines logged when config.log is used.\n\n" + ], + "config.longpress_duration": [ + "renpy", + "var", + "= 0.5", + "", + "var", + "The amount of time the player must press the screen for a longpress\nto be recognized on a touch device.\n\n" + ], + "config.longpress_radius": [ + "renpy", + "var", + "= 15", + "", + "var", + "The number of pixels the touch must remain within for a press to be\nrecognized as a longpress.\n\n" + ], + "config.longpress_vibrate": [ + "renpy", + "var", + "= .1", + "", + "var", + "The amount of time the device will vibrate for after a longpress.\n\n" + ], + "config.main_menu_music": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a music file to play when at the main menu.\n\n" + ], + "config.main_menu_music_fadein": [ + "renpy", + "var", + "= 0.0", + "", + "var", + "The number of seconds to take to fade in config.main_menu_music.\n\n" + ], + "config.main_menu_stop_channels": [ + "renpy", + "var", + "= [ \"movie\", \"sound\", \"voice\", ... ]", + "", + "var", + "A list of channels that are stopped when entering or returning to the\nmain menu.\n\n" + ], + "config.manage_gc": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, Ren'Py will manage the GC itself. This means that it will apply\nthe settings below.\n\n" + ], + "config.max_texture_size": [ + "renpy", + "var", + "= (4096, 4096)", + "", + "var", + "The maximum size of an image that Ren'Py will load as a single texture.\nThis is important for 3d models, while 2d images will be split into\nmultiple textures if necessary.\n\nLive2d will adjust this to fit the largest live2d texture.\n\n" + ], + "config.menu_arguments_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this should be a function that takes positional and/or\nkeyword arguments. It's called whenever a menu statement runs,\nwith the arguments to that menu statement.\n\nThis should return a pair, containing a tuple of positional arguments\n(almost always empty), and a dictionary of keyword arguments.\n\n" + ], + "config.menu_clear_layers": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of layer names (as strings) that are cleared when entering\nthe game menu.\n\n" + ], + "config.menu_include_disabled": [ + "renpy", + "var", + "= False", + "", + "var", + "When this variable is set, choices disables with the if statement are\nincluded as disabled buttons.\n\n" + ], + "config.menu_window_subtitle": [ + "renpy", + "var", + "= \"\"", + "", + "var", + "The _window_subtitle variable is set to this value when entering\nthe main or game menus.\n\n" + ], + "config.minimum_presplash_time": [ + "renpy", + "var", + "= 0.0", + "", + "var", + "The minimum amount of time, in seconds, a presplash, Android presplash,\nor iOS LaunchImage is displayed for. If Ren'Py initializes before this\namount of time has been reached, it will sleep to ensure the image is\nshown for at least this amount of time. The image may be shown longer\nif Ren'Py takes longer to start up.\n\n" + ], + "config.mipmap_dissolves": [ + "renpy", + "var", + "= False", + "", + "var", + "The default value of the mipmap argument to Dissolve,\nImageDissolve, AlphaDissolve, and AlphaMask.\n\n" + ], + "config.mipmap_movies": [ + "renpy", + "var", + "= False", + "", + "var", + "The default value of the mipmap argument to Movie.\n\n" + ], + "config.mipmap_text": [ + "renpy", + "var", + "= False", + "", + "var", + "The default value of the mipmap argument to Text, including\ntext used in screen statements.\n\n" + ], + "config.missing_image_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this function is called when an attempt to load an\nimage fails. The callback is passed the filename of the missing image.\nIt may return None, or it may return an image manipulator.\nIf an image manipulator is returned, that image\nmanipulator is loaded in the place of the missing image.\n\nOne may want to also define a config.loadable_callback,\nespecially if this is used with a DynamicImage.\n\n" + ], + "config.missing_label_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this function is called when Ren'Py attempts to access\na label that does not exist in the game. The callback should take a\nsingle parameter, the name of the missing label. It should return the\nname of a label to use as a replacement for the missing label, or None\nto cause Ren'Py to raise an exception.\n\n" + ], + "config.mouse": [ + "renpy", + "var", + "= None", + "", + "var", + "This variable controls the use of user-defined mouse cursors. If\nNone, the system mouse is used, which is usually a black-and-white\nmouse cursor.\n\nOtherwise, this should be a dictionary giving the\nmouse animations for various mouse types. Keys used by the default\nlibrary include ``default``, ``say``, ``with``, ``menu``, ``prompt``,\n``imagemap``, ``button``, ``pause``, ``mainmenu``, and\n``gamemenu``. The ``default`` key should always be present, as it is\nused when a more specific key is absent. Keys can have an optional\nprefix ``pressed_`` to indicate that the cursor will be used when the\nmouse is pressed.\n\nEach value in the dictionary should be a list of (`image`,\n`xoffset`, `yoffset`) tuples, representing frames.\n\n`image`\nThe mouse cursor image. The maximum size for this image\nvaries based on the player's hardware. 32x32 is guaranteed\nto work everywhere, while 64x64 works on most hardware. Larger\nimages may not work.\n\n`xoffset`\nThe offset of the hotspot pixel from the left side of the\ncursor.\n\n`yoffset`\nThe offset of the hotspot pixel from the top of the cursor.\n\nThe frames are played back at 20Hz, and the animation loops after\nall frames have been shown.\n\nSee mouse for more information and examples.\n\n" + ], + "config.mouse_displayable": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this should either be a displayable, or a callable that\nreturns a displayable. The callable may return None, in which case\nRen'Py proceeds if the displayable is None.\n\nIf a displayable is given, the mouse cursor is hidden, and the\ndisplayable is shown above anything else. This displayable is\nresponsible for positioning and drawing a sythetic mouse\ncursor, and so should probably be a MouseDisplayable\nor something very similar.\n\nSee mouse for more information.\n\n" + ], + "config.mouse_focus_clickthrough": [ + "renpy", + "var", + "= False", + "", + "var", + "If true, clicks that cause a window to be focused will be processed\nnormally. If false, such clicks will be ignored.\n\n" + ], + "config.mouse_hide_time": [ + "renpy", + "var", + "= 30", + "", + "var", + "The mouse is hidden after this number of seconds has elapsed\nwithout any mouse input. This should be set to longer than the\nexpected time it will take to read a single screen, so mouse users\nwill not experience the mouse appearing then disappearing between\nclicks.\n\nIf None, the mouse will never be hidden.\n\n" + ], + "config.movie_mixer": [ + "renpy", + "var", + "= \"music\"", + "", + "var", + "The mixer that is used when a Movie automatically defines\na channel for video playback.\n\n" + ], + "config.name": [ + "renpy", + "var", + "= \"\"", + "", + "var", + "This should be a string giving the name of the game. This is included\nas part of tracebacks and other log files, helping to identify the\nversion of the game being used.\n\n" + ], + "config.narrator_menu": [ + "renpy", + "var", + "= True", + "", + "var", + "If true, narration inside a menu is displayed using the narrator\ncharacter. Otherwise, narration is displayed as captions\nwithin the menu itself.\n\n" + ], + "config.nearest_neighbor": [ + "renpy", + "var", + "= False", + "", + "var", + "Uses nearest-neighbor filtering by default, to support pixel art or\nmelting players' eyes.\n\n" + ], + "config.new_substitutions": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, Ren'Py will apply new-style (square-bracket)\nsubstitutions to all text displayed.\n\n" + ], + "config.new_translate_order": [ + "renpy", + "var", + "= True", + "", + "var", + "Enables the new order of style and translate statements introduced in\nRen'Py 6.99.11.\n\n" + ], + "config.notify": [ + "renpy", + "var", + ": Callable", + "", + "var", + "This is called by renpy.notify or Notify with a\nsingle `message` argument, to display the notification. The default\nimplementation is renpy.display_notify. This is intended\nto allow creators to intercept notifications.\n\n" + ], + "config.nvl_adv_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "A transition that is used to hide the NVL-mode window when\nshowing ADV-mode text directly after NVL-mode text.\n\n" + ], + "config.old_substitutions": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, Ren'Py will apply old-style (percent) substitutions to\ntext displayed by the say and :doc:`menu\n` statements.\n\n" + ], + "config.open_file_encoding": [ + "renpy", + "var", + "= False", + "", + "var", + "If not False, this is the encoding that renpy.open_file uses\nwhen its `encoding` parameter is none. This is mostly used when porting\nPython 2 games that used renpy.file extensively to Python 3,\nto have those files open as text by default.\n\nThis gets its default value from the RENPY_OPEN_FILE_ENCODING\nenvironment variable.\n\n" + ], + "config.optimize_texture_bounds": [ + "renpy", + "var", + "= True", + "", + "var", + "When True, Ren'Py will scan images to find the bounding box of the\nnon-transparent pixels, and only load those pixels into a texture.\n\n" + ], + "config.overlay_during_with": [ + "renpy", + "var", + "= True", + "", + "var", + "True if we want overlays to be shown during :ref:`with statements\n`, or False if we'd prefer that they be hidden during\nthe with statements.\n\n" + ], + "config.overlay_layers": [ + "renpy", + "var", + "= [ 'overlay', ... ]", + "", + "var", + "This is a list of all of the overlay layers. Overlay layers are\ncleared before the overlay functions are called. \"overlay\" should\nalways be in this list.\n\n" + ], + "config.overlay_screens": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of screens that are displayed when the overlay is enabled,\nand hidden when the overlay is suppressed. (The screens are shown\non the screens layer, not the overlay layer.)\n\n" + ], + "config.pad_bindings": [ + "renpy", + "var", + "= { ... }", + "", + "var", + "An equivalent of config.keymap for gamepads.\nPlease see keymap's section about pad bindings for more information.\n\n" + ], + "config.pass_controller_events": [ + "renpy", + "var", + "= False", + "", + "var", + "If true, pygame-like CONTROLLER events are passed to Displayables event\nhandlers. If not, those are consumed by Ren'Py.\n\n" + ], + "config.pass_joystick_events": [ + "renpy", + "var", + "= False", + "", + "var", + "If true, pygame-like JOYSTICK events are passed to Displayables event\nhandlers. If not, those are consumed by Ren'Py.\n\n" + ], + "config.pause_after_rollback": [ + "renpy", + "var", + "= False", + "", + "var", + "If False, the default, rolling back will skip any pauses (timed or\nnot) and stop only at other interactions such as dialogues, menus...\nIf True, renpy will include timeless pauses to the valid places a\nrollback can take the user.\n\n" + ], + "config.pause_with_transition": [ + "renpy", + "var", + "= False", + "", + "var", + "If false, renpy.pause is always used by the ``pause`` statement.\nIf true, when given a delay, ``pause 5`` is equivalent to ``with Pause(5)``.\n\n" + ], + "config.per_frame_screens": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "This is a list of strings giving the name of screens that are updated\nonce per frame, rather than once per interaction. Ren'Py uses this internally,\nso if you add a screen, append the name rather than replacing the list in\nits entirety.\n\n" + ], + "config.periodic_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "This is a list of functions that are called, with no arguments, at around 20Hz.\n\n" + ], + "config.physical_height": [ + "renpy", + "var", + "= None", + "", + "var", + "If set, this is the default height of the window containing the Ren'Py\ngame, in pixels. If not set, the height of the window defaults to\nconfig.screen_height.\n\n" + ], + "config.physical_width": [ + "renpy", + "var", + "= None", + "", + "var", + "If set, this is the default height of the window containing the Ren'Py\ngame, in pixels. If not set, the height of the window defaults to\nconfig.screen_width.\n\n" + ], + "config.play_channel": [ + "renpy", + "var", + "= \"audio\"", + "", + "var", + "The name of the audio channel used by renpy.play,\nhover_sound, and activate_sound.\n\n" + ], + "config.pre_screenshot_actions": [ + "renpy", + "var", + "= [ Hide(\"notify\", immediately=True), ... ]", + "", + "var", + "A list of actions that are run before a screenshot is taken. This\nis intended to hide transient elements that should not be shown in the\nscreenshot.\n\n" + ], + "config.predict_statements": [ + "renpy", + "var", + "= 32", + "", + "var", + "This is the number of statements, including the current one, to\nconsider when doing predictive image loading. A breadth-first\nsearch from the current statement is performed until this number\nof statements is considered, and any image referenced in those\nstatements is potentially predictively loaded. Setting this to 0\nwill disable predictive loading of images.\n\n" + ], + "config.preload_fonts": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of the names of TrueType and OpenType fonts that Ren'Py should\nload when starting up. Including the name of a font here can prevent\nRen'Py from pausing when introducing a new typeface.\n\n" + ], + "config.preserve_volume_when_muted": [ + "renpy", + "var", + "= False", + "", + "var", + "If False, the default, the volume of channels are shown as 0 and\nchanging it disables mute when the channel is mute.\nOtherwise, It is shown and adjustable while keeping mute.\n\n" + ], + "config.profile": [ + "renpy", + "var", + "= False", + "", + "var", + "If set to True, some profiling information will be output to\nstdout.\n\n" + ], + "config.profile_init": [ + "renpy", + "var", + "= 0.25", + "", + "var", + "``init`` and ``init python`` blocks taking longer than this amount of time\nto run are reported to log file.\n\n" + ], + "config.python_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of functions. The functions in this list are called, without\nany arguments, whenever a Python block is run outside of the init\nphase.\n\nOne possible use of this would be to have a function limit a variable\nto within a range each time it is adjusted.\n\nThe functions may be called while Ren'Py is starting up, before the start\nof the game proper, and potentially before the variables the\nfunction depends on are initialized. The functions are required to deal\nwith this, perhaps by using ``hasattr(store, 'varname')`` to check if\na variable is defined.\n\n" + ], + "config.python_exit_callbacks": [ + "renpy", + "var", + "= [ ]", + "", + "var", + "A list of functions that are called when Ren'Py is about to exit to\nthe operating system. This is intended to be used to deinitalize\npython modules.\n\nMuch of Ren'Py is deinitalized before these functions are called,\nso it's not safe to use Ren'Py functions in these callbacks.\n\n" + ], + "config.quicksave_slots": [ + "renpy", + "var", + "= 10", + "", + "var", + "The number of slots used by quicksaves.\n\n" + ], + "config.quit_action": [ + "renpy", + "var", + ": Action", + "", + "var", + "The action that is called when the user clicks the quit button on\na window. The default action prompts the user to see if they want\nto quit the game.\n\n" + ], + "config.quit_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of functions that are called without any arguments when\nRen'Py is either terminating or reloading the script. This is\nintended to free resources, such as opened files or started threads,\nthat arte created inside init code, if such things aren't freed\nautomatically.\n\n" + ], + "config.quit_on_mobile_background": [ + "renpy", + "var", + "= False", + "", + "var", + "If True, the mobile app will quit when it loses focus, rather than\nsaving and restoring its state. (See also config.save_on_mobile_background,\nwhich controls this behavior.)\n\n" + ], + "config.raise_image_exceptions": [ + "renpy", + "var", + "= None", + "", + "var", + "If True, Ren'Py will raise an exception when an image name is\nnot found. If False, Ren'Py will display a textual error message in place of the image.\n\nIf None, this takes on the value of config.developer.\n\nThis is set to False when Ren'Py ignores an exception.\n\n" + ], + "config.raise_image_load_exceptions": [ + "renpy", + "var", + "= None", + "", + "var", + "If True, Ren'Py will raise an exception when an exception happens\nduring image loading. If False, Ren'Py will display a textual error\nmessage in place of the image.\n\nIf None, this takes on the value of config.developer.\n\nThis is set to False when Ren'Py ignore an exception.\n\n" + ], + "config.reload_modules": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of strings giving the names of python modules that should be\nreloaded along with the game. Any submodules of these modules\nwill also be reloaded.\n\n" + ], + "config.replace_text": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a function that is called with a single argument, a text to\nbe displayed to the user. The function can return the same text it was\npassed, or a replacement text that will be displayed instead.\n\nThe function is called after substitutions have been performed and after\nthe text has been split on tags, so its argument contains nothing but\nactual text. All displayed text passes through the function: not only\ndialogue text, but also user interface text.\n\nThis can be used to replace specific ASCII sequences with corresponding\nUnicode characters, as demonstrated by the following\n\n```\ndef replace_text(s):\n s = s.replace(\"'\", u'\\u2019') # apostrophe\n s = s.replace('--', u'\\u2014') # em dash\n s = s.replace('...', u'\\u2026') # ellipsis\n return s\nconfig.replace_text = replace_text\n\n```\n\nSee also: config.say_menu_text_filter\n\n" + ], + "config.replay_scope": [ + "renpy", + "var", + "= { \"_game_menu_screen\" : \"preferences\", ... }", + "", + "var", + "A dictionary mapping variables in the default store to the values\nthe variables will be given when entering a replay.\n\n" + ], + "config.return_not_found_label": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a label that is jumped to when a return site is not found.\nThe call stack is cleared before this jump occurs.\n\n" + ], + "config.rollback_enabled": [ + "renpy", + "var", + "= True", + "", + "var", + "Should the user be allowed to rollback the game? If set to False,\nthe user cannot interactively rollback.\n\n" + ], + "config.rollback_length": [ + "renpy", + "var", + "= 128", + "", + "var", + "When there are more than this many statements in the rollback log,\nRen'Py will consider trimming the log. This also covers how many\nsteps Ren'Py will rollback when trying to load a save when the script\nhas changed.\n\nDecreasing this below the default value may cause Ren'Py to become\nunstable.\n\n" + ], + "config.rollback_side_size": [ + "renpy", + "var", + "= .2", + "", + "var", + "If the rollback side is enabled, the fraction of the screen on the\nrollback side that, when clicked or touched, causes a rollback to\noccur.\n\n" + ], + "config.save": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, Ren'Py will allow the user to save the game. If False,\nRen'Py will not allow the user to save the game, and will not show\nexisting saves.\n\n" + ], + "config.save_directory": [ + "renpy", + "var", + "= \"...\"", + "", + "var", + "This is used to generate the directory in which games and\npersistent information are saved. The name generated depends on\nthe platform:\n\nWindows\n%APPDATA%/RenPy/`save_directory`\n\nMac OS X\n~/Library/RenPy/`save_directory`\n\nLinux/Other\n~/.renpy/`save_directory`\n\nSetting this to None creates a \"saves\" directory underneath the\ngame directory. This is not recommended, as it prevents the game\nfrom being shared between multiple users on a system. It can also\nlead to problems when a game is installed as Administrator, but run\nas a user.\n\nThis must be set with either the define statement, or in a ``python\nearly`` block. In either case, this will be run before any other\nstatement, and so it should be set to a string, not an expression.\n\nTo locate the save directory, read config.savedir instead of\nthis variable.\n\n" + ], + "config.save_dump": [ + "renpy", + "var", + "= False", + "", + "var", + "If set to True, Ren'Py will create the file save_dump.txt whenever it\nsaves a game. This file contains information about the objects contained\nin the save file. Each line consists of a relative size estimate, the path\nto the object, information about if the object is an alias, and a\nrepresentation of the object.\n\n" + ], + "config.save_json_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of callback functions that are used to create the json object\nthat is stored with each save and marked accessible through FileJson\nand renpy.slot_json.\n\nEach callback is called with a Python dictionary that will eventually be\nsaved. Callbacks should modify that dictionary by adding JSON-compatible\nPython types, such as numbers, strings, lists, and dicts. The dictionary\nat the end of the last callback is then saved as part of the save slot.\n\nThe dictionary passed to the callbacks may have already have keys\nbeginning with an underscore ``_``. These keys are used by Ren'Py,\nand should not be changed.\n\nFor example\n\n```\ninit python:\n def jsoncallback(d):\n d[\"playername\"] = player_name\n \n config.save_json_callbacks.append(jsoncallback)\n \n```\n\n``FileJson(slot)`` and ``renpy.slot_json(slot)`` will recover the state\nof the ``d`` dict-like object as it was at the moment the game was saved.\nThe value of the ``player_name`` variable at the moment the game was saved\nis also accessible by ``FileJson(slot, \"playername\")``.\n\n" + ], + "config.save_on_mobile_background": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, the mobile app will save its state when it loses focus. The state\nis saved in a way that allows it to be automatically loaded (and the game\nto resume its place) when the app starts again.\n\n" + ], + "config.save_persistent": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, Ren'Py will save persistent data. If False,\npersistent data will not be saved, and changes to persistent will be\nlost when the game ends.\n\n" + ], + "config.save_physical_size": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, the physical size of the window will be saved in the\npreferences, and restored when the game resumes.\n\n" + ], + "config.save_token_keys": [ + "renpy", + "var", + "= [ ]", + "", + "var", + "A list of keys that the game will trust when loading a save file. This can\nbe used to allow the game's creator to distribute save files that will\nbe loaded without displaying a warning.\n\nTo allow the save token for the current computer to be trusted in this\nway, open the console and run\n\n```\nprint(renpy.get_save_token_keys())\n\n```\n\nThis will print the keys out in log.txt. The value can then be used to\ndefine this config.save_token_keys. This variable must be set with a define\nstatement, or in a python early block.\n\n" + ], + "config.savedir": [ + "renpy", + "var", + "= ...", + "", + "var", + "The complete path to the directory in which the game is\nsaved. This should only be set in a ``python early`` block. See also\nconfig.save_directory, which generates the default value for this\nif it is not set during a ``python early`` block.\n\n" + ], + "config.say_allow_dismiss": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this should be a function. The function is called\nwith no arguments when the user attempts to dismiss a :ref:`say\nstatement `. If this function returns True, the\ndismissal is allowed, otherwise it is ignored.\n\n" + ], + "config.say_arguments_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this should be a function that takes the speaking character,\nfollowed by positional and keyword arguments. It's called whenever a\nsay statement occurs, even when the statement doesn't explicitly pass\narguments. The arguments passed to the callback always include an `interact`\nargument, and include the others provided in the say statement (if any).\n\nThis should return a pair, containing a tuple of positional arguments\n(almost always empty), and a dictionary of keyword arguments (almost\nalways with at least `interact` in it). Those will replace the arguments\npassed to the callback.\n\nFor example\n\n```\ndef say_arguments_callback(who, interact=True, color=\"#fff\"):\n return (), { \"interact\" : interact, \"what_color\" : color }\n \nconfig.say_arguments_callback = say_arguments_callback\n\n```\n\n" + ], + "config.say_attribute_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a transition to use when the image is changed by a\nsay statement with image attributes.\n\n" + ], + "config.say_attribute_transition_callback": [ + "renpy", + "var", + ": Callable", + "", + "var", + "This is a function that return a transition to apply and a layer to\napply it on\n\nThis should be a function that takes four arguments, the image tag\nbeing shown, a `mode` parameter, a `set` containing pre-transition tags\nand a `set` containing post-transition tags. Where the value of the\n`mode` parameter is one of:\n\n* \"permanent\", for permanent attribute change (one that lasts longer\nthan the current say statement).\n* \"temporary\", for a temporary attribute change (one that is restored\nat the end of the current say statement).\n* \"both\", for a simultaneous permanent and temporary attribute change\n(one that in part lasts longer than the current say statement, and in\npart is restored at the end of the current say statement).\n* \"restore\", for when a temporary (or both) change is being restored.\n\nThis should return a 2-component tuple, consisting of:\n\n* The transition to use, or None if no transition should occur.\n* The layer the transition should be on, either a string or None. This is\nalmost always None.\n\nThe default implementation of this returns (config.say_attribute_transition,\nconfig.say_attribute_transition_layer).\n\n" + ], + "config.say_attribute_transition_layer": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this must be a string giving the name of a layer. (Almost always\n\"master\".) The say attribute is applied to the named layer, and Ren'Py\nwill not pause to wait for the transition to occur. This will have the\neffect of transitioning in the attribute as dialogue is shown.\n\n" + ], + "config.say_layer": [ + "renpy", + "var", + "= \"screens\"", + "", + "var", + "The layer the say screen is shown on. This layer should be in\nconfig.context_clear_layers.\n\n" + ], + "config.say_menu_text_filter": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, then this is a function that is given the text found\nin strings in the say and :doc:`menu\n` statements. It is expected to return new\n(or the same) strings to replace them.\n\nThis runs very early in the say and menu statement processing, before\ntranslation and substitutions are applied. For a filter that runs later,\nsee config.replace_text.\n\n" + ], + "config.say_sustain_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of functions that are called, without arguments, before the\nsecond and later interactions caused by a line of dialogue with\npauses in it. Used to sustain voice through pauses.\n\n" + ], + "config.scene": [ + "renpy", + "var", + "= renpy.scene", + "", + "var", + "A function that's used in place of renpy.scene by the :ref:`scene\nstatement `. Note that this is used to clear the screen,\nand config.show is used to show a new image. This should have the same\nsignature as renpy.scene.\n\n" + ], + "config.scene_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of functions that are called when the scene statement runs,\nor renpy.scene is called. The functions are called with a\nsingle argument, the layer that the scene statement is called on.\nThese functions are called after the layer is cleared, but before the\noptional image is added, if present.\n\nRen'Py may call renpy.scene for its own purposes, so it's recommended\nto check the layer name before acting on these callbacks.\n\n" + ], + "config.screen_height": [ + "renpy", + "var", + "= 600", + "", + "var", + "The virtual height of the the game, in pixels. If config.physical_height\nis not set, this is also the default size of the window containing the\ngame. Usually set by gui.init to a much larger size.\n\n" + ], + "config.screen_width": [ + "renpy", + "var", + "= 800", + "", + "var", + "The virtual width of the the game, in pixels. If config.physical_width\nis not set, this is also the default size of the window containing the\ngame. Usually set by gui.init to a much larger size.\n\n" + ], + "config.screenshot_callback": [ + "renpy", + "var", + ": Callable", + "", + "var", + "A function that is called when a screenshot is taken. The function\nis called with a single parameter, the full filename the screenshot\nwas saved as.\n\n" + ], + "config.screenshot_crop": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this should be a (`x`, `y`, `height`, `width`)\ntuple. Screenshots are cropped to this rectangle before being\nsaved.\n\n" + ], + "config.screenshot_pattern": [ + "renpy", + "var", + "= \"screenshot%04d.png\"", + "", + "var", + "The pattern used to create screenshot files. This pattern is applied (using\nPython's %-formatting rules) to the natural numbers to generate a sequence\nof filenames. The filenames may be absolute, or relative to\nconfig.renpy_base. The first filename that does not exist is used as the\nname of the screenshot.\n\nDirectories are created if they do not exist.\n\nSee also _screenshot_pattern, which is used in preference to this\nvariable if not None.\n\n" + ], + "config.script_version": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is interpreted as a script version. The library\nwill use this script version to enable some compatibility\nfeatures, if necessary. If None, we assume this is a\nlatest-version script.\n\nThis is normally set in a file added by the Ren'Py launcher when\ndistributions are built.\n\n" + ], + "config.search_prefixes": [ + "renpy", + "var", + "= [ \"\", \"images/\", ... ]", + "", + "var", + "A list of prefixes that are prepended to filenames that are searched\nfor.\n\n" + ], + "config.searchpath": [ + "renpy", + "var", + "= [ 'common', 'game', ... ]", + "", + "var", + "A list of directories that are searched for images, music,\narchives, and other media, but not scripts. This is initialized to\na list containing \"common\" and the name of the game directory.\n\n" + ], + "config.shader_part_filter": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is a function that is called with a tuple of\nshader part names. It should return a new tuple of shader parts\nthat will be used.\n\n" + ], + "config.show": [ + "renpy", + "var", + "= renpy.show", + "", + "var", + "A function that is used in place of renpy.show by the :ref:`show\n` and scene statements. This\nshould have the same signature as renpy.show, and pass unknown\nkeyword arguments unchanged.\n\n" + ], + "config.single_movie_channel": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, and the `play` argument is give to Movie,\nthis is the name used for the channel the movie is played on.\nThis should not be \"movie\", as that name is reserved for\nRen'Py's internal use.\n\n" + ], + "config.skip_delay": [ + "renpy", + "var", + "= 75", + "", + "var", + "The amount of time that dialogue will be shown for, when skipping\nstatements using ctrl, in milliseconds. (Although it's nowhere\nnear that precise in practice.)\n\n" + ], + "config.skip_indicator": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, the library will display a skip indicator when skipping\nthrough the script.\n\n" + ], + "config.skip_sounds": [ + "renpy", + "var", + "= False", + "", + "var", + "If False, non-looping audio will not be played when Ren'Py is\nskipping.\n\n" + ], + "config.sound": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, sound works. If False, the sound/mixer subsystem is\ncompletely disabled.\n\n" + ], + "config.sound_sample_rate": [ + "renpy", + "var", + "= 48000", + "", + "var", + "The sample rate that the sound card will be run at. If all of your\nwav files are of a lower rate, changing this to that rate may make\nthings more efficient.\n\n" + ], + "config.speaking_attribute": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this should be a string giving an image attribute,\nwhich is added to the character's image tag when the character\nis speaking, and removed when the character stops.\n\nThis is applied to the image on the default layer for the tag,\nwhich can be set using config.tag_layer.\n\nThis is very similar to temporary attributes shown using @ in dialogue\nlines. The attribute is not removed when the text apparition animation\nends, but when the dialogue window gets dismissed.\n\n" + ], + "config.start_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of callbacks functions that are called with no arguments\nafter the init phase, but before the game (including the\nsplashscreen) starts. This is intended to be used by frameworks\nto initialize variables that will be saved.\n\nThe default value of this variable includes callbacks that Ren'Py\nuses internally to implement features such as nvl-mode. New\ncallbacks can be appended to this list, but the existing callbacks\nshould not be removed.\n\n" + ], + "config.start_interact_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of functions that are called (without any arguments) when\nan interaction is started. These callbacks are not called when an\ninteraction is restarted.\n\n" + ], + "config.statement_callbacks": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of functions that are called when a statement is executed.\nThese functions are generally called with the name of the statement\nin question. However, there are some special statement names.\n\n\"say\"\nNormal say statements.\n\n\"say-bubble\"\nSay statements in bubble mode.\n\n\"say-nvl\"\nSay statements in NVL mode.\n\n\"say-bubble\"\nSay statements in bubble mode.\n\n\"say-centered\"\nSay statments using the centered character.\n\n\"menu\":\nNormal menu statements.\n\n\"menu-nvl\"\nMenu statements in NVL mode.\n\n\"menu-with-caption\"\nMenu statements with a caption.\n\n\"menu-nvl-with-caption\"\nMenu statements with a caption in NVL mode.\n\nThere is a default callback in this list that is used to implement\n``window auto``.\n\n" + ], + "config.sticky_layers": [ + "renpy", + "var", + "= [ \"master\", ... ]", + "", + "var", + "A list of layer names that will, when a tag is shown on them, take\nprecedence over that tag's entry in config.tag_layer for the\nduration of it being shown.\n\n" + ], + "config.tag_layer": [ + "renpy", + "var", + "= { }", + "", + "var", + "A dictionary mapping image tag strings to layer name strings. When\nan image is shown without a specific layer name, the image's tag is\nlooked up in this dictionary to get the layer to show it on. If the\ntag is not found here, config.default_tag_layer is used.\n\n" + ], + "config.tag_transform": [ + "renpy", + "var", + "= { ... }", + "", + "var", + "A dictionary mapping image tag strings to transforms or lists of\ntransforms. When an image is newly-shown without an at clause,\nthe image's tag is looked up in this dictionary to find a transform\nor list of transforms to use.\n\n" + ], + "config.tag_zorder": [ + "renpy", + "var", + "= { }", + "", + "var", + "A dictionary mapping image tag strings to zorders. When an image is\nnewly-shown without a zorder clause, the image's tag is looked up\nin this dictionary to find a zorder to use. If no zorder is found,\n0 is used.\n\n" + ], + "config.textshader_callbacks": [ + "renpy", + "var", + "= { }", + "", + "var", + "This is dictionary that maps strings to callables. When textshaders\nwith the string are used, the function is called to return a string\ngiving another textshader. This can be used to make a textshader that\nchanges based on a persistent variable, for example.\n\n" + ], + "config.thumbnail_height": [ + "renpy", + "var", + "= 75", + "", + "var", + "The height of the thumbnails that are taken when the game is\nsaved. These thumbnails are shown when the game is loaded. Please\nnote that the thumbnail is shown at the size it was taken at,\nrather than the value of this setting when the thumbnail is shown\nto the user.\n\nThis is changed by the default GUI.\n\n" + ], + "config.thumbnail_width": [ + "renpy", + "var", + "= 100", + "", + "var", + "The width of the thumbnails that are taken when the game is\nsaved. These thumbnails are shown when the game is loaded. Please\nnote that the thumbnail is shown at the size it was taken at,\nrather than the value of this setting when the thumbnail is shown\nto the user.\n\nThis is changed by the default GUI.\n\n" + ], + "config.top_layers": [ + "renpy", + "var", + "= [ \"top\", ... ]", + "", + "var", + "This is a list of names of layers that are displayed above all\nother layers, and do not participate in a transition that is\napplied to all layers. If a layer name is listed here, it should\nnot be listed in config.layers` or config.bottom_layers.\n\n" + ], + "config.transform_uses_child_position": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, transforms will inherit :ref:`position properties\n` from their child. If not, they won't.\n\n" + ], + "config.transient_layers": [ + "renpy", + "var", + "= [ 'transient', ... ]", + "", + "var", + "This variable gives a list of all of the transient\nlayers. Transient layers are layers that are cleared after each\ninteraction. \"transient\" should always be in this list.\n\n" + ], + "config.transition_screens": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, screens will participate in transitions, dissolving from the\nold state of the screen to the new state of the screen. If False, only\nthe latest state of the screen will be shown.\n\n" + ], + "config.translate_clean_stores": [ + "renpy", + "var", + "= [ \"gui\", ... ]", + "", + "var", + "A list of named stores that are cleaned to their state at the end of\nthe init phase when the translation language changes.\n\n" + ], + "config.translate_ignore_who": [ + "renpy", + "var", + "= [ ]", + "", + "var", + "A list of strings giving characters that will not have tanslations generated. This is useful\nfor characters that are used for debugging or note purposes. This compares against string value\nof the expression in the statement. (So \"e\" will match ``e`` but not ``l``, even if e and l are\nthe same object.)\n\n" + ], + "config.tts_substitutions": [ + "renpy", + "var", + "= [ ]", + "", + "var", + "This is a list of (pattern, replacement) pairs that are used to perform\nsubstitutions on text before it is passed to the text-to-speech engine,\nso that the text-to-speech engine can pronounce it correctly.\n\nPatterns may be either strings or regular expressions, and replacements\nmust be strings.\n\nIf the pattern is a string, it is escaped, then prefixed\nand suffixed with r'\\\\b' (to indicate it must begin and end at a word\nboundary), and then compiled into a regular expression. When the pattern\nis a string, the replacement is also escaped.\n\nIf the pattern is a regular expression, it is used as-is, and the\nreplacement is not escaped.\n\nThe substitutions are performed in the order they are given. If a substitution\nmatches the string, the match is checked to see if it is in title case,\nupper case, or lower case ; and if so the corresponding casing is performed\non the replacement. Once this is done, the replacement is applied.\n\nFor example\n\n```\ndefine config.tts_substitutions = [\n (\"Ren'Py\", \"Ren Pie\"),\n]\n\n```\n\nWill cause the string \"Ren'Py is pronounced ren'py.\" to be voiced as if\nit were \"Ren Pie is pronounced ren pie.\"\n\n" + ], + "config.tts_voice": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, a string giving a non-default voice that is used to\nplay back text-to-speech for self voicing. The possible choices are\nplatform specific, and so this should be set in a platform-specific\nmanner. (It may make sense to change this in translations, as well.)\n\n" + ], + "config.variants": [ + "renpy", + "var", + "= [ ... ]", + "", + "var", + "A list of screen variants that are searched when choosing a screen to\ndisplay to the user. This should always end with None, to ensure\nthat the default screens are chosen. See screen-variants.\n\n" + ], + "config.version": [ + "renpy", + "var", + "= \"\"", + "", + "var", + "This should be a string giving the version of the game. This is included\nas part of tracebacks and other log files, helping to identify the\nversion of the game being used.\n\n" + ], + "config.voice_filename_format": [ + "renpy", + "var", + "= \"{filename}\"", + "", + "var", + "A string that is formatted with the string argument to the voice\nstatement to produce the filename that is played to the user. For\nexample, if this is \"{filename}.ogg\", the ``voice \"test\"`` statement\nwill play test.ogg.\n\n" + ], + "config.web_input": [ + "renpy", + "var", + "= True", + "", + "var", + "If True, the web platform will use the browser's input system to\nhandle renpy.input. If False, Ren'Py's own input system will\nbe used. The browser's input system supports more languages, virtual\nkeyboards, and other conveniences, but is not as customizable.\n\nThis may be changed at init time, and also in translate python blocks.\n\nTo only use the browser's input system on touchscreen devices, use\n\n```\ndefine config.web_input = renpy.variant(\"touch\")\n\n```\n\n" + ], + "config.web_video_base": [ + "renpy", + "var", + "= \"./game\"", + "", + "var", + "When playing a movie in the web browser, this is a URL that\nis appended to to the movie filename to get the full URL\nto play the movie from. It can include directories in it, so\n\"https://share.renpy.org/movies-for-mygame\" would also be fine.\n\nThis allows large movie files to be hosted on a different server\nthan the rest of the game.\n\n" + ], + "config.web_video_prompt": [ + "renpy", + "var", + "= _(\"Touch to play the video.\")", + "", + "var", + "On Mobile Safari on iOS, by default, the player will need to click to play\na movie with sound. This variable gives the message that's used to prompt\nplayers to click.\n\n" + ], + "config.webaudio_required_types": [ + "renpy", + "var", + "= [ \"audio/ogg\", \"audio/mpeg\", ... ]", + "", + "var", + "When running on the web platform, Ren'Py will check the browser to\nsee if it can play audio files of these mime types. If the browser\ncan, it is used to play the files. If not, a slower and potentially skip\nprone wasm decoder is used.\n\nBy default, the browser's web audio system is used on Chrome and Firefox,\nand wasm is used on safari. If your game only uses mp3 audio, this can\nbe changed using \n\n```\ndefine config.webaudio_required_types = [ \"audio/mpeg\" ]\n\n```\n\nTo used the faster web audio system on Safari as well.\n\n" + ], + "config.window": [ + "renpy", + "var", + "= None", + "", + "var", + "This controls the default method of dialogue window management. If\nnot None, this should be one of \"show\", \"hide\", or \"auto\".\n\nWhen set to \"show\", the dialogue window is shown at all times.\nWhen set to \"hide\", the dialogue window is hidden when not in a\nsay statement or other statement that displays dialogue. When set\nto \"auto\", the dialogue window is hidden before scene statements,\nand shown again when dialogue is shown.\n\nThis sets the default. Once set, the default can be changed using the\n``window show``, ``window hide`` and ``window auto`` statements. See\ndialogue-window-management for more information.\n\n\n" + ], + "config.window_auto_hide": [ + "renpy", + "var", + "= [ \"scene\", \"call screen\", \"menu\", \"say-centered\", \"say-bubble\", ... ]", + "", + "var", + "A list of statements that cause ``window auto`` to hide the empty\ndialogue window.\n\n" + ], + "config.window_auto_show": [ + "renpy", + "var", + "= [ \"say\", \"say-nvl\", \"menu-with-caption\", \"nvl-menu\", \"nvl-menu-with-caption\", ... ]", + "", + "var", + "A list of statements that cause ``window auto`` to show the empty\ndialogue window.\n\n" + ], + "config.window_hide_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "The transition used by the window hide statement when no\ntransition has been explicitly specified.\n\n" + ], + "config.window_icon": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this is expected to be the filename of an image\ngiving an icon that is used for the game's main window. This does\nnot set the icon used by windows executables and mac apps, as\nthose are controlled by special-files.\n\n" + ], + "config.window_show_transition": [ + "renpy", + "var", + "= None", + "", + "var", + "The transition used by the window show statement when no\ntransition has been explicitly specified.\n\n" + ], + "config.window_title": [ + "renpy", + "var", + "= None", + "", + "var", + "The static portion of the title of the window containing the\nRen'Py game. _window_subtitle is appended to this to get\nthe full title of the window.\n\nIf None, the default, this defaults to the value of config.name.\n\n\n\n" + ], + "config.with_callback": [ + "renpy", + "var", + "= None", + "", + "var", + "If not None, this should be a function that is called when a :ref:`with\nstatement ` occurs. This function can be responsible for\nputting up transient things on the screen during the transition. The\nfunction is called with two arguments: the transition that is occurring,\nand the transition it is paired with. The latter is None except in the case\nof the implicit None transition produced by an inline with statement, in\nwhich case it is the inline transition that produced the with None. It is\nexpected to return a transition, which may or may not be the transition\nsupplied as its argument.\n\n\n" + ] + }, + "renpy": { + "Action": [ + "renpy", + "class", + "", + "", + "class", + "To define a new action, inherit from this class. Override the\nmethods in this class to change the behavior of the action.\n\n.. method:: __call__(self)\n\nThis is the method that is called when the action is\nactivated. In many cases, returning a non-None value from the\naction will cause the current interaction to end.\n\nThis method must be overridden, as the default method will\nraise a NotImplementedError (and hence cause Ren'Py to\nreport an error).\n\n.. method:: get_sensitive(self)\n\nThis is called to determine if the button with this action\nshould be sensitive. It should return true if the button is\nsensitive.\n\nNote that __call__ can be called, even if this returns False.\n\nThe default implementation returns True.\n\n.. method:: get_selected(self)\n\nThis should return true if the button should be rendered as a\nselected button, and false otherwise.\n\nThe default implemention returns False.\n\n.. method:: get_tooltip(self)\n\nThis gets a default tooltip for this button, if a specific\ntooltip is not assigned. It should return the tooltip value,\nor None if a tooltip is not known.\n\nThis defaults to returning None.\n\n.. method:: periodic(self, st)\n\nThis method is called once at the start of each interaction,\nand then is called periodically thereafter. If it returns a\nnumber, it will be called before that many seconds elapse, but\nit might be called sooner.\n\nThe main use of this is to call\nrenpy.restart_interaction if the value of\nget_selected or get_sensitive should change.\n\nIt takes one argument:\n\n`st`\nThe number of seconds since the screen or displayable this\naction is associated with was first shown.\n\n.. method:: unhovered(self)\n\nWhen the action is used as the `hovered` parameter to a button (or\nsimilar object), this method is called when the object loses focus.\n\nattribute alt\n\nThe text-to-speech text used for buttons that use this Action, if\nthe button does not have the alt property set. This can\nset to a string in the class, or in the constructor, or it can be\na Python property that returns a string.\n\n" + ], + "AddToSet": [ + "renpy", + "function", + "(set, value)", + "", + "function", + "Adds `value` to `set`.\n\n`set`\nThe set to add to. This may be a Python set or list, in which\ncase the value is appended to the list.\n`value`\nThe value to add or append.\n\n" + ], + "AlphaBlend": [ + "renpy", + "function", + "(control, old, new, alpha=False)", + "", + "function", + "This transition uses a `control` displayable (almost always some sort of\nanimated transform) to transition from one displayable to another. The\ntransform is evaluated. The `new` displayable is used where the transform\nis opaque, and the `old` displayable is used when it is transparent.\n\n`alpha`\nIf true, the image is composited with what's behind it. If false,\nthe default, the image is opaque and overwrites what's behind it.\n\n" + ], + "AlphaDissolve": [ + "renpy", + "function", + "(control, delay=0.0, *, reverse=False, mipmap=None)", + "", + "function", + "Returns a transition that uses a control displayable (almost always some\nsort of animated transform) to transition from one screen to another. The\ntransform is evaluated. The new screen is used where the transform is\nopaque, and the old image is used when it is transparent.\n\n`control`\nThe control transform.\n\n`delay`\nThe time the transition takes, before ending.\n\n`reverse`\nIf true, the alpha channel is reversed. Opaque areas are taken\nfrom the old image, while transparent areas are taken from the\nnew image.\n\n`mipmap`\nWhen the dissolve will be scaled to less than half its natural size,\nthis can be set to True. This will cause mipmaps to be generated,\nwhich will make the dissolve consume more GPU resources, but will\nreduce artifacts. See mipmap for more information.\n\n" + ], + "AlphaMask": [ + "renpy", + "class", + "(child, mask, invert=False, **properties)", + "", + "class", + "This displayable takes its colors from `child`, and its alpha channel\nfrom the multiplication of the alpha channels of `child` and `mask`.\nThe result is a displayable that has the same colors as `child`, is\ntransparent where either `child` or `mask` is transparent, and is\nopaque where `child` and `mask` are both opaque.\n\nThe `child` and `mask` parameters may be arbitrary displayables. The\nsize of the AlphaMask is the size of `child`. The `invert` parameter\ncan be used to invert the mask's alpha channel.\n\nNote that this takes different arguments from im.AlphaMask,\nwhich uses the mask's red channel.\n\n" + ], + "AnimatedValue": [ + "renpy", + "function", + "(value=0.0, range=1.0, delay=1.0, old_value=None)", + "", + "function", + "This animates a value, taking `delay` seconds to vary the value from\n`old_value` to `value`.\n\n`value`\nThe value itself, a number.\n\n`range`\nThe range of the value, a number.\n\n`delay`\nThe time it takes to animate the value, in seconds. Defaults\nto 1.0.\n\n`old_value`\nThe old value. If this is None, then the value is taken from the\nAnimatedValue we replaced, if any. Otherwise, it is initialized\nto `value`.\n\n" + ], + "At": [ + "renpy", + "function", + "(d, *args)", + "", + "function", + "Given a displayable `d`, applies each of the transforms in `args`\nto it. The transforms are applied in left-to-right order, so that\nthe outermost transform is the rightmost argument. \n\n```\ntransform birds_transform:\n xpos -200\n linear 10 xpos 800\n pause 20\n repeat\n \nimage birds = At(\"birds.png\", birds_transform)\n\n```\n\n" + ], + "Attribute": [ + "renpy", + "class", + "(group, attribute, image=None, default=False, group_args={}, **kwargs)", + "", + "class", + "This is used to represent a layer of an LayeredImage that is\ncontrolled by an attribute. A single attribute can control\nmultiple layers, in which case all layers corresponding to\nthat attribute will be displayed.\n\n`group`\nA string giving the group the attribute is part of. This\nmay be None, in which case a group with the same name as\nthe attribute is created.\n\n`attribute`\nA string giving the name of the attribute.\n\n`image`\nIf not None, this should be a displayable that is displayed when\nthis attribute is shown.\n\n`default`\nIf True, and no other attribute for the group is selected,\nthis attribute is.\n\nThe following keyword arguments are also known:\n\n`at`\nA transform or list of transforms that are applied to the\nimage.\n\n`if_all`\nAn attribute or list of attributes. The displayable is only shown\nif all of these are showing.\n\n`if_any`\nAn attribute or list of attributes. if not empty, the displayable is only shown\nif any of these are showing.\n\n`if_not`\nAn attribute or list of attributes. The displayable is only shown\nif none of these are showing.\n\nOther keyword arguments are interpreted as transform properties. If\nany are present, a transform is created that wraps the image. (For\nexample, pos=(100, 200) can be used to offset the image by 100 pixels\nhorizontally and 200 vertically.)\n\nIf the `image` parameter is omitted or None, and the LayeredImage\nhas been given the `image_format` parameter, the image_format is used\nto generate an image filename.\n\n" + ], + "AudioData": [ + "renpy", + "class", + "(data, filename)", + "", + "class", + "This class wraps a bytes object containing audio data, so it can be\npassed to the audio playback system. The audio data should be contained\nin some format Ren'Py supports. (For examples RIFF WAV format headers,\nnot unadorned samples.)\n\n`data`\nA bytes object containing the audio file data.\n\n`filename`\nA synthetic filename associated with this data. It can be used to\nsuggest the format `data` is in, and is reported as part of\nerror messages.\n\nOnce created, this can be used wherever an audio filename is allowed. For\nexample\n\n```\ndefine audio.easteregg = AudioData(b'...', 'sample.wav')\nplay sound easteregg\n\n```\n\n" + ], + "AudioPositionValue": [ + "renpy", + "function", + "(channel='music', update_interval=0.1)", + "", + "function", + "A value that shows the playback position of the audio file playing\nin `channel`.\n\n`update_interval`\nHow often the value updates, in seconds.\n\n" + ], + "BarValue": [ + "renpy", + "class", + "", + "", + "class", + "To define a new BarValue, inherit from this class and override\nsome of the methods.\n\n.. method:: get_adjustment(self)\n\nThis method is called to get an adjustment object for the\nbar. It should create the adjustment with\nui.adjustment, and then return the object created this\nway.\n\nThis method must be overridden, as the default method will\nraise NotImplementedError (and hence cause Ren'Py to report an\nerror).\n\n.. method:: get_style(self)\n\nThis is used to determine the style of bars that use this\nvalue. It should return a tuple of two style names or style\nobjects. The first is used for a bar, and the\nsecond for vbar.\n\nThis defaults to (\"bar\", \"vbar\").\n\n.. method:: get_tooltip(self)\n\nThis gets a default tooltip for this button, if a specific\ntooltip is not assigned. It should return the tooltip value,\nor None if a tooltip is not known.\n\nThis defaults to returning None.\n\n.. method:: replaces(self, other)\n\nThis is called when a BarValue replaces another BarValue, such\nas when a screen is updated. It can be used to update this\nBarValue from the other. It is called before get_adjustment.\n\nNote that `other` is not necessarily the same type as `self`.\n\n.. method:: periodic(self, st)\n\nThis method is called once at the start of each interaction. If\nit returns a number of seconds, it will be called before that\nmany seconds elapse, but it might be called sooner. It is\ncalled after get_adjustment.\n\nIt can be used to update the value of the bar over time, like\nAnimatedValue does. To do this, get_adjustment should\nstore the adjustment, and periodic should call the\nadjustment's changed method.\n\nattribute alt\n\nThe text-to-speech text used for bars that use this BarValue, if\nthe bar does not have the alt property set. This can\nset to a string in the class, or in the constructor, or it can be\na Python property that returns a string.\n\n\n" + ], + "Borders": [ + "renpy", + "class", + "(left, top, right, bottom, pad_left=0, pad_top=0, pad_right=0, pad_bottom=0)", + "", + "class", + "This object provides border size and tiling information to a Frame.\nIt can also provide padding information that can be supplied to the\npadding style property of a window or frame.\n\n`left`, `top`, `right`, `bottom`\nThese provide the size of the insets used by a frame, and are added\nto the padding on each side. They should be zero or a positive integer.\n\n`pad_left`, `pad_top`, `pad_right`, `pad_bottom`\nThese are added to the padding on each side, and may be positive or\nnegative. (For example, if `left` is 5 and `pad_left` is -3, the final\npadding is 2.)\n\nThe padding information is supplied via a field:\n\nattribute padding\n\nThis is a four-element tuple containing the padding on each of the\nfour sides.\n\n" + ], + "BrightnessMatrix": [ + "renpy", + "class", + "(value=1.0)", + "", + "class", + "A ColorMatrix that can be used with matrixcolor to change\nthe brightness of an image, while leaving the Alpha channel\nalone.\n\n`value`\nThe amount of change in image brightness. This should be\na number between -1 and 1, with -1 the darkest possible\nimage and 1 the brightest.\n\n" + ], + "Call": [ + "renpy", + "function", + "(label, *args, **kwargs)", + "", + "function", + "Ends the current statement, and calls `label`, given as a string.\nArguments and keyword arguments are passed to renpy.call.\n\n" + ], + "Camera": [ + "renpy", + "class", + "(layer='master')", + "", + "class", + "Instances of this class can be used with point_to to point\nat the location of the camera for a particular layer.\n\n`layer`\nThe name of the layer.\n\n\n" + ], + "CaptureFocus": [ + "renpy", + "function", + "(name='default')", + "", + "function", + "If a displayable is focused when this action is run, the rectangle\ncontaining that displayable is stored with the name `name`. This\nrectangle can then be retrieved with the GetFocusRect action,\nor the `focus` property of the sl-nearrect displayable.\n\nIf no displayable is focused, the previous capture with that name\nis removed.\n\n`name`\nThe name of the focus rectangle to store. This should be a string.\nThe name \"tooltip\" is special, as it is automatically captured\nwhen the tooltip is changed.\n\n" + ], + "Character": [ + "renpy", + "function", + "(name=..., kind=adv, **args)", + "", + "function", + "Creates and returns a Character object, which controls the look\nand feel of dialogue and narration.\n\n`name`\nIf a string, the name of the character for dialogue. When\n`name` is None, display of the name is omitted, as for\nnarration. If no name is given, the name is taken from\n`kind`, and otherwise defaults to None.\n\n`kind`\nThe Character to base this Character off of. When used, the\ndefault value of any argument not supplied to this Character\nis the value of that argument supplied to ``kind``. This can\nbe used to define a template character, and then copy that\ncharacter with changes.\n\nThis can also be a namespace, in which case the 'character'\nvariable in the namespace is used as the kind.\n\n**Linked Image.**\nAn image tag may be associated with a Character. This allows a\nsay statement involving this character to display an image with\nthe tag, and also allows Ren'Py to automatically select a side\nimage to show when this character speaks.\n\n`image`\nA string giving the image tag that is linked with this\ncharacter.\n\n**Voice Tag.**\nIf a voice tag is assign to a Character, the voice files that are\nassociated with it, can be muted or played in the preference\nscreen.\n\n`voice_tag`\nA String that enables the voice file associated with the\nCharacter to be muted or played in the 'voice' channel.\n\n**Prefixes and Suffixes.**\nThese allow a prefix and suffix to be applied to the name of the\ncharacter, and to the text being shown. This can be used, for\nexample, to add quotes before and after each line of dialogue.\n\n`what_prefix`\nA string that is prepended to the dialogue being spoken before\nit is shown.\n\n`what_suffix`\nA string that is appended to the dialogue being spoken before\nit is shown.\n\n`who_prefix`\nA string that is prepended to the name of the character before\nit is shown.\n\n`who_suffix`\nA string that is appended to the name of the character before\nit is shown.\n\n**Changing Name Display.**\nThese options help to control the display of the name.\n\n`dynamic`\nIf true, then `name` should either be a string containing a Python\nexpression, a function, or a callable object. If it's a string,\nThat string will be evaluated before each line of dialogue, and\nthe result used as the name of the character. Otherwise, the\nfunction or callable object will be called with no arguments\nbefore each line of dialogue, and the return value of the call will\nbe used as the name of the character.\n\n**Controlling Interactions.**\nThese options control if the dialogue is displayed, if an\ninteraction occurs, and the mode that is entered upon display.\n\n`condition`\nIf given, this should be a string containing a Python\nexpression. If the expression is false, the dialogue\ndoes not occur, as if the say statement did not happen.\n\n`interact`\nIf true, the default, an interaction occurs whenever the\ndialogue is shown. If false, an interaction will not occur,\nand additional elements can be added to the screen.\n\n`advance`\nIf true, the default, the player can click to advance through\nthe statement, and other means of advancing (such as skip and\nauto-forward mode) will also work. If false, the player will be\nunable to move past the say statement unless an alternate means\n(such as a jump hyperlink or screen) is provided.\n\n`callback`\nA function that is called when events occur while the\ncharacter is speaking. See the section on\ncharacter-callbacks for more information.\n\n**Click-to-continue.**\nA click-to-continue indicator is displayed once all the text has\nfinished displaying, to prompt the user to advance.\n\n`ctc`\nA displayable to use as the click-to-continue indicator, unless\na more specific indicator is used.\n\n`ctc_pause`\nA displayable to use a the click-to-continue indicator when the\ndisplay of text is paused by the {p} or {w} text tags.\n\n`ctc_timedpause`\nA displayable to use a the click-to-continue indicator when the\ndisplay of text is paused by the {p=} or {w=} text tags. When\nNone, this takes its default from `ctc_pause`, use ``Null()``\nwhen you want a `ctc_pause` but no `ctc_timedpause`.\n\n`ctc_position`\nControls the location of the click-to-continue indicator. If\n``\"nestled\"``, the indicator is displayed as part of the text\nbeing shown, immediately after the last character. ``\"nestled-close\"`` is\nsimilar, except a break is not allowed between the text and the CTC\nindicator. If ``\"fixed\"``, a new screen containing the CTC indicator is shown,\nand the position style properties of the CTC displayable are used\nto position the CTC indicator.\n\n**Screens.**\nThe display of dialogue uses a screen. These arguments\nallow you to select that screen, and to provide arguments to it.\n\n`screen`\nThe name of the screen that is used to display the dialogue.\n\n`retain`\nIf not true, an unused tag is generated for each line of dialogue,\nand the screens are shown non-transiently. Call renpy.clear_retain\nto remove all retaint screens. This is almost always used with\nbubble.\n\nKeyword arguments beginning with ``show_`` have the prefix\nstripped off, and are passed to the screen as arguments. For\nexample, the value of ``show_myflag`` will become the value of\nthe ``myflag`` variable in the screen. (The ``myflag`` variable isn't\nused by default, but can be used by a custom say screen.)\n\nOne show variable is, for historical reasons, handled by Ren'Py itself:\n\n`show_layer`\nIf given, this should be a string giving the name of the layer\nto show the say screen on.\n\n**Styling Text and Windows.**\nKeyword arguments beginning with ``who_``, ``what_``, and\n``window_`` have their prefix stripped, and are used to :doc:`style\n