├── .eslintrc.cjs ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── index.html ├── package.json ├── src ├── App.tsx ├── components │ ├── PrepareProgress.module.scss │ ├── PrepareProgress.tsx │ ├── Slider.module.scss │ ├── Slider.tsx │ ├── Steps.module.scss │ ├── Steps.tsx │ ├── VideoCrop.module.scss │ ├── VideoCrop.tsx │ ├── VideoTrim.module.scss │ └── VideoTrim.tsx ├── helpers.ts ├── index.scss ├── main.tsx ├── steps │ ├── Crop.module.scss │ ├── Crop.tsx │ ├── Render.module.scss │ ├── Render.tsx │ ├── SelectFile.module.scss │ └── SelectFile.tsx ├── stores │ └── main.ts ├── types.ts └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json ├── vite.config.ts └── yarn.lock /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:@typescript-eslint/recommended', 7 | 'plugin:react-hooks/recommended', 8 | ], 9 | ignorePatterns: ['dist', '.eslintrc.cjs'], 10 | parser: '@typescript-eslint/parser', 11 | plugins: ['react-refresh'], 12 | rules: { 13 | 'react-refresh/only-export-components': [ 14 | 'warn', 15 | { allowConstantExport: true }, 16 | ], 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "singleQuote": true, 4 | "semi": true, 5 | "arrowParens": "avoid" 6 | } 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023, Mat Sz 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted (subject to the limitations in the disclaimer 6 | below) provided that the following conditions are met: 7 | 8 | * Redistributions of source code must retain the above copyright notice, 9 | this list of conditions and the following disclaimer. 10 | 11 | * Redistributions in binary form must reproduce the above copyright 12 | notice, this list of conditions and the following disclaimer in the 13 | documentation and/or other materials provided with the distribution. 14 | 15 | * Neither the name of the copyright holder nor the names of its 16 | contributors may be used to endorse or promote products derived from this 17 | software without specific prior written permission. 18 | 19 | NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY 20 | THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 21 | CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 23 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 24 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 27 | BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 28 | IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 | POSSIBILITY OF SUCH DAMAGE. 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # crop.mov 2 | 3 | Quick video edits, right in your web browser. Built with React and [ffmpeg.wasm](https://github.com/ffmpegwasm/ffmpeg.wasm) 4 | 5 | https://crop.mov 6 | 7 | - ✔️ Simple UI 8 | - ✔️ No watermarks 9 | - ✔️ Your video files stay on your computer 10 | 11 | ## Building 12 | 13 | Install the project with `yarn` and then run `yarn build`. 14 | 15 | ## Multi-core ffmpeg.wasm 16 | 17 | To enable multi-core ffmpeg.wasm, SharedArrayBuffer needs to be available and env variable `VITE_ENABLE_MT` needs to equal `1`. 18 | 19 | This is a work-in-progress feature and it may not work as expected. 20 | 21 | ### Nginx: 22 | 23 | ```nginx 24 | server { 25 | # ... 26 | add_header Cross-Origin-Embedder-Policy 'require-corp'; 27 | add_header Cross-Origin-Opener-Policy 'same-origin'; 28 | # ... 29 | } 30 | 31 | ``` 32 | 33 | See: https://developer.chrome.com/blog/enabling-shared-array-buffer/ 34 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 29 | 30 | crop.mov 31 | 32 | 33 |
34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "crop", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "start": "vite --force", 8 | "build": "tsc && vite build", 9 | "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", 10 | "preview": "vite preview" 11 | }, 12 | "husky": { 13 | "hooks": { 14 | "pre-commit": "lint-staged" 15 | } 16 | }, 17 | "lint-staged": { 18 | "src/**/*.{js,jsx,ts,tsx,json,css,scss,md}": [ 19 | "prettier --write" 20 | ], 21 | "__tests__/**/*.{js,jsx,ts,tsx,json,css,scss,md}": [ 22 | "prettier --write" 23 | ] 24 | }, 25 | "dependencies": { 26 | "@ffmpeg/ffmpeg": "^0.12.15", 27 | "@ffmpeg/util": "^0.12.2", 28 | "clsx": "^2.0.0", 29 | "idb-keyval": "^6.2.1", 30 | "mobx": "^6.10.2", 31 | "mobx-react-lite": "^4.0.4", 32 | "react": "^19.0.0", 33 | "react-dom": "^19.0.0", 34 | "react-icons": "^5.4.0", 35 | "react-use-pointer-drag": "^0.1.2" 36 | }, 37 | "devDependencies": { 38 | "@types/react": "^18.2.15", 39 | "@types/react-dom": "^18.2.7", 40 | "@typescript-eslint/eslint-plugin": "^6.0.0", 41 | "@typescript-eslint/parser": "^6.0.0", 42 | "@vitejs/plugin-react": "^4.3.4", 43 | "eslint": "^8.45.0", 44 | "eslint-plugin-react-hooks": "^4.6.0", 45 | "eslint-plugin-react-refresh": "^0.4.3", 46 | "husky": "^8.0.3", 47 | "lint-staged": "^14.0.1", 48 | "prettier": "^3.0.3", 49 | "sass-embedded": "^1.83.4", 50 | "typescript": "^5.7.3", 51 | "vite": "^6.0.11" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { observer } from 'mobx-react-lite'; 3 | import { runInAction } from 'mobx'; 4 | 5 | import './index.scss'; 6 | import { Steps } from './components/Steps'; 7 | import { SelectFile } from './steps/SelectFile'; 8 | import { mainStore } from './stores/main'; 9 | import { Crop } from './steps/Crop'; 10 | import { Render } from './steps/Render'; 11 | 12 | export const App: React.FC = observer(() => { 13 | const step = mainStore.step; 14 | 15 | return ( 16 |
17 |

crop.mov

18 | { 21 | runInAction(() => { 22 | mainStore.step = step; 23 | }); 24 | }} 25 | steps={['Select file', 'Crop', 'Render']} 26 | /> 27 | 28 | {step === 0 && } 29 | {step === 1 && } 30 | {step === 2 && } 31 |
32 | ); 33 | }); 34 | -------------------------------------------------------------------------------- /src/components/PrepareProgress.module.scss: -------------------------------------------------------------------------------- 1 | .progress { 2 | min-width: 0; 3 | width: 100%; 4 | max-width: 500px; 5 | 6 | progress { 7 | width: 100%; 8 | } 9 | 10 | pre { 11 | max-width: 100%; 12 | max-height: 500px; 13 | overflow-wrap: break-word; 14 | word-wrap: break-word; 15 | white-space: pre-wrap; 16 | overflow-y: auto; 17 | overflow-x: hidden; 18 | } 19 | 20 | video { 21 | max-width: 100%; 22 | } 23 | } 24 | 25 | .info, 26 | .actions { 27 | margin-bottom: 0.25rem; 28 | } 29 | 30 | .actions { 31 | display: flex; 32 | align-items: center; 33 | } 34 | -------------------------------------------------------------------------------- /src/components/PrepareProgress.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { observer } from 'mobx-react-lite'; 3 | import { runInAction } from 'mobx'; 4 | 5 | import styles from './PrepareProgress.module.scss'; 6 | import { mainStore } from '../stores/main'; 7 | 8 | export const PrepareProgress: React.FC = observer(() => { 9 | const { ffmpeg, fileLoading } = mainStore; 10 | 11 | if (!fileLoading) { 12 | return null; 13 | } 14 | 15 | if (!ffmpeg.loaded) { 16 | return ( 17 |
18 |
19 | 29 |
30 |
31 | Preparing video preview - loading FFMpeg 32 | 33 |
34 |
35 | ); 36 | } 37 | 38 | if (ffmpeg.running) { 39 | return ( 40 |
41 |
42 | 52 |
53 |
54 | Preparing video preview - remuxing 55 | 56 |
{ffmpeg.output}
57 |
58 |
59 | ); 60 | } 61 | 62 | return
Loading...
; 63 | }); 64 | -------------------------------------------------------------------------------- /src/components/Slider.module.scss: -------------------------------------------------------------------------------- 1 | .slider { 2 | padding: 1rem 0; 3 | 4 | .track { 5 | background: var(--color-interactive-dark); 6 | position: relative; 7 | height: 0.5rem; 8 | border-radius: 5px; 9 | } 10 | 11 | .thumb { 12 | position: absolute; 13 | border-radius: 5px; 14 | top: -0.75rem; 15 | bottom: -0.75rem; 16 | height: 2rem; 17 | width: 0.75rem; 18 | background: var(--color-interactive-hover); 19 | transform: translate(-50%, 0); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/components/Slider.tsx: -------------------------------------------------------------------------------- 1 | import React, { useRef } from 'react'; 2 | import { IPointerDragData, usePointerDrag } from 'react-use-pointer-drag'; 3 | 4 | import styles from './Slider.module.scss'; 5 | import { clamp } from '../helpers'; 6 | 7 | interface SliderProps { 8 | min: number; 9 | max: number; 10 | value: number; 11 | onChange?(value: number): void; 12 | } 13 | 14 | export const Slider: React.FC = ({ 15 | min, 16 | max, 17 | value, 18 | onChange, 19 | }) => { 20 | const trackRef = useRef(null); 21 | 22 | const handleEvent = ({ x }: IPointerDragData) => { 23 | const rect = trackRef.current!.getBoundingClientRect(); 24 | const value = clamp( 25 | ((x - rect.left) / rect.width) * (max - min) + min, 26 | min, 27 | max, 28 | ); 29 | onChange?.(value); 30 | }; 31 | 32 | const { dragProps } = usePointerDrag({ 33 | preventDefault: true, 34 | stopPropagation: true, 35 | onClick: handleEvent, 36 | onMove: handleEvent, 37 | }); 38 | return ( 39 |
40 |
41 |
47 |
48 |
49 | ); 50 | }; 51 | -------------------------------------------------------------------------------- /src/components/Steps.module.scss: -------------------------------------------------------------------------------- 1 | .steps { 2 | counter-reset: steps; 3 | list-style-type: none; 4 | display: grid; 5 | padding: 0; 6 | position: relative; 7 | grid-template-columns: 1fr 1fr 1fr; 8 | 9 | &:before { 10 | content: ''; 11 | display: block; 12 | position: absolute; 13 | border-top: 1px solid var(--color-fg-soft); 14 | left: 0; 15 | top: 0.75rem; 16 | right: 0; 17 | bottom: 0; 18 | } 19 | 20 | li { 21 | counter-increment: steps; 22 | position: relative; 23 | padding: 1rem; 24 | padding-top: 1.5rem; 25 | cursor: pointer; 26 | text-align: center; 27 | color: var(--color-fg-soft); 28 | font-size: 0.9rem; 29 | 30 | &:before { 31 | content: ''; 32 | display: block; 33 | position: absolute; 34 | left: 50%; 35 | width: 2rem; 36 | transform: translate(-50%); 37 | top: 0; 38 | height: 1.5rem; 39 | background: var(--color-bg); 40 | } 41 | 42 | &:first-child { 43 | &:before { 44 | left: 0; 45 | width: calc(50% + 1rem); 46 | transform: unset; 47 | } 48 | } 49 | 50 | &:last-child { 51 | &:before { 52 | left: unset; 53 | right: 0; 54 | width: calc(50% + 1rem); 55 | transform: unset; 56 | } 57 | } 58 | 59 | &:after { 60 | width: 1.2rem; 61 | height: 1.2rem; 62 | font-size: 0.8rem; 63 | padding: 0.5rem 0.3rem; 64 | box-sizing: border-box; 65 | 66 | position: absolute; 67 | top: 0.25rem; 68 | left: 50%; 69 | transform: translate(-50%, 0); 70 | border: 1px solid var(--color-fg); 71 | border-radius: 100%; 72 | content: counter(steps); 73 | line-height: 0; 74 | background: var(--color-bg); 75 | } 76 | 77 | &.current { 78 | &:after { 79 | background: var(--color-fg-soft); 80 | color: var(--color-bg); 81 | } 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/components/Steps.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | 4 | import styles from './Steps.module.scss'; 5 | 6 | interface StepsProps { 7 | current: number; 8 | steps: string[]; 9 | onChange?: (step: number) => void; 10 | } 11 | 12 | export const Steps: React.FC = ({ current, steps, onChange }) => { 13 | return ( 14 |
    15 | {steps.map((step, i) => ( 16 |
  • { 20 | onChange?.(i); 21 | }} 22 | > 23 | {step} 24 |
  • 25 | ))} 26 |
27 | ); 28 | }; 29 | -------------------------------------------------------------------------------- /src/components/VideoCrop.module.scss: -------------------------------------------------------------------------------- 1 | $handle-width: 3px; 2 | $handle-size: 2rem; 3 | $box-width: 2px; 4 | 5 | $handle-offset: -$handle-width - $box-width; 6 | 7 | .videoPreview { 8 | box-shadow: 0 0 20px 5px rgba(0, 0, 0, 0.3); 9 | overflow: hidden; 10 | width: 100%; 11 | } 12 | 13 | .crop { 14 | position: relative; 15 | font-size: 0; 16 | 17 | .box { 18 | border: $box-width solid white; 19 | position: absolute; 20 | inset: 0; 21 | touch-action: none; 22 | 23 | .dimensions { 24 | position: absolute; 25 | top: -2rem; 26 | right: 0; 27 | z-index: 9999; 28 | color: white; 29 | font-size: 0.9rem; 30 | background: rgba(0, 0, 0, 0.3); 31 | padding: 0.25rem; 32 | } 33 | 34 | svg { 35 | position: absolute; 36 | inset: 0; 37 | width: 100%; 38 | height: 100%; 39 | cursor: move; 40 | touch-action: manipulation; 41 | 42 | line { 43 | stroke: white; 44 | stroke-width: $box-width; 45 | } 46 | } 47 | } 48 | 49 | .handles { 50 | & > div { 51 | position: absolute; 52 | width: $handle-size; 53 | height: $handle-size; 54 | border-color: white; 55 | border-width: $handle-width; 56 | touch-action: manipulation; 57 | } 58 | } 59 | 60 | .handle-nw, 61 | .handle-n, 62 | .handle-ne { 63 | top: $handle-offset; 64 | border-top-style: solid; 65 | } 66 | 67 | .handle-nw, 68 | .handle-w, 69 | .handle-sw { 70 | left: $handle-offset; 71 | border-left-style: solid; 72 | } 73 | 74 | .handle-ne, 75 | .handle-e, 76 | .handle-se { 77 | right: $handle-offset; 78 | border-right-style: solid; 79 | } 80 | 81 | .handle-sw, 82 | .handle-s, 83 | .handle-se { 84 | bottom: $handle-offset; 85 | border-bottom-style: solid; 86 | } 87 | 88 | .handle-n, 89 | .handle-s { 90 | left: 50%; 91 | transform: translate(-50%, 0); 92 | } 93 | 94 | .handle-e, 95 | .handle-w { 96 | top: 50%; 97 | transform: translate(0, -50%); 98 | } 99 | } 100 | 101 | .options { 102 | margin-bottom: 0.25rem; 103 | } 104 | -------------------------------------------------------------------------------- /src/components/VideoCrop.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef, useState } from 'react'; 2 | import { usePointerDrag } from 'react-use-pointer-drag'; 3 | 4 | import styles from './VideoCrop.module.scss'; 5 | import { clamp } from '../helpers'; 6 | import { Area, Ratio, VideoTransform } from '../types'; 7 | 8 | const MIN_CROP_SIZE = 100; 9 | 10 | interface VideoCropProps { 11 | onChange: (area: Area) => void; 12 | transform: VideoTransform; 13 | video: HTMLVideoElement; 14 | } 15 | 16 | function ensureRatio(ratio: Ratio, area: Area): Area { 17 | const newArea: Area = [...area]; 18 | 19 | if (ratio > 1) { 20 | newArea[3] = newArea[2] / ratio; 21 | } else { 22 | newArea[2] = newArea[3] * ratio; 23 | } 24 | 25 | return newArea; 26 | } 27 | 28 | const handleDirections = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w']; 29 | 30 | export const VideoCrop: React.FC = ({ 31 | transform, 32 | onChange, 33 | video, 34 | }) => { 35 | const { area = [0, 0, video.videoWidth, video.videoHeight] } = transform; 36 | const [ratioName, setRatioName] = useState('free'); 37 | const [ratio, setRatio] = useState(); 38 | const canvasPreviewRef = useRef(null); 39 | const transformRef = useRef(transform); 40 | 41 | useEffect(() => { 42 | transformRef.current = transform; 43 | }, [transform]); 44 | 45 | const { dragProps } = usePointerDrag<{ 46 | dirX: number; 47 | dirY: number; 48 | area: Area; 49 | }>({ 50 | preventDefault: true, 51 | stopPropagation: true, 52 | onMove: ({ x, y, deltaX, deltaY, state: { dirX, dirY, area } }) => { 53 | const rect = canvasPreviewRef.current!.getBoundingClientRect(); 54 | 55 | const newArea: Area = [...area]; 56 | 57 | if (dirX === 0 && dirY === 0) { 58 | newArea[0] = clamp( 59 | area[0] + deltaX / (rect.width / video.videoWidth), 60 | 0, 61 | video.videoWidth - area[2], 62 | ); 63 | newArea[1] = clamp( 64 | area[1] + deltaY / (rect.height / video.videoHeight), 65 | 0, 66 | video.videoHeight - area[3], 67 | ); 68 | } else { 69 | const relativeX = clamp( 70 | (x - rect.left) / (rect.width / video.videoWidth), 71 | 0, 72 | video.videoWidth, 73 | ); 74 | const relativeY = clamp( 75 | (y - rect.top) / (rect.height / video.videoHeight), 76 | 0, 77 | video.videoHeight, 78 | ); 79 | 80 | const endX = area[0] + area[2]; 81 | const endY = area[1] + area[3]; 82 | 83 | if (ratio) { 84 | const dX = dirX === -1 ? area[0] - relativeX : relativeX - endX; 85 | const dY = dirY === -1 ? area[1] - relativeY : relativeY - endY; 86 | 87 | const cX = endX - area[2] / 2; 88 | const cY = endY - area[3] / 2; 89 | 90 | const newMaxWidth = area[2] + dX; 91 | const newMaxHeight = area[3] + dY; 92 | 93 | let newWidth = MIN_CROP_SIZE; 94 | 95 | if (dirX === 0) { 96 | newWidth = Math.min( 97 | cX * 2, 98 | (video.videoWidth - cX) * 2, 99 | newMaxHeight * ratio, 100 | ); 101 | } else if (dirY === 0) { 102 | newWidth = Math.min( 103 | cY * 2 * ratio, 104 | (video.videoHeight - cY) * 2 * ratio, 105 | newMaxWidth, 106 | ); 107 | } else { 108 | const maxWidth = dirX === -1 ? endX : video.videoWidth - area[0]; 109 | const maxHeight = dirY === -1 ? endY : video.videoHeight - area[1]; 110 | 111 | newWidth = Math.max( 112 | Math.min(maxWidth, newMaxHeight * ratio), 113 | Math.min(newMaxWidth, maxHeight * ratio), 114 | ); 115 | } 116 | 117 | newWidth = Math.max( 118 | MIN_CROP_SIZE / (dirY === 0 ? 1 : ratio), 119 | newWidth, 120 | ); 121 | const newHeight = newWidth / ratio; 122 | 123 | newArea[0] -= (area[2] - newWidth) * (0.5 * dirX - 0.5); 124 | newArea[1] -= (area[3] - newHeight) * (0.5 * dirY - 0.5); 125 | newArea[2] = newWidth; 126 | newArea[3] = newHeight; 127 | } else { 128 | if (dirY === -1) { 129 | newArea[1] = Math.min(relativeY, Math.max(endY - MIN_CROP_SIZE, 0)); 130 | newArea[3] = endY - newArea[1]; 131 | } else if (dirY === 1) { 132 | newArea[3] = Math.max( 133 | relativeY - newArea[1], 134 | Math.min(MIN_CROP_SIZE, video.videoHeight), 135 | ); 136 | } 137 | 138 | if (dirX === -1) { 139 | newArea[0] = Math.min(relativeX, Math.max(endX - MIN_CROP_SIZE, 0)); 140 | newArea[2] = endX - newArea[0]; 141 | } else if (dirX === 1) { 142 | newArea[2] = Math.max( 143 | relativeX - newArea[0], 144 | Math.min(MIN_CROP_SIZE, video.videoWidth), 145 | ); 146 | } 147 | } 148 | } 149 | 150 | onChange(newArea); 151 | }, 152 | }); 153 | 154 | useEffect(() => { 155 | let updating = true; 156 | 157 | const canvas = canvasPreviewRef.current; 158 | const context = canvas?.getContext('2d'); 159 | 160 | const CANVAS_FRAME_TIME = 1000 / 30; 161 | let time = Date.now(); 162 | 163 | const update = () => { 164 | if (!updating) { 165 | return; 166 | } 167 | 168 | const now = Date.now(); 169 | const shouldDraw = 170 | now - time > CANVAS_FRAME_TIME && video.readyState === 4; 171 | 172 | if (canvas && context && shouldDraw) { 173 | time = now; 174 | context.reset(); 175 | const transform = transformRef.current; 176 | context.clearRect(0, 0, canvas.width, canvas.height); 177 | 178 | if (transform.flipH) { 179 | context.translate(canvas.width, 0); 180 | context.scale(-1, 1); 181 | } 182 | 183 | if (transform.flipV) { 184 | context.translate(0, canvas.height); 185 | context.scale(1, -1); 186 | } 187 | 188 | const area = transform.area!; 189 | 190 | if (!area) { 191 | context.drawImage(video, 0, 0, canvas.width, canvas.height); 192 | } else { 193 | context.filter = 'brightness(0.25)'; 194 | context.drawImage(video, 0, 0, canvas.width, canvas.height); 195 | 196 | const x = 197 | (transform.flipH ? video.videoWidth - area[2] - area[0] : area[0]) * 198 | (video.videoWidth / canvas.width); 199 | const y = 200 | (transform.flipV 201 | ? video.videoHeight - area[3] - area[1] 202 | : area[1]) * 203 | (video.videoHeight / canvas.height); 204 | const w = area[2] * (video.videoWidth / canvas.width); 205 | const h = area[3] * (video.videoHeight / canvas.height); 206 | 207 | context.filter = 'none'; 208 | context.drawImage(video, x, y, w, h, x, y, w, h); 209 | } 210 | } 211 | 212 | requestAnimationFrame(update); 213 | }; 214 | 215 | requestAnimationFrame(update); 216 | 217 | return () => { 218 | updating = false; 219 | }; 220 | }, [video]); 221 | 222 | const cropWidth = Math.trunc(area[2] / 2) * 2; 223 | const cropHeight = Math.trunc(area[3] / 2) * 2; 224 | 225 | return ( 226 |
227 |
228 |
229 | 258 |
259 |
260 |
261 | 267 |
276 |
277 | {cropWidth}px x {cropHeight}px 278 |
279 | 285 | 292 | 299 | 306 | 313 | 314 |
315 | {handleDirections.map(direction => ( 316 |
334 | ))} 335 |
336 |
337 |
338 |
339 | ); 340 | }; 341 | -------------------------------------------------------------------------------- /src/components/VideoTrim.module.scss: -------------------------------------------------------------------------------- 1 | .timeline { 2 | background: var(--color-interactive-dark); 3 | height: 2rem; 4 | flex: 1; 5 | 6 | position: relative; 7 | box-shadow: 0 0 20px 5px rgba(0, 0, 0, 0.2); 8 | touch-action: none; 9 | 10 | .range { 11 | position: absolute; 12 | top: 0; 13 | left: 0; 14 | right: 0; 15 | bottom: 0; 16 | background: var(--color-interactive); 17 | cursor: move; 18 | touch-action: manipulation; 19 | } 20 | 21 | .current, 22 | .handleLeft, 23 | .handleRight { 24 | position: absolute; 25 | 26 | &:after { 27 | display: none; 28 | position: absolute; 29 | bottom: -1.75rem; 30 | content: attr(data-time); 31 | z-index: 9999; 32 | color: white; 33 | font-size: 0.9rem; 34 | background: rgba(0, 0, 0, 0.3); 35 | padding: 0.25rem; 36 | font-size: 0.9rem; 37 | } 38 | 39 | &.active:after { 40 | display: block; 41 | } 42 | } 43 | 44 | .handleLeft, 45 | .handleRight { 46 | position: absolute; 47 | top: -3px; 48 | bottom: -3px; 49 | width: 1rem; 50 | border: 3px solid white; 51 | touch-action: manipulation; 52 | } 53 | 54 | .current { 55 | border-left: 3px solid white; 56 | touch-action: manipulation; 57 | top: 0; 58 | bottom: 0; 59 | transform: translate(-1.5px, 0); 60 | cursor: ew-resize; 61 | 62 | &.active:after { 63 | transform: translate(-50%, 0); 64 | } 65 | } 66 | 67 | .handleLeft { 68 | left: -3px; 69 | border-right-style: none; 70 | cursor: w-resize; 71 | 72 | &:after { 73 | left: 0; 74 | } 75 | } 76 | 77 | .handleRight { 78 | right: -3px; 79 | border-left-style: none; 80 | cursor: e-resize; 81 | 82 | &:after { 83 | right: 0; 84 | } 85 | } 86 | } 87 | 88 | .controls { 89 | display: flex; 90 | margin-bottom: 0.25rem; 91 | margin-top: 0.25rem; 92 | } 93 | -------------------------------------------------------------------------------- /src/components/VideoTrim.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef, useState } from 'react'; 2 | import { BsPlay, BsPause } from 'react-icons/bs'; 3 | import { usePointerDrag } from 'react-use-pointer-drag'; 4 | import clsx from 'clsx'; 5 | 6 | import styles from './VideoTrim.module.scss'; 7 | import { clamp, humanTime } from '../helpers'; 8 | import { Time } from '../types'; 9 | 10 | interface VideoTrimProps { 11 | onChange: (time: Time) => void; 12 | time?: Time; 13 | video: HTMLVideoElement; 14 | } 15 | 16 | const MIN_DURATION = 1; 17 | const DURATION_SNAP_FACTOR = 0.02; 18 | 19 | export const VideoTrim: React.FC = ({ 20 | onChange, 21 | video, 22 | time = [0, video.duration], 23 | }) => { 24 | const [currentTime, setCurrentTime] = useState(video.currentTime); 25 | const [playing, setPlaying] = useState(!video.paused); 26 | const ignoreTimeUpdatesRef = useRef(false); 27 | 28 | const timelineRef = useRef(null); 29 | const { dragProps, dragState } = usePointerDrag<{ 30 | direction: string; 31 | time?: Time; 32 | currentTime?: number; 33 | paused: boolean; 34 | }>({ 35 | stopPropagation: true, 36 | pointerDownStopPropagation: true, 37 | onStart: () => { 38 | video.pause(); 39 | }, 40 | onClick: ({ state, x }) => { 41 | if (state.direction !== 'move') { 42 | return; 43 | } 44 | 45 | const rect = timelineRef.current!.getBoundingClientRect(); 46 | const relativeX = 47 | clamp((x - rect.left) / rect.width, 0, 1) * video.duration; 48 | const currentTime = clamp(relativeX, state.time![0], state.time![1]); 49 | setCurrentTime(currentTime); 50 | video.currentTime = currentTime; 51 | }, 52 | onMove: ({ x, deltaX, state }) => { 53 | ignoreTimeUpdatesRef.current = true; 54 | const rect = timelineRef.current!.getBoundingClientRect(); 55 | 56 | let relativeX = 57 | clamp((x - rect.left) / rect.width, 0, 1) * video.duration; 58 | const newTime: Time = [...time]; 59 | 60 | switch (state.direction) { 61 | case 'move': 62 | { 63 | relativeX = clamp( 64 | (deltaX / rect.width) * video.duration, 65 | -1 * state.time![0], 66 | video.duration - state.time![1], 67 | ); 68 | newTime[0] = state.time![0] + relativeX; 69 | newTime[1] = state.time![1] + relativeX; 70 | 71 | const currentTime = clamp( 72 | video.currentTime, 73 | newTime[0], 74 | newTime[1], 75 | ); 76 | setCurrentTime(currentTime); 77 | video.currentTime = currentTime; 78 | } 79 | break; 80 | case 'left': 81 | newTime[0] = Math.min( 82 | relativeX, 83 | Math.max(newTime[1] - MIN_DURATION, 0), 84 | ); 85 | if ( 86 | Math.abs(newTime[0] - currentTime) <= 87 | video.duration * DURATION_SNAP_FACTOR 88 | ) { 89 | newTime[0] = currentTime; 90 | } 91 | 92 | video.currentTime = newTime[0] + 0.01; 93 | break; 94 | case 'right': 95 | newTime[1] = Math.max( 96 | relativeX, 97 | Math.min(newTime[0] + MIN_DURATION, video.duration), 98 | ); 99 | if ( 100 | Math.abs(newTime[1] - currentTime) <= 101 | video.duration * DURATION_SNAP_FACTOR 102 | ) { 103 | newTime[1] = currentTime; 104 | } 105 | 106 | video.currentTime = newTime[1]; 107 | break; 108 | case 'seek': 109 | { 110 | const currentTime = clamp( 111 | relativeX, 112 | state.time![0], 113 | state.time![1], 114 | ); 115 | setCurrentTime(currentTime); 116 | video.currentTime = currentTime; 117 | } 118 | break; 119 | } 120 | 121 | onChange(newTime); 122 | }, 123 | onEnd: ({ state }) => { 124 | ignoreTimeUpdatesRef.current = false; 125 | if (typeof state.currentTime !== 'undefined') { 126 | video.currentTime = state.currentTime; 127 | } 128 | 129 | if (!state.paused) { 130 | video.play(); 131 | } 132 | }, 133 | }); 134 | 135 | useEffect(() => { 136 | const update = () => { 137 | setPlaying(!video.paused); 138 | 139 | if (!ignoreTimeUpdatesRef.current) { 140 | setCurrentTime(video.currentTime); 141 | } 142 | }; 143 | 144 | video.addEventListener('pause', update); 145 | video.addEventListener('playing', update); 146 | video.addEventListener('play', update); 147 | video.addEventListener('timeupdate', update); 148 | 149 | return () => { 150 | video.removeEventListener('pause', update); 151 | video.removeEventListener('playing', update); 152 | video.removeEventListener('play', update); 153 | video.removeEventListener('timeupdate', update); 154 | }; 155 | }, [video, setPlaying]); 156 | 157 | return ( 158 | <> 159 |
160 | 171 |
172 |
184 |
195 |
206 |
207 |
221 |
222 |
223 | 224 | ); 225 | }; 226 | -------------------------------------------------------------------------------- /src/helpers.ts: -------------------------------------------------------------------------------- 1 | export function humanTime(time?: number): string { 2 | if (typeof time === 'undefined') { 3 | return ''; 4 | } 5 | 6 | const minutes = Math.floor(time / 60); 7 | const seconds = Math.floor(time % 60); 8 | const centiseconds = Math.floor((time * 100) % 100); 9 | 10 | return `${minutes}:${seconds.toString().padStart(2, '0')}.${centiseconds 11 | .toString() 12 | .padStart(2, '0')}`; 13 | } 14 | 15 | export function clamp(value: number, min: number, max: number) { 16 | return Math.min(Math.max(value, min), max); 17 | } 18 | -------------------------------------------------------------------------------- /src/index.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | --color-bg: #f1f1fa; 3 | --color-bg-soft: #d1d1e4; 4 | --color-fg: #222222; 5 | --color-fg-soft: #444444; 6 | --color-interactive-dark: #111111; 7 | --color-interactive: #33333a; 8 | --color-interactive-hover: #444444; 9 | } 10 | 11 | @media (prefers-color-scheme: dark) { 12 | :root { 13 | --color-bg: #11111a; 14 | --color-bg-soft: #23232a; 15 | --color-fg: #ffffff; 16 | --color-fg-soft: #eeeeee; 17 | --color-interactive-dark: #29292a; 18 | --color-interactive: #33333a; 19 | --color-interactive-hover: #444444; 20 | } 21 | } 22 | 23 | body { 24 | font-family: 25 | system-ui, 26 | -apple-system, 27 | BlinkMacSystemFont, 28 | 'Segoe UI', 29 | Roboto, 30 | Oxygen, 31 | Ubuntu, 32 | Cantarell, 33 | 'Open Sans', 34 | 'Helvetica Neue', 35 | sans-serif; 36 | background: var(--color-bg); 37 | color: var(--color-fg); 38 | overflow-x: hidden; 39 | max-width: 100vw; 40 | padding: 0; 41 | margin: 0; 42 | } 43 | 44 | * { 45 | box-sizing: border-box; 46 | user-select: none; 47 | } 48 | 49 | .app { 50 | display: flex; 51 | flex-direction: column; 52 | align-items: center; 53 | margin: 1rem; 54 | } 55 | 56 | progress { 57 | background: rgba(0, 0, 0, 0.3); 58 | border: none; 59 | border-radius: 8px; 60 | -webkit-appearance: none; 61 | -moz-appearance: none; 62 | overflow: hidden; 63 | height: 6px; 64 | display: block; 65 | margin: 4px 0; 66 | width: 100%; 67 | 68 | &::-moz-progress-bar { 69 | background-color: var(--color-interactive-hover); 70 | } 71 | 72 | &::-webkit-progress-value { 73 | background-color: var(--color-interactive-hover); 74 | } 75 | 76 | &::-webkit-progress-bar { 77 | background: rgba(0, 0, 0, 0.3); 78 | border-radius: 8px; 79 | } 80 | } 81 | 82 | button, 83 | .button { 84 | display: inline-flex; 85 | align-items: center; 86 | text-decoration: none; 87 | background: var(--color-interactive); 88 | color: white; 89 | cursor: pointer; 90 | border: none; 91 | padding: 0.4rem 1rem; 92 | height: 2rem; 93 | margin-right: 0.25rem; 94 | font-size: 0.9rem; 95 | 96 | svg { 97 | font-size: 1.2rem; 98 | } 99 | 100 | svg:not(:last-child) { 101 | margin-right: 0.25rem; 102 | } 103 | 104 | &:hover { 105 | background: #444444; 106 | } 107 | } 108 | 109 | .select { 110 | display: inline-block; 111 | background: var(--color-interactive); 112 | padding: 0 0.25rem; 113 | } 114 | 115 | select { 116 | background: var(--color-interactive); 117 | color: white; 118 | border: none; 119 | outline: none !important; 120 | padding: 0.25rem 0; 121 | height: 2rem; 122 | } 123 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | 4 | import { App } from './App.tsx'; 5 | 6 | ReactDOM.createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | , 10 | ); 11 | -------------------------------------------------------------------------------- /src/steps/Crop.module.scss: -------------------------------------------------------------------------------- 1 | .controls { 2 | display: flex; 3 | align-items: center; 4 | justify-content: space-between; 5 | 6 | button:last-child { 7 | margin-right: 0; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/steps/Crop.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { observer } from 'mobx-react-lite'; 3 | import { runInAction } from 'mobx'; 4 | import { 5 | BsCheck, 6 | BsVolumeMute, 7 | BsSymmetryVertical, 8 | BsSymmetryHorizontal, 9 | BsVolumeUp, 10 | BsArrowCounterclockwise, 11 | } from 'react-icons/bs'; 12 | 13 | import styles from './Crop.module.scss'; 14 | import { mainStore } from '../stores/main'; 15 | import { VideoCrop } from '../components/VideoCrop'; 16 | import { VideoTrim } from '../components/VideoTrim'; 17 | 18 | export const Crop: React.FC = observer(() => { 19 | const video = mainStore.video; 20 | if (!video) { 21 | return ( 22 |
23 | No video selected. 24 |
25 | ); 26 | } 27 | 28 | return ( 29 |
30 |
31 |
32 | 47 | 69 | 91 |
92 |
93 | 101 | 112 |
113 |
114 | { 118 | runInAction(() => { 119 | mainStore.transform = { 120 | ...mainStore.transform, 121 | time, 122 | }; 123 | }); 124 | }} 125 | /> 126 | 130 | runInAction(() => { 131 | mainStore.transform = { 132 | ...mainStore.transform, 133 | area, 134 | }; 135 | }) 136 | } 137 | /> 138 |
139 | ); 140 | }); 141 | -------------------------------------------------------------------------------- /src/steps/Render.module.scss: -------------------------------------------------------------------------------- 1 | .step { 2 | min-width: 0; 3 | width: 100%; 4 | max-width: 500px; 5 | 6 | progress { 7 | width: 100%; 8 | } 9 | 10 | pre { 11 | max-width: 100%; 12 | max-height: 500px; 13 | overflow-wrap: break-word; 14 | word-wrap: break-word; 15 | white-space: pre-wrap; 16 | overflow-y: auto; 17 | overflow-x: hidden; 18 | } 19 | 20 | video { 21 | max-width: 100%; 22 | } 23 | } 24 | 25 | .info, 26 | .actions { 27 | margin-bottom: 0.25rem; 28 | } 29 | 30 | .actions { 31 | display: flex; 32 | align-items: center; 33 | } 34 | -------------------------------------------------------------------------------- /src/steps/Render.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import clsx from 'clsx'; 3 | import { observer } from 'mobx-react-lite'; 4 | import { BsDownload } from 'react-icons/bs'; 5 | import { runInAction } from 'mobx'; 6 | 7 | import styles from './Render.module.scss'; 8 | import { mainStore } from '../stores/main'; 9 | import { Slider } from '../components/Slider'; 10 | 11 | export const Render: React.FC = observer(() => { 12 | const [outputUrl, setOutputUrl] = useState(); 13 | const [logVisible, setLogVisible] = useState(false); 14 | 15 | const { ffmpeg, video } = mainStore; 16 | 17 | if (!ffmpeg.loaded) { 18 | return ( 19 |
20 | FFmpeg is loading... please wait! 21 | 22 |
23 | ); 24 | } 25 | 26 | if (!video) { 27 | return ( 28 |
29 | No video selected. 30 |
31 | ); 32 | } 33 | 34 | const { area, scale = 1 } = mainStore.transform; 35 | const x = Math.trunc((scale * (area ? area[0] : 0)) / 2) * 2; 36 | const y = Math.trunc((scale * (area ? area[1] : 0)) / 2) * 2; 37 | const width = 38 | Math.trunc((scale * (area ? area[2] : video.videoWidth)) / 2) * 2; 39 | const height = 40 | Math.trunc((scale * (area ? area[3] : video.videoHeight)) / 2) * 2; 41 | 42 | const crop = async () => { 43 | setOutputUrl(undefined); 44 | 45 | const args: string[] = []; 46 | const filters: string[] = []; 47 | 48 | const { flipH, flipV, area, time, mute } = mainStore.transform; 49 | 50 | if (flipH) { 51 | filters.push('hflip'); 52 | } 53 | 54 | if (flipV) { 55 | filters.push('vflip'); 56 | } 57 | 58 | if (scale !== 1) { 59 | filters.push( 60 | `scale=${Math.trunc((video.videoWidth * scale) / 2) * 2}:${ 61 | Math.trunc((video.videoHeight * scale) / 2) * 2 62 | }`, 63 | ); 64 | } 65 | 66 | if ( 67 | area && 68 | (area[0] !== 0 || area[1] !== 0 || area[2] !== 1 || area[3] !== 1) 69 | ) { 70 | filters.push(`crop=${width}:${height}:${x}:${y}`); 71 | } 72 | 73 | // Add filters 74 | if (filters.length > 0) { 75 | args.push('-vf', filters.join(', ')); 76 | } 77 | 78 | if (time) { 79 | let start = 0; 80 | if (time[0] > 0) { 81 | start = time[0]; 82 | args.push('-ss', `${start}`); 83 | } 84 | 85 | if (time[1] < video.duration) { 86 | args.push('-t', `${time[1] - start}`); 87 | } 88 | } 89 | 90 | args.push('-c:v', 'libx264'); 91 | args.push('-preset', 'veryfast'); 92 | 93 | if (mute) { 94 | args.push('-an'); 95 | } else { 96 | args.push('-c:a', 'copy'); 97 | } 98 | 99 | const newFile = await ffmpeg.exec(mainStore.file!, args); 100 | setOutputUrl(URL.createObjectURL(newFile)); 101 | }; 102 | 103 | return ( 104 |
105 | {ffmpeg.running ? ( 106 | <> 107 |
108 | 111 |
112 |
113 | Running 114 | 115 |
{ffmpeg.output}
116 |
117 | 118 | ) : ( 119 | <> 120 |
121 |
122 | Resolution: {width}px x {height}px 123 |
124 |
125 | Scale: {Math.round(scale * 100) / 100} 126 | { 131 | runInAction(() => { 132 | mainStore.transform.scale = value; 133 | }); 134 | }} 135 | /> 136 |
137 |
138 |
139 | 142 | {outputUrl && ( 143 | 148 | 149 | Download 150 | 151 | )} 152 |
153 | 154 | )} 155 | {outputUrl && !ffmpeg.running && ( 156 |
157 |
159 | )} 160 | {!!ffmpeg.log && ( 161 |
162 | 165 | {logVisible &&
{ffmpeg.log}
} 166 |
167 | )} 168 |
169 | ); 170 | }); 171 | -------------------------------------------------------------------------------- /src/steps/SelectFile.module.scss: -------------------------------------------------------------------------------- 1 | label, 2 | .loading { 3 | position: relative; 4 | background: var(--color-interactive); 5 | color: white; 6 | border-radius: 5px; 7 | padding: 2rem; 8 | width: 20rem; 9 | text-align: center; 10 | display: block; 11 | box-shadow: 0 10px 20px -10px rgba(0, 0, 0, 0.1); 12 | 13 | &:hover { 14 | background: var(--color-interactive-hover); 15 | } 16 | 17 | input { 18 | cursor: pointer; 19 | position: absolute; 20 | inset: 0; 21 | display: block; 22 | background: transparent; 23 | opacity: 0.01; 24 | font-size: 0; 25 | } 26 | } 27 | 28 | .credits { 29 | width: 20rem; 30 | margin-top: 1rem; 31 | text-align: center; 32 | font-size: 0.9rem; 33 | 34 | ul { 35 | text-align: left; 36 | list-style-type: none; 37 | padding: 0; 38 | } 39 | 40 | div { 41 | margin-bottom: 1rem; 42 | } 43 | 44 | a { 45 | color: var(--color-fg); 46 | 47 | svg { 48 | font-size: 1.2rem; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/steps/SelectFile.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { BsGithub } from 'react-icons/bs'; 3 | import { observer } from 'mobx-react-lite'; 4 | 5 | import styles from './SelectFile.module.scss'; 6 | import { mainStore } from '../stores/main'; 7 | import { PrepareProgress } from '../components/PrepareProgress'; 8 | 9 | export const SelectFile: React.FC = observer(() => { 10 | return ( 11 |
12 | {mainStore.fileLoading ? ( 13 | 14 | ) : ( 15 | 29 | )} 30 |
31 |
    32 |
  • ✔️ Free and open source
  • 33 |
  • ✔️ Crop, trim, mirror or mute your video easily
  • 34 |
  • ✔️ No watermarks
  • 35 |
  • ✔️ Your video files stay on your computer
  • 36 |
37 |
38 | 💜 Thanks to the{' '} 39 | 44 | ffmpeg.wasm 45 | {' '} 46 | project for making this possible. 47 |
48 |
49 | 54 | 55 | 56 |
57 |
58 |
59 | ); 60 | }); 61 | -------------------------------------------------------------------------------- /src/stores/main.ts: -------------------------------------------------------------------------------- 1 | import { FFmpeg } from '@ffmpeg/ffmpeg'; 2 | import { makeAutoObservable, reaction, runInAction } from 'mobx'; 3 | import { get, set } from 'idb-keyval'; 4 | 5 | import { VideoTransform } from '../types'; 6 | 7 | const canUseMT = 8 | import.meta.env.VITE_ENABLE_MT === '1' && 'SharedArrayBuffer' in window; 9 | const ffmpegVersion = '0.12.10'; 10 | const ffmpegName = canUseMT ? 'core-mt' : 'core'; 11 | const ffmpegWorker = canUseMT ? 'ffmpeg-core.worker.js' : undefined; 12 | const ffmpegBaseURL = `https://unpkg.com/@ffmpeg/${ffmpegName}@${ffmpegVersion}/dist/esm`; 13 | 14 | async function retrieveBlob( 15 | url: string, 16 | type: string, 17 | onProgress?: (progress: number) => void, 18 | ) { 19 | let buffer = await get(url); 20 | if (!buffer) { 21 | const response = await fetch(url); 22 | const reader = response.body?.getReader(); 23 | if (!reader) { 24 | throw new Error(`Unable to fetch: ${url}`); 25 | } 26 | 27 | const contentLength = +response.headers.get('Content-Length')!; 28 | let receivedLength = 0; 29 | const chunks = []; 30 | 31 | // eslint-disable-next-line no-constant-condition 32 | while (true) { 33 | const { done, value } = await reader.read(); 34 | 35 | if (done) { 36 | break; 37 | } 38 | 39 | chunks.push(value); 40 | receivedLength += value.length; 41 | onProgress?.(receivedLength / contentLength); 42 | } 43 | 44 | buffer = await new Blob(chunks).arrayBuffer(); 45 | 46 | try { 47 | set(url, buffer); 48 | console.log(`Saved to IndexedDB: ${url}`); 49 | } catch { 50 | // 51 | } 52 | } else { 53 | console.log(`Loaded from IndexedDB: ${url}`); 54 | } 55 | 56 | const blob = new Blob([buffer], { type }); 57 | return URL.createObjectURL(blob); 58 | } 59 | 60 | class FfmpegStore { 61 | loaded = false; 62 | loadProgress = 0; 63 | ffmpeg = new FFmpeg(); 64 | 65 | running = false; 66 | execProgress = 0; 67 | outputUrl: string | undefined = undefined; 68 | output: string = ''; 69 | log: string = ''; 70 | 71 | onLoadCallback: (() => void) | undefined = undefined; 72 | 73 | constructor() { 74 | makeAutoObservable(this); 75 | 76 | this.ffmpeg.on('log', e => { 77 | console.log(e); 78 | runInAction(() => { 79 | this.output = e.message; 80 | this.log += `${e.message}\n`; 81 | }); 82 | }); 83 | 84 | this.ffmpeg.on('progress', e => { 85 | runInAction(() => { 86 | this.execProgress = e.progress; 87 | }); 88 | }); 89 | } 90 | 91 | async load() { 92 | // toBlobURL is used to bypass CORS issue, urls with the same 93 | // domain can be used directly. 94 | await this.ffmpeg.load({ 95 | coreURL: await retrieveBlob( 96 | `${ffmpegBaseURL}/ffmpeg-core.js`, 97 | 'text/javascript', 98 | ), 99 | wasmURL: await retrieveBlob( 100 | `${ffmpegBaseURL}/ffmpeg-core.wasm`, 101 | 'application/wasm', 102 | progress => { 103 | runInAction(() => { 104 | this.loadProgress = progress; 105 | }); 106 | }, 107 | ), 108 | workerURL: ffmpegWorker 109 | ? await retrieveBlob( 110 | `${ffmpegBaseURL}/${ffmpegWorker}`, 111 | 'text/javascript', 112 | ) 113 | : undefined, 114 | }); 115 | 116 | runInAction(() => { 117 | this.loadProgress = 1; 118 | this.loaded = true; 119 | 120 | if (this.onLoadCallback) { 121 | this.onLoadCallback(); 122 | this.onLoadCallback = undefined; 123 | } 124 | }); 125 | } 126 | 127 | async exec(file: File, args: string[]) { 128 | this.running = true; 129 | this.execProgress = 0; 130 | this.output = ''; 131 | 132 | try { 133 | await this.ffmpeg.writeFile( 134 | 'input', 135 | new Uint8Array(await file.arrayBuffer()), 136 | ); 137 | await this.ffmpeg.exec(['-i', 'input', ...args, 'output.mp4']); 138 | 139 | const data = (await this.ffmpeg.readFile('output.mp4')) as Uint8Array; 140 | return new File([data.buffer], 'output.mp4', { type: 'video/mp4' }); 141 | } finally { 142 | try { 143 | await this.ffmpeg.deleteFile('input'); 144 | } catch { 145 | // 146 | } 147 | try { 148 | await this.ffmpeg.deleteFile('output.mp4'); 149 | } catch { 150 | // 151 | } 152 | 153 | runInAction(() => { 154 | this.running = false; 155 | }); 156 | } 157 | } 158 | 159 | cancel() { 160 | this.ffmpeg.terminate(); 161 | this.load(); 162 | } 163 | } 164 | 165 | class MainStore { 166 | file: File | undefined = undefined; 167 | fileLoading = false; 168 | transform: VideoTransform = {}; 169 | 170 | ffmpeg = new FfmpegStore(); 171 | 172 | step = 0; 173 | video: HTMLVideoElement | undefined = undefined; 174 | 175 | constructor() { 176 | makeAutoObservable(this); 177 | this.ffmpeg.load(); 178 | 179 | reaction( 180 | () => [this.step], 181 | () => this.video?.pause(), 182 | ); 183 | } 184 | 185 | reset() { 186 | this.transform = {}; 187 | 188 | if (this.video) { 189 | this.video.pause(); 190 | this.video.currentTime = 0.1; 191 | } 192 | } 193 | 194 | async loadVideo(file: File) { 195 | this.video?.pause(); 196 | this.video = undefined; 197 | this.file = file; 198 | this.fileLoading = true; 199 | this.ffmpeg.onLoadCallback = undefined; 200 | this.reset(); 201 | 202 | const video = document.createElement('video'); 203 | if (!video.canPlayType(file.type)) { 204 | const remux = async () => { 205 | const newFile = await this.ffmpeg.exec(file, [ 206 | '-c:v', 207 | 'copy', 208 | '-c:a', 209 | 'copy', 210 | ]); 211 | if (newFile) { 212 | this.loadVideo(newFile); 213 | } else { 214 | // TODO: Error handling. 215 | runInAction(() => { 216 | this.fileLoading = false; 217 | }); 218 | } 219 | }; 220 | if (this.ffmpeg.loaded) { 221 | remux(); 222 | } else { 223 | this.ffmpeg.onLoadCallback = remux; 224 | } 225 | return; 226 | } 227 | 228 | video.setAttribute('playsinline', ''); 229 | video.preload = 'metadata'; 230 | video.autoplay = false; 231 | 232 | // Required when using a Service Worker on iOS Safari. 233 | video.crossOrigin = 'anonymous'; 234 | 235 | video.addEventListener('loadedmetadata', () => { 236 | runInAction(() => { 237 | video.currentTime = 0.01; 238 | this.video = video; 239 | }); 240 | }); 241 | 242 | video.addEventListener('canplay', () => { 243 | if (this.fileLoading) { 244 | this.fileLoading = false; 245 | this.step = 1; 246 | } 247 | }); 248 | 249 | video.addEventListener('ended', () => { 250 | const start = this.transform.time?.[0] || 0; 251 | video.currentTime = start; 252 | }); 253 | 254 | video.addEventListener('timeupdate', () => { 255 | const start = this.transform.time?.[0] || 0; 256 | const end = this.transform.time?.[1] || video.duration; 257 | 258 | if (video.currentTime > end) { 259 | video.currentTime = start; 260 | } else if (video.currentTime < start - 1) { 261 | video.currentTime = start; 262 | } 263 | }); 264 | 265 | video.src = URL.createObjectURL(file); 266 | } 267 | } 268 | 269 | export const mainStore = new MainStore(); 270 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type Time = [start: number, end: number]; 2 | export type Area = [x: number, y: number, width: number, height: number]; 3 | 4 | export interface VideoTransform { 5 | time?: Time; 6 | area?: Area; 7 | mute?: boolean; 8 | flipH?: boolean; 9 | flipV?: boolean; 10 | scale?: number; 11 | } 12 | 13 | /** 14 | * Width / height 15 | */ 16 | export type Ratio = number; 17 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"], 24 | "references": [{ "path": "./tsconfig.node.json" }] 25 | } 26 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /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(({ mode }) => ({ 6 | build: { 7 | assetsInlineLimit: 0, 8 | }, 9 | plugins: [ 10 | react(), 11 | { 12 | name: 'configure-sharedarraybuffer', 13 | configureServer: server => { 14 | server.middlewares.use((_req, res, next) => { 15 | res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp'); 16 | res.setHeader('Cross-Origin-Opener-Policy', 'same-origin'); 17 | next(); 18 | }); 19 | }, 20 | }, 21 | ], 22 | optimizeDeps: { 23 | exclude: ['@ffmpeg/ffmpeg'], 24 | }, 25 | resolve: 26 | mode === 'production' 27 | ? { 28 | // Enables MobX production build 29 | mainFields: ['jsnext:main', 'module', 'main'], 30 | } 31 | : undefined, 32 | })); 33 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@aashutoshrathi/word-wrap@^1.2.3": 6 | version "1.2.6" 7 | resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" 8 | integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== 9 | 10 | "@ampproject/remapping@^2.2.0": 11 | version "2.2.1" 12 | resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" 13 | integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== 14 | dependencies: 15 | "@jridgewell/gen-mapping" "^0.3.0" 16 | "@jridgewell/trace-mapping" "^0.3.9" 17 | 18 | "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": 19 | version "7.26.2" 20 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" 21 | integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== 22 | dependencies: 23 | "@babel/helper-validator-identifier" "^7.25.9" 24 | js-tokens "^4.0.0" 25 | picocolors "^1.0.0" 26 | 27 | "@babel/compat-data@^7.26.5": 28 | version "7.26.5" 29 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" 30 | integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== 31 | 32 | "@babel/core@^7.26.0": 33 | version "7.26.7" 34 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" 35 | integrity sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA== 36 | dependencies: 37 | "@ampproject/remapping" "^2.2.0" 38 | "@babel/code-frame" "^7.26.2" 39 | "@babel/generator" "^7.26.5" 40 | "@babel/helper-compilation-targets" "^7.26.5" 41 | "@babel/helper-module-transforms" "^7.26.0" 42 | "@babel/helpers" "^7.26.7" 43 | "@babel/parser" "^7.26.7" 44 | "@babel/template" "^7.25.9" 45 | "@babel/traverse" "^7.26.7" 46 | "@babel/types" "^7.26.7" 47 | convert-source-map "^2.0.0" 48 | debug "^4.1.0" 49 | gensync "^1.0.0-beta.2" 50 | json5 "^2.2.3" 51 | semver "^6.3.1" 52 | 53 | "@babel/generator@^7.26.5": 54 | version "7.26.5" 55 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" 56 | integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== 57 | dependencies: 58 | "@babel/parser" "^7.26.5" 59 | "@babel/types" "^7.26.5" 60 | "@jridgewell/gen-mapping" "^0.3.5" 61 | "@jridgewell/trace-mapping" "^0.3.25" 62 | jsesc "^3.0.2" 63 | 64 | "@babel/helper-compilation-targets@^7.26.5": 65 | version "7.26.5" 66 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" 67 | integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== 68 | dependencies: 69 | "@babel/compat-data" "^7.26.5" 70 | "@babel/helper-validator-option" "^7.25.9" 71 | browserslist "^4.24.0" 72 | lru-cache "^5.1.1" 73 | semver "^6.3.1" 74 | 75 | "@babel/helper-module-imports@^7.25.9": 76 | version "7.25.9" 77 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" 78 | integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== 79 | dependencies: 80 | "@babel/traverse" "^7.25.9" 81 | "@babel/types" "^7.25.9" 82 | 83 | "@babel/helper-module-transforms@^7.26.0": 84 | version "7.26.0" 85 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" 86 | integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== 87 | dependencies: 88 | "@babel/helper-module-imports" "^7.25.9" 89 | "@babel/helper-validator-identifier" "^7.25.9" 90 | "@babel/traverse" "^7.25.9" 91 | 92 | "@babel/helper-plugin-utils@^7.25.9": 93 | version "7.26.5" 94 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" 95 | integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== 96 | 97 | "@babel/helper-string-parser@^7.25.9": 98 | version "7.25.9" 99 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" 100 | integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== 101 | 102 | "@babel/helper-validator-identifier@^7.25.9": 103 | version "7.25.9" 104 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" 105 | integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== 106 | 107 | "@babel/helper-validator-option@^7.25.9": 108 | version "7.25.9" 109 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" 110 | integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== 111 | 112 | "@babel/helpers@^7.26.7": 113 | version "7.26.7" 114 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4" 115 | integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== 116 | dependencies: 117 | "@babel/template" "^7.25.9" 118 | "@babel/types" "^7.26.7" 119 | 120 | "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": 121 | version "7.26.7" 122 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" 123 | integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== 124 | dependencies: 125 | "@babel/types" "^7.26.7" 126 | 127 | "@babel/plugin-transform-react-jsx-self@^7.25.9": 128 | version "7.25.9" 129 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" 130 | integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg== 131 | dependencies: 132 | "@babel/helper-plugin-utils" "^7.25.9" 133 | 134 | "@babel/plugin-transform-react-jsx-source@^7.25.9": 135 | version "7.25.9" 136 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" 137 | integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg== 138 | dependencies: 139 | "@babel/helper-plugin-utils" "^7.25.9" 140 | 141 | "@babel/template@^7.25.9": 142 | version "7.25.9" 143 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" 144 | integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== 145 | dependencies: 146 | "@babel/code-frame" "^7.25.9" 147 | "@babel/parser" "^7.25.9" 148 | "@babel/types" "^7.25.9" 149 | 150 | "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.7": 151 | version "7.26.7" 152 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" 153 | integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== 154 | dependencies: 155 | "@babel/code-frame" "^7.26.2" 156 | "@babel/generator" "^7.26.5" 157 | "@babel/parser" "^7.26.7" 158 | "@babel/template" "^7.25.9" 159 | "@babel/types" "^7.26.7" 160 | debug "^4.3.1" 161 | globals "^11.1.0" 162 | 163 | "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.5", "@babel/types@^7.26.7": 164 | version "7.26.7" 165 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" 166 | integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== 167 | dependencies: 168 | "@babel/helper-string-parser" "^7.25.9" 169 | "@babel/helper-validator-identifier" "^7.25.9" 170 | 171 | "@bufbuild/protobuf@^2.0.0": 172 | version "2.2.3" 173 | resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-2.2.3.tgz#9cd136f6b687e63e9b517b3a54211ece942897ee" 174 | integrity sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg== 175 | 176 | "@esbuild/aix-ppc64@0.24.2": 177 | version "0.24.2" 178 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" 179 | integrity sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== 180 | 181 | "@esbuild/android-arm64@0.24.2": 182 | version "0.24.2" 183 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" 184 | integrity sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== 185 | 186 | "@esbuild/android-arm@0.24.2": 187 | version "0.24.2" 188 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" 189 | integrity sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== 190 | 191 | "@esbuild/android-x64@0.24.2": 192 | version "0.24.2" 193 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" 194 | integrity sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== 195 | 196 | "@esbuild/darwin-arm64@0.24.2": 197 | version "0.24.2" 198 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" 199 | integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== 200 | 201 | "@esbuild/darwin-x64@0.24.2": 202 | version "0.24.2" 203 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" 204 | integrity sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== 205 | 206 | "@esbuild/freebsd-arm64@0.24.2": 207 | version "0.24.2" 208 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" 209 | integrity sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== 210 | 211 | "@esbuild/freebsd-x64@0.24.2": 212 | version "0.24.2" 213 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" 214 | integrity sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== 215 | 216 | "@esbuild/linux-arm64@0.24.2": 217 | version "0.24.2" 218 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" 219 | integrity sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== 220 | 221 | "@esbuild/linux-arm@0.24.2": 222 | version "0.24.2" 223 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" 224 | integrity sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== 225 | 226 | "@esbuild/linux-ia32@0.24.2": 227 | version "0.24.2" 228 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" 229 | integrity sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== 230 | 231 | "@esbuild/linux-loong64@0.24.2": 232 | version "0.24.2" 233 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" 234 | integrity sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== 235 | 236 | "@esbuild/linux-mips64el@0.24.2": 237 | version "0.24.2" 238 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" 239 | integrity sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== 240 | 241 | "@esbuild/linux-ppc64@0.24.2": 242 | version "0.24.2" 243 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" 244 | integrity sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== 245 | 246 | "@esbuild/linux-riscv64@0.24.2": 247 | version "0.24.2" 248 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" 249 | integrity sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== 250 | 251 | "@esbuild/linux-s390x@0.24.2": 252 | version "0.24.2" 253 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" 254 | integrity sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== 255 | 256 | "@esbuild/linux-x64@0.24.2": 257 | version "0.24.2" 258 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" 259 | integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== 260 | 261 | "@esbuild/netbsd-arm64@0.24.2": 262 | version "0.24.2" 263 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz#65f19161432bafb3981f5f20a7ff45abb2e708e6" 264 | integrity sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== 265 | 266 | "@esbuild/netbsd-x64@0.24.2": 267 | version "0.24.2" 268 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" 269 | integrity sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== 270 | 271 | "@esbuild/openbsd-arm64@0.24.2": 272 | version "0.24.2" 273 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" 274 | integrity sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== 275 | 276 | "@esbuild/openbsd-x64@0.24.2": 277 | version "0.24.2" 278 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" 279 | integrity sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== 280 | 281 | "@esbuild/sunos-x64@0.24.2": 282 | version "0.24.2" 283 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" 284 | integrity sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== 285 | 286 | "@esbuild/win32-arm64@0.24.2": 287 | version "0.24.2" 288 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" 289 | integrity sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== 290 | 291 | "@esbuild/win32-ia32@0.24.2": 292 | version "0.24.2" 293 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" 294 | integrity sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== 295 | 296 | "@esbuild/win32-x64@0.24.2": 297 | version "0.24.2" 298 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" 299 | integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== 300 | 301 | "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": 302 | version "4.4.0" 303 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 304 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 305 | dependencies: 306 | eslint-visitor-keys "^3.3.0" 307 | 308 | "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": 309 | version "4.8.0" 310 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" 311 | integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== 312 | 313 | "@eslint/eslintrc@^2.1.2": 314 | version "2.1.2" 315 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" 316 | integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== 317 | dependencies: 318 | ajv "^6.12.4" 319 | debug "^4.3.2" 320 | espree "^9.6.0" 321 | globals "^13.19.0" 322 | ignore "^5.2.0" 323 | import-fresh "^3.2.1" 324 | js-yaml "^4.1.0" 325 | minimatch "^3.1.2" 326 | strip-json-comments "^3.1.1" 327 | 328 | "@eslint/js@8.48.0": 329 | version "8.48.0" 330 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" 331 | integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== 332 | 333 | "@ffmpeg/ffmpeg@^0.12.15": 334 | version "0.12.15" 335 | resolved "https://registry.yarnpkg.com/@ffmpeg/ffmpeg/-/ffmpeg-0.12.15.tgz#e5b05c2b5c946f3464b3aa85461e4654a4649d80" 336 | integrity sha512-1C8Obr4GsN3xw+/1Ww6PFM84wSQAGsdoTuTWPOj2OizsRDLT4CXTaVjPhkw6ARyDus1B9X/L2LiXHqYYsGnRFw== 337 | dependencies: 338 | "@ffmpeg/types" "^0.12.4" 339 | 340 | "@ffmpeg/types@^0.12.4": 341 | version "0.12.4" 342 | resolved "https://registry.yarnpkg.com/@ffmpeg/types/-/types-0.12.4.tgz#aecd9b1a035882ee0bdf8853af37271a3b447473" 343 | integrity sha512-k9vJQNBGTxE5AhYDtOYR5rO5fKsspbg51gbcwtbkw2lCdoIILzklulcjJfIDwrtn7XhDeF2M+THwJ2FGrLeV6A== 344 | 345 | "@ffmpeg/util@^0.12.2": 346 | version "0.12.2" 347 | resolved "https://registry.yarnpkg.com/@ffmpeg/util/-/util-0.12.2.tgz#6bab9d8022a5bed9a6ff0933e5235b9b38698599" 348 | integrity sha512-ouyoW+4JB7WxjeZ2y6KpRvB+dLp7Cp4ro8z0HIVpZVCM7AwFlHa0c4R8Y/a4M3wMqATpYKhC7lSFHQ0T11MEDw== 349 | 350 | "@humanwhocodes/config-array@^0.11.10": 351 | version "0.11.11" 352 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" 353 | integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== 354 | dependencies: 355 | "@humanwhocodes/object-schema" "^1.2.1" 356 | debug "^4.1.1" 357 | minimatch "^3.0.5" 358 | 359 | "@humanwhocodes/module-importer@^1.0.1": 360 | version "1.0.1" 361 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 362 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 363 | 364 | "@humanwhocodes/object-schema@^1.2.1": 365 | version "1.2.1" 366 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 367 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 368 | 369 | "@jridgewell/gen-mapping@^0.3.0": 370 | version "0.3.3" 371 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" 372 | integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== 373 | dependencies: 374 | "@jridgewell/set-array" "^1.0.1" 375 | "@jridgewell/sourcemap-codec" "^1.4.10" 376 | "@jridgewell/trace-mapping" "^0.3.9" 377 | 378 | "@jridgewell/gen-mapping@^0.3.5": 379 | version "0.3.8" 380 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" 381 | integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== 382 | dependencies: 383 | "@jridgewell/set-array" "^1.2.1" 384 | "@jridgewell/sourcemap-codec" "^1.4.10" 385 | "@jridgewell/trace-mapping" "^0.3.24" 386 | 387 | "@jridgewell/resolve-uri@^3.1.0": 388 | version "3.1.1" 389 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" 390 | integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== 391 | 392 | "@jridgewell/set-array@^1.0.1": 393 | version "1.1.2" 394 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 395 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 396 | 397 | "@jridgewell/set-array@^1.2.1": 398 | version "1.2.1" 399 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" 400 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 401 | 402 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 403 | version "1.4.15" 404 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 405 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 406 | 407 | "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": 408 | version "0.3.25" 409 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" 410 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 411 | dependencies: 412 | "@jridgewell/resolve-uri" "^3.1.0" 413 | "@jridgewell/sourcemap-codec" "^1.4.14" 414 | 415 | "@jridgewell/trace-mapping@^0.3.9": 416 | version "0.3.19" 417 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" 418 | integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== 419 | dependencies: 420 | "@jridgewell/resolve-uri" "^3.1.0" 421 | "@jridgewell/sourcemap-codec" "^1.4.14" 422 | 423 | "@nodelib/fs.scandir@2.1.5": 424 | version "2.1.5" 425 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 426 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 427 | dependencies: 428 | "@nodelib/fs.stat" "2.0.5" 429 | run-parallel "^1.1.9" 430 | 431 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 432 | version "2.0.5" 433 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 434 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 435 | 436 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 437 | version "1.2.8" 438 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 439 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 440 | dependencies: 441 | "@nodelib/fs.scandir" "2.1.5" 442 | fastq "^1.6.0" 443 | 444 | "@rollup/rollup-android-arm-eabi@4.32.1": 445 | version "4.32.1" 446 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz#c18bad635ba24220a6c8cc427ab2cab12e1531a3" 447 | integrity sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA== 448 | 449 | "@rollup/rollup-android-arm64@4.32.1": 450 | version "4.32.1" 451 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz#b5c00344b80f20889b72bfe65d3c209cef247362" 452 | integrity sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q== 453 | 454 | "@rollup/rollup-darwin-arm64@4.32.1": 455 | version "4.32.1" 456 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz#78e5358d4a2a08c090f75dd87fa2eada42eca1e5" 457 | integrity sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA== 458 | 459 | "@rollup/rollup-darwin-x64@4.32.1": 460 | version "4.32.1" 461 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz#c04c9e173244d44de50278f3f893fb68d987fcc6" 462 | integrity sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q== 463 | 464 | "@rollup/rollup-freebsd-arm64@4.32.1": 465 | version "4.32.1" 466 | resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz#3bdf18d4ef32dcfe9b20bba18d7a53a101ed79d9" 467 | integrity sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA== 468 | 469 | "@rollup/rollup-freebsd-x64@4.32.1": 470 | version "4.32.1" 471 | resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz#35867b15c276f4b4ca8eb226f7dd6df8c64640db" 472 | integrity sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw== 473 | 474 | "@rollup/rollup-linux-arm-gnueabihf@4.32.1": 475 | version "4.32.1" 476 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz#92c212d1b38c105bd1eb101254722d27d869b1ac" 477 | integrity sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g== 478 | 479 | "@rollup/rollup-linux-arm-musleabihf@4.32.1": 480 | version "4.32.1" 481 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz#ebb94d8cd438f23e38caa4a87ca80d4cf5b50fa1" 482 | integrity sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q== 483 | 484 | "@rollup/rollup-linux-arm64-gnu@4.32.1": 485 | version "4.32.1" 486 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz#ce6a5eacbd5fd4bdf7bf27bd818980230bdb9fab" 487 | integrity sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw== 488 | 489 | "@rollup/rollup-linux-arm64-musl@4.32.1": 490 | version "4.32.1" 491 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz#31b4e0a543607e6eb4f982ffb45830919a952a83" 492 | integrity sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw== 493 | 494 | "@rollup/rollup-linux-loongarch64-gnu@4.32.1": 495 | version "4.32.1" 496 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz#ad7b35f193f1d2e0dc37eba733069b4af5f6498d" 497 | integrity sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw== 498 | 499 | "@rollup/rollup-linux-powerpc64le-gnu@4.32.1": 500 | version "4.32.1" 501 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz#b713a55d7eac4d2c8a0109c3daca6ea85fc178b3" 502 | integrity sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg== 503 | 504 | "@rollup/rollup-linux-riscv64-gnu@4.32.1": 505 | version "4.32.1" 506 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz#bea4fd8ad190e9bc1d11efafa2efc9d121f50b96" 507 | integrity sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g== 508 | 509 | "@rollup/rollup-linux-s390x-gnu@4.32.1": 510 | version "4.32.1" 511 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz#cc98c32733ca472635759c78a79b5f8d887b2a6a" 512 | integrity sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ== 513 | 514 | "@rollup/rollup-linux-x64-gnu@4.32.1": 515 | version "4.32.1" 516 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz#5c009c264a7ce0e19b40890ca9945440bb420691" 517 | integrity sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg== 518 | 519 | "@rollup/rollup-linux-x64-musl@4.32.1": 520 | version "4.32.1" 521 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz#73d2f44070c23e031262b601927fdb4eec253bc1" 522 | integrity sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA== 523 | 524 | "@rollup/rollup-win32-arm64-msvc@4.32.1": 525 | version "4.32.1" 526 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz#fa106304818078f9d3fc9005642ad99f596eed2d" 527 | integrity sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ== 528 | 529 | "@rollup/rollup-win32-ia32-msvc@4.32.1": 530 | version "4.32.1" 531 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz#a1a394c705a0d2a974a124c4b471fc1cf851a56f" 532 | integrity sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ== 533 | 534 | "@rollup/rollup-win32-x64-msvc@4.32.1": 535 | version "4.32.1" 536 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz#512db088df67afee8f07183cdf8c9eecd64f6ef8" 537 | integrity sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q== 538 | 539 | "@types/babel__core@^7.20.5": 540 | version "7.20.5" 541 | resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" 542 | integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== 543 | dependencies: 544 | "@babel/parser" "^7.20.7" 545 | "@babel/types" "^7.20.7" 546 | "@types/babel__generator" "*" 547 | "@types/babel__template" "*" 548 | "@types/babel__traverse" "*" 549 | 550 | "@types/babel__generator@*": 551 | version "7.6.8" 552 | resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" 553 | integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== 554 | dependencies: 555 | "@babel/types" "^7.0.0" 556 | 557 | "@types/babel__template@*": 558 | version "7.4.4" 559 | resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" 560 | integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== 561 | dependencies: 562 | "@babel/parser" "^7.1.0" 563 | "@babel/types" "^7.0.0" 564 | 565 | "@types/babel__traverse@*": 566 | version "7.20.6" 567 | resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" 568 | integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== 569 | dependencies: 570 | "@babel/types" "^7.20.7" 571 | 572 | "@types/estree@1.0.6": 573 | version "1.0.6" 574 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" 575 | integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== 576 | 577 | "@types/json-schema@^7.0.12": 578 | version "7.0.12" 579 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" 580 | integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== 581 | 582 | "@types/prop-types@*": 583 | version "15.7.5" 584 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" 585 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 586 | 587 | "@types/react-dom@^18.2.7": 588 | version "18.2.7" 589 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" 590 | integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== 591 | dependencies: 592 | "@types/react" "*" 593 | 594 | "@types/react@*", "@types/react@^18.2.15": 595 | version "18.2.21" 596 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9" 597 | integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== 598 | dependencies: 599 | "@types/prop-types" "*" 600 | "@types/scheduler" "*" 601 | csstype "^3.0.2" 602 | 603 | "@types/scheduler@*": 604 | version "0.16.3" 605 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" 606 | integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== 607 | 608 | "@types/semver@^7.5.0": 609 | version "7.5.1" 610 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" 611 | integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== 612 | 613 | "@typescript-eslint/eslint-plugin@^6.0.0": 614 | version "6.6.0" 615 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz#19ba09aa34fd504696445100262e5a9e1b1d7024" 616 | integrity sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA== 617 | dependencies: 618 | "@eslint-community/regexpp" "^4.5.1" 619 | "@typescript-eslint/scope-manager" "6.6.0" 620 | "@typescript-eslint/type-utils" "6.6.0" 621 | "@typescript-eslint/utils" "6.6.0" 622 | "@typescript-eslint/visitor-keys" "6.6.0" 623 | debug "^4.3.4" 624 | graphemer "^1.4.0" 625 | ignore "^5.2.4" 626 | natural-compare "^1.4.0" 627 | semver "^7.5.4" 628 | ts-api-utils "^1.0.1" 629 | 630 | "@typescript-eslint/parser@^6.0.0": 631 | version "6.6.0" 632 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.6.0.tgz#fe323a7b4eafb6d5ea82b96216561810394a739e" 633 | integrity sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w== 634 | dependencies: 635 | "@typescript-eslint/scope-manager" "6.6.0" 636 | "@typescript-eslint/types" "6.6.0" 637 | "@typescript-eslint/typescript-estree" "6.6.0" 638 | "@typescript-eslint/visitor-keys" "6.6.0" 639 | debug "^4.3.4" 640 | 641 | "@typescript-eslint/scope-manager@6.6.0": 642 | version "6.6.0" 643 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz#57105d4419d6de971f7d2c30a2ff4ac40003f61a" 644 | integrity sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw== 645 | dependencies: 646 | "@typescript-eslint/types" "6.6.0" 647 | "@typescript-eslint/visitor-keys" "6.6.0" 648 | 649 | "@typescript-eslint/type-utils@6.6.0": 650 | version "6.6.0" 651 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.6.0.tgz#14f651d13b884915c4fca0d27adeb652a4499e86" 652 | integrity sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg== 653 | dependencies: 654 | "@typescript-eslint/typescript-estree" "6.6.0" 655 | "@typescript-eslint/utils" "6.6.0" 656 | debug "^4.3.4" 657 | ts-api-utils "^1.0.1" 658 | 659 | "@typescript-eslint/types@6.6.0": 660 | version "6.6.0" 661 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.6.0.tgz#95e7ea650a2b28bc5af5ea8907114a48f54618c2" 662 | integrity sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg== 663 | 664 | "@typescript-eslint/typescript-estree@6.6.0": 665 | version "6.6.0" 666 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz#373c420d2e12c28220f4a83352280a04823a91b7" 667 | integrity sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA== 668 | dependencies: 669 | "@typescript-eslint/types" "6.6.0" 670 | "@typescript-eslint/visitor-keys" "6.6.0" 671 | debug "^4.3.4" 672 | globby "^11.1.0" 673 | is-glob "^4.0.3" 674 | semver "^7.5.4" 675 | ts-api-utils "^1.0.1" 676 | 677 | "@typescript-eslint/utils@6.6.0": 678 | version "6.6.0" 679 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.6.0.tgz#2d686c0f0786da6362d909e27a9de1c13ba2e7dc" 680 | integrity sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw== 681 | dependencies: 682 | "@eslint-community/eslint-utils" "^4.4.0" 683 | "@types/json-schema" "^7.0.12" 684 | "@types/semver" "^7.5.0" 685 | "@typescript-eslint/scope-manager" "6.6.0" 686 | "@typescript-eslint/types" "6.6.0" 687 | "@typescript-eslint/typescript-estree" "6.6.0" 688 | semver "^7.5.4" 689 | 690 | "@typescript-eslint/visitor-keys@6.6.0": 691 | version "6.6.0" 692 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz#1109088b4346c8b2446f3845db526374d9a3bafc" 693 | integrity sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ== 694 | dependencies: 695 | "@typescript-eslint/types" "6.6.0" 696 | eslint-visitor-keys "^3.4.1" 697 | 698 | "@vitejs/plugin-react@^4.3.4": 699 | version "4.3.4" 700 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz#c64be10b54c4640135a5b28a2432330e88ad7c20" 701 | integrity sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug== 702 | dependencies: 703 | "@babel/core" "^7.26.0" 704 | "@babel/plugin-transform-react-jsx-self" "^7.25.9" 705 | "@babel/plugin-transform-react-jsx-source" "^7.25.9" 706 | "@types/babel__core" "^7.20.5" 707 | react-refresh "^0.14.2" 708 | 709 | acorn-jsx@^5.3.2: 710 | version "5.3.2" 711 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 712 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 713 | 714 | acorn@^8.9.0: 715 | version "8.10.0" 716 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" 717 | integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== 718 | 719 | ajv@^6.12.4: 720 | version "6.12.6" 721 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 722 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 723 | dependencies: 724 | fast-deep-equal "^3.1.1" 725 | fast-json-stable-stringify "^2.0.0" 726 | json-schema-traverse "^0.4.1" 727 | uri-js "^4.2.2" 728 | 729 | ansi-escapes@^5.0.0: 730 | version "5.0.0" 731 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" 732 | integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== 733 | dependencies: 734 | type-fest "^1.0.2" 735 | 736 | ansi-regex@^5.0.1: 737 | version "5.0.1" 738 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 739 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 740 | 741 | ansi-regex@^6.0.1: 742 | version "6.0.1" 743 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" 744 | integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== 745 | 746 | ansi-styles@^4.1.0: 747 | version "4.3.0" 748 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 749 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 750 | dependencies: 751 | color-convert "^2.0.1" 752 | 753 | ansi-styles@^6.0.0, ansi-styles@^6.1.0: 754 | version "6.2.1" 755 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" 756 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 757 | 758 | argparse@^2.0.1: 759 | version "2.0.1" 760 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 761 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 762 | 763 | array-union@^2.1.0: 764 | version "2.1.0" 765 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 766 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 767 | 768 | balanced-match@^1.0.0: 769 | version "1.0.2" 770 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 771 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 772 | 773 | brace-expansion@^1.1.7: 774 | version "1.1.11" 775 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 776 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 777 | dependencies: 778 | balanced-match "^1.0.0" 779 | concat-map "0.0.1" 780 | 781 | braces@^3.0.2: 782 | version "3.0.2" 783 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 784 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 785 | dependencies: 786 | fill-range "^7.0.1" 787 | 788 | browserslist@^4.24.0: 789 | version "4.24.4" 790 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" 791 | integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== 792 | dependencies: 793 | caniuse-lite "^1.0.30001688" 794 | electron-to-chromium "^1.5.73" 795 | node-releases "^2.0.19" 796 | update-browserslist-db "^1.1.1" 797 | 798 | buffer-builder@^0.2.0: 799 | version "0.2.0" 800 | resolved "https://registry.yarnpkg.com/buffer-builder/-/buffer-builder-0.2.0.tgz#3322cd307d8296dab1f604618593b261a3fade8f" 801 | integrity sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg== 802 | 803 | callsites@^3.0.0: 804 | version "3.1.0" 805 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 806 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 807 | 808 | caniuse-lite@^1.0.30001688: 809 | version "1.0.30001696" 810 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz#00c30a2fc11e3c98c25e5125418752af3ae2f49f" 811 | integrity sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ== 812 | 813 | chalk@5.3.0: 814 | version "5.3.0" 815 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" 816 | integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== 817 | 818 | chalk@^4.0.0: 819 | version "4.1.2" 820 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 821 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 822 | dependencies: 823 | ansi-styles "^4.1.0" 824 | supports-color "^7.1.0" 825 | 826 | cli-cursor@^4.0.0: 827 | version "4.0.0" 828 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" 829 | integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== 830 | dependencies: 831 | restore-cursor "^4.0.0" 832 | 833 | cli-truncate@^3.1.0: 834 | version "3.1.0" 835 | resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" 836 | integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== 837 | dependencies: 838 | slice-ansi "^5.0.0" 839 | string-width "^5.0.0" 840 | 841 | clsx@^2.0.0: 842 | version "2.0.0" 843 | resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" 844 | integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== 845 | 846 | color-convert@^2.0.1: 847 | version "2.0.1" 848 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 849 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 850 | dependencies: 851 | color-name "~1.1.4" 852 | 853 | color-name@~1.1.4: 854 | version "1.1.4" 855 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 856 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 857 | 858 | colorette@^2.0.20: 859 | version "2.0.20" 860 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" 861 | integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== 862 | 863 | colorjs.io@^0.5.0: 864 | version "0.5.2" 865 | resolved "https://registry.yarnpkg.com/colorjs.io/-/colorjs.io-0.5.2.tgz#63b20139b007591ebc3359932bef84628eb3fcef" 866 | integrity sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw== 867 | 868 | commander@11.0.0: 869 | version "11.0.0" 870 | resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" 871 | integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== 872 | 873 | concat-map@0.0.1: 874 | version "0.0.1" 875 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 876 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 877 | 878 | convert-source-map@^2.0.0: 879 | version "2.0.0" 880 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" 881 | integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== 882 | 883 | cross-spawn@^7.0.2, cross-spawn@^7.0.3: 884 | version "7.0.3" 885 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 886 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 887 | dependencies: 888 | path-key "^3.1.0" 889 | shebang-command "^2.0.0" 890 | which "^2.0.1" 891 | 892 | csstype@^3.0.2: 893 | version "3.1.2" 894 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" 895 | integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== 896 | 897 | debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: 898 | version "4.3.4" 899 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 900 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 901 | dependencies: 902 | ms "2.1.2" 903 | 904 | debug@^4.3.1: 905 | version "4.4.0" 906 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" 907 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 908 | dependencies: 909 | ms "^2.1.3" 910 | 911 | deep-is@^0.1.3: 912 | version "0.1.4" 913 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 914 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 915 | 916 | dir-glob@^3.0.1: 917 | version "3.0.1" 918 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 919 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 920 | dependencies: 921 | path-type "^4.0.0" 922 | 923 | doctrine@^3.0.0: 924 | version "3.0.0" 925 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 926 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 927 | dependencies: 928 | esutils "^2.0.2" 929 | 930 | eastasianwidth@^0.2.0: 931 | version "0.2.0" 932 | resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" 933 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 934 | 935 | electron-to-chromium@^1.5.73: 936 | version "1.5.90" 937 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz#4717e5a5413f95bbb12d0af14c35057e9c65e0b6" 938 | integrity sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug== 939 | 940 | emoji-regex@^9.2.2: 941 | version "9.2.2" 942 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 943 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 944 | 945 | esbuild@^0.24.2: 946 | version "0.24.2" 947 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" 948 | integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== 949 | optionalDependencies: 950 | "@esbuild/aix-ppc64" "0.24.2" 951 | "@esbuild/android-arm" "0.24.2" 952 | "@esbuild/android-arm64" "0.24.2" 953 | "@esbuild/android-x64" "0.24.2" 954 | "@esbuild/darwin-arm64" "0.24.2" 955 | "@esbuild/darwin-x64" "0.24.2" 956 | "@esbuild/freebsd-arm64" "0.24.2" 957 | "@esbuild/freebsd-x64" "0.24.2" 958 | "@esbuild/linux-arm" "0.24.2" 959 | "@esbuild/linux-arm64" "0.24.2" 960 | "@esbuild/linux-ia32" "0.24.2" 961 | "@esbuild/linux-loong64" "0.24.2" 962 | "@esbuild/linux-mips64el" "0.24.2" 963 | "@esbuild/linux-ppc64" "0.24.2" 964 | "@esbuild/linux-riscv64" "0.24.2" 965 | "@esbuild/linux-s390x" "0.24.2" 966 | "@esbuild/linux-x64" "0.24.2" 967 | "@esbuild/netbsd-arm64" "0.24.2" 968 | "@esbuild/netbsd-x64" "0.24.2" 969 | "@esbuild/openbsd-arm64" "0.24.2" 970 | "@esbuild/openbsd-x64" "0.24.2" 971 | "@esbuild/sunos-x64" "0.24.2" 972 | "@esbuild/win32-arm64" "0.24.2" 973 | "@esbuild/win32-ia32" "0.24.2" 974 | "@esbuild/win32-x64" "0.24.2" 975 | 976 | escalade@^3.2.0: 977 | version "3.2.0" 978 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 979 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 980 | 981 | escape-string-regexp@^4.0.0: 982 | version "4.0.0" 983 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 984 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 985 | 986 | eslint-plugin-react-hooks@^4.6.0: 987 | version "4.6.0" 988 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" 989 | integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== 990 | 991 | eslint-plugin-react-refresh@^0.4.3: 992 | version "0.4.3" 993 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz#59dae8c00a119f06ea16b1d3e6891df3775947c7" 994 | integrity sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA== 995 | 996 | eslint-scope@^7.2.2: 997 | version "7.2.2" 998 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" 999 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 1000 | dependencies: 1001 | esrecurse "^4.3.0" 1002 | estraverse "^5.2.0" 1003 | 1004 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 1005 | version "3.4.3" 1006 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 1007 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 1008 | 1009 | eslint@^8.45.0: 1010 | version "8.48.0" 1011 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" 1012 | integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== 1013 | dependencies: 1014 | "@eslint-community/eslint-utils" "^4.2.0" 1015 | "@eslint-community/regexpp" "^4.6.1" 1016 | "@eslint/eslintrc" "^2.1.2" 1017 | "@eslint/js" "8.48.0" 1018 | "@humanwhocodes/config-array" "^0.11.10" 1019 | "@humanwhocodes/module-importer" "^1.0.1" 1020 | "@nodelib/fs.walk" "^1.2.8" 1021 | ajv "^6.12.4" 1022 | chalk "^4.0.0" 1023 | cross-spawn "^7.0.2" 1024 | debug "^4.3.2" 1025 | doctrine "^3.0.0" 1026 | escape-string-regexp "^4.0.0" 1027 | eslint-scope "^7.2.2" 1028 | eslint-visitor-keys "^3.4.3" 1029 | espree "^9.6.1" 1030 | esquery "^1.4.2" 1031 | esutils "^2.0.2" 1032 | fast-deep-equal "^3.1.3" 1033 | file-entry-cache "^6.0.1" 1034 | find-up "^5.0.0" 1035 | glob-parent "^6.0.2" 1036 | globals "^13.19.0" 1037 | graphemer "^1.4.0" 1038 | ignore "^5.2.0" 1039 | imurmurhash "^0.1.4" 1040 | is-glob "^4.0.0" 1041 | is-path-inside "^3.0.3" 1042 | js-yaml "^4.1.0" 1043 | json-stable-stringify-without-jsonify "^1.0.1" 1044 | levn "^0.4.1" 1045 | lodash.merge "^4.6.2" 1046 | minimatch "^3.1.2" 1047 | natural-compare "^1.4.0" 1048 | optionator "^0.9.3" 1049 | strip-ansi "^6.0.1" 1050 | text-table "^0.2.0" 1051 | 1052 | espree@^9.6.0, espree@^9.6.1: 1053 | version "9.6.1" 1054 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 1055 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 1056 | dependencies: 1057 | acorn "^8.9.0" 1058 | acorn-jsx "^5.3.2" 1059 | eslint-visitor-keys "^3.4.1" 1060 | 1061 | esquery@^1.4.2: 1062 | version "1.5.0" 1063 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" 1064 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== 1065 | dependencies: 1066 | estraverse "^5.1.0" 1067 | 1068 | esrecurse@^4.3.0: 1069 | version "4.3.0" 1070 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 1071 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 1072 | dependencies: 1073 | estraverse "^5.2.0" 1074 | 1075 | estraverse@^5.1.0, estraverse@^5.2.0: 1076 | version "5.3.0" 1077 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 1078 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 1079 | 1080 | esutils@^2.0.2: 1081 | version "2.0.3" 1082 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 1083 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1084 | 1085 | eventemitter3@^5.0.1: 1086 | version "5.0.1" 1087 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" 1088 | integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== 1089 | 1090 | execa@7.2.0: 1091 | version "7.2.0" 1092 | resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" 1093 | integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== 1094 | dependencies: 1095 | cross-spawn "^7.0.3" 1096 | get-stream "^6.0.1" 1097 | human-signals "^4.3.0" 1098 | is-stream "^3.0.0" 1099 | merge-stream "^2.0.0" 1100 | npm-run-path "^5.1.0" 1101 | onetime "^6.0.0" 1102 | signal-exit "^3.0.7" 1103 | strip-final-newline "^3.0.0" 1104 | 1105 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 1106 | version "3.1.3" 1107 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1108 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1109 | 1110 | fast-glob@^3.2.9: 1111 | version "3.3.1" 1112 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" 1113 | integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== 1114 | dependencies: 1115 | "@nodelib/fs.stat" "^2.0.2" 1116 | "@nodelib/fs.walk" "^1.2.3" 1117 | glob-parent "^5.1.2" 1118 | merge2 "^1.3.0" 1119 | micromatch "^4.0.4" 1120 | 1121 | fast-json-stable-stringify@^2.0.0: 1122 | version "2.1.0" 1123 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1124 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1125 | 1126 | fast-levenshtein@^2.0.6: 1127 | version "2.0.6" 1128 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1129 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 1130 | 1131 | fastq@^1.6.0: 1132 | version "1.15.0" 1133 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" 1134 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== 1135 | dependencies: 1136 | reusify "^1.0.4" 1137 | 1138 | file-entry-cache@^6.0.1: 1139 | version "6.0.1" 1140 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 1141 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 1142 | dependencies: 1143 | flat-cache "^3.0.4" 1144 | 1145 | fill-range@^7.0.1: 1146 | version "7.0.1" 1147 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1148 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1149 | dependencies: 1150 | to-regex-range "^5.0.1" 1151 | 1152 | find-up@^5.0.0: 1153 | version "5.0.0" 1154 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 1155 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1156 | dependencies: 1157 | locate-path "^6.0.0" 1158 | path-exists "^4.0.0" 1159 | 1160 | flat-cache@^3.0.4: 1161 | version "3.1.0" 1162 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" 1163 | integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== 1164 | dependencies: 1165 | flatted "^3.2.7" 1166 | keyv "^4.5.3" 1167 | rimraf "^3.0.2" 1168 | 1169 | flatted@^3.2.7: 1170 | version "3.2.7" 1171 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" 1172 | integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== 1173 | 1174 | fs.realpath@^1.0.0: 1175 | version "1.0.0" 1176 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1177 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 1178 | 1179 | fsevents@~2.3.2, fsevents@~2.3.3: 1180 | version "2.3.3" 1181 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 1182 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 1183 | 1184 | gensync@^1.0.0-beta.2: 1185 | version "1.0.0-beta.2" 1186 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 1187 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 1188 | 1189 | get-stream@^6.0.1: 1190 | version "6.0.1" 1191 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 1192 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 1193 | 1194 | glob-parent@^5.1.2: 1195 | version "5.1.2" 1196 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1197 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1198 | dependencies: 1199 | is-glob "^4.0.1" 1200 | 1201 | glob-parent@^6.0.2: 1202 | version "6.0.2" 1203 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 1204 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1205 | dependencies: 1206 | is-glob "^4.0.3" 1207 | 1208 | glob@^7.1.3: 1209 | version "7.2.3" 1210 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 1211 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 1212 | dependencies: 1213 | fs.realpath "^1.0.0" 1214 | inflight "^1.0.4" 1215 | inherits "2" 1216 | minimatch "^3.1.1" 1217 | once "^1.3.0" 1218 | path-is-absolute "^1.0.0" 1219 | 1220 | globals@^11.1.0: 1221 | version "11.12.0" 1222 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 1223 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1224 | 1225 | globals@^13.19.0: 1226 | version "13.21.0" 1227 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" 1228 | integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== 1229 | dependencies: 1230 | type-fest "^0.20.2" 1231 | 1232 | globby@^11.1.0: 1233 | version "11.1.0" 1234 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 1235 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1236 | dependencies: 1237 | array-union "^2.1.0" 1238 | dir-glob "^3.0.1" 1239 | fast-glob "^3.2.9" 1240 | ignore "^5.2.0" 1241 | merge2 "^1.4.1" 1242 | slash "^3.0.0" 1243 | 1244 | graphemer@^1.4.0: 1245 | version "1.4.0" 1246 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 1247 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 1248 | 1249 | has-flag@^4.0.0: 1250 | version "4.0.0" 1251 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1252 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1253 | 1254 | human-signals@^4.3.0: 1255 | version "4.3.1" 1256 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" 1257 | integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== 1258 | 1259 | husky@^8.0.3: 1260 | version "8.0.3" 1261 | resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" 1262 | integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== 1263 | 1264 | idb-keyval@^6.2.1: 1265 | version "6.2.1" 1266 | resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" 1267 | integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== 1268 | 1269 | ignore@^5.2.0, ignore@^5.2.4: 1270 | version "5.2.4" 1271 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" 1272 | integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== 1273 | 1274 | immutable@^5.0.2: 1275 | version "5.0.3" 1276 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1" 1277 | integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== 1278 | 1279 | import-fresh@^3.2.1: 1280 | version "3.3.0" 1281 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1282 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1283 | dependencies: 1284 | parent-module "^1.0.0" 1285 | resolve-from "^4.0.0" 1286 | 1287 | imurmurhash@^0.1.4: 1288 | version "0.1.4" 1289 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1290 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1291 | 1292 | inflight@^1.0.4: 1293 | version "1.0.6" 1294 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1295 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1296 | dependencies: 1297 | once "^1.3.0" 1298 | wrappy "1" 1299 | 1300 | inherits@2: 1301 | version "2.0.4" 1302 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1303 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1304 | 1305 | is-extglob@^2.1.1: 1306 | version "2.1.1" 1307 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1308 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1309 | 1310 | is-fullwidth-code-point@^4.0.0: 1311 | version "4.0.0" 1312 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" 1313 | integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== 1314 | 1315 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1316 | version "4.0.3" 1317 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1318 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1319 | dependencies: 1320 | is-extglob "^2.1.1" 1321 | 1322 | is-number@^7.0.0: 1323 | version "7.0.0" 1324 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1325 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1326 | 1327 | is-path-inside@^3.0.3: 1328 | version "3.0.3" 1329 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1330 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1331 | 1332 | is-stream@^3.0.0: 1333 | version "3.0.0" 1334 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" 1335 | integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== 1336 | 1337 | isexe@^2.0.0: 1338 | version "2.0.0" 1339 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1340 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1341 | 1342 | js-tokens@^4.0.0: 1343 | version "4.0.0" 1344 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1345 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1346 | 1347 | js-yaml@^4.1.0: 1348 | version "4.1.0" 1349 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1350 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1351 | dependencies: 1352 | argparse "^2.0.1" 1353 | 1354 | jsesc@^3.0.2: 1355 | version "3.1.0" 1356 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" 1357 | integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== 1358 | 1359 | json-buffer@3.0.1: 1360 | version "3.0.1" 1361 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 1362 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1363 | 1364 | json-schema-traverse@^0.4.1: 1365 | version "0.4.1" 1366 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1367 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1368 | 1369 | json-stable-stringify-without-jsonify@^1.0.1: 1370 | version "1.0.1" 1371 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1372 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1373 | 1374 | json5@^2.2.3: 1375 | version "2.2.3" 1376 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 1377 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 1378 | 1379 | keyv@^4.5.3: 1380 | version "4.5.3" 1381 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" 1382 | integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== 1383 | dependencies: 1384 | json-buffer "3.0.1" 1385 | 1386 | levn@^0.4.1: 1387 | version "0.4.1" 1388 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1389 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1390 | dependencies: 1391 | prelude-ls "^1.2.1" 1392 | type-check "~0.4.0" 1393 | 1394 | lilconfig@2.1.0: 1395 | version "2.1.0" 1396 | resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" 1397 | integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== 1398 | 1399 | lint-staged@^14.0.1: 1400 | version "14.0.1" 1401 | resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-14.0.1.tgz#57dfa3013a3d60762d9af5d9c83bdb51291a6232" 1402 | integrity sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw== 1403 | dependencies: 1404 | chalk "5.3.0" 1405 | commander "11.0.0" 1406 | debug "4.3.4" 1407 | execa "7.2.0" 1408 | lilconfig "2.1.0" 1409 | listr2 "6.6.1" 1410 | micromatch "4.0.5" 1411 | pidtree "0.6.0" 1412 | string-argv "0.3.2" 1413 | yaml "2.3.1" 1414 | 1415 | listr2@6.6.1: 1416 | version "6.6.1" 1417 | resolved "https://registry.yarnpkg.com/listr2/-/listr2-6.6.1.tgz#08b2329e7e8ba6298481464937099f4a2cd7f95d" 1418 | integrity sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== 1419 | dependencies: 1420 | cli-truncate "^3.1.0" 1421 | colorette "^2.0.20" 1422 | eventemitter3 "^5.0.1" 1423 | log-update "^5.0.1" 1424 | rfdc "^1.3.0" 1425 | wrap-ansi "^8.1.0" 1426 | 1427 | locate-path@^6.0.0: 1428 | version "6.0.0" 1429 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1430 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1431 | dependencies: 1432 | p-locate "^5.0.0" 1433 | 1434 | lodash.merge@^4.6.2: 1435 | version "4.6.2" 1436 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1437 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1438 | 1439 | log-update@^5.0.1: 1440 | version "5.0.1" 1441 | resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" 1442 | integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== 1443 | dependencies: 1444 | ansi-escapes "^5.0.0" 1445 | cli-cursor "^4.0.0" 1446 | slice-ansi "^5.0.0" 1447 | strip-ansi "^7.0.1" 1448 | wrap-ansi "^8.0.1" 1449 | 1450 | lru-cache@^5.1.1: 1451 | version "5.1.1" 1452 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 1453 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1454 | dependencies: 1455 | yallist "^3.0.2" 1456 | 1457 | lru-cache@^6.0.0: 1458 | version "6.0.0" 1459 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1460 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1461 | dependencies: 1462 | yallist "^4.0.0" 1463 | 1464 | merge-stream@^2.0.0: 1465 | version "2.0.0" 1466 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1467 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1468 | 1469 | merge2@^1.3.0, merge2@^1.4.1: 1470 | version "1.4.1" 1471 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1472 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1473 | 1474 | micromatch@4.0.5, micromatch@^4.0.4: 1475 | version "4.0.5" 1476 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1477 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1478 | dependencies: 1479 | braces "^3.0.2" 1480 | picomatch "^2.3.1" 1481 | 1482 | mimic-fn@^2.1.0: 1483 | version "2.1.0" 1484 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1485 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1486 | 1487 | mimic-fn@^4.0.0: 1488 | version "4.0.0" 1489 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" 1490 | integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== 1491 | 1492 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 1493 | version "3.1.2" 1494 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1495 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1496 | dependencies: 1497 | brace-expansion "^1.1.7" 1498 | 1499 | mobx-react-lite@^4.0.4: 1500 | version "4.0.4" 1501 | resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-4.0.4.tgz#eee3c55dfa6841365d5a7764971c456db12570fb" 1502 | integrity sha512-68uNYvQC/5Dazs3sIBv+bnpzRwcWde8y4ujHiLizhq8yeQtJ2tlNUGSh4r40gyE5M0utACIofBDsAj2hplcovQ== 1503 | dependencies: 1504 | use-sync-external-store "^1.2.0" 1505 | 1506 | mobx@^6.10.2: 1507 | version "6.10.2" 1508 | resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.10.2.tgz#96e123deef140750360ca9a5b02a8b91fbffd4d9" 1509 | integrity sha512-B1UGC3ieK3boCjnMEcZSwxqRDMdzX65H/8zOHbuTY8ZhvrIjTUoLRR2TP2bPqIgYRfb3+dUigu8yMZufNjn0LQ== 1510 | 1511 | ms@2.1.2: 1512 | version "2.1.2" 1513 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1514 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1515 | 1516 | ms@^2.1.3: 1517 | version "2.1.3" 1518 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1519 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1520 | 1521 | nanoid@^3.3.8: 1522 | version "3.3.8" 1523 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" 1524 | integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== 1525 | 1526 | natural-compare@^1.4.0: 1527 | version "1.4.0" 1528 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1529 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1530 | 1531 | node-releases@^2.0.19: 1532 | version "2.0.19" 1533 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" 1534 | integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== 1535 | 1536 | npm-run-path@^5.1.0: 1537 | version "5.1.0" 1538 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" 1539 | integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== 1540 | dependencies: 1541 | path-key "^4.0.0" 1542 | 1543 | once@^1.3.0: 1544 | version "1.4.0" 1545 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1546 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1547 | dependencies: 1548 | wrappy "1" 1549 | 1550 | onetime@^5.1.0: 1551 | version "5.1.2" 1552 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1553 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1554 | dependencies: 1555 | mimic-fn "^2.1.0" 1556 | 1557 | onetime@^6.0.0: 1558 | version "6.0.0" 1559 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" 1560 | integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== 1561 | dependencies: 1562 | mimic-fn "^4.0.0" 1563 | 1564 | optionator@^0.9.3: 1565 | version "0.9.3" 1566 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" 1567 | integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== 1568 | dependencies: 1569 | "@aashutoshrathi/word-wrap" "^1.2.3" 1570 | deep-is "^0.1.3" 1571 | fast-levenshtein "^2.0.6" 1572 | levn "^0.4.1" 1573 | prelude-ls "^1.2.1" 1574 | type-check "^0.4.0" 1575 | 1576 | p-limit@^3.0.2: 1577 | version "3.1.0" 1578 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1579 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1580 | dependencies: 1581 | yocto-queue "^0.1.0" 1582 | 1583 | p-locate@^5.0.0: 1584 | version "5.0.0" 1585 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1586 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1587 | dependencies: 1588 | p-limit "^3.0.2" 1589 | 1590 | parent-module@^1.0.0: 1591 | version "1.0.1" 1592 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1593 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1594 | dependencies: 1595 | callsites "^3.0.0" 1596 | 1597 | path-exists@^4.0.0: 1598 | version "4.0.0" 1599 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1600 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1601 | 1602 | path-is-absolute@^1.0.0: 1603 | version "1.0.1" 1604 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1605 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1606 | 1607 | path-key@^3.1.0: 1608 | version "3.1.1" 1609 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1610 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1611 | 1612 | path-key@^4.0.0: 1613 | version "4.0.0" 1614 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" 1615 | integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== 1616 | 1617 | path-type@^4.0.0: 1618 | version "4.0.0" 1619 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1620 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1621 | 1622 | picocolors@^1.0.0: 1623 | version "1.0.0" 1624 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1625 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1626 | 1627 | picocolors@^1.1.1: 1628 | version "1.1.1" 1629 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 1630 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 1631 | 1632 | picomatch@^2.3.1: 1633 | version "2.3.1" 1634 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1635 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1636 | 1637 | pidtree@0.6.0: 1638 | version "0.6.0" 1639 | resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" 1640 | integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== 1641 | 1642 | postcss@^8.4.49: 1643 | version "8.5.1" 1644 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" 1645 | integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== 1646 | dependencies: 1647 | nanoid "^3.3.8" 1648 | picocolors "^1.1.1" 1649 | source-map-js "^1.2.1" 1650 | 1651 | prelude-ls@^1.2.1: 1652 | version "1.2.1" 1653 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1654 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1655 | 1656 | prettier@^3.0.3: 1657 | version "3.0.3" 1658 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" 1659 | integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== 1660 | 1661 | punycode@^2.1.0: 1662 | version "2.3.0" 1663 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" 1664 | integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== 1665 | 1666 | queue-microtask@^1.2.2: 1667 | version "1.2.3" 1668 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1669 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1670 | 1671 | react-dom@^19.0.0: 1672 | version "19.0.0" 1673 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0.tgz#43446f1f01c65a4cd7f7588083e686a6726cfb57" 1674 | integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ== 1675 | dependencies: 1676 | scheduler "^0.25.0" 1677 | 1678 | react-icons@^5.4.0: 1679 | version "5.4.0" 1680 | resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.4.0.tgz#443000f6e5123ee1b21ea8c0a716f6e7797f7416" 1681 | integrity sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ== 1682 | 1683 | react-refresh@^0.14.2: 1684 | version "0.14.2" 1685 | resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" 1686 | integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== 1687 | 1688 | react-use-pointer-drag@^0.1.2: 1689 | version "0.1.2" 1690 | resolved "https://registry.yarnpkg.com/react-use-pointer-drag/-/react-use-pointer-drag-0.1.2.tgz#f5418f8eea6246b8969e93a97790bb995ddd04d5" 1691 | integrity sha512-Sm53xOun8NEYLFLUvywOSSnzYoxnx79TU2tecOrdhYKkSQyaoxoNvxA1+KtaKxqT/gy2TqxrvrgerkwoeF7S7g== 1692 | 1693 | react@^19.0.0: 1694 | version "19.0.0" 1695 | resolved "https://registry.yarnpkg.com/react/-/react-19.0.0.tgz#6e1969251b9f108870aa4bff37a0ce9ddfaaabdd" 1696 | integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== 1697 | 1698 | resolve-from@^4.0.0: 1699 | version "4.0.0" 1700 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1701 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1702 | 1703 | restore-cursor@^4.0.0: 1704 | version "4.0.0" 1705 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" 1706 | integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== 1707 | dependencies: 1708 | onetime "^5.1.0" 1709 | signal-exit "^3.0.2" 1710 | 1711 | reusify@^1.0.4: 1712 | version "1.0.4" 1713 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1714 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1715 | 1716 | rfdc@^1.3.0: 1717 | version "1.3.0" 1718 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" 1719 | integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== 1720 | 1721 | rimraf@^3.0.2: 1722 | version "3.0.2" 1723 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1724 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1725 | dependencies: 1726 | glob "^7.1.3" 1727 | 1728 | rollup@^4.23.0: 1729 | version "4.32.1" 1730 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.32.1.tgz#95309604d92c3d21cbf06c3ee46a098209ce13a4" 1731 | integrity sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA== 1732 | dependencies: 1733 | "@types/estree" "1.0.6" 1734 | optionalDependencies: 1735 | "@rollup/rollup-android-arm-eabi" "4.32.1" 1736 | "@rollup/rollup-android-arm64" "4.32.1" 1737 | "@rollup/rollup-darwin-arm64" "4.32.1" 1738 | "@rollup/rollup-darwin-x64" "4.32.1" 1739 | "@rollup/rollup-freebsd-arm64" "4.32.1" 1740 | "@rollup/rollup-freebsd-x64" "4.32.1" 1741 | "@rollup/rollup-linux-arm-gnueabihf" "4.32.1" 1742 | "@rollup/rollup-linux-arm-musleabihf" "4.32.1" 1743 | "@rollup/rollup-linux-arm64-gnu" "4.32.1" 1744 | "@rollup/rollup-linux-arm64-musl" "4.32.1" 1745 | "@rollup/rollup-linux-loongarch64-gnu" "4.32.1" 1746 | "@rollup/rollup-linux-powerpc64le-gnu" "4.32.1" 1747 | "@rollup/rollup-linux-riscv64-gnu" "4.32.1" 1748 | "@rollup/rollup-linux-s390x-gnu" "4.32.1" 1749 | "@rollup/rollup-linux-x64-gnu" "4.32.1" 1750 | "@rollup/rollup-linux-x64-musl" "4.32.1" 1751 | "@rollup/rollup-win32-arm64-msvc" "4.32.1" 1752 | "@rollup/rollup-win32-ia32-msvc" "4.32.1" 1753 | "@rollup/rollup-win32-x64-msvc" "4.32.1" 1754 | fsevents "~2.3.2" 1755 | 1756 | run-parallel@^1.1.9: 1757 | version "1.2.0" 1758 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1759 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1760 | dependencies: 1761 | queue-microtask "^1.2.2" 1762 | 1763 | rxjs@^7.4.0: 1764 | version "7.8.1" 1765 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" 1766 | integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== 1767 | dependencies: 1768 | tslib "^2.1.0" 1769 | 1770 | sass-embedded-android-arm64@1.83.4: 1771 | version "1.83.4" 1772 | resolved "https://registry.yarnpkg.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.83.4.tgz#60af9d787e74276af95e4a1a1507567435bc61d2" 1773 | integrity sha512-tgX4FzmbVqnQmD67ZxQDvI+qFNABrboOQgwsG05E5bA/US42zGajW9AxpECJYiMXVOHmg+d81ICbjb0fsVHskw== 1774 | 1775 | sass-embedded-android-arm@1.83.4: 1776 | version "1.83.4" 1777 | resolved "https://registry.yarnpkg.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.83.4.tgz#960953d094bf28c3e10a2e0ebd14459d4ec6e2d2" 1778 | integrity sha512-9Z4pJAOgEkXa3VDY/o+U6l5XvV0mZTJcSl0l/mSPHihjAHSpLYnOW6+KOWeM8dxqrsqTYcd6COzhanI/a++5Gw== 1779 | 1780 | sass-embedded-android-ia32@1.83.4: 1781 | version "1.83.4" 1782 | resolved "https://registry.yarnpkg.com/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.83.4.tgz#2293cb9920181094edfa477ba503f1f187d21624" 1783 | integrity sha512-RsFOziFqPcfZXdFRULC4Ayzy9aK6R6FwQ411broCjlOBX+b0gurjRadkue3cfUEUR5mmy0KeCbp7zVKPLTK+5Q== 1784 | 1785 | sass-embedded-android-riscv64@1.83.4: 1786 | version "1.83.4" 1787 | resolved "https://registry.yarnpkg.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.83.4.tgz#84f86f2e96955a415343a2f24bae1af7bde26e5f" 1788 | integrity sha512-EHwh0nmQarBBrMRU928eTZkFGx19k/XW2YwbPR4gBVdWLkbTgCA5aGe8hTE6/1zStyx++3nDGvTZ78+b/VvvLg== 1789 | 1790 | sass-embedded-android-x64@1.83.4: 1791 | version "1.83.4" 1792 | resolved "https://registry.yarnpkg.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.83.4.tgz#8db3bb08b941889918f8435a97487cd84e7fd748" 1793 | integrity sha512-0PgQNuPWYy1jEOEPDVsV89KfqOsMLIp9CSbjBY7jRcwRhyVAcigqrUG6bDeNtojHUYKA1kU+Eh/85WxOHUOgBw== 1794 | 1795 | sass-embedded-darwin-arm64@1.83.4: 1796 | version "1.83.4" 1797 | resolved "https://registry.yarnpkg.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.83.4.tgz#d0f3d82eea999ab0ae7ec8abd7fa364f0defc75e" 1798 | integrity sha512-rp2ywymWc3nymnSnAFG5R/8hvxWCsuhK3wOnD10IDlmNB7o4rzKby1c+2ZfpQGowlYGWsWWTgz8FW2qzmZsQRw== 1799 | 1800 | sass-embedded-darwin-x64@1.83.4: 1801 | version "1.83.4" 1802 | resolved "https://registry.yarnpkg.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.83.4.tgz#cd2ac7f209fe823a8a5fc1a064cdfe2833680034" 1803 | integrity sha512-kLkN2lXz9PCgGfDS8Ev5YVcl/V2173L6379en/CaFuJJi7WiyPgBymW7hOmfCt4uO4R1y7CP2Uc08DRtZsBlAA== 1804 | 1805 | sass-embedded-linux-arm64@1.83.4: 1806 | version "1.83.4" 1807 | resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.83.4.tgz#057adf6e337357787331d40714cb8bba4a96dafe" 1808 | integrity sha512-E0zjsZX2HgESwyqw31EHtI39DKa7RgK7nvIhIRco1d0QEw227WnoR9pjH3M/ZQy4gQj3GKilOFHM5Krs/omeIA== 1809 | 1810 | sass-embedded-linux-arm@1.83.4: 1811 | version "1.83.4" 1812 | resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.83.4.tgz#aea8b56f3844633f0bfaf13e0694c79511218fc0" 1813 | integrity sha512-nL90ryxX2lNmFucr9jYUyHHx21AoAgdCL1O5Ltx2rKg2xTdytAGHYo2MT5S0LIeKLa/yKP/hjuSvrbICYNDvtA== 1814 | 1815 | sass-embedded-linux-ia32@1.83.4: 1816 | version "1.83.4" 1817 | resolved "https://registry.yarnpkg.com/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.83.4.tgz#2cedba9f41be61ded3cede5abd16f8ec163d7f46" 1818 | integrity sha512-ew5HpchSzgAYbQoriRh8QhlWn5Kw2nQ2jHoV9YLwGKe3fwwOWA0KDedssvDv7FWnY/FCqXyymhLd6Bxae4Xquw== 1819 | 1820 | sass-embedded-linux-musl-arm64@1.83.4: 1821 | version "1.83.4" 1822 | resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.83.4.tgz#1c5f50c9df93abce7d5ffb4d86eed65b8ffba2f4" 1823 | integrity sha512-IzMgalf6MZOxgp4AVCgsaWAFDP/IVWOrgVXxkyhw29fyAEoSWBJH4k87wyPhEtxSuzVHLxKNbc8k3UzdWmlBFg== 1824 | 1825 | sass-embedded-linux-musl-arm@1.83.4: 1826 | version "1.83.4" 1827 | resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.83.4.tgz#00f241dbc750ee73242bfde1ec5d64ef2d5d7956" 1828 | integrity sha512-0RrJRwMrmm+gG0VOB5b5Cjs7Sd+lhqpQJa6EJNEaZHljJokEfpE5GejZsGMRMIQLxEvVphZnnxl6sonCGFE/QQ== 1829 | 1830 | sass-embedded-linux-musl-ia32@1.83.4: 1831 | version "1.83.4" 1832 | resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.83.4.tgz#27537a309d39f8e35a7dba34a3edc29a3ee16adf" 1833 | integrity sha512-LLb4lYbcxPzX4UaJymYXC+WwokxUlfTJEFUv5VF0OTuSsHAGNRs/rslPtzVBTvMeG9TtlOQDhku1F7G6iaDotA== 1834 | 1835 | sass-embedded-linux-musl-riscv64@1.83.4: 1836 | version "1.83.4" 1837 | resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.83.4.tgz#a32edf2ddb7f7d9b526e971e80cadef1e025cce8" 1838 | integrity sha512-zoKlPzD5Z13HKin1UGR74QkEy+kZEk2AkGX5RelRG494mi+IWwRuWCppXIovor9+BQb9eDWPYPoMVahwN5F7VA== 1839 | 1840 | sass-embedded-linux-musl-x64@1.83.4: 1841 | version "1.83.4" 1842 | resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.4.tgz#668b90b80bf35830c2f1ea2a47557d5e60842598" 1843 | integrity sha512-hB8+/PYhfEf2zTIcidO5Bpof9trK6WJjZ4T8g2MrxQh8REVtdPcgIkoxczRynqybf9+fbqbUwzXtiUao2GV+vQ== 1844 | 1845 | sass-embedded-linux-riscv64@1.83.4: 1846 | version "1.83.4" 1847 | resolved "https://registry.yarnpkg.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.83.4.tgz#b7718df2adf1cbcb4c26609215018dd2e8bab595" 1848 | integrity sha512-83fL4n+oeDJ0Y4KjASmZ9jHS1Vl9ESVQYHMhJE0i4xDi/P3BNarm2rsKljq/QtrwGpbqwn8ujzOu7DsNCMDSHA== 1849 | 1850 | sass-embedded-linux-x64@1.83.4: 1851 | version "1.83.4" 1852 | resolved "https://registry.yarnpkg.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.4.tgz#52e61bd582dfc56b8f638f2b9cfdb8a53db1e57e" 1853 | integrity sha512-NlnGdvCmTD5PK+LKXlK3sAuxOgbRIEoZfnHvxd157imCm/s2SYF/R28D0DAAjEViyI8DovIWghgbcqwuertXsA== 1854 | 1855 | sass-embedded-win32-arm64@1.83.4: 1856 | version "1.83.4" 1857 | resolved "https://registry.yarnpkg.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.83.4.tgz#b6ca8f65177e24770e87e43ffea5868fea34de27" 1858 | integrity sha512-J2BFKrEaeSrVazU2qTjyQdAk+MvbzJeTuCET0uAJEXSKtvQ3AzxvzndS7LqkDPbF32eXAHLw8GVpwcBwKbB3Uw== 1859 | 1860 | sass-embedded-win32-ia32@1.83.4: 1861 | version "1.83.4" 1862 | resolved "https://registry.yarnpkg.com/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.83.4.tgz#94f8da72e253532f8d857516b99e1caf61e7b08f" 1863 | integrity sha512-uPAe9T/5sANFhJS5dcfAOhOJy8/l2TRYG4r+UO3Wp4yhqbN7bggPvY9c7zMYS0OC8tU/bCvfYUDFHYMCl91FgA== 1864 | 1865 | sass-embedded-win32-x64@1.83.4: 1866 | version "1.83.4" 1867 | resolved "https://registry.yarnpkg.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.83.4.tgz#2179d4e2fc2f9086aecd64209a2d84f7d8e9edbe" 1868 | integrity sha512-C9fkDY0jKITdJFij4UbfPFswxoXN9O/Dr79v17fJnstVwtUojzVJWKHUXvF0Zg2LIR7TCc4ju3adejKFxj7ueA== 1869 | 1870 | sass-embedded@^1.83.4: 1871 | version "1.83.4" 1872 | resolved "https://registry.yarnpkg.com/sass-embedded/-/sass-embedded-1.83.4.tgz#9b05cdc22ae71a1b27b5996a39054ba59bebc04a" 1873 | integrity sha512-Hf2burRA/y5PGxsg6jB9UpoK/xZ6g/pgrkOcdl6j+rRg1Zj8XhGKZ1MTysZGtTPUUmiiErqzkP5+Kzp95yv9GQ== 1874 | dependencies: 1875 | "@bufbuild/protobuf" "^2.0.0" 1876 | buffer-builder "^0.2.0" 1877 | colorjs.io "^0.5.0" 1878 | immutable "^5.0.2" 1879 | rxjs "^7.4.0" 1880 | supports-color "^8.1.1" 1881 | sync-child-process "^1.0.2" 1882 | varint "^6.0.0" 1883 | optionalDependencies: 1884 | sass-embedded-android-arm "1.83.4" 1885 | sass-embedded-android-arm64 "1.83.4" 1886 | sass-embedded-android-ia32 "1.83.4" 1887 | sass-embedded-android-riscv64 "1.83.4" 1888 | sass-embedded-android-x64 "1.83.4" 1889 | sass-embedded-darwin-arm64 "1.83.4" 1890 | sass-embedded-darwin-x64 "1.83.4" 1891 | sass-embedded-linux-arm "1.83.4" 1892 | sass-embedded-linux-arm64 "1.83.4" 1893 | sass-embedded-linux-ia32 "1.83.4" 1894 | sass-embedded-linux-musl-arm "1.83.4" 1895 | sass-embedded-linux-musl-arm64 "1.83.4" 1896 | sass-embedded-linux-musl-ia32 "1.83.4" 1897 | sass-embedded-linux-musl-riscv64 "1.83.4" 1898 | sass-embedded-linux-musl-x64 "1.83.4" 1899 | sass-embedded-linux-riscv64 "1.83.4" 1900 | sass-embedded-linux-x64 "1.83.4" 1901 | sass-embedded-win32-arm64 "1.83.4" 1902 | sass-embedded-win32-ia32 "1.83.4" 1903 | sass-embedded-win32-x64 "1.83.4" 1904 | 1905 | scheduler@^0.25.0: 1906 | version "0.25.0" 1907 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0.tgz#336cd9768e8cceebf52d3c80e3dcf5de23e7e015" 1908 | integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA== 1909 | 1910 | semver@^6.3.1: 1911 | version "6.3.1" 1912 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 1913 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1914 | 1915 | semver@^7.5.4: 1916 | version "7.5.4" 1917 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 1918 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 1919 | dependencies: 1920 | lru-cache "^6.0.0" 1921 | 1922 | shebang-command@^2.0.0: 1923 | version "2.0.0" 1924 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1925 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1926 | dependencies: 1927 | shebang-regex "^3.0.0" 1928 | 1929 | shebang-regex@^3.0.0: 1930 | version "3.0.0" 1931 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1932 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1933 | 1934 | signal-exit@^3.0.2, signal-exit@^3.0.7: 1935 | version "3.0.7" 1936 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 1937 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 1938 | 1939 | slash@^3.0.0: 1940 | version "3.0.0" 1941 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1942 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1943 | 1944 | slice-ansi@^5.0.0: 1945 | version "5.0.0" 1946 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" 1947 | integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== 1948 | dependencies: 1949 | ansi-styles "^6.0.0" 1950 | is-fullwidth-code-point "^4.0.0" 1951 | 1952 | source-map-js@^1.2.1: 1953 | version "1.2.1" 1954 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" 1955 | integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== 1956 | 1957 | string-argv@0.3.2: 1958 | version "0.3.2" 1959 | resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" 1960 | integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== 1961 | 1962 | string-width@^5.0.0, string-width@^5.0.1: 1963 | version "5.1.2" 1964 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" 1965 | integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== 1966 | dependencies: 1967 | eastasianwidth "^0.2.0" 1968 | emoji-regex "^9.2.2" 1969 | strip-ansi "^7.0.1" 1970 | 1971 | strip-ansi@^6.0.1: 1972 | version "6.0.1" 1973 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1974 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1975 | dependencies: 1976 | ansi-regex "^5.0.1" 1977 | 1978 | strip-ansi@^7.0.1: 1979 | version "7.1.0" 1980 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 1981 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 1982 | dependencies: 1983 | ansi-regex "^6.0.1" 1984 | 1985 | strip-final-newline@^3.0.0: 1986 | version "3.0.0" 1987 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" 1988 | integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== 1989 | 1990 | strip-json-comments@^3.1.1: 1991 | version "3.1.1" 1992 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1993 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1994 | 1995 | supports-color@^7.1.0: 1996 | version "7.2.0" 1997 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1998 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1999 | dependencies: 2000 | has-flag "^4.0.0" 2001 | 2002 | supports-color@^8.1.1: 2003 | version "8.1.1" 2004 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 2005 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 2006 | dependencies: 2007 | has-flag "^4.0.0" 2008 | 2009 | sync-child-process@^1.0.2: 2010 | version "1.0.2" 2011 | resolved "https://registry.yarnpkg.com/sync-child-process/-/sync-child-process-1.0.2.tgz#45e7c72e756d1243e80b547ea2e17957ab9e367f" 2012 | integrity sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA== 2013 | dependencies: 2014 | sync-message-port "^1.0.0" 2015 | 2016 | sync-message-port@^1.0.0: 2017 | version "1.1.3" 2018 | resolved "https://registry.yarnpkg.com/sync-message-port/-/sync-message-port-1.1.3.tgz#6055c565ee8c81d2f9ee5aae7db757e6d9088c0c" 2019 | integrity sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg== 2020 | 2021 | text-table@^0.2.0: 2022 | version "0.2.0" 2023 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2024 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 2025 | 2026 | to-regex-range@^5.0.1: 2027 | version "5.0.1" 2028 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2029 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2030 | dependencies: 2031 | is-number "^7.0.0" 2032 | 2033 | ts-api-utils@^1.0.1: 2034 | version "1.0.2" 2035 | resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.2.tgz#7c094f753b6705ee4faee25c3c684ade52d66d99" 2036 | integrity sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ== 2037 | 2038 | tslib@^2.1.0: 2039 | version "2.8.1" 2040 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" 2041 | integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== 2042 | 2043 | type-check@^0.4.0, type-check@~0.4.0: 2044 | version "0.4.0" 2045 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2046 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2047 | dependencies: 2048 | prelude-ls "^1.2.1" 2049 | 2050 | type-fest@^0.20.2: 2051 | version "0.20.2" 2052 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 2053 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 2054 | 2055 | type-fest@^1.0.2: 2056 | version "1.4.0" 2057 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" 2058 | integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== 2059 | 2060 | typescript@^5.7.3: 2061 | version "5.7.3" 2062 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" 2063 | integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== 2064 | 2065 | update-browserslist-db@^1.1.1: 2066 | version "1.1.2" 2067 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" 2068 | integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== 2069 | dependencies: 2070 | escalade "^3.2.0" 2071 | picocolors "^1.1.1" 2072 | 2073 | uri-js@^4.2.2: 2074 | version "4.4.1" 2075 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2076 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2077 | dependencies: 2078 | punycode "^2.1.0" 2079 | 2080 | use-sync-external-store@^1.2.0: 2081 | version "1.2.0" 2082 | resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" 2083 | integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== 2084 | 2085 | varint@^6.0.0: 2086 | version "6.0.0" 2087 | resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" 2088 | integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== 2089 | 2090 | vite@^6.0.11: 2091 | version "6.0.11" 2092 | resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.11.tgz#224497e93e940b34c3357c9ebf2ec20803091ed8" 2093 | integrity sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg== 2094 | dependencies: 2095 | esbuild "^0.24.2" 2096 | postcss "^8.4.49" 2097 | rollup "^4.23.0" 2098 | optionalDependencies: 2099 | fsevents "~2.3.3" 2100 | 2101 | which@^2.0.1: 2102 | version "2.0.2" 2103 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2104 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2105 | dependencies: 2106 | isexe "^2.0.0" 2107 | 2108 | wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: 2109 | version "8.1.0" 2110 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 2111 | integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== 2112 | dependencies: 2113 | ansi-styles "^6.1.0" 2114 | string-width "^5.0.1" 2115 | strip-ansi "^7.0.1" 2116 | 2117 | wrappy@1: 2118 | version "1.0.2" 2119 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2120 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 2121 | 2122 | yallist@^3.0.2: 2123 | version "3.1.1" 2124 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 2125 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 2126 | 2127 | yallist@^4.0.0: 2128 | version "4.0.0" 2129 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2130 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2131 | 2132 | yaml@2.3.1: 2133 | version "2.3.1" 2134 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" 2135 | integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== 2136 | 2137 | yocto-queue@^0.1.0: 2138 | version "0.1.0" 2139 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2140 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2141 | --------------------------------------------------------------------------------