├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ ├── tauri.yaml │ └── test.yaml ├── .gitignore ├── .vscode └── extensions.json ├── LICENSE ├── README.md ├── index.html ├── package.json ├── public ├── tauri.svg └── vite.svg ├── src-tauri ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── build.rs ├── gooey_config.json ├── icons │ ├── 128x128.png │ ├── 128x128@2x.png │ ├── 32x32.png │ ├── Square107x107Logo.png │ ├── Square142x142Logo.png │ ├── Square150x150Logo.png │ ├── Square284x284Logo.png │ ├── Square30x30Logo.png │ ├── Square310x310Logo.png │ ├── Square44x44Logo.png │ ├── Square71x71Logo.png │ ├── Square89x89Logo.png │ ├── StoreLogo.png │ ├── icon.icns │ ├── icon.ico │ └── icon.png ├── src │ └── main.rs └── tauri.conf.json ├── src ├── App.css ├── App.tsx ├── Gpu.ts ├── assets │ └── react.svg ├── commands │ ├── convert.test.ts │ ├── convert.ts │ ├── docker.test.ts │ ├── docker.ts │ ├── dreambooth.test.ts │ ├── dreambooth.ts │ └── runner.ts ├── components │ ├── ConfigTrainer.tsx │ ├── Gallery.tsx │ ├── ImagePicker.tsx │ ├── Trainer.tsx │ ├── Training.tsx │ └── utils.ts ├── docker.ts ├── main.tsx ├── state.ts ├── style.css ├── vite-env.d.ts └── vite.config.ts ├── tsconfig.json ├── tsconfig.node.json ├── vite.config.ts └── yarn.lock /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | - GPU: [eg. GTX 3060] 31 | 32 | **Additional context** 33 | Add any other context about the problem here. 34 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/tauri.yaml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | tags: 5 | - 'v*' 6 | workflow_dispatch: 7 | 8 | jobs: 9 | release: 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | platform: [ubuntu-latest, windows-latest] 14 | runs-on: ${{ matrix.platform }} 15 | steps: 16 | - name: Checkout repository 17 | uses: actions/checkout@v2 18 | 19 | - name: Node.js setup 20 | uses: actions/setup-node@v1 21 | with: 22 | node-version: 16 23 | 24 | - name: Rust setup 25 | uses: actions-rs/toolchain@v1 26 | with: 27 | toolchain: stable 28 | 29 | - name: Install dependencies (ubuntu only) 30 | if: matrix.platform == 'ubuntu-latest' 31 | run: | 32 | sudo apt-get update 33 | sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf 34 | - name: Install app dependencies and build web 35 | run: yarn && yarn build 36 | 37 | - name: Build the app 38 | uses: tauri-apps/tauri-action@v0 39 | 40 | env: 41 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 42 | with: 43 | tagName: v__VERSION__ # tauri-action replaces \_\_VERSION\_\_ with the app version 44 | releaseName: 'v__VERSION__' 45 | releaseBody: 'See the assets to download this version and install.' 46 | releaseDraft: false 47 | prerelease: false 48 | -------------------------------------------------------------------------------- /.github/workflows/test.yaml: -------------------------------------------------------------------------------- 1 | name: "test" 2 | on: 3 | push: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | test-tauri: 8 | strategy: 9 | fail-fast: false 10 | matrix: 11 | platform: [macos-latest, ubuntu-20.04, windows-latest] 12 | 13 | runs-on: ${{ matrix.platform }} 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: setup node 17 | uses: actions/setup-node@v1 18 | with: 19 | node-version: 16 20 | - name: install Rust stable 21 | uses: actions-rs/toolchain@v1 22 | with: 23 | toolchain: stable 24 | - name: install dependencies (ubuntu only) 25 | if: matrix.platform == 'ubuntu-20.04' 26 | run: | 27 | sudo apt-get update 28 | sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf 29 | - name: build the app and test it 30 | run: yarn && yarn test -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] 3 | } 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 smy20011 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dreambooth Gui 2 | 3 | Provides a easy-to-use gui for users to train Dreambooth with custom images. This 4 | Gui supports any NVIDIA card with >10GB VRAM. 5 | 6 | ![BuildStatus](https://github.com/smy20011/dreambooth-gui/actions/workflows/test.yaml/badge.svg) 7 | 8 | ## Screenshots 9 | 10 | ![203261990-a1920337-1687-4503-84bd-ffcd599d3c42](https://user-images.githubusercontent.com/1560175/204433541-28882839-4e55-4a11-b732-210ece68a213.jpg) 11 | ![203261994-f541593a-65e1-4a4e-9acc-6a05d5ce310d](https://user-images.githubusercontent.com/1560175/204433550-f4d73012-4cc3-4812-b3dc-e171195dd6fe.jpg) 12 | ![203261997-cc3c8456-a7fc-4162-b4fd-d953b4c5fbcd](https://user-images.githubusercontent.com/1560175/204433559-9aacdd94-32c1-445b-8fdc-6aa03a8a67a0.jpg) 13 | 14 | 15 | 16 | ## Highlights 17 | 18 | 1. Automatically decide training params that fit your available VRAM. 19 | 2. Easy to use Gui for you to select images. 20 | 3. Support prior preservation training with class images. 21 | 4. Automatically cache models. 22 | 23 | ## Install (Windows) 24 | 25 | 1. Download and install docker from https://www.docker.com/ 26 | 2. Setup WSL2 for windows. https://learn.microsoft.com/en-us/windows/wsl/install 27 | 3. If you find 'WSL 2 installation is incomplete' when starting docker, you can follow this video to fix it. https://www.youtube.com/watch?v=Ffzud5xLH4c 28 | 4. [Download](https://github.com/smy20011/dreambooth-gui/releases/latest) and install dreambooth-gui_*_x64_en-US.msi 29 | from [release page](https://github.com/smy20011/dreambooth-gui/releases/latest). 30 | 5. Run the dreambooth-gui as administrator. 31 | 32 | ## Install (Linux) 33 | 34 | 1. Download and install docker from https://www.docker.com/ 35 | 2. Download AppImage from [release page](https://github.com/smy20011/dreambooth-gui/releases/latest). 36 | 3. Run `chmod +x dreambooth-gui_*amd64.AppImage` 37 | 4. Run `sudo dreambooth-gui_*amd64.AppImage` 38 | 39 | ## FAQs 40 | 41 | 1. Failed to create directory 42 | 43 | Please make sure you have the latest verion of GUI. This is a old bug that fixed in v0.1.3 44 | 45 | 2. PIL.UnidentifiedImageEnnon: cannot identify image file 46 | 47 | Make sure the instance image folder only have image. 48 | 49 | 3. Read-only file system error 50 | 51 | Make sure you have enough space in C(or home folder) before running the Gui. 52 | 53 | 4. Train with SD v2 54 | 55 | Training with SD v2 is supported. However, you need to type `stabilityai/stable-diffusion-2` as model name. Local v2 training is not supported right now. 56 | 57 | 5. I have other questions! 58 | 59 | Please use the [discussion](https://github.com/smy20011/dreambooth-gui/discussions) page for Q&A. 60 | 61 | I will convert FAQs to a bug if necessary. I perfer to keep the issue section clean but keep getting questions 62 | that I answered before. 63 | 64 | 65 | ## Roadmap 66 | 67 | - [X] Refactor the state management. 68 | - [X] Better error handling to cover FAQs. 69 | - [ ] Allow advanced customization 70 | - [X] Load local model. 71 | - [ ] Save/Load config for users. 72 | - [ ] Save model / pics in places other than $APP_DIR 73 | - [ ] Better training progress report. 74 | - [X] Create a dialog when training finished. 75 | - [ ] Progress bar. 76 | - [X] Support model converstion. 77 | 78 | ## Additional Resources 79 | 80 | 1. Someone in japan write a [doc](https://gigazine.net/gsc_news/en/20221103-dreambooth-gui/) regarding how to use it. 81 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Tauri + React + TS 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dreambooth-gui", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "license": "MIT", 7 | "scripts": { 8 | "dev": "vite", 9 | "build": "tsc && vite build", 10 | "preview": "vite preview", 11 | "tauri": "tauri", 12 | "test": "vitest" 13 | }, 14 | "dependencies": { 15 | "@emotion/react": "^11.10.4", 16 | "@emotion/styled": "^11.10.4", 17 | "@mui/material": "^5.10.8", 18 | "@tauri-apps/api": "^1.1.0", 19 | "bootstrap": "^5.2.2", 20 | "jotai": "^1.8.6", 21 | "react": "^18.2.0", 22 | "react-bootstrap": "^2.5.0", 23 | "react-dom": "^18.2.0", 24 | "react-hook-form": "^7.36.1" 25 | }, 26 | "devDependencies": { 27 | "@tauri-apps/cli": "^1.1.0", 28 | "@types/lodash": "^4.14.186", 29 | "@types/node": "^18.7.10", 30 | "@types/react": "^18.0.15", 31 | "@types/react-dom": "^18.0.6", 32 | "@vitejs/plugin-react": "^2.0.0", 33 | "lodash": "^4.17.21", 34 | "typescript": "^4.6.4", 35 | "vite": "^3.0.2", 36 | "vitest": "^0.24.3" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /public/tauri.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | 5 | -------------------------------------------------------------------------------- /src-tauri/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "dreambooth-gui" 3 | version = "0.0.0" 4 | description = "A Tauri App" 5 | authors = ["you"] 6 | license = "" 7 | repository = "" 8 | edition = "2021" 9 | rust-version = "1.57" 10 | 11 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 12 | 13 | [build-dependencies] 14 | tauri-build = { version = "1.1", features = [] } 15 | 16 | [dependencies] 17 | serde_json = "1.0" 18 | serde = { version = "1.0", features = ["derive"] } 19 | tauri = { version = "1.1", features = ["api-all"] } 20 | nvml-wrapper = { version = "0.8.0", features = ["serde"] } 21 | 22 | [features] 23 | # by default Tauri runs in production mode 24 | # when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL 25 | default = [ "custom-protocol"] 26 | # this feature is used used for production builds where `devPath` points to the filesystem 27 | # DO NOT remove this 28 | custom-protocol = [ "tauri/custom-protocol" ] 29 | -------------------------------------------------------------------------------- /src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | tauri_build::build() 3 | } 4 | -------------------------------------------------------------------------------- /src-tauri/gooey_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "language": "english", 3 | "target": "'/home/smy/miniconda3/envs/dev/bin/python' -u 'train_dreambooth.py'", 4 | "suppress_gooey_flag": false, 5 | "program_name": "dreambooth", 6 | "program_description": "Simple example of a training script.", 7 | "sidebar_title": "Actions", 8 | "default_size": [ 9 | 610, 10 | 530 11 | ], 12 | "auto_start": false, 13 | "show_advanced": true, 14 | "run_validators": true, 15 | "encoding": "utf-8", 16 | "show_stop_warning": true, 17 | "show_success_modal": true, 18 | "show_failure_modal": true, 19 | "force_stop_is_error": true, 20 | "poll_external_updates": false, 21 | "return_to_config": false, 22 | "show_restart_button": true, 23 | "requires_shell": true, 24 | "menu": [], 25 | "clear_before_run": false, 26 | "fullscreen": false, 27 | "use_legacy_titles": true, 28 | "num_required_cols": 2, 29 | "num_optional_cols": 2, 30 | "manual_start": false, 31 | "monospace_display": false, 32 | "image_dir": "::gooey/default", 33 | "language_dir": "/home/smy/miniconda3/envs/dev/lib/python3.9/site-packages/gooey/languages", 34 | "progress_regex": null, 35 | "progress_expr": null, 36 | "hide_progress_msg": false, 37 | "timing_options": { 38 | "show_time_remaining": false, 39 | "hide_time_remaining_on_complete": true 40 | }, 41 | "disable_progress_bar_animation": false, 42 | "disable_stop_button": false, 43 | "navigation": "SIDEBAR", 44 | "show_sidebar": false, 45 | "tabbed_groups": true, 46 | "group_by_type": true, 47 | "body_bg_color": "#f0f0f0", 48 | "header_bg_color": "#ffffff", 49 | "header_height": 80, 50 | "header_show_title": true, 51 | "header_show_subtitle": true, 52 | "header_image_center": false, 53 | "footer_bg_color": "#f0f0f0", 54 | "sidebar_bg_color": "#f2f2f2", 55 | "terminal_panel_color": "#F0F0F0", 56 | "terminal_font_color": "#000000", 57 | "terminal_font_family": null, 58 | "terminal_font_weight": 400, 59 | "terminal_font_size": null, 60 | "richtext_controls": false, 61 | "error_color": "#ea7878", 62 | "layout": "standard", 63 | "widgets": { 64 | "dreambooth": { 65 | "command": "::gooey/default", 66 | "name": "dreambooth", 67 | "help": null, 68 | "description": "", 69 | "contents": [ 70 | { 71 | "name": "Basic", 72 | "items": [ 73 | { 74 | "id": "--training_folder", 75 | "type": "TextField", 76 | "cli_type": "optional", 77 | "required": true, 78 | "data": { 79 | "display_name": "training_folder", 80 | "help": "Path to a folder that store all training data.", 81 | "required": true, 82 | "nargs": "", 83 | "commands": [ 84 | "--training_folder" 85 | ], 86 | "choices": [], 87 | "default": "/home/smy/Downloads/cyan", 88 | "dest": "training_folder" 89 | }, 90 | "options": { 91 | "error_color": "#ea7878", 92 | "label_color": "#000000", 93 | "help_color": "#363636", 94 | "full_width": false, 95 | "validator": { 96 | "type": "ExpressionValidator", 97 | "test": "user_input and not user_input.isspace()", 98 | "message": "This field is required" 99 | }, 100 | "external_validator": { 101 | "cmd": "" 102 | } 103 | } 104 | }, 105 | { 106 | "id": "--pretrained_model_name_or_path", 107 | "type": "TextField", 108 | "cli_type": "optional", 109 | "required": true, 110 | "data": { 111 | "display_name": "pretrained_model_name_or_path", 112 | "help": "Path to pretrained model or model identifier from huggingface.co/models.", 113 | "required": true, 114 | "nargs": "", 115 | "commands": [ 116 | "--pretrained_model_name_or_path" 117 | ], 118 | "choices": [], 119 | "default": "hakurei/waifu-diffusion", 120 | "dest": "pretrained_model_name_or_path" 121 | }, 122 | "options": { 123 | "error_color": "#ea7878", 124 | "label_color": "#000000", 125 | "help_color": "#363636", 126 | "full_width": false, 127 | "validator": { 128 | "type": "ExpressionValidator", 129 | "test": "user_input and not user_input.isspace()", 130 | "message": "This field is required" 131 | }, 132 | "external_validator": { 133 | "cmd": "" 134 | } 135 | } 136 | }, 137 | { 138 | "id": "--instance_data_dir", 139 | "type": "TextField", 140 | "cli_type": "optional", 141 | "required": true, 142 | "data": { 143 | "display_name": "instance_data_dir", 144 | "help": "A folder containing the training data of instance images.", 145 | "required": true, 146 | "nargs": "", 147 | "commands": [ 148 | "--instance_data_dir" 149 | ], 150 | "choices": [], 151 | "default": "/home/smy/Downloads/cyan/instance", 152 | "dest": "instance_data_dir" 153 | }, 154 | "options": { 155 | "error_color": "#ea7878", 156 | "label_color": "#000000", 157 | "help_color": "#363636", 158 | "full_width": false, 159 | "validator": { 160 | "type": "ExpressionValidator", 161 | "test": "user_input and not user_input.isspace()", 162 | "message": "This field is required" 163 | }, 164 | "external_validator": { 165 | "cmd": "" 166 | } 167 | } 168 | }, 169 | { 170 | "id": "--instance_prompt", 171 | "type": "TextField", 172 | "cli_type": "optional", 173 | "required": false, 174 | "data": { 175 | "display_name": "instance_prompt", 176 | "help": "The prompt with identifier specifing the instance", 177 | "required": false, 178 | "nargs": "", 179 | "commands": [ 180 | "--instance_prompt" 181 | ], 182 | "choices": [], 183 | "default": "a sks girl", 184 | "dest": "instance_prompt" 185 | }, 186 | "options": { 187 | "error_color": "#ea7878", 188 | "label_color": "#000000", 189 | "help_color": "#363636", 190 | "full_width": false, 191 | "validator": { 192 | "type": "ExpressionValidator", 193 | "test": "True", 194 | "message": "" 195 | }, 196 | "external_validator": { 197 | "cmd": "" 198 | } 199 | } 200 | }, 201 | { 202 | "id": "--resolution", 203 | "type": "TextField", 204 | "cli_type": "optional", 205 | "required": false, 206 | "data": { 207 | "display_name": "resolution", 208 | "help": "The resolution for input images, all the images in the train/validation dataset will be resized to this resolution", 209 | "required": false, 210 | "nargs": "", 211 | "commands": [ 212 | "--resolution" 213 | ], 214 | "choices": [], 215 | "default": 512, 216 | "dest": "resolution" 217 | }, 218 | "options": { 219 | "error_color": "#ea7878", 220 | "label_color": "#000000", 221 | "help_color": "#363636", 222 | "full_width": false, 223 | "validator": { 224 | "type": "ExpressionValidator", 225 | "test": "True", 226 | "message": "" 227 | }, 228 | "external_validator": { 229 | "cmd": "" 230 | } 231 | } 232 | }, 233 | { 234 | "id": "--auth_token", 235 | "type": "TextField", 236 | "cli_type": "optional", 237 | "required": true, 238 | "data": { 239 | "display_name": "auth_token", 240 | "help": "Huggingface auth token to access model, https://huggingface.co/settings/tokens", 241 | "required": true, 242 | "nargs": "", 243 | "commands": [ 244 | "--auth_token" 245 | ], 246 | "choices": [], 247 | "default": "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", 248 | "dest": "auth_token" 249 | }, 250 | "options": { 251 | "error_color": "#ea7878", 252 | "label_color": "#000000", 253 | "help_color": "#363636", 254 | "full_width": false, 255 | "validator": { 256 | "type": "ExpressionValidator", 257 | "test": "user_input and not user_input.isspace()", 258 | "message": "This field is required" 259 | }, 260 | "external_validator": { 261 | "cmd": "" 262 | } 263 | } 264 | } 265 | ], 266 | "groups": [], 267 | "description": "Basic dreambooth training config.", 268 | "options": { 269 | "label_color": "#000000", 270 | "description_color": "#363636", 271 | "legacy": { 272 | "required_cols": 2, 273 | "optional_cols": 2 274 | }, 275 | "columns": 2, 276 | "padding": 10, 277 | "show_border": false 278 | } 279 | }, 280 | { 281 | "name": "Prior Preservation", 282 | "items": [ 283 | { 284 | "id": "--class_data_dir", 285 | "type": "TextField", 286 | "cli_type": "optional", 287 | "required": false, 288 | "data": { 289 | "display_name": "class_data_dir", 290 | "help": "A folder containing the training data of class images.", 291 | "required": false, 292 | "nargs": "", 293 | "commands": [ 294 | "--class_data_dir" 295 | ], 296 | "choices": [], 297 | "default": null, 298 | "dest": "class_data_dir" 299 | }, 300 | "options": { 301 | "error_color": "#ea7878", 302 | "label_color": "#000000", 303 | "help_color": "#363636", 304 | "full_width": false, 305 | "validator": { 306 | "type": "ExpressionValidator", 307 | "test": "True", 308 | "message": "" 309 | }, 310 | "external_validator": { 311 | "cmd": "" 312 | } 313 | } 314 | }, 315 | { 316 | "id": "--class_prompt", 317 | "type": "TextField", 318 | "cli_type": "optional", 319 | "required": false, 320 | "data": { 321 | "display_name": "class_prompt", 322 | "help": "The prompt to specify images in the same class as provided intance images.", 323 | "required": false, 324 | "nargs": "", 325 | "commands": [ 326 | "--class_prompt" 327 | ], 328 | "choices": [], 329 | "default": null, 330 | "dest": "class_prompt" 331 | }, 332 | "options": { 333 | "error_color": "#ea7878", 334 | "label_color": "#000000", 335 | "help_color": "#363636", 336 | "full_width": false, 337 | "validator": { 338 | "type": "ExpressionValidator", 339 | "test": "True", 340 | "message": "" 341 | }, 342 | "external_validator": { 343 | "cmd": "" 344 | } 345 | } 346 | }, 347 | { 348 | "id": "--with_prior_preservation", 349 | "type": "CheckBox", 350 | "cli_type": "optional", 351 | "required": false, 352 | "data": { 353 | "display_name": "with_prior_preservation", 354 | "help": "Flag to add prior perservation loss.", 355 | "required": false, 356 | "nargs": "", 357 | "commands": [ 358 | "--with_prior_preservation" 359 | ], 360 | "choices": [], 361 | "default": false, 362 | "dest": "with_prior_preservation" 363 | }, 364 | "options": { 365 | "error_color": "#ea7878", 366 | "label_color": "#000000", 367 | "help_color": "#363636", 368 | "full_width": false, 369 | "validator": { 370 | "type": "ExpressionValidator", 371 | "test": "True", 372 | "message": "" 373 | }, 374 | "external_validator": { 375 | "cmd": "" 376 | } 377 | } 378 | }, 379 | { 380 | "id": "--prior_loss_weight", 381 | "type": "TextField", 382 | "cli_type": "optional", 383 | "required": false, 384 | "data": { 385 | "display_name": "prior_loss_weight", 386 | "help": "The weight of prior preservation loss.", 387 | "required": false, 388 | "nargs": "", 389 | "commands": [ 390 | "--prior_loss_weight" 391 | ], 392 | "choices": [], 393 | "default": 1.0, 394 | "dest": "prior_loss_weight" 395 | }, 396 | "options": { 397 | "error_color": "#ea7878", 398 | "label_color": "#000000", 399 | "help_color": "#363636", 400 | "full_width": false, 401 | "validator": { 402 | "type": "ExpressionValidator", 403 | "test": "True", 404 | "message": "" 405 | }, 406 | "external_validator": { 407 | "cmd": "" 408 | } 409 | } 410 | }, 411 | { 412 | "id": "--num_class_images", 413 | "type": "TextField", 414 | "cli_type": "optional", 415 | "required": false, 416 | "data": { 417 | "display_name": "num_class_images", 418 | "help": "Minimal class images for prior perversation loss. If not have enough images, additional images will be sampled with class_prompt.", 419 | "required": false, 420 | "nargs": "", 421 | "commands": [ 422 | "--num_class_images" 423 | ], 424 | "choices": [], 425 | "default": 100, 426 | "dest": "num_class_images" 427 | }, 428 | "options": { 429 | "error_color": "#ea7878", 430 | "label_color": "#000000", 431 | "help_color": "#363636", 432 | "full_width": false, 433 | "validator": { 434 | "type": "ExpressionValidator", 435 | "test": "True", 436 | "message": "" 437 | }, 438 | "external_validator": { 439 | "cmd": "" 440 | } 441 | } 442 | } 443 | ], 444 | "groups": [], 445 | "description": "Prior-preservation is used to avoid overfitting and language-drift.", 446 | "options": { 447 | "label_color": "#000000", 448 | "description_color": "#363636", 449 | "legacy": { 450 | "required_cols": 2, 451 | "optional_cols": 2 452 | }, 453 | "columns": 2, 454 | "padding": 10, 455 | "show_border": false 456 | } 457 | }, 458 | { 459 | "name": "Training Config", 460 | "items": [ 461 | { 462 | "id": "--train_batch_size", 463 | "type": "TextField", 464 | "cli_type": "optional", 465 | "required": false, 466 | "data": { 467 | "display_name": "train_batch_size", 468 | "help": "Batch size (per device) for the training dataloader.", 469 | "required": false, 470 | "nargs": "", 471 | "commands": [ 472 | "--train_batch_size" 473 | ], 474 | "choices": [], 475 | "default": 1, 476 | "dest": "train_batch_size" 477 | }, 478 | "options": { 479 | "error_color": "#ea7878", 480 | "label_color": "#000000", 481 | "help_color": "#363636", 482 | "full_width": false, 483 | "validator": { 484 | "type": "ExpressionValidator", 485 | "test": "True", 486 | "message": "" 487 | }, 488 | "external_validator": { 489 | "cmd": "" 490 | } 491 | } 492 | }, 493 | { 494 | "id": "--sample_batch_size", 495 | "type": "TextField", 496 | "cli_type": "optional", 497 | "required": false, 498 | "data": { 499 | "display_name": "sample_batch_size", 500 | "help": "Batch size (per device) for sampling images.", 501 | "required": false, 502 | "nargs": "", 503 | "commands": [ 504 | "--sample_batch_size" 505 | ], 506 | "choices": [], 507 | "default": 1, 508 | "dest": "sample_batch_size" 509 | }, 510 | "options": { 511 | "error_color": "#ea7878", 512 | "label_color": "#000000", 513 | "help_color": "#363636", 514 | "full_width": false, 515 | "validator": { 516 | "type": "ExpressionValidator", 517 | "test": "True", 518 | "message": "" 519 | }, 520 | "external_validator": { 521 | "cmd": "" 522 | } 523 | } 524 | }, 525 | { 526 | "id": "--num_train_epochs", 527 | "type": "TextField", 528 | "cli_type": "optional", 529 | "required": false, 530 | "data": { 531 | "display_name": "num_train_epochs", 532 | "help": null, 533 | "required": false, 534 | "nargs": "", 535 | "commands": [ 536 | "--num_train_epochs" 537 | ], 538 | "choices": [], 539 | "default": 1, 540 | "dest": "num_train_epochs" 541 | }, 542 | "options": { 543 | "error_color": "#ea7878", 544 | "label_color": "#000000", 545 | "help_color": "#363636", 546 | "full_width": false, 547 | "validator": { 548 | "type": "ExpressionValidator", 549 | "test": "True", 550 | "message": "" 551 | }, 552 | "external_validator": { 553 | "cmd": "" 554 | } 555 | } 556 | }, 557 | { 558 | "id": "--max_train_steps", 559 | "type": "TextField", 560 | "cli_type": "optional", 561 | "required": false, 562 | "data": { 563 | "display_name": "max_train_steps", 564 | "help": "Total number of training steps to perform. If provided, overrides num_train_epochs.", 565 | "required": false, 566 | "nargs": "", 567 | "commands": [ 568 | "--max_train_steps" 569 | ], 570 | "choices": [], 571 | "default": 800, 572 | "dest": "max_train_steps" 573 | }, 574 | "options": { 575 | "error_color": "#ea7878", 576 | "label_color": "#000000", 577 | "help_color": "#363636", 578 | "full_width": false, 579 | "validator": { 580 | "type": "ExpressionValidator", 581 | "test": "True", 582 | "message": "" 583 | }, 584 | "external_validator": { 585 | "cmd": "" 586 | } 587 | } 588 | }, 589 | { 590 | "id": "--gradient_accumulation_steps", 591 | "type": "TextField", 592 | "cli_type": "optional", 593 | "required": false, 594 | "data": { 595 | "display_name": "gradient_accumulation_steps", 596 | "help": "Number of updates steps to accumulate before performing a backward/update pass.", 597 | "required": false, 598 | "nargs": "", 599 | "commands": [ 600 | "--gradient_accumulation_steps" 601 | ], 602 | "choices": [], 603 | "default": 1, 604 | "dest": "gradient_accumulation_steps" 605 | }, 606 | "options": { 607 | "error_color": "#ea7878", 608 | "label_color": "#000000", 609 | "help_color": "#363636", 610 | "full_width": false, 611 | "validator": { 612 | "type": "ExpressionValidator", 613 | "test": "True", 614 | "message": "" 615 | }, 616 | "external_validator": { 617 | "cmd": "" 618 | } 619 | } 620 | }, 621 | { 622 | "id": "--gradient_checkpointing", 623 | "type": "CheckBox", 624 | "cli_type": "optional", 625 | "required": false, 626 | "data": { 627 | "display_name": "gradient_checkpointing", 628 | "help": "Whether or not to use gradient checkpointing to save memory at the expense of slower backward pass.", 629 | "required": false, 630 | "nargs": "", 631 | "commands": [ 632 | "--gradient_checkpointing" 633 | ], 634 | "choices": [], 635 | "default": true, 636 | "dest": "gradient_checkpointing" 637 | }, 638 | "options": { 639 | "error_color": "#ea7878", 640 | "label_color": "#000000", 641 | "help_color": "#363636", 642 | "full_width": false, 643 | "validator": { 644 | "type": "ExpressionValidator", 645 | "test": "True", 646 | "message": "" 647 | }, 648 | "external_validator": { 649 | "cmd": "" 650 | } 651 | } 652 | }, 653 | { 654 | "id": "--use_8bit_adam", 655 | "type": "CheckBox", 656 | "cli_type": "optional", 657 | "required": false, 658 | "data": { 659 | "display_name": "use_8bit_adam", 660 | "help": "Whether or not to use 8-bit Adam from bitsandbytes.", 661 | "required": false, 662 | "nargs": "", 663 | "commands": [ 664 | "--use_8bit_adam" 665 | ], 666 | "choices": [], 667 | "default": true, 668 | "dest": "use_8bit_adam" 669 | }, 670 | "options": { 671 | "error_color": "#ea7878", 672 | "label_color": "#000000", 673 | "help_color": "#363636", 674 | "full_width": false, 675 | "validator": { 676 | "type": "ExpressionValidator", 677 | "test": "True", 678 | "message": "" 679 | }, 680 | "external_validator": { 681 | "cmd": "" 682 | } 683 | } 684 | }, 685 | { 686 | "id": "--mixed_precision", 687 | "type": "Dropdown", 688 | "cli_type": "optional", 689 | "required": false, 690 | "data": { 691 | "display_name": "mixed_precision", 692 | "help": "Whether to use mixed precision. Choosebetween fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10.and an Nvidia Ampere GPU.", 693 | "required": false, 694 | "nargs": "", 695 | "commands": [ 696 | "--mixed_precision" 697 | ], 698 | "choices": [ 699 | "no", 700 | "fp16", 701 | "bf16" 702 | ], 703 | "default": "no", 704 | "dest": "mixed_precision" 705 | }, 706 | "options": { 707 | "error_color": "#ea7878", 708 | "label_color": "#000000", 709 | "help_color": "#363636", 710 | "full_width": false, 711 | "validator": { 712 | "type": "ExpressionValidator", 713 | "test": "True", 714 | "message": "" 715 | }, 716 | "external_validator": { 717 | "cmd": "" 718 | } 719 | } 720 | }, 721 | { 722 | "id": "--local_rank", 723 | "type": "TextField", 724 | "cli_type": "optional", 725 | "required": false, 726 | "data": { 727 | "display_name": "local_rank", 728 | "help": "For distributed training: local_rank", 729 | "required": false, 730 | "nargs": "", 731 | "commands": [ 732 | "--local_rank" 733 | ], 734 | "choices": [], 735 | "default": -1, 736 | "dest": "local_rank" 737 | }, 738 | "options": { 739 | "error_color": "#ea7878", 740 | "label_color": "#000000", 741 | "help_color": "#363636", 742 | "full_width": false, 743 | "validator": { 744 | "type": "ExpressionValidator", 745 | "test": "True", 746 | "message": "" 747 | }, 748 | "external_validator": { 749 | "cmd": "" 750 | } 751 | } 752 | } 753 | ], 754 | "groups": [], 755 | "description": "Basic config for training", 756 | "options": { 757 | "label_color": "#000000", 758 | "description_color": "#363636", 759 | "legacy": { 760 | "required_cols": 2, 761 | "optional_cols": 2 762 | }, 763 | "columns": 2, 764 | "padding": 10, 765 | "show_border": false 766 | } 767 | }, 768 | { 769 | "name": "Learning rate config", 770 | "items": [ 771 | { 772 | "id": "--learning_rate", 773 | "type": "TextField", 774 | "cli_type": "optional", 775 | "required": false, 776 | "data": { 777 | "display_name": "learning_rate", 778 | "help": "Initial learning rate (after the potential warmup period) to use.", 779 | "required": false, 780 | "nargs": "", 781 | "commands": [ 782 | "--learning_rate" 783 | ], 784 | "choices": [], 785 | "default": 5e-06, 786 | "dest": "learning_rate" 787 | }, 788 | "options": { 789 | "error_color": "#ea7878", 790 | "label_color": "#000000", 791 | "help_color": "#363636", 792 | "full_width": false, 793 | "validator": { 794 | "type": "ExpressionValidator", 795 | "test": "True", 796 | "message": "" 797 | }, 798 | "external_validator": { 799 | "cmd": "" 800 | } 801 | } 802 | }, 803 | { 804 | "id": "--scale_lr", 805 | "type": "CheckBox", 806 | "cli_type": "optional", 807 | "required": false, 808 | "data": { 809 | "display_name": "scale_lr", 810 | "help": "Scale the learning rate by the number of GPUs, gradient accumulation steps, and batch size.", 811 | "required": false, 812 | "nargs": "", 813 | "commands": [ 814 | "--scale_lr" 815 | ], 816 | "choices": [], 817 | "default": false, 818 | "dest": "scale_lr" 819 | }, 820 | "options": { 821 | "error_color": "#ea7878", 822 | "label_color": "#000000", 823 | "help_color": "#363636", 824 | "full_width": false, 825 | "validator": { 826 | "type": "ExpressionValidator", 827 | "test": "True", 828 | "message": "" 829 | }, 830 | "external_validator": { 831 | "cmd": "" 832 | } 833 | } 834 | }, 835 | { 836 | "id": "--lr_scheduler", 837 | "type": "TextField", 838 | "cli_type": "optional", 839 | "required": false, 840 | "data": { 841 | "display_name": "lr_scheduler", 842 | "help": "The scheduler type to use. Choose between [\"linear\", \"cosine\", \"cosine_with_restarts\", \"polynomial\", \"constant\", \"constant_with_warmup\"]", 843 | "required": false, 844 | "nargs": "", 845 | "commands": [ 846 | "--lr_scheduler" 847 | ], 848 | "choices": [], 849 | "default": "constant", 850 | "dest": "lr_scheduler" 851 | }, 852 | "options": { 853 | "error_color": "#ea7878", 854 | "label_color": "#000000", 855 | "help_color": "#363636", 856 | "full_width": false, 857 | "validator": { 858 | "type": "ExpressionValidator", 859 | "test": "True", 860 | "message": "" 861 | }, 862 | "external_validator": { 863 | "cmd": "" 864 | } 865 | } 866 | }, 867 | { 868 | "id": "--lr_warmup_steps", 869 | "type": "TextField", 870 | "cli_type": "optional", 871 | "required": false, 872 | "data": { 873 | "display_name": "lr_warmup_steps", 874 | "help": "Number of steps for the warmup in the lr scheduler.", 875 | "required": false, 876 | "nargs": "", 877 | "commands": [ 878 | "--lr_warmup_steps" 879 | ], 880 | "choices": [], 881 | "default": 500, 882 | "dest": "lr_warmup_steps" 883 | }, 884 | "options": { 885 | "error_color": "#ea7878", 886 | "label_color": "#000000", 887 | "help_color": "#363636", 888 | "full_width": false, 889 | "validator": { 890 | "type": "ExpressionValidator", 891 | "test": "True", 892 | "message": "" 893 | }, 894 | "external_validator": { 895 | "cmd": "" 896 | } 897 | } 898 | }, 899 | { 900 | "id": "--tokenizer_name", 901 | "type": "TextField", 902 | "cli_type": "optional", 903 | "required": false, 904 | "data": { 905 | "display_name": "tokenizer_name", 906 | "help": "Pretrained tokenizer name or path if not the same as model_name", 907 | "required": false, 908 | "nargs": "", 909 | "commands": [ 910 | "--tokenizer_name" 911 | ], 912 | "choices": [], 913 | "default": null, 914 | "dest": "tokenizer_name" 915 | }, 916 | "options": { 917 | "error_color": "#ea7878", 918 | "label_color": "#000000", 919 | "help_color": "#363636", 920 | "full_width": false, 921 | "validator": { 922 | "type": "ExpressionValidator", 923 | "test": "True", 924 | "message": "" 925 | }, 926 | "external_validator": { 927 | "cmd": "" 928 | } 929 | } 930 | }, 931 | { 932 | "id": "--seed", 933 | "type": "TextField", 934 | "cli_type": "optional", 935 | "required": false, 936 | "data": { 937 | "display_name": "seed", 938 | "help": "A seed for reproducible training.", 939 | "required": false, 940 | "nargs": "", 941 | "commands": [ 942 | "--seed" 943 | ], 944 | "choices": [], 945 | "default": null, 946 | "dest": "seed" 947 | }, 948 | "options": { 949 | "error_color": "#ea7878", 950 | "label_color": "#000000", 951 | "help_color": "#363636", 952 | "full_width": false, 953 | "validator": { 954 | "type": "ExpressionValidator", 955 | "test": "True", 956 | "message": "" 957 | }, 958 | "external_validator": { 959 | "cmd": "" 960 | } 961 | } 962 | }, 963 | { 964 | "id": "--center_crop", 965 | "type": "CheckBox", 966 | "cli_type": "optional", 967 | "required": false, 968 | "data": { 969 | "display_name": "center_crop", 970 | "help": "Whether to center crop images before resizing to resolution", 971 | "required": false, 972 | "nargs": "", 973 | "commands": [ 974 | "--center_crop" 975 | ], 976 | "choices": [], 977 | "default": false, 978 | "dest": "center_crop" 979 | }, 980 | "options": { 981 | "error_color": "#ea7878", 982 | "label_color": "#000000", 983 | "help_color": "#363636", 984 | "full_width": false, 985 | "validator": { 986 | "type": "ExpressionValidator", 987 | "test": "True", 988 | "message": "" 989 | }, 990 | "external_validator": { 991 | "cmd": "" 992 | } 993 | } 994 | }, 995 | { 996 | "id": "--adam_beta1", 997 | "type": "TextField", 998 | "cli_type": "optional", 999 | "required": false, 1000 | "data": { 1001 | "display_name": "adam_beta1", 1002 | "help": "The beta1 parameter for the Adam optimizer.", 1003 | "required": false, 1004 | "nargs": "", 1005 | "commands": [ 1006 | "--adam_beta1" 1007 | ], 1008 | "choices": [], 1009 | "default": 0.9, 1010 | "dest": "adam_beta1" 1011 | }, 1012 | "options": { 1013 | "error_color": "#ea7878", 1014 | "label_color": "#000000", 1015 | "help_color": "#363636", 1016 | "full_width": false, 1017 | "validator": { 1018 | "type": "ExpressionValidator", 1019 | "test": "True", 1020 | "message": "" 1021 | }, 1022 | "external_validator": { 1023 | "cmd": "" 1024 | } 1025 | } 1026 | }, 1027 | { 1028 | "id": "--adam_beta2", 1029 | "type": "TextField", 1030 | "cli_type": "optional", 1031 | "required": false, 1032 | "data": { 1033 | "display_name": "adam_beta2", 1034 | "help": "The beta2 parameter for the Adam optimizer.", 1035 | "required": false, 1036 | "nargs": "", 1037 | "commands": [ 1038 | "--adam_beta2" 1039 | ], 1040 | "choices": [], 1041 | "default": 0.999, 1042 | "dest": "adam_beta2" 1043 | }, 1044 | "options": { 1045 | "error_color": "#ea7878", 1046 | "label_color": "#000000", 1047 | "help_color": "#363636", 1048 | "full_width": false, 1049 | "validator": { 1050 | "type": "ExpressionValidator", 1051 | "test": "True", 1052 | "message": "" 1053 | }, 1054 | "external_validator": { 1055 | "cmd": "" 1056 | } 1057 | } 1058 | }, 1059 | { 1060 | "id": "--adam_weight_decay", 1061 | "type": "TextField", 1062 | "cli_type": "optional", 1063 | "required": false, 1064 | "data": { 1065 | "display_name": "adam_weight_decay", 1066 | "help": "Weight decay to use.", 1067 | "required": false, 1068 | "nargs": "", 1069 | "commands": [ 1070 | "--adam_weight_decay" 1071 | ], 1072 | "choices": [], 1073 | "default": 0.01, 1074 | "dest": "adam_weight_decay" 1075 | }, 1076 | "options": { 1077 | "error_color": "#ea7878", 1078 | "label_color": "#000000", 1079 | "help_color": "#363636", 1080 | "full_width": false, 1081 | "validator": { 1082 | "type": "ExpressionValidator", 1083 | "test": "True", 1084 | "message": "" 1085 | }, 1086 | "external_validator": { 1087 | "cmd": "" 1088 | } 1089 | } 1090 | }, 1091 | { 1092 | "id": "--adam_epsilon", 1093 | "type": "TextField", 1094 | "cli_type": "optional", 1095 | "required": false, 1096 | "data": { 1097 | "display_name": "adam_epsilon", 1098 | "help": "Epsilon value for the Adam optimizer", 1099 | "required": false, 1100 | "nargs": "", 1101 | "commands": [ 1102 | "--adam_epsilon" 1103 | ], 1104 | "choices": [], 1105 | "default": 1e-08, 1106 | "dest": "adam_epsilon" 1107 | }, 1108 | "options": { 1109 | "error_color": "#ea7878", 1110 | "label_color": "#000000", 1111 | "help_color": "#363636", 1112 | "full_width": false, 1113 | "validator": { 1114 | "type": "ExpressionValidator", 1115 | "test": "True", 1116 | "message": "" 1117 | }, 1118 | "external_validator": { 1119 | "cmd": "" 1120 | } 1121 | } 1122 | }, 1123 | { 1124 | "id": "--max_grad_norm", 1125 | "type": "TextField", 1126 | "cli_type": "optional", 1127 | "required": false, 1128 | "data": { 1129 | "display_name": "max_grad_norm", 1130 | "help": "Max gradient norm.", 1131 | "required": false, 1132 | "nargs": "", 1133 | "commands": [ 1134 | "--max_grad_norm" 1135 | ], 1136 | "choices": [], 1137 | "default": 1.0, 1138 | "dest": "max_grad_norm" 1139 | }, 1140 | "options": { 1141 | "error_color": "#ea7878", 1142 | "label_color": "#000000", 1143 | "help_color": "#363636", 1144 | "full_width": false, 1145 | "validator": { 1146 | "type": "ExpressionValidator", 1147 | "test": "True", 1148 | "message": "" 1149 | }, 1150 | "external_validator": { 1151 | "cmd": "" 1152 | } 1153 | } 1154 | } 1155 | ], 1156 | "groups": [], 1157 | "description": "Fine tune learning rate", 1158 | "options": { 1159 | "label_color": "#000000", 1160 | "description_color": "#363636", 1161 | "legacy": { 1162 | "required_cols": 2, 1163 | "optional_cols": 2 1164 | }, 1165 | "columns": 2, 1166 | "padding": 10, 1167 | "show_border": false 1168 | } 1169 | }, 1170 | { 1171 | "name": "Push to Huggingface Hub", 1172 | "items": [ 1173 | { 1174 | "id": "--push_to_hub", 1175 | "type": "CheckBox", 1176 | "cli_type": "optional", 1177 | "required": false, 1178 | "data": { 1179 | "display_name": "push_to_hub", 1180 | "help": "Whether or not to push the model to the Hub.", 1181 | "required": false, 1182 | "nargs": "", 1183 | "commands": [ 1184 | "--push_to_hub" 1185 | ], 1186 | "choices": [], 1187 | "default": false, 1188 | "dest": "push_to_hub" 1189 | }, 1190 | "options": { 1191 | "error_color": "#ea7878", 1192 | "label_color": "#000000", 1193 | "help_color": "#363636", 1194 | "full_width": false, 1195 | "validator": { 1196 | "type": "ExpressionValidator", 1197 | "test": "True", 1198 | "message": "" 1199 | }, 1200 | "external_validator": { 1201 | "cmd": "" 1202 | } 1203 | } 1204 | }, 1205 | { 1206 | "id": "--hub_token", 1207 | "type": "TextField", 1208 | "cli_type": "optional", 1209 | "required": false, 1210 | "data": { 1211 | "display_name": "hub_token", 1212 | "help": "The token to use to push to the Model Hub.", 1213 | "required": false, 1214 | "nargs": "", 1215 | "commands": [ 1216 | "--hub_token" 1217 | ], 1218 | "choices": [], 1219 | "default": null, 1220 | "dest": "hub_token" 1221 | }, 1222 | "options": { 1223 | "error_color": "#ea7878", 1224 | "label_color": "#000000", 1225 | "help_color": "#363636", 1226 | "full_width": false, 1227 | "validator": { 1228 | "type": "ExpressionValidator", 1229 | "test": "True", 1230 | "message": "" 1231 | }, 1232 | "external_validator": { 1233 | "cmd": "" 1234 | } 1235 | } 1236 | }, 1237 | { 1238 | "id": "--hub_model_id", 1239 | "type": "TextField", 1240 | "cli_type": "optional", 1241 | "required": false, 1242 | "data": { 1243 | "display_name": "hub_model_id", 1244 | "help": "The name of the repository to keep in sync with the local `output_dir`.", 1245 | "required": false, 1246 | "nargs": "", 1247 | "commands": [ 1248 | "--hub_model_id" 1249 | ], 1250 | "choices": [], 1251 | "default": null, 1252 | "dest": "hub_model_id" 1253 | }, 1254 | "options": { 1255 | "error_color": "#ea7878", 1256 | "label_color": "#000000", 1257 | "help_color": "#363636", 1258 | "full_width": false, 1259 | "validator": { 1260 | "type": "ExpressionValidator", 1261 | "test": "True", 1262 | "message": "" 1263 | }, 1264 | "external_validator": { 1265 | "cmd": "" 1266 | } 1267 | } 1268 | } 1269 | ], 1270 | "groups": [], 1271 | "description": "Whether or not push model to huggingface hub", 1272 | "options": { 1273 | "label_color": "#000000", 1274 | "description_color": "#363636", 1275 | "legacy": { 1276 | "required_cols": 2, 1277 | "optional_cols": 2 1278 | }, 1279 | "columns": 2, 1280 | "padding": 10, 1281 | "show_border": false 1282 | } 1283 | } 1284 | ] 1285 | } 1286 | } 1287 | } -------------------------------------------------------------------------------- /src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smy20011/dreambooth-gui/f9c5ca6964b371ffc82497536ccb81699ee4735e/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /src-tauri/src/main.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr( 2 | all(not(debug_assertions), target_os = "windows"), 3 | windows_subsystem = "windows" 4 | )] 5 | 6 | use std::str; 7 | 8 | use nvml_wrapper::{error::NvmlError, struct_wrappers::device::MemoryInfo, Nvml}; 9 | use serde::{Deserialize, Serialize}; 10 | 11 | // Learn more about Tauri commands at https://tauri.app/v1/guides/features/command 12 | #[tauri::command] 13 | fn greet(name: &str) -> String { 14 | format!("Hello, {}! You've been greeted from Rust!", name) 15 | } 16 | 17 | #[derive(Serialize, Deserialize)] 18 | struct GpuInfo { 19 | name: String, 20 | meminfo: MemoryInfo, 21 | } 22 | 23 | fn gpu_info_impl() -> Result { 24 | let nvml = Nvml::init()?; 25 | let device = nvml.device_by_index(0)?; 26 | 27 | return Ok(GpuInfo { 28 | name: device.name()?, 29 | meminfo: device.memory_info()?, 30 | }); 31 | } 32 | 33 | #[tauri::command] 34 | async fn gpu_info() -> Result { 35 | gpu_info_impl().map_err(|e| e.to_string()) 36 | } 37 | 38 | fn main() { 39 | tauri::Builder::default() 40 | .invoke_handler(tauri::generate_handler![greet, gpu_info]) 41 | .run(tauri::generate_context!()) 42 | .expect("error while running tauri application"); 43 | } 44 | -------------------------------------------------------------------------------- /src-tauri/tauri.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "beforeDevCommand": "yarn dev", 4 | "beforeBuildCommand": "yarn build", 5 | "devPath": "http://localhost:1420", 6 | "distDir": "../dist" 7 | }, 8 | "package": { 9 | "productName": "dreambooth-gui", 10 | "version": "0.1.11" 11 | }, 12 | "tauri": { 13 | "allowlist": { 14 | "all": true, 15 | "fs": { 16 | "all": true, 17 | "scope": [ 18 | "*" 19 | ] 20 | }, 21 | "shell": { 22 | "all": true, 23 | "execute": true, 24 | "scope": [ 25 | { 26 | "name": "docker", 27 | "cmd": "docker", 28 | "args": true 29 | } 30 | ] 31 | } 32 | }, 33 | "bundle": { 34 | "active": true, 35 | "category": "DeveloperTool", 36 | "copyright": "", 37 | "deb": { 38 | "depends": [] 39 | }, 40 | "externalBin": [], 41 | "icon": [ 42 | "icons/32x32.png", 43 | "icons/128x128.png", 44 | "icons/128x128@2x.png", 45 | "icons/icon.icns", 46 | "icons/icon.ico" 47 | ], 48 | "identifier": "smy20011.dreambooth", 49 | "longDescription": "", 50 | "macOS": { 51 | "entitlements": null, 52 | "exceptionDomain": "", 53 | "frameworks": [], 54 | "providerShortName": null, 55 | "signingIdentity": null 56 | }, 57 | "resources": [ 58 | "gooey_config.json" 59 | ], 60 | "shortDescription": "", 61 | "targets": "all", 62 | "windows": { 63 | "certificateThumbprint": null, 64 | "digestAlgorithm": "sha256", 65 | "timestampUrl": "" 66 | } 67 | }, 68 | "security": { 69 | "csp": null 70 | }, 71 | "updater": { 72 | "active": false 73 | }, 74 | "windows": [ 75 | { 76 | "fullscreen": false, 77 | "height": 800, 78 | "resizable": true, 79 | "title": "dreambooth-gui", 80 | "width": 800 81 | } 82 | ] 83 | } 84 | } -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | .logo.vite:hover { 2 | filter: drop-shadow(0 0 2em #747bff); 3 | } 4 | 5 | .logo.react:hover { 6 | filter: drop-shadow(0 0 2em #61dafb); 7 | } 8 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import { Suspense } from "react"; 2 | import { Container } from "react-bootstrap"; 3 | import "./App.css"; 4 | import Trainer from "./components/Trainer"; 5 | 6 | 7 | function App() { 8 | return ( 9 | 10 | 11 | 12 | 13 | 14 | ); 15 | } 16 | 17 | export default App; 18 | -------------------------------------------------------------------------------- /src/Gpu.ts: -------------------------------------------------------------------------------- 1 | import { invoke } from "@tauri-apps/api"; 2 | 3 | export interface MemoryInfo { 4 | free: number; 5 | total: number; 6 | used: number; 7 | } 8 | 9 | export interface GpuInfo { 10 | name: string; 11 | meminfo: MemoryInfo; 12 | } 13 | export function GetGpuInfo(): Promise { 14 | return invoke('gpu_info'); 15 | } 16 | -------------------------------------------------------------------------------- /src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/commands/convert.test.ts: -------------------------------------------------------------------------------- 1 | import { assert, expect, test } from 'vitest' 2 | import Converter from './convert'; 3 | 4 | test('Convert Commands', () => { 5 | const convert = new Converter("/a", "/b"); 6 | const command = convert.getDiffuserToCkptCommand(); 7 | expect(command.executable).toEqual("python"); 8 | expect(command.arguments).toEqual([ 9 | convert.diffuserToOriginScript, 10 | "--model_path=/a", 11 | "--checkpoint_path=/b/model.ckpt", 12 | ]); 13 | expect(command.environment).toBeUndefined(); 14 | }); -------------------------------------------------------------------------------- /src/commands/convert.ts: -------------------------------------------------------------------------------- 1 | import { Command } from "./runner"; 2 | 3 | export default class Converter { 4 | constructor( 5 | public source: string, 6 | public dest: string, 7 | public diffuserToOriginScript = "/diffusers/scripts/convert_diffusers_to_original_stable_diffusion.py", 8 | public originToDiffuerScript = "/diffusers/scripts/convert_original_stable_diffusion_to_diffusers.py", 9 | ) { } 10 | 11 | public getDiffuserToCkptCommand(): Command { 12 | return { 13 | executable: "python", 14 | arguments: [ 15 | this.diffuserToOriginScript, 16 | `--model_path=${this.source}`, 17 | `--checkpoint_path=${this.dest}/model.ckpt` 18 | ] 19 | } 20 | } 21 | 22 | public getCkptToDiffuserCommand(): Command { 23 | return { 24 | executable: "python", 25 | arguments: [ 26 | this.originToDiffuerScript, 27 | `--checkpoint_path=${this.source}`, 28 | `--dump_path=${this.dest}` 29 | ] 30 | }; 31 | } 32 | } -------------------------------------------------------------------------------- /src/commands/docker.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "vitest"; 2 | import Converter from "./convert"; 3 | import { DockerCommand } from "./docker"; 4 | import Dreambooth from "./dreambooth"; 5 | 6 | describe("TestDocker", () => { 7 | test("Docker volume mapping", () => { 8 | const dockerCommand = new DockerCommand( 9 | { executable: "echo", arguments: ["hello"] }, 10 | [["/path/to/a", "/a"]] 11 | ); 12 | expect(dockerCommand.getCommand().arguments).toEqual([ 13 | "run", "--rm", "-t", "--pull", "always", "-v=/path/to/a:/a", "smy20011/dreambooth:v0.1.10", "echo", "hello" 14 | ]); 15 | }); 16 | test("Docker additional arguments", () => { 17 | const dockerCommand = new DockerCommand( 18 | { executable: "echo", arguments: ["hello"] }, 19 | [["/path/to/a", "/a"]], 20 | ["--gpu", "all"] 21 | ); 22 | expect(dockerCommand.getCommand().arguments).toEqual([ 23 | "run", "--rm", "-t", "--pull", "always", "--gpu", "all", "-v=/path/to/a:/a", "smy20011/dreambooth:v0.1.10", "echo", "hello" 24 | ]); 25 | }); 26 | 27 | test("Docker environment mapping", () => { 28 | const dockerCommand = new DockerCommand( 29 | { executable: "echo", arguments: ["hello"], environment: { 'HELLO': "world" } }, 30 | [["/path/to/a", "/a"]], 31 | ); 32 | expect(dockerCommand.getCommand().arguments).toEqual([ 33 | "run", "--rm", "-t", "--pull", "always", "-v=/path/to/a:/a", "-e", "HELLO=world", "smy20011/dreambooth:v0.1.10", "echo", "hello" 34 | ]); 35 | }); 36 | 37 | test("Docker run convert ckpt", () => { 38 | let converter = new Converter("/a", "/b", "/convert.py") 39 | const dockerCommand = DockerCommand.runDiffusersToCkpt(converter); 40 | expect(converter.source).toEqual("/a"); 41 | expect(converter.dest).toEqual("/b"); 42 | expect(dockerCommand.getCommand().arguments).toEqual([ 43 | "run", "--rm", "-t", "--pull", "always", "--gpus=all", "-v=/a:/source", "-v=/b:/dest", "smy20011/dreambooth:v0.1.10", "python", 44 | "/convert.py", "--model_path=/source", "--checkpoint_path=/dest/model.ckpt", 45 | ]); 46 | }); 47 | test("Docker run ckpt to diffusers", () => { 48 | let converter = new Converter("/a", "/b", "/convert.py") 49 | const dockerCommand = DockerCommand.runCkptToDiffusers(converter, '/cache'); 50 | expect(converter.source).toEqual("/a"); 51 | expect(converter.dest).toEqual("/b"); 52 | expect(dockerCommand.getCommand().arguments).toEqual([ 53 | "run", 54 | "--rm", 55 | "-t", 56 | "--pull", 57 | "always", 58 | "--gpus=all", 59 | "--mount", 60 | "type=bind,source=/a,target=/source.ckpt", 61 | "-v=/b:/dest", 62 | "-v=/cache:/train", 63 | "smy20011/dreambooth:v0.1.10", 64 | "python", 65 | "/diffusers/scripts/convert_original_stable_diffusion_to_diffusers.py", 66 | "--checkpoint_path=/source.ckpt", 67 | "--dump_path=/dest", 68 | ]); 69 | }); 70 | 71 | test("Docker run dreambooth training", () => { 72 | let dreambooth = new Dreambooth("sks", ""); 73 | dreambooth.instanceDir = "/path/instance"; 74 | dreambooth.outputDir = "/path/output"; 75 | dreambooth.token = "abc"; 76 | expect(DockerCommand.runDreambooth(dreambooth, "/cache").getCommand().arguments).toEqual([ 77 | "run", 78 | "--rm", 79 | "-t", 80 | "--pull", 81 | "always", 82 | "--gpus=all", 83 | "-v=/path/instance:/instance", 84 | "-v=/path/output:/output", 85 | "-v=/cache:/train", 86 | "-e", 87 | "HUGGING_FACE_HUB_TOKEN=abc", 88 | "smy20011/dreambooth:v0.1.10", 89 | "/start_training", 90 | "/train_dreambooth.py", 91 | "--pretrained_model_name_or_path=CompVis/stable-diffusion-v1-4", 92 | "--instance_prompt=sks", 93 | "--instance_data_dir=/instance", 94 | "--max_train_steps=600", 95 | "--learning_rate=5e-6", 96 | "--lr_scheduler=constant", 97 | "--lr_warmup_steps=0", 98 | "--save_interval=10000", 99 | "--save_min_steps=100000", 100 | "--resolution=512", 101 | "--output_dir=/output", 102 | ]); 103 | }); 104 | }); -------------------------------------------------------------------------------- /src/commands/docker.ts: -------------------------------------------------------------------------------- 1 | import Converter from "./convert"; 2 | import Dreambooth from "./dreambooth"; 3 | import { Command } from "./runner"; 4 | import _ from "lodash"; 5 | 6 | // Run a command within docker. 7 | export class DockerCommand { 8 | constructor( 9 | private subCommand: Command, 10 | private volumeMapping: [string, string][] = [], 11 | private additionalArguments: string[] = [], 12 | private image = "smy20011/dreambooth:v0.1.10", 13 | private alwaysPull = true, 14 | ) { } 15 | 16 | public getCommand(): Command { 17 | return { 18 | executable: "docker", 19 | arguments: [ 20 | "run", 21 | "--rm", 22 | "-t", 23 | ...this.getPullingArguments(), 24 | ...this.additionalArguments, 25 | ...this.volumeMapping.map(it => `-v=${it[0]}:${it[1]}`), 26 | ...Object.entries(this.subCommand.environment ?? {}).sort().flatMap(it => ['-e', `${it[0]}=${it[1]}`]), 27 | this.image, 28 | this.subCommand.executable, 29 | ...this.subCommand.arguments 30 | ] 31 | } 32 | } 33 | 34 | private getPullingArguments(): string[] { 35 | if (this.alwaysPull) { 36 | return ["--pull", "always"]; 37 | } 38 | return []; 39 | } 40 | 41 | private static rewrite(mapping: [string, string][], obj: T, key: keyof T, newFolder: string) { 42 | mapping.push([obj[key] as string, newFolder]); 43 | obj[key] = newFolder as T[keyof T]; 44 | } 45 | 46 | private static forceNewLine(command: Command): Command { 47 | return { 48 | executable: '/start_training', 49 | arguments: [ 50 | ...command.arguments 51 | ], 52 | environment: command.environment 53 | } 54 | } 55 | 56 | public static runDreambooth(dreambooth: Dreambooth, cacheDir: string, classDir?: string, isLocalModel = false): DockerCommand { 57 | let mapping: [string, string][] = []; 58 | dreambooth = _.clone(dreambooth); 59 | this.rewrite(mapping, dreambooth, "instanceDir", "/instance"); 60 | if (dreambooth.classPrompt && classDir) { 61 | dreambooth.classDir = classDir; 62 | this.rewrite(mapping, dreambooth, "classDir", "/class"); 63 | } 64 | this.rewrite(mapping, dreambooth, "outputDir", "/output"); 65 | if (isLocalModel) { 66 | this.rewrite(mapping, dreambooth, "model", "/input_model"); 67 | } 68 | mapping.push([cacheDir, '/train']); 69 | return new DockerCommand( 70 | this.forceNewLine(dreambooth.getTrainingCommand()), 71 | mapping, 72 | [ 73 | '--gpus=all', 74 | ] 75 | ); 76 | } 77 | 78 | public static runDiffusersToCkpt(converter: Converter): DockerCommand { 79 | let mapping: [string, string][] = []; 80 | converter = _.clone(converter); 81 | this.rewrite(mapping, converter, "source", "/source"); 82 | this.rewrite(mapping, converter, "dest", "/dest"); 83 | return new DockerCommand( 84 | converter.getDiffuserToCkptCommand(), 85 | mapping, 86 | ['--gpus=all'], 87 | ); 88 | } 89 | 90 | public static runCkptToDiffusers(converter: Converter, cacheDir: string): DockerCommand { 91 | let mapping: [string, string][] = []; 92 | converter = _.clone(converter); 93 | this.rewrite(mapping, converter, "dest", "/dest"); 94 | mapping.push([cacheDir, '/train']); 95 | let source = converter.source; 96 | converter.source = "/source.ckpt"; 97 | return new DockerCommand( 98 | converter.getCkptToDiffuserCommand(), 99 | mapping, 100 | ['--gpus=all', "--mount", `type=bind,source=${source},target=/source.ckpt`], 101 | ); 102 | } 103 | 104 | } -------------------------------------------------------------------------------- /src/commands/dreambooth.test.ts: -------------------------------------------------------------------------------- 1 | import { expect, test, describe, beforeEach } from 'vitest' 2 | import Dreambooth from './dreambooth'; 3 | describe('Dreambooth Test', () => { 4 | let dreambooth: Dreambooth; 5 | beforeEach(() => { 6 | dreambooth = new Dreambooth("sks"); 7 | dreambooth.instanceDir = "/instance"; 8 | dreambooth.classDir = "/class"; 9 | dreambooth.outputDir = "/output" 10 | dreambooth.token = "abc"; 11 | }); 12 | 13 | test('Instance prompt only training', () => { 14 | const command = dreambooth.getTrainingCommand(); 15 | expect(command.arguments).toEqual([ 16 | "/train_dreambooth.py", 17 | "--pretrained_model_name_or_path=CompVis/stable-diffusion-v1-4", 18 | "--instance_prompt=sks", 19 | "--instance_data_dir=/instance", 20 | "--max_train_steps=600", 21 | "--learning_rate=5e-6", 22 | "--lr_scheduler=constant", 23 | "--lr_warmup_steps=0", 24 | "--save_interval=10000", 25 | "--save_min_steps=100000", 26 | "--resolution=512", 27 | "--output_dir=/output", 28 | ]); 29 | expect(command.environment).toEqual({ 30 | "HUGGING_FACE_HUB_TOKEN": "abc" 31 | }) 32 | }); 33 | test('Class training', () => { 34 | dreambooth.classPrompt = "class" 35 | const command = dreambooth.getTrainingCommand(); 36 | expect(command.arguments).toEqual([ 37 | "/train_dreambooth.py", 38 | "--pretrained_model_name_or_path=CompVis/stable-diffusion-v1-4", 39 | "--instance_prompt=sks", 40 | "--instance_data_dir=/instance", 41 | "--class_data_dir=/class", 42 | "--with_prior_preservation", 43 | "--prior_loss_weight=1.0", 44 | "--class_prompt=class", 45 | "--max_train_steps=600", 46 | "--learning_rate=5e-6", 47 | "--lr_scheduler=constant", 48 | "--lr_warmup_steps=0", 49 | "--save_interval=10000", 50 | "--save_min_steps=100000", 51 | "--resolution=512", 52 | "--output_dir=/output", 53 | ]); 54 | expect(command.environment).toEqual({ 55 | "HUGGING_FACE_HUB_TOKEN": "abc" 56 | }) 57 | }); 58 | 59 | }); -------------------------------------------------------------------------------- /src/commands/dreambooth.ts: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import { GpuInfo } from "../Gpu"; 3 | import { Command } from "./runner"; 4 | 5 | function recordToArgs(obj: Record): string[] { 6 | return Object.entries(obj) 7 | .map(([key, value]) => { 8 | if (typeof value == "boolean") { 9 | return value ? `--${key}` : null; 10 | } 11 | return `--${key}=${value}`; 12 | }) 13 | .filter(v => v !== null) as string[]; 14 | } 15 | 16 | function pickTrainingArgs(gpuInfo: GpuInfo) { 17 | const GIB = 1024 * 1024 * 1024; 18 | if (gpuInfo.name == "unknown") { 19 | return []; 20 | } 21 | // Config for GPU with < 10GB varm 22 | let config = { 23 | mixed_precision: 'fp16', 24 | train_batch_size: 1, 25 | gradient_accumulation_steps: 1, 26 | gradient_checkpointing: true, 27 | use_8bit_adam: true, 28 | }; 29 | if (gpuInfo.meminfo.free > 13.7 * GIB) { 30 | // Train with better quality and disable checkpoint. 31 | config.gradient_accumulation_steps = 2; 32 | config.gradient_checkpointing = false; 33 | } else if (gpuInfo.meminfo.free > 11.2 * GIB) { 34 | // Disbale gradient checkpoint for faster training. 35 | config.gradient_checkpointing = false; 36 | } else if (gpuInfo.meminfo.free > 10.4 * GIB) { 37 | // Increase batch size for better training quality. 38 | config.train_batch_size = 2; 39 | } 40 | return recordToArgs(config); 41 | } 42 | 43 | 44 | 45 | export default class Dreambooth { 46 | constructor( 47 | // Prompt of dir. 48 | public instancePrompt: string, 49 | // Train dreambooth with class images. 50 | public classPrompt: string = "", 51 | // User defined additional arguments to train the model. 52 | public additionalArguments: string[] = [], 53 | // Max training steps 54 | public steps: number = 600, 55 | // Learning rate. 56 | public learningRate: string = "5e-6", 57 | // Model dir or name. 58 | public model: string = "CompVis/stable-diffusion-v1-4", 59 | // Model output dir 60 | public outputDir = "", 61 | // Class image directory. 62 | public classDir = "", 63 | // Dir of images. 64 | public instanceDir = "", 65 | // Script location 66 | public scriptLocation: string = "/train_dreambooth.py", 67 | // Additional training arguments 68 | public extraTrainingArgs: string[] = [], 69 | // Token 70 | public token = "", 71 | // Save every n steps 72 | public saveInterval = 10000, 73 | // Steps to save model 74 | public saveMinSteps = 100000, 75 | ) { } 76 | 77 | public withGpu(gpuInfo: GpuInfo): Dreambooth { 78 | let newDb = _.clone(this); 79 | newDb.additionalArguments = pickTrainingArgs(gpuInfo); 80 | return newDb; 81 | } 82 | 83 | public with(update: Partial>): Dreambooth { 84 | return _.assign(_.clone(this), update); 85 | } 86 | 87 | public verifyState(): string { 88 | if (!this.instanceDir) { 89 | return "Please select instance images in the image tab."; 90 | } 91 | if (!this.instancePrompt) { 92 | return "Please set your instance prompt in the training tab."; 93 | } 94 | if (!this.model) { 95 | return "Please select your based model in the training tab."; 96 | } 97 | if (!this.steps || this.steps < 0) { 98 | return "Steps cannot be negative." 99 | } 100 | if (!this.outputDir) { 101 | return "Please select output dir."; 102 | } 103 | if (!this.token) { 104 | return "Please set your hugging face token."; 105 | } 106 | return ""; 107 | } 108 | 109 | public getTrainingCommand(): Command { 110 | return { 111 | executable: "python", 112 | arguments: [ 113 | this.scriptLocation, 114 | `--pretrained_model_name_or_path=${this.model}`, 115 | ...this.getInstantArguments(), 116 | ...this.getClassArguments(), 117 | ...this.getTrainingArguments(), 118 | ...this.getOutputArguments(), 119 | ...this.additionalArguments 120 | ], 121 | environment: { 122 | "HUGGING_FACE_HUB_TOKEN": this.token, 123 | } 124 | }; 125 | } 126 | 127 | private getInstantArguments(): string[] { 128 | return [ 129 | `--instance_prompt=${this.instancePrompt}`, 130 | `--instance_data_dir=${this.instanceDir}` 131 | ]; 132 | } 133 | 134 | private getClassArguments(): string[] { 135 | if (this.classPrompt) { 136 | return [ 137 | `--class_data_dir=${this.classDir}`, 138 | "--with_prior_preservation", 139 | "--prior_loss_weight=1.0", 140 | `--class_prompt=${this.classPrompt}` 141 | ]; 142 | } 143 | return []; 144 | } 145 | 146 | private getTrainingArguments(): string[] { 147 | return [ 148 | `--max_train_steps=${this.steps}`, 149 | `--learning_rate=${this.learningRate}`, 150 | "--lr_scheduler=constant", 151 | "--lr_warmup_steps=0", 152 | `--save_interval=${this.saveInterval}`, 153 | `--save_min_steps=${this.saveMinSteps}`, 154 | ...this.extraTrainingArgs 155 | ]; 156 | } 157 | 158 | private getOutputArguments(): string[] { 159 | return [ 160 | "--resolution=512", 161 | `--output_dir=${this.outputDir}`, 162 | ] 163 | } 164 | } -------------------------------------------------------------------------------- /src/commands/runner.ts: -------------------------------------------------------------------------------- 1 | import { shell } from "@tauri-apps/api"; 2 | 3 | export interface Command { 4 | executable: string; 5 | arguments: string[]; 6 | environment?: Record; 7 | } 8 | 9 | // Run docker with command, pipe output to outputCallback and returns the exit value. 10 | export async function run(command: Command, outputCallback: (line: string) => void): Promise { 11 | return new Promise((resolve, reject) => { 12 | const process = new shell.Command(command.executable, command.arguments, { env: command.environment }); 13 | process.on("close", payload => resolve(payload.code)); 14 | process.on("error", reject); 15 | process.stdout.on("data", outputCallback); 16 | process.stderr.on("data", outputCallback); 17 | process.spawn().catch(reject); 18 | }) 19 | } -------------------------------------------------------------------------------- /src/components/ConfigTrainer.tsx: -------------------------------------------------------------------------------- 1 | import { dialog } from "@tauri-apps/api"; 2 | import { useAtom, useAtomValue, useSetAtom } from "jotai"; 3 | import _ from "lodash"; 4 | import { Form, InputGroup, Button, Row, Col } from "react-bootstrap"; 5 | import { dreamboothAtom, gpuAtom, updateClassPromptAtom } from "../state"; 6 | import { bind, updateStateField, useAtomForm } from "./utils"; 7 | 8 | export default function ConfigTrainer() { 9 | const GIB = 1024 * 1024 * 1024; 10 | const [state, setState, bind] = useAtomForm(dreamboothAtom); 11 | const gpuInfo = useAtomValue(gpuAtom); 12 | const setClassPrompt = useSetAtom(updateClassPromptAtom); 13 | 14 | if (!gpuInfo) { 15 | return
Cannot find your GPU infomation.
16 | } 17 | const selectModelFolder = async () => { 18 | const result = await dialog.open({ 19 | filters: [{ 20 | name: "Model Checkpoint", 21 | extensions: ["ckpt"], 22 | }] 23 | }); 24 | if (result != null && typeof result === 'string') { 25 | setState(s => _.assign(_.clone(s), { model: result })); 26 | } 27 | }; 28 | 29 | return ( 30 |
31 |

Run dreambooth on {gpuInfo.name}, {(gpuInfo.meminfo.free / GIB).toFixed(2)}gb free

32 | 33 | Model 34 | 35 | 36 | 39 | 40 | 41 | Name of the base model, (eg, CompVis/stable-diffusion-v1-4) 42 | 43 | 44 | 45 | Instance prompt 46 | 47 | 48 | Name of the instance, use a rare word if possible. (Eg, sks) 49 | 50 | 51 | 52 | Class prompt 53 | { 55 | setClassPrompt(t.target.value); 56 | } 57 | } /> 58 | 59 | If you want training with prior-preservation loss, set the class prompt. (Eg, a person) 60 | 61 | 62 | 63 | Training Steps 64 | 65 | 66 | 67 | 68 | 69 | Save Every # Steps 70 | 71 | 72 | 73 | Start saving at # Steps 74 | 75 | 76 | 77 | 78 | 79 | Learning Rate 80 | 81 | 82 | 83 |
Training arguments
84 | 85 | Add your custom arguments here. 86 | 87 | { 92 | setState(_.assign(_.clone(state), { "additionalArguments": t.target.value.split("\n") })); 93 | }} 94 | /> 95 |
96 |
97 | ); 98 | } 99 | -------------------------------------------------------------------------------- /src/components/Gallery.tsx: -------------------------------------------------------------------------------- 1 | import { readDir } from "@tauri-apps/api/fs"; 2 | import { convertFileSrc } from "@tauri-apps/api/tauri"; 3 | import { useEffect, useState } from "react"; 4 | import { Col } from "react-bootstrap"; 5 | 6 | async function getImageUrisInForlder(folder: string): Promise { 7 | if (!folder) { 8 | return []; 9 | } 10 | const files = await readDir(folder); 11 | return Promise.all(files.map(f => convertFileSrc(f.path))); 12 | } 13 | 14 | export default function Gallery({ imageDir }: { imageDir: string }) { 15 | const [imageUri, setImageUri] = useState([]); 16 | useEffect(() => { 17 | getImageUrisInForlder(imageDir).then(setImageUri); 18 | }, [imageDir]); 19 | return <> 20 | {imageUri.slice(0, 50).map(uri => 21 | 22 | )} 23 | 24 | } -------------------------------------------------------------------------------- /src/components/ImagePicker.tsx: -------------------------------------------------------------------------------- 1 | import { dialog } from "@tauri-apps/api"; 2 | import { useAtom } from "jotai"; 3 | import _ from "lodash"; 4 | import { Col, Button, Row } from "react-bootstrap"; 5 | import { dreamboothAtom } from "../state"; 6 | import Gallery from "./Gallery"; 7 | import { useAtomForm } from "./utils"; 8 | 9 | export default function ImagePicker() { 10 | const [state, setState, bind] = useAtomForm(dreamboothAtom); 11 | const showDialog = async () => { 12 | const result = await dialog.open({ 13 | directory: true, 14 | }); 15 | if (result != null && typeof result === 'string') { 16 | setState(_.assign(_.clone(state), { "instanceDir": result })); 17 | } 18 | } 19 | return ( 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | ); 29 | } 30 | 31 | -------------------------------------------------------------------------------- /src/components/Trainer.tsx: -------------------------------------------------------------------------------- 1 | import { shell } from "@tauri-apps/api"; 2 | import { useAtom, useSetAtom } from "jotai"; 3 | import { useEffect, useState } from "react"; 4 | import { Tab, Tabs } from "react-bootstrap"; 5 | import { GetGpuInfo } from "../Gpu"; 6 | import { updateGpuAtom } from "../state"; 7 | import ConfigTrainer from "./ConfigTrainer"; 8 | import ImagePicker from "./ImagePicker"; 9 | import { Training } from "./Training"; 10 | 11 | 12 | 13 | 14 | function Trainer() { 15 | const [error, setError] = useState(""); 16 | const updateGpu = useSetAtom(updateGpuAtom); 17 | 18 | useEffect(() => { 19 | GetGpuInfo().then(updateGpu).catch(err => setError(`Failed to fetch GPU info ${error}`)); 20 | const command = new shell.Command("docker", "version"); 21 | command.execute() 22 | .catch(err => setError("Failed to execute docker command, make sure docker is installed in your system.\n\nOpen the docker GUI and make sure it's running.")) 23 | .then(res => { 24 | if (res && res.code != 0) { 25 | setError(`Docker command returns error, make sure you run this program as admin/root user. \n\n'docker version' output: ${res.stderr}\n\nOpen the docker GUI and make sure it's running.`); 26 | } 27 | }); 28 | }, []); 29 | 30 | return ( 31 | error ?
{error}
: 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | ) 44 | } 45 | 46 | export default Trainer; -------------------------------------------------------------------------------- /src/components/Training.tsx: -------------------------------------------------------------------------------- 1 | import { dialog } from "@tauri-apps/api"; 2 | import { message } from "@tauri-apps/api/dialog"; 3 | import { exists, readDir, writeTextFile } from "@tauri-apps/api/fs"; 4 | import { appDir, join } from "@tauri-apps/api/path"; 5 | import { appWindow } from "@tauri-apps/api/window"; 6 | import { atom, useAtom, useAtomValue } from "jotai"; 7 | import _ from "lodash"; 8 | import { FormEvent, useEffect, useRef, useState } from "react"; 9 | import { Button, Form, InputGroup } from "react-bootstrap"; 10 | import Converter from "../commands/convert"; 11 | import { DockerCommand } from "../commands/docker"; 12 | import Dreambooth from "../commands/dreambooth"; 13 | import { Command, run } from "../commands/runner"; 14 | import { killDocker } from "../docker"; 15 | import { appDirAtom, dreamboothAtom } from "../state"; 16 | import { getClassDir, ensureDir, bind, updateStateField, useAtomForm, asyncAtomWithCache } from "./utils"; 17 | 18 | const trainingCommandAtom = atom(async (get) => { 19 | let db = get(dreamboothAtom); 20 | const isLocalModel = await exists(db.model) as unknown as boolean; 21 | const appDir = get(appDirAtom); 22 | const classDir = await getClassDir(db.classPrompt); 23 | let commands = []; 24 | if (isLocalModel) { 25 | const model_dir = db.model.replace(".ckpt", ""); 26 | commands.push(DockerCommand.runCkptToDiffusers(new Converter(db.model, model_dir), appDir).getCommand()); 27 | db = db.with({ model: model_dir }); 28 | } 29 | return [ 30 | ...commands, 31 | DockerCommand.runDreambooth(db, appDir, classDir, isLocalModel).getCommand() 32 | ]; 33 | }); 34 | 35 | const cachedTrainingCommandAtom = asyncAtomWithCache(trainingCommandAtom, []); 36 | 37 | export function Training() { 38 | const [running, setRunning] = useState(false); 39 | const [genCkpt, setGenCkpt] = useState(true); 40 | const [lines, setLines] = useState([]); 41 | const [state, setState, bind] = useAtomForm(dreamboothAtom); 42 | const dockerTrainCommand = useAtomValue(cachedTrainingCommandAtom); 43 | 44 | const outputRef = useRef(); 45 | 46 | useEffect(() => { 47 | const area = outputRef.current!!; 48 | area.scrollTop = area.scrollHeight; 49 | }, [lines]); 50 | 51 | useEffect(() => { 52 | const unlisten = appWindow.onCloseRequested(async () => { 53 | try { 54 | await killDocker(); 55 | } catch { 56 | } 57 | }); 58 | }, []); 59 | 60 | const onSubmit = async (e: FormEvent) => { 61 | e.preventDefault(); 62 | if (running) { 63 | await killDocker(); 64 | setRunning(false); 65 | } else { 66 | const verificationMessage = state.verifyState(); 67 | if (verificationMessage) { 68 | await message(`Cannot start training: ${verificationMessage}`); 69 | return; 70 | } 71 | const dirs = [ 72 | await getClassDir(state.classDir), 73 | await appDir(), 74 | state.outputDir, 75 | ]; 76 | 77 | for (const dir of dirs) { 78 | try { 79 | if (dir) { 80 | ensureDir(dir); 81 | } 82 | } catch (e) { 83 | await message(`Failed to create dir ${dir}, ${e}`); 84 | return; 85 | } 86 | } 87 | 88 | try { 89 | setRunning(true); 90 | setLines([]); 91 | for (const command of dockerTrainCommand) { 92 | const ret = await run( 93 | command, 94 | line => setLines(list => list.concat(line))); 95 | if (ret != 0) { 96 | await message(`Failed to train model, see output for detailed error.`); 97 | setRunning(false); 98 | return; 99 | } 100 | } 101 | await writeTextFile(await join(state.outputDir, "trainer_config"), JSON.stringify(state)); 102 | if (genCkpt) { 103 | for (const f of await readDir(state.outputDir)) { 104 | // TODO: We still don't have a good API to check whether or not the f is a dir. 105 | // Tauri are planning to add such a API, refactor it later. 106 | if (f.name?.match(/\d+/) && f.name !== "0") { 107 | let genCkptOuput: string[] = []; 108 | setLines(line => line.concat(`Converting model in ${f.path} to ckpt.`)) 109 | const ret = await run( 110 | DockerCommand.runDiffusersToCkpt(new Converter(f.path, f.path)).getCommand(), 111 | l => genCkptOuput.push(l)); 112 | if (ret != 0) { 113 | await message(`Failed to convert model, output: ${genCkptOuput.join("\n")}`); 114 | } 115 | } 116 | } 117 | } 118 | setRunning(false); 119 | } catch (e) { 120 | await message(`Failed to start docker ${e}`); 121 | } 122 | await message(`Training finished, check ${state.outputDir} for model output.`, 'Finished!'); 123 | } 124 | }; 125 | 126 | const selectOutputFolder = async () => { 127 | const result = await dialog.open({ 128 | directory: true, 129 | }); 130 | if (result != null && typeof result === 'string') { 131 | setState(_.assign(_.clone(state), { "outputDir": result })); 132 | } 133 | }; 134 | 135 | return ( 136 |
137 | 138 | Hugging Face Token 139 | 140 | 141 | 142 | Output Dir 143 | 144 | 145 | 148 | 149 | 150 | 151 | setGenCkpt(t.target.checked)} /> 152 | 153 | 154 |
Training Command
155 | `${c.executable} ${c.arguments.join(" ")}`).join("\n")} disabled /> 157 |
158 | 159 |
Training Output
160 | 161 |
162 | {!running ? 163 | : 166 | } 169 |
170 | ); 171 | } 172 | -------------------------------------------------------------------------------- /src/components/utils.ts: -------------------------------------------------------------------------------- 1 | import { exists, createDir } from "@tauri-apps/api/fs"; 2 | import { join, appDir } from "@tauri-apps/api/path"; 3 | import { Atom, SetStateAction, useAtom, atom } from "jotai"; 4 | import { PrimitiveAtom, SetAtom } from "jotai/core/atom"; 5 | import { loadable } from "jotai/utils" 6 | import _ from "lodash"; 7 | 8 | 9 | export function updateStateField(setState: (update: SetStateAction) => void, name: keyof T, value: any) { 10 | setState(s => _.assign(_.clone(s), { [name]: value })); 11 | } 12 | 13 | export function bind(state: T, setState: (update: SetStateAction) => void, name: keyof T) { 14 | return { 15 | value: state[name] as any, 16 | onChange: (t: any) => updateStateField(setState, name, t.target.value) 17 | } 18 | } 19 | 20 | export function useAtomForm(atom: PrimitiveAtom): [Value, SetAtom, void>, (name: keyof Value) => any] { 21 | const [state, setState] = useAtom(atom); 22 | return [ 23 | state, setState, (name: keyof Value) => bind(state, setState, name) 24 | ] 25 | } 26 | 27 | export function asyncAtomWithCache(orig: Atom>, defaultValue: Value): Atom { 28 | const loadableAtom = loadable(orig); 29 | let cache = [defaultValue]; 30 | return atom((get) => { 31 | const value = get(loadableAtom); 32 | if (value.state == "hasData") { 33 | cache[0] = value.data; 34 | } 35 | return cache[0]; 36 | }); 37 | } 38 | 39 | export async function getClassDir(prompt: string | undefined) { 40 | if (!prompt) { 41 | return ""; 42 | } 43 | return await join(await appDir(), prompt); 44 | } 45 | 46 | export async function ensureDir(dir: string) { 47 | if (dir && !(await exists(dir) as unknown as boolean)) { 48 | await createDir(dir, { recursive: true }); 49 | } 50 | } 51 | 52 | -------------------------------------------------------------------------------- /src/docker.ts: -------------------------------------------------------------------------------- 1 | 2 | import { shell } from "@tauri-apps/api"; 3 | 4 | // Kill all running instance of docker. 5 | export async function killDocker() { 6 | const process = new shell.Command("docker", ["ps", "--format", "{{.Image}} {{.ID}}"]); 7 | const dockerIds = (await process.execute()).stdout; 8 | const futures = dockerIds.split("\n").map(async (s) => { 9 | const [image, id] = s.split(" "); 10 | if (image.startsWith("smy20011")) { 11 | const killProcess = new shell.Command("docker", ["kill", id]); 12 | const ret = await killProcess.execute(); 13 | console.log(`Killed docker image ${id}, retcode=${ret.code}`); 14 | } 15 | }); 16 | await Promise.all(futures); 17 | } -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./App"; 4 | import "./style.css"; 5 | import 'bootstrap/dist/css/bootstrap.min.css'; 6 | 7 | ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( 8 | 9 | 10 | 11 | ); 12 | -------------------------------------------------------------------------------- /src/state.ts: -------------------------------------------------------------------------------- 1 | import { appDir, join } from "@tauri-apps/api/path"; 2 | import { atom } from "jotai"; 3 | import _ from "lodash"; 4 | import Dreambooth from "./commands/dreambooth"; 5 | import { GpuInfo } from "./Gpu"; 6 | 7 | export const gpuAtom = atom({ 8 | name: "unknown", 9 | meminfo: { 10 | free: 0, 11 | total: 0, 12 | used: 0, 13 | } 14 | }); 15 | 16 | export const updateGpuAtom = atom(null, (get, set, update: GpuInfo) => { 17 | set(gpuAtom, update); 18 | set(dreamboothAtom, get(dreamboothAtom).withGpu(update)); 19 | }); 20 | 21 | export const dreamboothAtom = atom(new Dreambooth("sks")); 22 | export const updateClassPromptAtom = atom(null, async (get, set, prompt: string) => { 23 | const classDir = await join(get(appDirAtom), prompt); 24 | set(dreamboothAtom, get(dreamboothAtom).with({ "classDir": classDir, "classPrompt": prompt })); 25 | }); 26 | export const appDirAtom = atom(async () => appDir()); -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | html, 2 | body, 3 | #root, 4 | .container { 5 | margin: 0; 6 | padding: 0; 7 | height: 100%; 8 | } 9 | 10 | .trainer-error { 11 | white-space: pre-line; 12 | } -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/vite.config.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | // Configure Vitest (https://vitest.dev/config/) 4 | 5 | import { defineConfig } from 'vite' 6 | 7 | export default defineConfig({ 8 | }) -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src"], 20 | "references": [{ "path": "./tsconfig.node.json" }] 21 | } 22 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | 8 | // Vite optons tailored for Tauri development and only applied in `tauri dev` or `tauri build` 9 | // prevent vite from obscuring rust errors 10 | clearScreen: false, 11 | // tauri expects a fixed port, fail if that port is not available 12 | server: { 13 | port: 1420, 14 | strictPort: true, 15 | }, 16 | // to make use of `TAURI_DEBUG` and other env variables 17 | // https://tauri.studio/v1/api/config#buildconfig.beforedevcommand 18 | envPrefix: ["VITE_", "TAURI_"], 19 | build: { 20 | // Tauri supports es2021 21 | target: ["es2021", "chrome100", "safari13"], 22 | // don't minify for debug builds 23 | minify: !process.env.TAURI_DEBUG ? "esbuild" : false, 24 | // produce sourcemaps for debug builds 25 | sourcemap: !!process.env.TAURI_DEBUG, 26 | }, 27 | }); 28 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ampproject/remapping@^2.1.0": 6 | version "2.2.0" 7 | resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" 8 | integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== 9 | dependencies: 10 | "@jridgewell/gen-mapping" "^0.1.0" 11 | "@jridgewell/trace-mapping" "^0.3.9" 12 | 13 | "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": 14 | version "7.18.6" 15 | resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" 16 | integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== 17 | dependencies: 18 | "@babel/highlight" "^7.18.6" 19 | 20 | "@babel/compat-data@^7.19.3": 21 | version "7.19.3" 22 | resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz" 23 | integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== 24 | 25 | "@babel/core@^7.18.13": 26 | version "7.19.3" 27 | resolved "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz" 28 | integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== 29 | dependencies: 30 | "@ampproject/remapping" "^2.1.0" 31 | "@babel/code-frame" "^7.18.6" 32 | "@babel/generator" "^7.19.3" 33 | "@babel/helper-compilation-targets" "^7.19.3" 34 | "@babel/helper-module-transforms" "^7.19.0" 35 | "@babel/helpers" "^7.19.0" 36 | "@babel/parser" "^7.19.3" 37 | "@babel/template" "^7.18.10" 38 | "@babel/traverse" "^7.19.3" 39 | "@babel/types" "^7.19.3" 40 | convert-source-map "^1.7.0" 41 | debug "^4.1.0" 42 | gensync "^1.0.0-beta.2" 43 | json5 "^2.2.1" 44 | semver "^6.3.0" 45 | 46 | "@babel/generator@^7.19.3": 47 | version "7.19.3" 48 | resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz" 49 | integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== 50 | dependencies: 51 | "@babel/types" "^7.19.3" 52 | "@jridgewell/gen-mapping" "^0.3.2" 53 | jsesc "^2.5.1" 54 | 55 | "@babel/helper-annotate-as-pure@^7.18.6": 56 | version "7.18.6" 57 | resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" 58 | integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== 59 | dependencies: 60 | "@babel/types" "^7.18.6" 61 | 62 | "@babel/helper-compilation-targets@^7.19.3": 63 | version "7.19.3" 64 | resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz" 65 | integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== 66 | dependencies: 67 | "@babel/compat-data" "^7.19.3" 68 | "@babel/helper-validator-option" "^7.18.6" 69 | browserslist "^4.21.3" 70 | semver "^6.3.0" 71 | 72 | "@babel/helper-environment-visitor@^7.18.9": 73 | version "7.18.9" 74 | resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" 75 | integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== 76 | 77 | "@babel/helper-function-name@^7.19.0": 78 | version "7.19.0" 79 | resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" 80 | integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== 81 | dependencies: 82 | "@babel/template" "^7.18.10" 83 | "@babel/types" "^7.19.0" 84 | 85 | "@babel/helper-hoist-variables@^7.18.6": 86 | version "7.18.6" 87 | resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" 88 | integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== 89 | dependencies: 90 | "@babel/types" "^7.18.6" 91 | 92 | "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": 93 | version "7.18.6" 94 | resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" 95 | integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== 96 | dependencies: 97 | "@babel/types" "^7.18.6" 98 | 99 | "@babel/helper-module-transforms@^7.19.0": 100 | version "7.19.0" 101 | resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz" 102 | integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== 103 | dependencies: 104 | "@babel/helper-environment-visitor" "^7.18.9" 105 | "@babel/helper-module-imports" "^7.18.6" 106 | "@babel/helper-simple-access" "^7.18.6" 107 | "@babel/helper-split-export-declaration" "^7.18.6" 108 | "@babel/helper-validator-identifier" "^7.18.6" 109 | "@babel/template" "^7.18.10" 110 | "@babel/traverse" "^7.19.0" 111 | "@babel/types" "^7.19.0" 112 | 113 | "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0": 114 | version "7.19.0" 115 | resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz" 116 | integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== 117 | 118 | "@babel/helper-simple-access@^7.18.6": 119 | version "7.18.6" 120 | resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" 121 | integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== 122 | dependencies: 123 | "@babel/types" "^7.18.6" 124 | 125 | "@babel/helper-split-export-declaration@^7.18.6": 126 | version "7.18.6" 127 | resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" 128 | integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== 129 | dependencies: 130 | "@babel/types" "^7.18.6" 131 | 132 | "@babel/helper-string-parser@^7.18.10": 133 | version "7.18.10" 134 | resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz" 135 | integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== 136 | 137 | "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": 138 | version "7.19.1" 139 | resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" 140 | integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== 141 | 142 | "@babel/helper-validator-option@^7.18.6": 143 | version "7.18.6" 144 | resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" 145 | integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== 146 | 147 | "@babel/helpers@^7.19.0": 148 | version "7.19.0" 149 | resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz" 150 | integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== 151 | dependencies: 152 | "@babel/template" "^7.18.10" 153 | "@babel/traverse" "^7.19.0" 154 | "@babel/types" "^7.19.0" 155 | 156 | "@babel/highlight@^7.18.6": 157 | version "7.18.6" 158 | resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" 159 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 160 | dependencies: 161 | "@babel/helper-validator-identifier" "^7.18.6" 162 | chalk "^2.0.0" 163 | js-tokens "^4.0.0" 164 | 165 | "@babel/parser@^7.18.10", "@babel/parser@^7.19.3": 166 | version "7.19.3" 167 | resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz" 168 | integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ== 169 | 170 | "@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": 171 | version "7.18.6" 172 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" 173 | integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== 174 | dependencies: 175 | "@babel/helper-plugin-utils" "^7.18.6" 176 | 177 | "@babel/plugin-transform-react-jsx-development@^7.18.6": 178 | version "7.18.6" 179 | resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" 180 | integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== 181 | dependencies: 182 | "@babel/plugin-transform-react-jsx" "^7.18.6" 183 | 184 | "@babel/plugin-transform-react-jsx-self@^7.18.6": 185 | version "7.18.6" 186 | resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz" 187 | integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== 188 | dependencies: 189 | "@babel/helper-plugin-utils" "^7.18.6" 190 | 191 | "@babel/plugin-transform-react-jsx-source@^7.18.6": 192 | version "7.18.6" 193 | resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz" 194 | integrity sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw== 195 | dependencies: 196 | "@babel/helper-plugin-utils" "^7.18.6" 197 | 198 | "@babel/plugin-transform-react-jsx@^7.18.10", "@babel/plugin-transform-react-jsx@^7.18.6": 199 | version "7.19.0" 200 | resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz" 201 | integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== 202 | dependencies: 203 | "@babel/helper-annotate-as-pure" "^7.18.6" 204 | "@babel/helper-module-imports" "^7.18.6" 205 | "@babel/helper-plugin-utils" "^7.19.0" 206 | "@babel/plugin-syntax-jsx" "^7.18.6" 207 | "@babel/types" "^7.19.0" 208 | 209 | "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": 210 | version "7.19.0" 211 | resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz" 212 | integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== 213 | dependencies: 214 | regenerator-runtime "^0.13.4" 215 | 216 | "@babel/template@^7.18.10": 217 | version "7.18.10" 218 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" 219 | integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== 220 | dependencies: 221 | "@babel/code-frame" "^7.18.6" 222 | "@babel/parser" "^7.18.10" 223 | "@babel/types" "^7.18.10" 224 | 225 | "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3": 226 | version "7.19.3" 227 | resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz" 228 | integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== 229 | dependencies: 230 | "@babel/code-frame" "^7.18.6" 231 | "@babel/generator" "^7.19.3" 232 | "@babel/helper-environment-visitor" "^7.18.9" 233 | "@babel/helper-function-name" "^7.19.0" 234 | "@babel/helper-hoist-variables" "^7.18.6" 235 | "@babel/helper-split-export-declaration" "^7.18.6" 236 | "@babel/parser" "^7.19.3" 237 | "@babel/types" "^7.19.3" 238 | debug "^4.1.0" 239 | globals "^11.1.0" 240 | 241 | "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3": 242 | version "7.19.3" 243 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz" 244 | integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== 245 | dependencies: 246 | "@babel/helper-string-parser" "^7.18.10" 247 | "@babel/helper-validator-identifier" "^7.19.1" 248 | to-fast-properties "^2.0.0" 249 | 250 | "@emotion/babel-plugin@^11.10.0": 251 | version "11.10.2" 252 | resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.2.tgz" 253 | integrity sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA== 254 | dependencies: 255 | "@babel/helper-module-imports" "^7.16.7" 256 | "@babel/plugin-syntax-jsx" "^7.17.12" 257 | "@babel/runtime" "^7.18.3" 258 | "@emotion/hash" "^0.9.0" 259 | "@emotion/memoize" "^0.8.0" 260 | "@emotion/serialize" "^1.1.0" 261 | babel-plugin-macros "^3.1.0" 262 | convert-source-map "^1.5.0" 263 | escape-string-regexp "^4.0.0" 264 | find-root "^1.1.0" 265 | source-map "^0.5.7" 266 | stylis "4.0.13" 267 | 268 | "@emotion/cache@^11.10.0", "@emotion/cache@^11.10.3": 269 | version "11.10.3" 270 | resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.3.tgz" 271 | integrity sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ== 272 | dependencies: 273 | "@emotion/memoize" "^0.8.0" 274 | "@emotion/sheet" "^1.2.0" 275 | "@emotion/utils" "^1.2.0" 276 | "@emotion/weak-memoize" "^0.3.0" 277 | stylis "4.0.13" 278 | 279 | "@emotion/hash@^0.9.0": 280 | version "0.9.0" 281 | resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz" 282 | integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== 283 | 284 | "@emotion/is-prop-valid@^1.2.0": 285 | version "1.2.0" 286 | resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz" 287 | integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== 288 | dependencies: 289 | "@emotion/memoize" "^0.8.0" 290 | 291 | "@emotion/memoize@^0.8.0": 292 | version "0.8.0" 293 | resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz" 294 | integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== 295 | 296 | "@emotion/react@^11.10.4": 297 | version "11.10.4" 298 | resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.4.tgz" 299 | integrity sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA== 300 | dependencies: 301 | "@babel/runtime" "^7.18.3" 302 | "@emotion/babel-plugin" "^11.10.0" 303 | "@emotion/cache" "^11.10.0" 304 | "@emotion/serialize" "^1.1.0" 305 | "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" 306 | "@emotion/utils" "^1.2.0" 307 | "@emotion/weak-memoize" "^0.3.0" 308 | hoist-non-react-statics "^3.3.1" 309 | 310 | "@emotion/serialize@^1.1.0": 311 | version "1.1.0" 312 | resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.0.tgz" 313 | integrity sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA== 314 | dependencies: 315 | "@emotion/hash" "^0.9.0" 316 | "@emotion/memoize" "^0.8.0" 317 | "@emotion/unitless" "^0.8.0" 318 | "@emotion/utils" "^1.2.0" 319 | csstype "^3.0.2" 320 | 321 | "@emotion/sheet@^1.2.0": 322 | version "1.2.0" 323 | resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.0.tgz" 324 | integrity sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w== 325 | 326 | "@emotion/styled@^11.10.4": 327 | version "11.10.4" 328 | resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.4.tgz" 329 | integrity sha512-pRl4R8Ez3UXvOPfc2bzIoV8u9P97UedgHS4FPX594ntwEuAMA114wlaHvOK24HB48uqfXiGlYIZYCxVJ1R1ttQ== 330 | dependencies: 331 | "@babel/runtime" "^7.18.3" 332 | "@emotion/babel-plugin" "^11.10.0" 333 | "@emotion/is-prop-valid" "^1.2.0" 334 | "@emotion/serialize" "^1.1.0" 335 | "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" 336 | "@emotion/utils" "^1.2.0" 337 | 338 | "@emotion/unitless@^0.8.0": 339 | version "0.8.0" 340 | resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz" 341 | integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== 342 | 343 | "@emotion/use-insertion-effect-with-fallbacks@^1.0.0": 344 | version "1.0.0" 345 | resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz" 346 | integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== 347 | 348 | "@emotion/utils@^1.2.0": 349 | version "1.2.0" 350 | resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz" 351 | integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== 352 | 353 | "@emotion/weak-memoize@^0.3.0": 354 | version "0.3.0" 355 | resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz" 356 | integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== 357 | 358 | "@esbuild/android-arm@0.15.10": 359 | version "0.15.10" 360 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.10.tgz#a5f9432eb221afc243c321058ef25fe899886892" 361 | integrity sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg== 362 | 363 | "@esbuild/android-arm@0.15.12": 364 | version "0.15.12" 365 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.12.tgz#e548b10a5e55b9e10537a049ebf0bc72c453b769" 366 | integrity sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA== 367 | 368 | "@esbuild/linux-loong64@0.15.10": 369 | version "0.15.10" 370 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz#78a42897c2cf8db9fd5f1811f7590393b77774c7" 371 | integrity sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg== 372 | 373 | "@esbuild/linux-loong64@0.15.12": 374 | version "0.15.12" 375 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz#475b33a2631a3d8ca8aa95ee127f9a61d95bf9c1" 376 | integrity sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw== 377 | 378 | "@jridgewell/gen-mapping@^0.1.0": 379 | version "0.1.1" 380 | resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" 381 | integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== 382 | dependencies: 383 | "@jridgewell/set-array" "^1.0.0" 384 | "@jridgewell/sourcemap-codec" "^1.4.10" 385 | 386 | "@jridgewell/gen-mapping@^0.3.2": 387 | version "0.3.2" 388 | resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" 389 | integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== 390 | dependencies: 391 | "@jridgewell/set-array" "^1.0.1" 392 | "@jridgewell/sourcemap-codec" "^1.4.10" 393 | "@jridgewell/trace-mapping" "^0.3.9" 394 | 395 | "@jridgewell/resolve-uri@^3.0.3": 396 | version "3.1.0" 397 | resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" 398 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 399 | 400 | "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": 401 | version "1.1.2" 402 | resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" 403 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 404 | 405 | "@jridgewell/sourcemap-codec@^1.4.10": 406 | version "1.4.14" 407 | resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" 408 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 409 | 410 | "@jridgewell/trace-mapping@^0.3.9": 411 | version "0.3.15" 412 | resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz" 413 | integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== 414 | dependencies: 415 | "@jridgewell/resolve-uri" "^3.0.3" 416 | "@jridgewell/sourcemap-codec" "^1.4.10" 417 | 418 | "@mui/base@5.0.0-alpha.100": 419 | version "5.0.0-alpha.100" 420 | resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.100.tgz" 421 | integrity sha512-bSoJEKCENtmJrJDECHUe9PiqztIUACuSskyqw9ypqE7Dz3WxL3e8puFsWBkUsz+WOCjXh4B4Xljn88Ucxxv5HA== 422 | dependencies: 423 | "@babel/runtime" "^7.19.0" 424 | "@emotion/is-prop-valid" "^1.2.0" 425 | "@mui/types" "^7.2.0" 426 | "@mui/utils" "^5.10.6" 427 | "@popperjs/core" "^2.11.6" 428 | clsx "^1.2.1" 429 | prop-types "^15.8.1" 430 | react-is "^18.2.0" 431 | 432 | "@mui/core-downloads-tracker@^5.10.8": 433 | version "5.10.8" 434 | resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.8.tgz" 435 | integrity sha512-V5D7OInO4P9PdT/JACg7fwjbOORm3GklaMVgdGomjyxiyetgRND5CC9r35e1LK/DqHdoyDuhbFzdfrqWtpmEIw== 436 | 437 | "@mui/material@^5.10.8": 438 | version "5.10.8" 439 | resolved "https://registry.npmjs.org/@mui/material/-/material-5.10.8.tgz" 440 | integrity sha512-sF/Ka0IJjGXV52zoT4xAWEqXVRjNYbIjATo9L4Q5oQC5iJpGrKJFY16uNtWWB0+vp/nayAuPGZHrxtV+t3ecdQ== 441 | dependencies: 442 | "@babel/runtime" "^7.19.0" 443 | "@mui/base" "5.0.0-alpha.100" 444 | "@mui/core-downloads-tracker" "^5.10.8" 445 | "@mui/system" "^5.10.8" 446 | "@mui/types" "^7.2.0" 447 | "@mui/utils" "^5.10.6" 448 | "@types/react-transition-group" "^4.4.5" 449 | clsx "^1.2.1" 450 | csstype "^3.1.1" 451 | prop-types "^15.8.1" 452 | react-is "^18.2.0" 453 | react-transition-group "^4.4.5" 454 | 455 | "@mui/private-theming@^5.10.6": 456 | version "5.10.6" 457 | resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.10.6.tgz" 458 | integrity sha512-I/W0QyTLRdEx6py3lKAquKO/rNF/7j+nIOM/xCyI9kU0fcotVTcTY08mKMsS6vrzdWpi6pAkD0wP0KwWy5R5VA== 459 | dependencies: 460 | "@babel/runtime" "^7.19.0" 461 | "@mui/utils" "^5.10.6" 462 | prop-types "^15.8.1" 463 | 464 | "@mui/styled-engine@^5.10.8": 465 | version "5.10.8" 466 | resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.10.8.tgz" 467 | integrity sha512-w+y8WI18EJV6zM/q41ug19cE70JTeO6sWFsQ7tgePQFpy6ToCVPh0YLrtqxUZXSoMStW5FMw0t9fHTFAqPbngw== 468 | dependencies: 469 | "@babel/runtime" "^7.19.0" 470 | "@emotion/cache" "^11.10.3" 471 | csstype "^3.1.1" 472 | prop-types "^15.8.1" 473 | 474 | "@mui/system@^5.10.8": 475 | version "5.10.8" 476 | resolved "https://registry.npmjs.org/@mui/system/-/system-5.10.8.tgz" 477 | integrity sha512-hRQ354zcrYP/KHqK8FheICSvE9raQaUgQaV+A3oD4JETaFUCVI9Ytt+RcQYgTqx02xlCXIjl8LK1rPjTneySqw== 478 | dependencies: 479 | "@babel/runtime" "^7.19.0" 480 | "@mui/private-theming" "^5.10.6" 481 | "@mui/styled-engine" "^5.10.8" 482 | "@mui/types" "^7.2.0" 483 | "@mui/utils" "^5.10.6" 484 | clsx "^1.2.1" 485 | csstype "^3.1.1" 486 | prop-types "^15.8.1" 487 | 488 | "@mui/types@^7.2.0": 489 | version "7.2.0" 490 | resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.0.tgz" 491 | integrity sha512-lGXtFKe5lp3UxTBGqKI1l7G8sE2xBik8qCfrLHD5olwP/YU0/ReWoWT7Lp1//ri32dK39oPMrJN8TgbkCSbsNA== 492 | 493 | "@mui/utils@^5.10.6": 494 | version "5.10.6" 495 | resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.10.6.tgz" 496 | integrity sha512-g0Qs8xN/MW2M3fLL8197h5J2VB9U+49fLlnKKqC6zy/yus5cZwdT+Gwec+wUMxgwQoxMDn+J8oDWAn28kEOR/Q== 497 | dependencies: 498 | "@babel/runtime" "^7.19.0" 499 | "@types/prop-types" "^15.7.5" 500 | "@types/react-is" "^16.7.1 || ^17.0.0" 501 | prop-types "^15.8.1" 502 | react-is "^18.2.0" 503 | 504 | "@popperjs/core@^2.11.5", "@popperjs/core@^2.11.6": 505 | version "2.11.6" 506 | resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz" 507 | integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== 508 | 509 | "@react-aria/ssr@^3.2.0": 510 | version "3.3.0" 511 | resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.3.0.tgz" 512 | integrity sha512-yNqUDuOVZIUGP81R87BJVi/ZUZp/nYOBXbPsRe7oltJOfErQZD+UezMpw4vM2KRz18cURffvmC8tJ6JTeyDtaQ== 513 | dependencies: 514 | "@babel/runtime" "^7.6.2" 515 | 516 | "@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7": 517 | version "0.4.7" 518 | resolved "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz" 519 | integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A== 520 | dependencies: 521 | dequal "^2.0.2" 522 | 523 | "@restart/ui@^1.3.1": 524 | version "1.4.0" 525 | resolved "https://registry.npmjs.org/@restart/ui/-/ui-1.4.0.tgz" 526 | integrity sha512-5dDj5uDzUgK1iijWPRg6AnxjkHM04XhTQDJirM1h/8tIc7KyLtF9YyjcCpNEn259hPMXswpkfXKNgiag0skPFg== 527 | dependencies: 528 | "@babel/runtime" "^7.18.3" 529 | "@popperjs/core" "^2.11.5" 530 | "@react-aria/ssr" "^3.2.0" 531 | "@restart/hooks" "^0.4.7" 532 | "@types/warning" "^3.0.0" 533 | dequal "^2.0.2" 534 | dom-helpers "^5.2.0" 535 | uncontrollable "^7.2.1" 536 | warning "^4.0.3" 537 | 538 | "@tauri-apps/api@^1.1.0": 539 | version "1.1.0" 540 | resolved "https://registry.npmjs.org/@tauri-apps/api/-/api-1.1.0.tgz" 541 | integrity sha512-n13pIqdPd3KtaMmmAcrU7BTfdMtIlGNnfZD0dNX8L4p8dgmuNyikm6JAA+yCpl9gqq6I8x5cV2Y0muqdgD0cWw== 542 | 543 | "@tauri-apps/cli-darwin-arm64@1.1.1": 544 | version "1.1.1" 545 | resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.1.1.tgz#c6f4553cfb338f24131910a1ebbe9fe74d89b8ae" 546 | integrity sha512-qBG11ig525/qf0f5OQxn0ON3hT8YdpTfpa4Y4kVqBJhdW50R5fadPv6tv5Dpl2TS2X7nWh/zg5mEXYoCK3HZ9w== 547 | 548 | "@tauri-apps/cli-darwin-x64@1.1.1": 549 | version "1.1.1" 550 | resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.1.1.tgz#11beb8b3dfc43725f0acd3736cd9d181f93526a2" 551 | integrity sha512-M3dMsp78OdxisbTwAWGvy3jIb3uqThtQcUYVvqOu9LeEOHyldOBFDSht+6PTBpaJLAHFMQK2rmNxiWgigklJaA== 552 | 553 | "@tauri-apps/cli-linux-arm-gnueabihf@1.1.1": 554 | version "1.1.1" 555 | resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.1.1.tgz#f4bd3f5839cfcd69132d213efee09ce5da5c6d90" 556 | integrity sha512-LYlvdAd73cq+yTi6rw7j/DWIvDpeApwgQkIn+HYsNNeFhyFmABU7tmw+pekK3W3nHAkYAJ69Rl4ZdoxdNGKmHg== 557 | 558 | "@tauri-apps/cli-linux-arm64-gnu@1.1.1": 559 | version "1.1.1" 560 | resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.1.1.tgz#2631b2a68e7901ea7281af022d8826c0d82b9edd" 561 | integrity sha512-o/hbMQIKuFI7cTNpeQBHD/OCNJOBIci78faKms/t6AstLXx0QJuRHDk477Rg6VVy/I3BBKbyATALbmcTq+ti0A== 562 | 563 | "@tauri-apps/cli-linux-arm64-musl@1.1.1": 564 | version "1.1.1" 565 | resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.1.1.tgz#11a4bdc52696583152fc70ea373cf31717cb0f4c" 566 | integrity sha512-8Ci4qlDnXIp93XqUrtzFCBDatUzPHpZq7L3bociUbWpvy/bnlzxp1C/C+vwdc4uS1MiAp9v3BFgrU4i0f0Z3QQ== 567 | 568 | "@tauri-apps/cli-linux-x64-gnu@1.1.1": 569 | version "1.1.1" 570 | resolved "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.1.1.tgz" 571 | integrity sha512-ES4Bkx2JAI8+dDNDJswhLS3yqt+yT/4C6UfGOPIHFxcXUh6fe36eUllrTt+HLRS9xTZbYnteJy7ebq2TqMkaxw== 572 | 573 | "@tauri-apps/cli-linux-x64-musl@1.1.1": 574 | version "1.1.1" 575 | resolved "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.1.1.tgz" 576 | integrity sha512-qrN1WOMAaDl+LE8P8iO0+DYlrWNTc9jIu/CsnVY/LImTn79ZPxEkcVBo0UGeKRI7f10TfvkVmLCBLxTz8QhEyA== 577 | 578 | "@tauri-apps/cli-win32-ia32-msvc@1.1.1": 579 | version "1.1.1" 580 | resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.1.1.tgz#1d106ae1c3766f95d7f49bac51eba0d2cd2daf33" 581 | integrity sha512-vw7VOmrQlywHhFV3pf54udf2FRNj9dg9WP1gL0My55FnB+w+PWS9Ipm871kX5qepmChdnZHKq9fsqE2uTjX//Q== 582 | 583 | "@tauri-apps/cli-win32-x64-msvc@1.1.1": 584 | version "1.1.1" 585 | resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.1.1.tgz#ce931d299fcc8c60aceec3f9e18b0987f9951c25" 586 | integrity sha512-OukxlLLi3AoCN4ABnqCDTiiC7xJGWukAjrKCIx7wFISrLjNfsrnH7/UOzuopfGpZChSe2c+AamVmcpBfVsEmJA== 587 | 588 | "@tauri-apps/cli@^1.1.0": 589 | version "1.1.1" 590 | resolved "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.1.1.tgz" 591 | integrity sha512-80kjMEMPBwLYCp0tTKSquy90PHHGGBvZsneNr3B/mWxNsvjzA1C0vOyGJGFrJuT2OmkvrdvuJZ5mch5hL8O1Xg== 592 | optionalDependencies: 593 | "@tauri-apps/cli-darwin-arm64" "1.1.1" 594 | "@tauri-apps/cli-darwin-x64" "1.1.1" 595 | "@tauri-apps/cli-linux-arm-gnueabihf" "1.1.1" 596 | "@tauri-apps/cli-linux-arm64-gnu" "1.1.1" 597 | "@tauri-apps/cli-linux-arm64-musl" "1.1.1" 598 | "@tauri-apps/cli-linux-x64-gnu" "1.1.1" 599 | "@tauri-apps/cli-linux-x64-musl" "1.1.1" 600 | "@tauri-apps/cli-win32-ia32-msvc" "1.1.1" 601 | "@tauri-apps/cli-win32-x64-msvc" "1.1.1" 602 | 603 | "@types/chai-subset@^1.3.3": 604 | version "1.3.3" 605 | resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.3.tgz#97893814e92abd2c534de422cb377e0e0bdaac94" 606 | integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== 607 | dependencies: 608 | "@types/chai" "*" 609 | 610 | "@types/chai@*", "@types/chai@^4.3.3": 611 | version "4.3.3" 612 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.3.tgz#3c90752792660c4b562ad73b3fbd68bf3bc7ae07" 613 | integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== 614 | 615 | "@types/lodash@^4.14.186": 616 | version "4.14.186" 617 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.186.tgz#862e5514dd7bd66ada6c70ee5fce844b06c8ee97" 618 | integrity sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw== 619 | 620 | "@types/node@*": 621 | version "18.11.7" 622 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.7.tgz#8ccef136f240770c1379d50100796a6952f01f94" 623 | integrity sha512-LhFTglglr63mNXUSRYD8A+ZAIu5sFqNJ4Y2fPuY7UlrySJH87rRRlhtVmMHplmfk5WkoJGmDjE9oiTfyX94CpQ== 624 | 625 | "@types/node@^18.7.10": 626 | version "18.8.0" 627 | resolved "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz" 628 | integrity sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA== 629 | 630 | "@types/parse-json@^4.0.0": 631 | version "4.0.0" 632 | resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" 633 | integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== 634 | 635 | "@types/prop-types@*", "@types/prop-types@^15.7.5": 636 | version "15.7.5" 637 | resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" 638 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 639 | 640 | "@types/react-dom@^18.0.6": 641 | version "18.0.6" 642 | resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz" 643 | integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== 644 | dependencies: 645 | "@types/react" "*" 646 | 647 | "@types/react-is@^16.7.1 || ^17.0.0": 648 | version "17.0.3" 649 | resolved "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz" 650 | integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw== 651 | dependencies: 652 | "@types/react" "*" 653 | 654 | "@types/react-transition-group@^4.4.4", "@types/react-transition-group@^4.4.5": 655 | version "4.4.5" 656 | resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz" 657 | integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== 658 | dependencies: 659 | "@types/react" "*" 660 | 661 | "@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.0.15": 662 | version "18.0.21" 663 | resolved "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz" 664 | integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== 665 | dependencies: 666 | "@types/prop-types" "*" 667 | "@types/scheduler" "*" 668 | csstype "^3.0.2" 669 | 670 | "@types/scheduler@*": 671 | version "0.16.2" 672 | resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" 673 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== 674 | 675 | "@types/warning@^3.0.0": 676 | version "3.0.0" 677 | resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz" 678 | integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA== 679 | 680 | "@vitejs/plugin-react@^2.0.0": 681 | version "2.1.0" 682 | resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz" 683 | integrity sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA== 684 | dependencies: 685 | "@babel/core" "^7.18.13" 686 | "@babel/plugin-transform-react-jsx" "^7.18.10" 687 | "@babel/plugin-transform-react-jsx-development" "^7.18.6" 688 | "@babel/plugin-transform-react-jsx-self" "^7.18.6" 689 | "@babel/plugin-transform-react-jsx-source" "^7.18.6" 690 | magic-string "^0.26.2" 691 | react-refresh "^0.14.0" 692 | 693 | acorn@^8.8.0: 694 | version "8.8.1" 695 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" 696 | integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== 697 | 698 | ansi-styles@^3.2.1: 699 | version "3.2.1" 700 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 701 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 702 | dependencies: 703 | color-convert "^1.9.0" 704 | 705 | assertion-error@^1.1.0: 706 | version "1.1.0" 707 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 708 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 709 | 710 | babel-plugin-macros@^3.1.0: 711 | version "3.1.0" 712 | resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" 713 | integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== 714 | dependencies: 715 | "@babel/runtime" "^7.12.5" 716 | cosmiconfig "^7.0.0" 717 | resolve "^1.19.0" 718 | 719 | bootstrap@^5.2.2: 720 | version "5.2.2" 721 | resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.2.tgz" 722 | integrity sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ== 723 | 724 | browserslist@^4.21.3: 725 | version "4.21.4" 726 | resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" 727 | integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== 728 | dependencies: 729 | caniuse-lite "^1.0.30001400" 730 | electron-to-chromium "^1.4.251" 731 | node-releases "^2.0.6" 732 | update-browserslist-db "^1.0.9" 733 | 734 | callsites@^3.0.0: 735 | version "3.1.0" 736 | resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" 737 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 738 | 739 | caniuse-lite@^1.0.30001400: 740 | version "1.0.30001414" 741 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz" 742 | integrity sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg== 743 | 744 | chai@^4.3.6: 745 | version "4.3.6" 746 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" 747 | integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== 748 | dependencies: 749 | assertion-error "^1.1.0" 750 | check-error "^1.0.2" 751 | deep-eql "^3.0.1" 752 | get-func-name "^2.0.0" 753 | loupe "^2.3.1" 754 | pathval "^1.1.1" 755 | type-detect "^4.0.5" 756 | 757 | chalk@^2.0.0: 758 | version "2.4.2" 759 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 760 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 761 | dependencies: 762 | ansi-styles "^3.2.1" 763 | escape-string-regexp "^1.0.5" 764 | supports-color "^5.3.0" 765 | 766 | check-error@^1.0.2: 767 | version "1.0.2" 768 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 769 | integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== 770 | 771 | classnames@^2.3.1: 772 | version "2.3.2" 773 | resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" 774 | integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== 775 | 776 | clsx@^1.2.1: 777 | version "1.2.1" 778 | resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" 779 | integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== 780 | 781 | color-convert@^1.9.0: 782 | version "1.9.3" 783 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 784 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 785 | dependencies: 786 | color-name "1.1.3" 787 | 788 | color-name@1.1.3: 789 | version "1.1.3" 790 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 791 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 792 | 793 | convert-source-map@^1.5.0, convert-source-map@^1.7.0: 794 | version "1.8.0" 795 | resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" 796 | integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== 797 | dependencies: 798 | safe-buffer "~5.1.1" 799 | 800 | cosmiconfig@^7.0.0: 801 | version "7.0.1" 802 | resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" 803 | integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== 804 | dependencies: 805 | "@types/parse-json" "^4.0.0" 806 | import-fresh "^3.2.1" 807 | parse-json "^5.0.0" 808 | path-type "^4.0.0" 809 | yaml "^1.10.0" 810 | 811 | csstype@^3.0.2, csstype@^3.1.1: 812 | version "3.1.1" 813 | resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" 814 | integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== 815 | 816 | debug@^4.1.0, debug@^4.3.4: 817 | version "4.3.4" 818 | resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" 819 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 820 | dependencies: 821 | ms "2.1.2" 822 | 823 | deep-eql@^3.0.1: 824 | version "3.0.1" 825 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 826 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 827 | dependencies: 828 | type-detect "^4.0.0" 829 | 830 | dequal@^2.0.2: 831 | version "2.0.3" 832 | resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" 833 | integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== 834 | 835 | dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: 836 | version "5.2.1" 837 | resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" 838 | integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== 839 | dependencies: 840 | "@babel/runtime" "^7.8.7" 841 | csstype "^3.0.2" 842 | 843 | electron-to-chromium@^1.4.251: 844 | version "1.4.270" 845 | resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz" 846 | integrity sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg== 847 | 848 | error-ex@^1.3.1: 849 | version "1.3.2" 850 | resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" 851 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 852 | dependencies: 853 | is-arrayish "^0.2.1" 854 | 855 | esbuild-android-64@0.15.10: 856 | version "0.15.10" 857 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz#8a59a84acbf2eca96996cadc35642cf055c494f0" 858 | integrity sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA== 859 | 860 | esbuild-android-64@0.15.12: 861 | version "0.15.12" 862 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz#5e8151d5f0a748c71a7fbea8cee844ccf008e6fc" 863 | integrity sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q== 864 | 865 | esbuild-android-arm64@0.15.10: 866 | version "0.15.10" 867 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz#f453851dc1d8c5409a38cf7613a33852faf4915d" 868 | integrity sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg== 869 | 870 | esbuild-android-arm64@0.15.12: 871 | version "0.15.12" 872 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz#5ee72a6baa444bc96ffcb472a3ba4aba2cc80666" 873 | integrity sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA== 874 | 875 | esbuild-darwin-64@0.15.10: 876 | version "0.15.10" 877 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz#778bd29c8186ff47b176c8af58c08cf0fb8e6b86" 878 | integrity sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA== 879 | 880 | esbuild-darwin-64@0.15.12: 881 | version "0.15.12" 882 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz#70047007e093fa1b3ba7ef86f9b3fa63db51fe25" 883 | integrity sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q== 884 | 885 | esbuild-darwin-arm64@0.15.10: 886 | version "0.15.10" 887 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz#b30bbefb46dc3c5d4708b0435e52f6456578d6df" 888 | integrity sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ== 889 | 890 | esbuild-darwin-arm64@0.15.12: 891 | version "0.15.12" 892 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz#41c951f23d9a70539bcca552bae6e5196696ae04" 893 | integrity sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw== 894 | 895 | esbuild-freebsd-64@0.15.10: 896 | version "0.15.10" 897 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz#ab301c5f6ded5110dbdd611140bef1a7c2e99236" 898 | integrity sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w== 899 | 900 | esbuild-freebsd-64@0.15.12: 901 | version "0.15.12" 902 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz#a761b5afd12bbedb7d56c612e9cfa4d2711f33f0" 903 | integrity sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw== 904 | 905 | esbuild-freebsd-arm64@0.15.10: 906 | version "0.15.10" 907 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz#a5b09b867a6ff49110f52343b6f12265db63d43f" 908 | integrity sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg== 909 | 910 | esbuild-freebsd-arm64@0.15.12: 911 | version "0.15.12" 912 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz#6b0839d4d58deabc6cbd96276eb8cbf94f7f335e" 913 | integrity sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g== 914 | 915 | esbuild-linux-32@0.15.10: 916 | version "0.15.10" 917 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz#5282fe9915641caf9c8070e4ba2c3e16d358f837" 918 | integrity sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w== 919 | 920 | esbuild-linux-32@0.15.12: 921 | version "0.15.12" 922 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz#bd50bfe22514d434d97d5150977496e2631345b4" 923 | integrity sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA== 924 | 925 | esbuild-linux-64@0.15.10: 926 | version "0.15.10" 927 | resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz" 928 | integrity sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA== 929 | 930 | esbuild-linux-64@0.15.12: 931 | version "0.15.12" 932 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz#074bb2b194bf658245f8490f29c01ffcdfa8c931" 933 | integrity sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA== 934 | 935 | esbuild-linux-arm64@0.15.10: 936 | version "0.15.10" 937 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz#2f0056e9d5286edb0185b56655caa8c574d8dbe7" 938 | integrity sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A== 939 | 940 | esbuild-linux-arm64@0.15.12: 941 | version "0.15.12" 942 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz#3bf789c4396dc032875a122988efd6f3733f28f5" 943 | integrity sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ== 944 | 945 | esbuild-linux-arm@0.15.10: 946 | version "0.15.10" 947 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz#40a9270da3c8ffa32cf72e24a79883e323dff08d" 948 | integrity sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A== 949 | 950 | esbuild-linux-arm@0.15.12: 951 | version "0.15.12" 952 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz#b91b5a8d470053f6c2c9c8a5e67ec10a71fe4a67" 953 | integrity sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A== 954 | 955 | esbuild-linux-mips64le@0.15.10: 956 | version "0.15.10" 957 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz#90ce1c4ee0202edb4ac69807dea77f7e5804abc4" 958 | integrity sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q== 959 | 960 | esbuild-linux-mips64le@0.15.12: 961 | version "0.15.12" 962 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz#2fb54099ada3c950a7536dfcba46172c61e580e2" 963 | integrity sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A== 964 | 965 | esbuild-linux-ppc64le@0.15.10: 966 | version "0.15.10" 967 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz#782837ae7bd5b279178106c9dd801755a21fabdf" 968 | integrity sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ== 969 | 970 | esbuild-linux-ppc64le@0.15.12: 971 | version "0.15.12" 972 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz#9e3b8c09825fb27886249dfb3142a750df29a1b7" 973 | integrity sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg== 974 | 975 | esbuild-linux-riscv64@0.15.10: 976 | version "0.15.10" 977 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz#d7420d806ece5174f24f4634303146f915ab4207" 978 | integrity sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q== 979 | 980 | esbuild-linux-riscv64@0.15.12: 981 | version "0.15.12" 982 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz#923d0f5b6e12ee0d1fe116b08e4ae4478fe40693" 983 | integrity sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA== 984 | 985 | esbuild-linux-s390x@0.15.10: 986 | version "0.15.10" 987 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz#21fdf0cb3494a7fb520a71934e4dffce67fe47be" 988 | integrity sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA== 989 | 990 | esbuild-linux-s390x@0.15.12: 991 | version "0.15.12" 992 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz#3b1620220482b96266a0c6d9d471d451a1eab86f" 993 | integrity sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww== 994 | 995 | esbuild-netbsd-64@0.15.10: 996 | version "0.15.10" 997 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz#6c06b3107e3df53de381e6299184d4597db0440f" 998 | integrity sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw== 999 | 1000 | esbuild-netbsd-64@0.15.12: 1001 | version "0.15.12" 1002 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz#276730f80da646859b1af5a740e7802d8cd73e42" 1003 | integrity sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w== 1004 | 1005 | esbuild-openbsd-64@0.15.10: 1006 | version "0.15.10" 1007 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz#4daef5f5d8e74bbda53b65160029445d582570cf" 1008 | integrity sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ== 1009 | 1010 | esbuild-openbsd-64@0.15.12: 1011 | version "0.15.12" 1012 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz#bd0eea1dd2ca0722ed489d88c26714034429f8ae" 1013 | integrity sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw== 1014 | 1015 | esbuild-sunos-64@0.15.10: 1016 | version "0.15.10" 1017 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz#5fe7bef267a02f322fd249a8214d0274937388a7" 1018 | integrity sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg== 1019 | 1020 | esbuild-sunos-64@0.15.12: 1021 | version "0.15.12" 1022 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz#5e56bf9eef3b2d92360d6d29dcde7722acbecc9e" 1023 | integrity sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg== 1024 | 1025 | esbuild-windows-32@0.15.10: 1026 | version "0.15.10" 1027 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz#48e3dde25ab0135579a288b30ab6ddef6d1f0b28" 1028 | integrity sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg== 1029 | 1030 | esbuild-windows-32@0.15.12: 1031 | version "0.15.12" 1032 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz#a4f1a301c1a2fa7701fcd4b91ef9d2620cf293d0" 1033 | integrity sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw== 1034 | 1035 | esbuild-windows-64@0.15.10: 1036 | version "0.15.10" 1037 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz#387a9515bef3fee502d277a5d0a2db49a4ecda05" 1038 | integrity sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA== 1039 | 1040 | esbuild-windows-64@0.15.12: 1041 | version "0.15.12" 1042 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz#bc2b467541744d653be4fe64eaa9b0dbbf8e07f6" 1043 | integrity sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA== 1044 | 1045 | esbuild-windows-arm64@0.15.10: 1046 | version "0.15.10" 1047 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz#5a6fcf2fa49e895949bf5495cf088ab1b43ae879" 1048 | integrity sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw== 1049 | 1050 | esbuild-windows-arm64@0.15.12: 1051 | version "0.15.12" 1052 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz#9a7266404334a86be800957eaee9aef94c3df328" 1053 | integrity sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA== 1054 | 1055 | esbuild@^0.15.6: 1056 | version "0.15.10" 1057 | resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz" 1058 | integrity sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng== 1059 | optionalDependencies: 1060 | "@esbuild/android-arm" "0.15.10" 1061 | "@esbuild/linux-loong64" "0.15.10" 1062 | esbuild-android-64 "0.15.10" 1063 | esbuild-android-arm64 "0.15.10" 1064 | esbuild-darwin-64 "0.15.10" 1065 | esbuild-darwin-arm64 "0.15.10" 1066 | esbuild-freebsd-64 "0.15.10" 1067 | esbuild-freebsd-arm64 "0.15.10" 1068 | esbuild-linux-32 "0.15.10" 1069 | esbuild-linux-64 "0.15.10" 1070 | esbuild-linux-arm "0.15.10" 1071 | esbuild-linux-arm64 "0.15.10" 1072 | esbuild-linux-mips64le "0.15.10" 1073 | esbuild-linux-ppc64le "0.15.10" 1074 | esbuild-linux-riscv64 "0.15.10" 1075 | esbuild-linux-s390x "0.15.10" 1076 | esbuild-netbsd-64 "0.15.10" 1077 | esbuild-openbsd-64 "0.15.10" 1078 | esbuild-sunos-64 "0.15.10" 1079 | esbuild-windows-32 "0.15.10" 1080 | esbuild-windows-64 "0.15.10" 1081 | esbuild-windows-arm64 "0.15.10" 1082 | 1083 | esbuild@^0.15.9: 1084 | version "0.15.12" 1085 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.12.tgz#6c8e22d6d3b7430d165c33848298d3fc9a1f251c" 1086 | integrity sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng== 1087 | optionalDependencies: 1088 | "@esbuild/android-arm" "0.15.12" 1089 | "@esbuild/linux-loong64" "0.15.12" 1090 | esbuild-android-64 "0.15.12" 1091 | esbuild-android-arm64 "0.15.12" 1092 | esbuild-darwin-64 "0.15.12" 1093 | esbuild-darwin-arm64 "0.15.12" 1094 | esbuild-freebsd-64 "0.15.12" 1095 | esbuild-freebsd-arm64 "0.15.12" 1096 | esbuild-linux-32 "0.15.12" 1097 | esbuild-linux-64 "0.15.12" 1098 | esbuild-linux-arm "0.15.12" 1099 | esbuild-linux-arm64 "0.15.12" 1100 | esbuild-linux-mips64le "0.15.12" 1101 | esbuild-linux-ppc64le "0.15.12" 1102 | esbuild-linux-riscv64 "0.15.12" 1103 | esbuild-linux-s390x "0.15.12" 1104 | esbuild-netbsd-64 "0.15.12" 1105 | esbuild-openbsd-64 "0.15.12" 1106 | esbuild-sunos-64 "0.15.12" 1107 | esbuild-windows-32 "0.15.12" 1108 | esbuild-windows-64 "0.15.12" 1109 | esbuild-windows-arm64 "0.15.12" 1110 | 1111 | escalade@^3.1.1: 1112 | version "3.1.1" 1113 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" 1114 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 1115 | 1116 | escape-string-regexp@^1.0.5: 1117 | version "1.0.5" 1118 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 1119 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 1120 | 1121 | escape-string-regexp@^4.0.0: 1122 | version "4.0.0" 1123 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" 1124 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 1125 | 1126 | find-root@^1.1.0: 1127 | version "1.1.0" 1128 | resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" 1129 | integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== 1130 | 1131 | fsevents@~2.3.2: 1132 | version "2.3.2" 1133 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 1134 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 1135 | 1136 | function-bind@^1.1.1: 1137 | version "1.1.1" 1138 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 1139 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1140 | 1141 | gensync@^1.0.0-beta.2: 1142 | version "1.0.0-beta.2" 1143 | resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" 1144 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 1145 | 1146 | get-func-name@^2.0.0: 1147 | version "2.0.0" 1148 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 1149 | integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== 1150 | 1151 | globals@^11.1.0: 1152 | version "11.12.0" 1153 | resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" 1154 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1155 | 1156 | has-flag@^3.0.0: 1157 | version "3.0.0" 1158 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 1159 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1160 | 1161 | has@^1.0.3: 1162 | version "1.0.3" 1163 | resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 1164 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1165 | dependencies: 1166 | function-bind "^1.1.1" 1167 | 1168 | hoist-non-react-statics@^3.3.1: 1169 | version "3.3.2" 1170 | resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" 1171 | integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== 1172 | dependencies: 1173 | react-is "^16.7.0" 1174 | 1175 | import-fresh@^3.2.1: 1176 | version "3.3.0" 1177 | resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" 1178 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1179 | dependencies: 1180 | parent-module "^1.0.0" 1181 | resolve-from "^4.0.0" 1182 | 1183 | invariant@^2.2.4: 1184 | version "2.2.4" 1185 | resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" 1186 | integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== 1187 | dependencies: 1188 | loose-envify "^1.0.0" 1189 | 1190 | is-arrayish@^0.2.1: 1191 | version "0.2.1" 1192 | resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" 1193 | integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== 1194 | 1195 | is-core-module@^2.9.0: 1196 | version "2.10.0" 1197 | resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" 1198 | integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== 1199 | dependencies: 1200 | has "^1.0.3" 1201 | 1202 | jotai@^1.8.6: 1203 | version "1.8.6" 1204 | resolved "https://registry.yarnpkg.com/jotai/-/jotai-1.8.6.tgz#4112f619c0153db9fc04025b871ab02a6800cfe1" 1205 | integrity sha512-6JXNd2ewR6Ur0hGY0kRJebQ++p7lN/8kNdGNXv7XT11FDPxAtPN2XLM+m0w4bV22f1knQlG8ZpVLfY6BEGF+UQ== 1206 | 1207 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1208 | version "4.0.0" 1209 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 1210 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1211 | 1212 | jsesc@^2.5.1: 1213 | version "2.5.2" 1214 | resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" 1215 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 1216 | 1217 | json-parse-even-better-errors@^2.3.0: 1218 | version "2.3.1" 1219 | resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" 1220 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 1221 | 1222 | json5@^2.2.1: 1223 | version "2.2.1" 1224 | resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" 1225 | integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== 1226 | 1227 | lines-and-columns@^1.1.6: 1228 | version "1.2.4" 1229 | resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" 1230 | integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== 1231 | 1232 | local-pkg@^0.4.2: 1233 | version "0.4.2" 1234 | resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.2.tgz#13107310b77e74a0e513147a131a2ba288176c2f" 1235 | integrity sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg== 1236 | 1237 | lodash@^4.17.21: 1238 | version "4.17.21" 1239 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1240 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1241 | 1242 | loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: 1243 | version "1.4.0" 1244 | resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" 1245 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1246 | dependencies: 1247 | js-tokens "^3.0.0 || ^4.0.0" 1248 | 1249 | loupe@^2.3.1: 1250 | version "2.3.4" 1251 | resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" 1252 | integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== 1253 | dependencies: 1254 | get-func-name "^2.0.0" 1255 | 1256 | magic-string@^0.26.2: 1257 | version "0.26.5" 1258 | resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.26.5.tgz" 1259 | integrity sha512-yXUIYOOQnEHKHOftp5shMWpB9ImfgfDJpapa38j/qMtTj5QHWucvxP4lUtuRmHT9vAzvtpHkWKXW9xBwimXeNg== 1260 | dependencies: 1261 | sourcemap-codec "^1.4.8" 1262 | 1263 | ms@2.1.2: 1264 | version "2.1.2" 1265 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 1266 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1267 | 1268 | nanoid@^3.3.4: 1269 | version "3.3.4" 1270 | resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" 1271 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 1272 | 1273 | node-releases@^2.0.6: 1274 | version "2.0.6" 1275 | resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" 1276 | integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== 1277 | 1278 | object-assign@^4.1.1: 1279 | version "4.1.1" 1280 | resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" 1281 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1282 | 1283 | parent-module@^1.0.0: 1284 | version "1.0.1" 1285 | resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" 1286 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1287 | dependencies: 1288 | callsites "^3.0.0" 1289 | 1290 | parse-json@^5.0.0: 1291 | version "5.2.0" 1292 | resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" 1293 | integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== 1294 | dependencies: 1295 | "@babel/code-frame" "^7.0.0" 1296 | error-ex "^1.3.1" 1297 | json-parse-even-better-errors "^2.3.0" 1298 | lines-and-columns "^1.1.6" 1299 | 1300 | path-parse@^1.0.7: 1301 | version "1.0.7" 1302 | resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" 1303 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1304 | 1305 | path-type@^4.0.0: 1306 | version "4.0.0" 1307 | resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" 1308 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1309 | 1310 | pathval@^1.1.1: 1311 | version "1.1.1" 1312 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 1313 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 1314 | 1315 | picocolors@^1.0.0: 1316 | version "1.0.0" 1317 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" 1318 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1319 | 1320 | postcss@^8.4.16: 1321 | version "8.4.17" 1322 | resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz" 1323 | integrity sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q== 1324 | dependencies: 1325 | nanoid "^3.3.4" 1326 | picocolors "^1.0.0" 1327 | source-map-js "^1.0.2" 1328 | 1329 | postcss@^8.4.18: 1330 | version "8.4.18" 1331 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2" 1332 | integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA== 1333 | dependencies: 1334 | nanoid "^3.3.4" 1335 | picocolors "^1.0.0" 1336 | source-map-js "^1.0.2" 1337 | 1338 | prop-types-extra@^1.1.0: 1339 | version "1.1.1" 1340 | resolved "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz" 1341 | integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== 1342 | dependencies: 1343 | react-is "^16.3.2" 1344 | warning "^4.0.0" 1345 | 1346 | prop-types@^15.6.2, prop-types@^15.8.1: 1347 | version "15.8.1" 1348 | resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" 1349 | integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== 1350 | dependencies: 1351 | loose-envify "^1.4.0" 1352 | object-assign "^4.1.1" 1353 | react-is "^16.13.1" 1354 | 1355 | react-bootstrap@^2.5.0: 1356 | version "2.5.0" 1357 | resolved "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.5.0.tgz" 1358 | integrity sha512-j/aLR+okzbYk61TM3eDOU1NqOqnUdwyVrF+ojoCRUxPdzc2R0xXvqyRsjSoyRoCo7n82Fs/LWjPCin/QJNdwvA== 1359 | dependencies: 1360 | "@babel/runtime" "^7.17.2" 1361 | "@restart/hooks" "^0.4.6" 1362 | "@restart/ui" "^1.3.1" 1363 | "@types/react-transition-group" "^4.4.4" 1364 | classnames "^2.3.1" 1365 | dom-helpers "^5.2.1" 1366 | invariant "^2.2.4" 1367 | prop-types "^15.8.1" 1368 | prop-types-extra "^1.1.0" 1369 | react-transition-group "^4.4.2" 1370 | uncontrollable "^7.2.1" 1371 | warning "^4.0.3" 1372 | 1373 | react-dom@^18.2.0: 1374 | version "18.2.0" 1375 | resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" 1376 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 1377 | dependencies: 1378 | loose-envify "^1.1.0" 1379 | scheduler "^0.23.0" 1380 | 1381 | react-hook-form@^7.36.1: 1382 | version "7.36.1" 1383 | resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.36.1.tgz" 1384 | integrity sha512-EbYYkCG2p8ywe7ikOH2l02lAFMrrrslZi1I8fqd8ifDGNAkhomHZQzQsP6ksvzrWBKntRe8b5L5L7Zsd+Gm02Q== 1385 | 1386 | react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: 1387 | version "16.13.1" 1388 | resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" 1389 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 1390 | 1391 | react-is@^18.2.0: 1392 | version "18.2.0" 1393 | resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" 1394 | integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== 1395 | 1396 | react-lifecycles-compat@^3.0.4: 1397 | version "3.0.4" 1398 | resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" 1399 | integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== 1400 | 1401 | react-refresh@^0.14.0: 1402 | version "0.14.0" 1403 | resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz" 1404 | integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== 1405 | 1406 | react-transition-group@^4.4.2, react-transition-group@^4.4.5: 1407 | version "4.4.5" 1408 | resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" 1409 | integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== 1410 | dependencies: 1411 | "@babel/runtime" "^7.5.5" 1412 | dom-helpers "^5.0.1" 1413 | loose-envify "^1.4.0" 1414 | prop-types "^15.6.2" 1415 | 1416 | react@^18.2.0: 1417 | version "18.2.0" 1418 | resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" 1419 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 1420 | dependencies: 1421 | loose-envify "^1.1.0" 1422 | 1423 | regenerator-runtime@^0.13.4: 1424 | version "0.13.9" 1425 | resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" 1426 | integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== 1427 | 1428 | resolve-from@^4.0.0: 1429 | version "4.0.0" 1430 | resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" 1431 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1432 | 1433 | resolve@^1.19.0, resolve@^1.22.1: 1434 | version "1.22.1" 1435 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" 1436 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 1437 | dependencies: 1438 | is-core-module "^2.9.0" 1439 | path-parse "^1.0.7" 1440 | supports-preserve-symlinks-flag "^1.0.0" 1441 | 1442 | rollup@^2.79.1: 1443 | version "2.79.1" 1444 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" 1445 | integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== 1446 | optionalDependencies: 1447 | fsevents "~2.3.2" 1448 | 1449 | rollup@~2.78.0: 1450 | version "2.78.1" 1451 | resolved "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz" 1452 | integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg== 1453 | optionalDependencies: 1454 | fsevents "~2.3.2" 1455 | 1456 | safe-buffer@~5.1.1: 1457 | version "5.1.2" 1458 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" 1459 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1460 | 1461 | scheduler@^0.23.0: 1462 | version "0.23.0" 1463 | resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" 1464 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 1465 | dependencies: 1466 | loose-envify "^1.1.0" 1467 | 1468 | semver@^6.3.0: 1469 | version "6.3.0" 1470 | resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" 1471 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1472 | 1473 | source-map-js@^1.0.2: 1474 | version "1.0.2" 1475 | resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" 1476 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1477 | 1478 | source-map@^0.5.7: 1479 | version "0.5.7" 1480 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" 1481 | integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== 1482 | 1483 | sourcemap-codec@^1.4.8: 1484 | version "1.4.8" 1485 | resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" 1486 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 1487 | 1488 | strip-literal@^0.4.2: 1489 | version "0.4.2" 1490 | resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-0.4.2.tgz#4f9fa6c38bb157b924e9ace7155ebf8a2342cbcf" 1491 | integrity sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw== 1492 | dependencies: 1493 | acorn "^8.8.0" 1494 | 1495 | stylis@4.0.13: 1496 | version "4.0.13" 1497 | resolved "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz" 1498 | integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag== 1499 | 1500 | supports-color@^5.3.0: 1501 | version "5.5.0" 1502 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 1503 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1504 | dependencies: 1505 | has-flag "^3.0.0" 1506 | 1507 | supports-preserve-symlinks-flag@^1.0.0: 1508 | version "1.0.0" 1509 | resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" 1510 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1511 | 1512 | tinybench@^2.3.0: 1513 | version "2.3.1" 1514 | resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.3.1.tgz#14f64e6b77d7ef0b1f6ab850c7a808c6760b414d" 1515 | integrity sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA== 1516 | 1517 | tinypool@^0.3.0: 1518 | version "0.3.0" 1519 | resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.3.0.tgz#c405d8b743509fc28ea4ca358433190be654f819" 1520 | integrity sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ== 1521 | 1522 | tinyspy@^1.0.2: 1523 | version "1.0.2" 1524 | resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-1.0.2.tgz#6da0b3918bfd56170fb3cd3a2b5ef832ee1dff0d" 1525 | integrity sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q== 1526 | 1527 | to-fast-properties@^2.0.0: 1528 | version "2.0.0" 1529 | resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" 1530 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 1531 | 1532 | type-detect@^4.0.0, type-detect@^4.0.5: 1533 | version "4.0.8" 1534 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1535 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1536 | 1537 | typescript@^4.6.4: 1538 | version "4.8.4" 1539 | resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" 1540 | integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== 1541 | 1542 | uncontrollable@^7.2.1: 1543 | version "7.2.1" 1544 | resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz" 1545 | integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== 1546 | dependencies: 1547 | "@babel/runtime" "^7.6.3" 1548 | "@types/react" ">=16.9.11" 1549 | invariant "^2.2.4" 1550 | react-lifecycles-compat "^3.0.4" 1551 | 1552 | update-browserslist-db@^1.0.9: 1553 | version "1.0.9" 1554 | resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz" 1555 | integrity sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg== 1556 | dependencies: 1557 | escalade "^3.1.1" 1558 | picocolors "^1.0.0" 1559 | 1560 | vite@^3.0.0: 1561 | version "3.2.1" 1562 | resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.1.tgz#dc1f54568300a7acdd89c8611e2719c21f1334f4" 1563 | integrity sha512-ADtMkfHuWq4tskJsri2n2FZkORO8ZyhI+zIz7zTrDAgDEtct1jdxOg3YsZBfHhKjmMoWLOSCr+64qrEDGo/DbQ== 1564 | dependencies: 1565 | esbuild "^0.15.9" 1566 | postcss "^8.4.18" 1567 | resolve "^1.22.1" 1568 | rollup "^2.79.1" 1569 | optionalDependencies: 1570 | fsevents "~2.3.2" 1571 | 1572 | vite@^3.0.2: 1573 | version "3.1.4" 1574 | resolved "https://registry.npmjs.org/vite/-/vite-3.1.4.tgz" 1575 | integrity sha512-JoQI08aBjY9lycL7jcEq4p9o1xUjq5aRvdH4KWaXtkSx7e7RpAh9D3IjzDWRD4Fg44LS3oDAIOG/Kq1L+82psA== 1576 | dependencies: 1577 | esbuild "^0.15.6" 1578 | postcss "^8.4.16" 1579 | resolve "^1.22.1" 1580 | rollup "~2.78.0" 1581 | optionalDependencies: 1582 | fsevents "~2.3.2" 1583 | 1584 | vitest@^0.24.3: 1585 | version "0.24.3" 1586 | resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.24.3.tgz#d91c7e2d557877d5270033efdf18add6063f0c97" 1587 | integrity sha512-aM0auuPPgMSstWvr851hB74g/LKaKBzSxcG3da7ejfZbx08Y21JpZmbmDYrMTCGhVZKqTGwzcnLMwyfz2WzkhQ== 1588 | dependencies: 1589 | "@types/chai" "^4.3.3" 1590 | "@types/chai-subset" "^1.3.3" 1591 | "@types/node" "*" 1592 | chai "^4.3.6" 1593 | debug "^4.3.4" 1594 | local-pkg "^0.4.2" 1595 | strip-literal "^0.4.2" 1596 | tinybench "^2.3.0" 1597 | tinypool "^0.3.0" 1598 | tinyspy "^1.0.2" 1599 | vite "^3.0.0" 1600 | 1601 | warning@^4.0.0, warning@^4.0.3: 1602 | version "4.0.3" 1603 | resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" 1604 | integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== 1605 | dependencies: 1606 | loose-envify "^1.0.0" 1607 | 1608 | yaml@^1.10.0: 1609 | version "1.10.2" 1610 | resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" 1611 | integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== 1612 | --------------------------------------------------------------------------------