├── env.d.ts ├── src ├── crypto │ ├── index.ts │ └── crypto.ts ├── vite-env.d.ts ├── utils │ ├── time.ts │ └── base64.ts ├── totp │ └── index.ts ├── main.ts ├── components │ ├── AppHeader.vue │ └── TOTP.vue ├── App.vue ├── components.d.ts ├── router │ └── index.ts ├── views │ ├── Unlock.vue │ ├── Login.vue │ ├── Home.vue │ └── Register.vue ├── stores │ ├── database.ts │ └── account.ts └── auto-imports.d.ts ├── vercel.json ├── .prettierignore ├── .prettierrc.json ├── public └── favicon.ico ├── .vscode └── extensions.json ├── tsconfig.json ├── tsconfig.node.json ├── tsconfig.app.json ├── index.html ├── .gitignore ├── README.md ├── package.json ├── vite.config.ts ├── LICENSE └── pnpm-lock.yaml /env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/crypto/index.ts: -------------------------------------------------------------------------------- 1 | export * from './crypto'; 2 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "github": { "silent": true } 3 | } 4 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | pnpm-lock.yaml 4 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gizmo-ds/simple-authenticator/main/public/favicon.ico -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.node.json" 6 | }, 7 | { 8 | "path": "./tsconfig.app.json" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/utils/time.ts: -------------------------------------------------------------------------------- 1 | export function timestamp() { 2 | return Math.round(new Date().getTime() / 1000) 3 | } 4 | 5 | export function countdown(period: number) { 6 | return period - (timestamp() % period) 7 | } 8 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.node.json", 3 | "include": ["vite.config.*", "cypress.config.*", "playwright.config.*"], 4 | "compilerOptions": { 5 | "composite": true, 6 | "types": ["node"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/totp/index.ts: -------------------------------------------------------------------------------- 1 | import { init as init_wasm } from 'totp-wasm/packages/totp-wasm' 2 | import wasm_url from 'totp-wasm/packages/totp-wasm/dist/totp_wasm_bg.wasm?url' 3 | export { hotp, totp, steam } from 'totp-wasm/packages/totp-wasm' 4 | 5 | export async function init_totp() { 6 | await init_wasm(wasm_url) 7 | } 8 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.web.json", 3 | "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], 4 | "exclude": ["src/**/__tests__/*"], 5 | "compilerOptions": { 6 | "composite": true, 7 | "baseUrl": ".", 8 | "paths": { 9 | "@/*": ["./src/*"] 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Simple Authenticator 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp, markRaw } from 'vue' 2 | import { createPinia } from 'pinia' 3 | import App from './App.vue' 4 | import router from './router' 5 | 6 | import 'vfonts/FiraCode.css' 7 | 8 | const app = createApp(App) 9 | const pinia = createPinia() 10 | 11 | pinia.use(({ store }) => { 12 | store.$router = markRaw(router) 13 | }) 14 | 15 | app.use(pinia) 16 | app.use(router) 17 | 18 | app.mount('#app') 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 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | 30 | .vercel 31 | -------------------------------------------------------------------------------- /src/utils/base64.ts: -------------------------------------------------------------------------------- 1 | export function encode_base64(buf: ArrayBuffer) { 2 | const bytes = new Uint8Array(buf) 3 | let bs = '' 4 | for (let i = 0; i < bytes.byteLength; i++) bs += String.fromCharCode(bytes[i]) 5 | return btoa(bs) 6 | } 7 | 8 | export function decode_base64(str: string) { 9 | const binary = atob(str) 10 | const length = binary.length 11 | const arr = new Uint8Array(length) 12 | for (let i = 0; i < length; i++) arr[i] = binary.charCodeAt(i) 13 | return arr 14 | } 15 | -------------------------------------------------------------------------------- /src/components/AppHeader.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Simple Authenticator 2 | 3 | A simple authenticator for the web. 4 | 5 | > **Warning** 6 | > This project is still in the early stage of development, and is not ready for production use. 7 | 8 | ## Project Setup 9 | 10 | ```sh 11 | pnpm install 12 | ``` 13 | 14 | ### Compile and Hot-Reload for Development 15 | 16 | ```sh 17 | pnpm dev 18 | ``` 19 | 20 | ### Compile and Minify for Production 21 | 22 | ```sh 23 | pnpm build 24 | ``` 25 | 26 | ## License 27 | 28 | Code is distributed under [MIT](./LICENSE) license, feel free to use it in your proprietary projects as well. 29 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 21 | 22 | 33 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple-authenticator", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "run-p build-only", 8 | "preview": "vite preview", 9 | "build-only": "vite build" 10 | }, 11 | "dependencies": { 12 | "@vueuse/components": "^10.1.0", 13 | "@vueuse/core": "^10.1.0", 14 | "pinia": "^2.0.35", 15 | "totp-wasm": "github:gizmo-ds/totp-wasm", 16 | "vue": "^3.2.47", 17 | "vue-router": "^4.1.6" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "^18.14.2", 21 | "@vitejs/plugin-vue": "^4.0.0", 22 | "@vue/tsconfig": "^0.1.3", 23 | "naive-ui": "^2.34.3", 24 | "npm-run-all": "^4.1.5", 25 | "sass": "^1.62.0", 26 | "typescript": "^5.0.4", 27 | "unplugin-auto-import": "^0.15.3", 28 | "unplugin-vue-components": "^0.24.1", 29 | "vfonts": "^0.0.3", 30 | "vite": "^4.1.4", 31 | "vooks": "^0.2.12", 32 | "vue-tsc": "^1.2.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | import path from 'node:path' 3 | 4 | import { defineConfig } from 'vite' 5 | import vue from '@vitejs/plugin-vue' 6 | import AutoImport from 'unplugin-auto-import/vite' 7 | import Components from 'unplugin-vue-components/vite' 8 | import { NaiveUiResolver } from 'unplugin-vue-components/resolvers' 9 | 10 | export default defineConfig({ 11 | plugins: [ 12 | vue({ 13 | reactivityTransform: true, 14 | }), 15 | AutoImport({ 16 | imports: [ 17 | 'vue', 18 | { 19 | 'naive-ui': [ 20 | 'useDialog', 21 | 'useMessage', 22 | 'useNotification', 23 | 'useLoadingBar', 24 | ], 25 | }, 26 | ], 27 | dts: path.resolve('src/auto-imports.d.ts'), 28 | }), 29 | Components({ 30 | resolvers: [NaiveUiResolver()], 31 | dts: path.resolve('src/components.d.ts'), 32 | }), 33 | ], 34 | resolve: { 35 | alias: { 36 | '@': fileURLToPath(new URL('./src', import.meta.url)), 37 | }, 38 | }, 39 | }) 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Gizmo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/components.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* prettier-ignore */ 3 | // @ts-nocheck 4 | // Generated by unplugin-vue-components 5 | // Read more: https://github.com/vuejs/core/pull/3399 6 | import '@vue/runtime-core' 7 | 8 | export {} 9 | 10 | declare module '@vue/runtime-core' { 11 | export interface GlobalComponents { 12 | AppHeader: typeof import('./components/AppHeader.vue')['default'] 13 | NButton: typeof import('naive-ui')['NButton'] 14 | NCard: typeof import('naive-ui')['NCard'] 15 | NConfigProvider: typeof import('naive-ui')['NConfigProvider'] 16 | NDivider: typeof import('naive-ui')['NDivider'] 17 | NForm: typeof import('naive-ui')['NForm'] 18 | NFormItem: typeof import('naive-ui')['NFormItem'] 19 | NGlobalStyle: typeof import('naive-ui')['NGlobalStyle'] 20 | NInput: typeof import('naive-ui')['NInput'] 21 | NLayout: typeof import('naive-ui')['NLayout'] 22 | NMessageProvider: typeof import('naive-ui')['NMessageProvider'] 23 | NP: typeof import('naive-ui')['NP'] 24 | NProgress: typeof import('naive-ui')['NProgress'] 25 | NSpace: typeof import('naive-ui')['NSpace'] 26 | RouterLink: typeof import('vue-router')['RouterLink'] 27 | RouterView: typeof import('vue-router')['RouterView'] 28 | TOTP: typeof import('./components/TOTP.vue')['default'] 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHashHistory } from 'vue-router' 2 | import Unlock from '@/views/Unlock.vue' 3 | import Login from '@/views/Login.vue' 4 | import { useAccountStore } from '@/stores/account' 5 | 6 | const router = createRouter({ 7 | history: createWebHashHistory(import.meta.env.BASE_URL), 8 | routes: [ 9 | { 10 | path: '/', 11 | name: 'home', 12 | component: () => import('@/views/Home.vue'), 13 | meta: { 14 | require_unlock: true, 15 | }, 16 | }, 17 | { 18 | path: '/unlock', 19 | name: 'unlock', 20 | component: Unlock, 21 | }, 22 | { 23 | path: '/login', 24 | name: 'login', 25 | component: Login, 26 | }, 27 | { 28 | path: '/register', 29 | name: 'register', 30 | component: () => import('../views/Register.vue'), 31 | meta: { 32 | header_title: 'Create Account', 33 | }, 34 | }, 35 | ], 36 | }) 37 | 38 | router.beforeResolve(async (to, from, next) => { 39 | const account = localStorage.getItem('account') 40 | if (to.meta.require_unlock && !account) return next({ name: 'login' }) 41 | const account_store = useAccountStore() 42 | if (to.meta.require_unlock && !account_store.account) 43 | return next({ name: 'unlock' }) 44 | next() 45 | }) 46 | 47 | export default router 48 | -------------------------------------------------------------------------------- /src/views/Unlock.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 44 | 45 | 52 | -------------------------------------------------------------------------------- /src/stores/database.ts: -------------------------------------------------------------------------------- 1 | export class Database { 2 | private db: IDBDatabase | undefined 3 | 4 | constructor(public db_name: string, public store_name: string) { 5 | if (!('indexedDB' in window)) 6 | throw new Error('browser does not support IndexedDB') 7 | } 8 | 9 | private async init_store(): Promise { 10 | return new Promise((resolve, reject) => { 11 | const request = indexedDB.open(this.db_name) 12 | request.onupgradeneeded = () => 13 | request.result.createObjectStore(this.store_name, { 14 | autoIncrement: true, 15 | }) 16 | request.onerror = () => reject(request.error) 17 | request.onsuccess = () => resolve(request.result) 18 | }) 19 | } 20 | 21 | private tx(mode: IDBTransactionMode) { 22 | if (!this.db) throw new Error('database not connected') 23 | return this.db 24 | .transaction(this.store_name, mode) 25 | .objectStore(this.store_name) 26 | } 27 | 28 | public async connect() { 29 | if (this.db) return 30 | this.db = await this.init_store() 31 | } 32 | public put(value: T, key?: IDBValidKey): Promise { 33 | return new Promise((resolve, reject) => { 34 | const request = this.tx('readwrite').put(value, key) 35 | request.onerror = () => reject(request.error) 36 | request.onsuccess = () => resolve(request.result) 37 | }) 38 | } 39 | public get(key: IDBValidKey): Promise { 40 | return new Promise((resolve, reject) => { 41 | const request = this.tx('readonly').get(key) 42 | request.onerror = () => reject(request.error) 43 | request.onsuccess = () => resolve(request.result) 44 | }) 45 | } 46 | public delete(key: IDBValidKey): Promise { 47 | return new Promise((resolve, reject) => { 48 | const request = this.tx('readwrite').delete(key) 49 | request.onerror = () => reject(request.error) 50 | request.onsuccess = () => resolve() 51 | }) 52 | } 53 | public async list(query?: IDBValidKey, count = 10): Promise { 54 | return new Promise((resolve, reject) => { 55 | const request = this.tx('readonly').getAll(query, count) 56 | request.onerror = () => reject(request.error) 57 | request.onsuccess = () => resolve(request.result) 58 | }) 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/views/Login.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 84 | 85 | 96 | -------------------------------------------------------------------------------- /src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 70 | 71 | 103 | 104 | 111 | -------------------------------------------------------------------------------- /src/stores/account.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { ref } from 'vue' 3 | import { 4 | aes_decrypt, 5 | aes_encrypt, 6 | Cipher, 7 | gen_sym_key, 8 | pbkdf2, 9 | stretch_key, 10 | SymmetricCryptoKey, 11 | } from '@/crypto' 12 | import { encode_base64 } from '@/utils/base64' 13 | 14 | export const useAccountStore = defineStore('account', () => { 15 | const account = ref('') 16 | const sym_key = ref(undefined as SymmetricCryptoKey | undefined) 17 | 18 | async function create_account(account: string, password: string) { 19 | let pwd: Uint8Array | null = new TextEncoder().encode(password) 20 | let master_key: ArrayBuffer | null = await pbkdf2( 21 | pwd, 22 | new TextEncoder().encode(account), 23 | 500_000 24 | ) 25 | const master_key_hash = await pbkdf2(master_key, pwd, 1) 26 | // remove pwd from memory 27 | pwd = null 28 | 29 | let stretched_master_key: SymmetricCryptoKey | null = await stretch_key( 30 | master_key 31 | ) 32 | // remove master_key from memory 33 | master_key = null 34 | 35 | let _sym_key: SymmetricCryptoKey | null = gen_sym_key() 36 | const protected_sym_key = await aes_encrypt( 37 | _sym_key.key, 38 | stretched_master_key.enc, 39 | stretched_master_key.mac 40 | ) 41 | // remove sym_key from memory 42 | _sym_key = null 43 | // remove stretched_master_key from memory 44 | stretched_master_key = null 45 | 46 | localStorage.setItem('account', account) 47 | localStorage.setItem('master_key_hash', encode_base64(master_key_hash)) 48 | localStorage.setItem('sym_key', protected_sym_key.string) 49 | } 50 | 51 | async function unlock(_account: string, password: string) { 52 | const store_master_key_hash = localStorage.getItem('master_key_hash') 53 | if (!store_master_key_hash) throw new Error('No master key hash found') 54 | 55 | const store_sym_key = localStorage.getItem('sym_key') 56 | if (!store_sym_key) throw new Error('No stretch key found') 57 | 58 | let pwd: Uint8Array | null = new TextEncoder().encode(password) 59 | let master_key: ArrayBuffer | null = await pbkdf2( 60 | pwd, 61 | new TextEncoder().encode(_account), 62 | 500_000 63 | ) 64 | const master_key_hash = await pbkdf2(master_key, pwd, 1) 65 | // remove pwd from memory 66 | pwd = null 67 | 68 | if (encode_base64(master_key_hash) !== store_master_key_hash) 69 | throw new Error('Wrong password') 70 | 71 | let stretched_master_key: SymmetricCryptoKey | null = await stretch_key( 72 | master_key 73 | ) 74 | // remove master_key from memory 75 | master_key = null 76 | 77 | const sym_key_buf = await aes_decrypt( 78 | Cipher.from_string(store_sym_key), 79 | stretched_master_key.enc, 80 | stretched_master_key.mac 81 | ) 82 | // remove stretched_master_key from memory 83 | stretched_master_key = null 84 | 85 | account.value = _account 86 | sym_key.value = new SymmetricCryptoKey(sym_key_buf) 87 | } 88 | 89 | return { account, sym_key, create_account, unlock } 90 | }) 91 | -------------------------------------------------------------------------------- /src/components/TOTP.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 77 | 78 | 125 | -------------------------------------------------------------------------------- /src/views/Register.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | 105 | 106 | 117 | -------------------------------------------------------------------------------- /src/auto-imports.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* prettier-ignore */ 3 | // @ts-nocheck 4 | // Generated by unplugin-auto-import 5 | export {} 6 | declare global { 7 | const EffectScope: typeof import('vue')['EffectScope'] 8 | const computed: typeof import('vue')['computed'] 9 | const createApp: typeof import('vue')['createApp'] 10 | const customRef: typeof import('vue')['customRef'] 11 | const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] 12 | const defineComponent: typeof import('vue')['defineComponent'] 13 | const effectScope: typeof import('vue')['effectScope'] 14 | const getCurrentInstance: typeof import('vue')['getCurrentInstance'] 15 | const getCurrentScope: typeof import('vue')['getCurrentScope'] 16 | const h: typeof import('vue')['h'] 17 | const inject: typeof import('vue')['inject'] 18 | const isProxy: typeof import('vue')['isProxy'] 19 | const isReactive: typeof import('vue')['isReactive'] 20 | const isReadonly: typeof import('vue')['isReadonly'] 21 | const isRef: typeof import('vue')['isRef'] 22 | const markRaw: typeof import('vue')['markRaw'] 23 | const nextTick: typeof import('vue')['nextTick'] 24 | const onActivated: typeof import('vue')['onActivated'] 25 | const onBeforeMount: typeof import('vue')['onBeforeMount'] 26 | const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] 27 | const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] 28 | const onDeactivated: typeof import('vue')['onDeactivated'] 29 | const onErrorCaptured: typeof import('vue')['onErrorCaptured'] 30 | const onMounted: typeof import('vue')['onMounted'] 31 | const onRenderTracked: typeof import('vue')['onRenderTracked'] 32 | const onRenderTriggered: typeof import('vue')['onRenderTriggered'] 33 | const onScopeDispose: typeof import('vue')['onScopeDispose'] 34 | const onServerPrefetch: typeof import('vue')['onServerPrefetch'] 35 | const onUnmounted: typeof import('vue')['onUnmounted'] 36 | const onUpdated: typeof import('vue')['onUpdated'] 37 | const provide: typeof import('vue')['provide'] 38 | const reactive: typeof import('vue')['reactive'] 39 | const readonly: typeof import('vue')['readonly'] 40 | const ref: typeof import('vue')['ref'] 41 | const resolveComponent: typeof import('vue')['resolveComponent'] 42 | const shallowReactive: typeof import('vue')['shallowReactive'] 43 | const shallowReadonly: typeof import('vue')['shallowReadonly'] 44 | const shallowRef: typeof import('vue')['shallowRef'] 45 | const toRaw: typeof import('vue')['toRaw'] 46 | const toRef: typeof import('vue')['toRef'] 47 | const toRefs: typeof import('vue')['toRefs'] 48 | const triggerRef: typeof import('vue')['triggerRef'] 49 | const unref: typeof import('vue')['unref'] 50 | const useAttrs: typeof import('vue')['useAttrs'] 51 | const useCssModule: typeof import('vue')['useCssModule'] 52 | const useCssVars: typeof import('vue')['useCssVars'] 53 | const useDialog: typeof import('naive-ui')['useDialog'] 54 | const useLoadingBar: typeof import('naive-ui')['useLoadingBar'] 55 | const useMessage: typeof import('naive-ui')['useMessage'] 56 | const useNotification: typeof import('naive-ui')['useNotification'] 57 | const useSlots: typeof import('vue')['useSlots'] 58 | const watch: typeof import('vue')['watch'] 59 | const watchEffect: typeof import('vue')['watchEffect'] 60 | const watchPostEffect: typeof import('vue')['watchPostEffect'] 61 | const watchSyncEffect: typeof import('vue')['watchSyncEffect'] 62 | } 63 | // for type re-export 64 | declare global { 65 | // @ts-ignore 66 | export type { Component, ComponentPublicInstance, ComputedRef, InjectionKey, PropType, Ref, VNode } from 'vue' 67 | } 68 | -------------------------------------------------------------------------------- /src/crypto/crypto.ts: -------------------------------------------------------------------------------- 1 | import { decode_base64, encode_base64 } from '@/utils/base64' 2 | 3 | export async function pbkdf2( 4 | key: BufferSource, 5 | salt: BufferSource, 6 | iterations: number 7 | ) { 8 | const _key = await crypto.subtle.importKey( 9 | 'raw', 10 | key, 11 | { name: 'PBKDF2' }, 12 | false, 13 | ['deriveBits'] 14 | ) 15 | return await crypto.subtle.deriveBits( 16 | { name: 'PBKDF2', salt, iterations, hash: 'SHA-256' }, 17 | _key, 18 | 256 19 | ) 20 | } 21 | 22 | export class SymmetricCryptoKey { 23 | public key: Uint8Array 24 | public enc: Uint8Array 25 | public mac: Uint8Array 26 | constructor(buf: ArrayBuffer) { 27 | this.enc = new Uint8Array(buf, 0, buf.byteLength / 2) 28 | this.mac = new Uint8Array(buf, buf.byteLength / 2) 29 | this.key = new Uint8Array(buf) 30 | } 31 | } 32 | 33 | export async function stretch_key(key: BufferSource) { 34 | const enc = await hkdf_expand(key, new TextEncoder().encode('enc'), 32) 35 | const mac = await hkdf_expand(key, new TextEncoder().encode('mac'), 32) 36 | const new_key = new Uint8Array(64) 37 | new_key.set(enc) 38 | new_key.set(mac, 32) 39 | return new SymmetricCryptoKey(new_key.buffer) 40 | } 41 | 42 | export async function hkdf_expand( 43 | prk: BufferSource, 44 | info: Uint8Array, 45 | size: number 46 | ) { 47 | const alg = { name: 'HMAC', hash: { name: 'SHA-256' } } 48 | const key = await crypto.subtle.importKey('raw', prk, alg, false, ['sign']) 49 | const okm = new Uint8Array(size) 50 | let pt = new Uint8Array(0) 51 | const n = Math.ceil(size / 32) 52 | for (let i = 0; i < n; i++) { 53 | const t = new Uint8Array(pt.length + info.length + 1) 54 | t.set(pt) 55 | t.set(info, pt.length) 56 | t.set([i + 1], t.length - 1) 57 | pt = new Uint8Array(await crypto.subtle.sign(alg, key, t.buffer)) 58 | okm.set(pt, i * 32) 59 | } 60 | return okm 61 | } 62 | 63 | export function gen_sym_key() { 64 | const key = new Uint8Array(64) 65 | crypto.getRandomValues(key) 66 | return new SymmetricCryptoKey(key.buffer) 67 | } 68 | 69 | export class RSAKeyPair { 70 | constructor(public public_key: Uint8Array, public private_key: Uint8Array) {} 71 | } 72 | 73 | export async function gen_rsa_keys() { 74 | const pair = await crypto.subtle.generateKey( 75 | { 76 | name: 'RSA-OAEP', 77 | modulusLength: 2048, 78 | publicExponent: new Uint8Array([0x01, 0x00, 0x01]), 79 | hash: { name: 'SHA-1' }, 80 | }, 81 | true, 82 | ['encrypt', 'decrypt'] 83 | ) 84 | const public_key = new Uint8Array( 85 | await crypto.subtle.exportKey('spki', pair.publicKey) 86 | ) 87 | const private_key = new Uint8Array( 88 | await crypto.subtle.exportKey('pkcs8', pair.privateKey) 89 | ) 90 | return new RSAKeyPair(public_key, private_key) 91 | } 92 | 93 | async function macs_equal( 94 | mac1: BufferSource, 95 | mac2: BufferSource, 96 | key: BufferSource 97 | ) { 98 | const alg = { 99 | name: 'HMAC', 100 | hash: { name: 'SHA-256' }, 101 | } 102 | const _key = await crypto.subtle.importKey('raw', key, alg, false, ['sign']) 103 | const _mac1 = await crypto.subtle.sign(alg, _key, mac1) 104 | const _mac2 = await crypto.subtle.sign(alg, _key, mac2) 105 | if (_mac1.byteLength !== _mac2.byteLength) return false 106 | const mac1_arr = new Uint8Array(_mac1) 107 | const mac2_arr = new Uint8Array(_mac2) 108 | for (let i = 0; i < mac2_arr.length; i++) 109 | if (mac1_arr[i] !== mac2_arr[i]) return false 110 | return true 111 | } 112 | 113 | export class Cipher { 114 | public string: string 115 | constructor( 116 | public iv: Uint8Array, 117 | public encrypted: Uint8Array, 118 | public mac_data: Uint8Array 119 | ) { 120 | this.string = 121 | encode_base64(iv) + 122 | '|' + 123 | encode_base64(encrypted) + 124 | '|' + 125 | encode_base64(mac_data) 126 | } 127 | 128 | static from_string(str: string) { 129 | const [iv, encrypted, mac_data] = str.split('|').map(decode_base64) 130 | if (!iv || !encrypted || !mac_data) throw new Error('Invalid cipher') 131 | return new Cipher(iv, encrypted, mac_data) 132 | } 133 | } 134 | 135 | export async function aes_encrypt( 136 | data: BufferSource, 137 | enc: BufferSource, 138 | mac: BufferSource, 139 | iv?: Uint8Array 140 | ) { 141 | const enc_options = { 142 | name: 'AES-CBC', 143 | iv: new Uint8Array(16), 144 | } 145 | if (iv) enc_options.iv = iv 146 | else crypto.getRandomValues(enc_options.iv) 147 | 148 | const key = await crypto.subtle.importKey( 149 | 'raw', 150 | enc, 151 | { name: 'AES-CBC' }, 152 | false, 153 | ['encrypt'] 154 | ) 155 | const encrypted = new Uint8Array( 156 | await crypto.subtle.encrypt(enc_options, key, data) 157 | ) 158 | 159 | const t_data_mac = new Uint8Array( 160 | enc_options.iv.byteLength + encrypted.byteLength 161 | ) 162 | t_data_mac.set(enc_options.iv, 0) 163 | t_data_mac.set(encrypted, enc_options.iv.byteLength) 164 | const mac_buf = await crypto.subtle.sign( 165 | { name: 'HMAC', hash: { name: 'SHA-256' } }, 166 | await crypto.subtle.importKey( 167 | 'raw', 168 | mac, 169 | { name: 'HMAC', hash: { name: 'SHA-256' } }, 170 | false, 171 | ['sign'] 172 | ), 173 | t_data_mac 174 | ) 175 | const mac_data = new Uint8Array(mac_buf) 176 | return new Cipher(enc_options.iv, encrypted, mac_data) 177 | } 178 | 179 | export async function aes_decrypt( 180 | cipher: Cipher, 181 | enc: BufferSource, 182 | mac: BufferSource 183 | ) { 184 | const t_data_mac = new Uint8Array( 185 | cipher.iv.byteLength + cipher.encrypted.byteLength 186 | ) 187 | t_data_mac.set(cipher.iv, 0) 188 | t_data_mac.set(cipher.encrypted, cipher.iv.byteLength) 189 | const mac_buf = await crypto.subtle.sign( 190 | { name: 'HMAC', hash: { name: 'SHA-256' } }, 191 | await crypto.subtle.importKey( 192 | 'raw', 193 | mac, 194 | { name: 'HMAC', hash: { name: 'SHA-256' } }, 195 | false, 196 | ['sign'] 197 | ), 198 | t_data_mac 199 | ) 200 | if (!(await macs_equal(cipher.mac_data, mac_buf, enc))) throw 'Invalid MAC' 201 | 202 | const key = await crypto.subtle.importKey( 203 | 'raw', 204 | enc, 205 | { name: 'AES-CBC' }, 206 | false, 207 | ['decrypt'] 208 | ) 209 | return await crypto.subtle.decrypt( 210 | { name: 'AES-CBC', iv: cipher.iv }, 211 | key, 212 | cipher.encrypted 213 | ) 214 | } 215 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | dependencies: 4 | '@vueuse/components': 5 | specifier: ^10.1.0 6 | version: 10.1.0(vue@3.2.47) 7 | '@vueuse/core': 8 | specifier: ^10.1.0 9 | version: 10.1.0(vue@3.2.47) 10 | pinia: 11 | specifier: ^2.0.35 12 | version: 2.0.35(typescript@5.0.4)(vue@3.2.47) 13 | totp-wasm: 14 | specifier: github:gizmo-ds/totp-wasm 15 | version: github.com/gizmo-ds/totp-wasm/7b91ef831b6b93854ffa70786699effd4c944d14 16 | vue: 17 | specifier: ^3.2.47 18 | version: 3.2.47 19 | vue-router: 20 | specifier: ^4.1.6 21 | version: 4.1.6(vue@3.2.47) 22 | 23 | devDependencies: 24 | '@types/node': 25 | specifier: ^18.14.2 26 | version: 18.16.0 27 | '@vitejs/plugin-vue': 28 | specifier: ^4.0.0 29 | version: 4.1.0(vite@4.3.1)(vue@3.2.47) 30 | '@vue/tsconfig': 31 | specifier: ^0.1.3 32 | version: 0.1.3(@types/node@18.16.0) 33 | naive-ui: 34 | specifier: ^2.34.3 35 | version: 2.34.3(vue@3.2.47) 36 | npm-run-all: 37 | specifier: ^4.1.5 38 | version: 4.1.5 39 | sass: 40 | specifier: ^1.62.0 41 | version: 1.62.0 42 | typescript: 43 | specifier: ^5.0.4 44 | version: 5.0.4 45 | unplugin-auto-import: 46 | specifier: ^0.15.3 47 | version: 0.15.3(@vueuse/core@10.1.0) 48 | unplugin-vue-components: 49 | specifier: ^0.24.1 50 | version: 0.24.1(vue@3.2.47) 51 | vfonts: 52 | specifier: ^0.0.3 53 | version: 0.0.3 54 | vite: 55 | specifier: ^4.1.4 56 | version: 4.3.1(@types/node@18.16.0)(sass@1.62.0) 57 | vooks: 58 | specifier: ^0.2.12 59 | version: 0.2.12(vue@3.2.47) 60 | vue-tsc: 61 | specifier: ^1.2.0 62 | version: 1.4.4(typescript@5.0.4) 63 | 64 | packages: 65 | 66 | /@antfu/utils@0.7.2: 67 | resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==} 68 | dev: true 69 | 70 | /@babel/helper-string-parser@7.19.4: 71 | resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} 72 | engines: {node: '>=6.9.0'} 73 | 74 | /@babel/helper-validator-identifier@7.19.1: 75 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} 76 | engines: {node: '>=6.9.0'} 77 | 78 | /@babel/parser@7.21.4: 79 | resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} 80 | engines: {node: '>=6.0.0'} 81 | hasBin: true 82 | dependencies: 83 | '@babel/types': 7.21.4 84 | 85 | /@babel/types@7.21.4: 86 | resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} 87 | engines: {node: '>=6.9.0'} 88 | dependencies: 89 | '@babel/helper-string-parser': 7.19.4 90 | '@babel/helper-validator-identifier': 7.19.1 91 | to-fast-properties: 2.0.0 92 | 93 | /@css-render/plugin-bem@0.15.12(css-render@0.15.12): 94 | resolution: {integrity: sha512-Lq2jSOZn+wYQtsyaFj6QRz2EzAnd3iW5fZeHO1WSXQdVYwvwGX0ZiH3X2JQgtgYLT1yeGtrwrqJdNdMEUD2xTw==} 95 | peerDependencies: 96 | css-render: ~0.15.12 97 | dependencies: 98 | css-render: 0.15.12 99 | dev: true 100 | 101 | /@css-render/vue3-ssr@0.15.12(vue@3.2.47): 102 | resolution: {integrity: sha512-AQLGhhaE0F+rwybRCkKUdzBdTEM/5PZBYy+fSYe1T9z9+yxMuV/k7ZRqa4M69X+EI1W8pa4kc9Iq2VjQkZx4rg==} 103 | peerDependencies: 104 | vue: ^3.0.11 105 | dependencies: 106 | vue: 3.2.47 107 | dev: true 108 | 109 | /@emotion/hash@0.8.0: 110 | resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} 111 | dev: true 112 | 113 | /@esbuild/android-arm64@0.17.18: 114 | resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} 115 | engines: {node: '>=12'} 116 | cpu: [arm64] 117 | os: [android] 118 | requiresBuild: true 119 | dev: true 120 | optional: true 121 | 122 | /@esbuild/android-arm@0.17.18: 123 | resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} 124 | engines: {node: '>=12'} 125 | cpu: [arm] 126 | os: [android] 127 | requiresBuild: true 128 | dev: true 129 | optional: true 130 | 131 | /@esbuild/android-x64@0.17.18: 132 | resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} 133 | engines: {node: '>=12'} 134 | cpu: [x64] 135 | os: [android] 136 | requiresBuild: true 137 | dev: true 138 | optional: true 139 | 140 | /@esbuild/darwin-arm64@0.17.18: 141 | resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} 142 | engines: {node: '>=12'} 143 | cpu: [arm64] 144 | os: [darwin] 145 | requiresBuild: true 146 | dev: true 147 | optional: true 148 | 149 | /@esbuild/darwin-x64@0.17.18: 150 | resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} 151 | engines: {node: '>=12'} 152 | cpu: [x64] 153 | os: [darwin] 154 | requiresBuild: true 155 | dev: true 156 | optional: true 157 | 158 | /@esbuild/freebsd-arm64@0.17.18: 159 | resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} 160 | engines: {node: '>=12'} 161 | cpu: [arm64] 162 | os: [freebsd] 163 | requiresBuild: true 164 | dev: true 165 | optional: true 166 | 167 | /@esbuild/freebsd-x64@0.17.18: 168 | resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} 169 | engines: {node: '>=12'} 170 | cpu: [x64] 171 | os: [freebsd] 172 | requiresBuild: true 173 | dev: true 174 | optional: true 175 | 176 | /@esbuild/linux-arm64@0.17.18: 177 | resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} 178 | engines: {node: '>=12'} 179 | cpu: [arm64] 180 | os: [linux] 181 | requiresBuild: true 182 | dev: true 183 | optional: true 184 | 185 | /@esbuild/linux-arm@0.17.18: 186 | resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} 187 | engines: {node: '>=12'} 188 | cpu: [arm] 189 | os: [linux] 190 | requiresBuild: true 191 | dev: true 192 | optional: true 193 | 194 | /@esbuild/linux-ia32@0.17.18: 195 | resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} 196 | engines: {node: '>=12'} 197 | cpu: [ia32] 198 | os: [linux] 199 | requiresBuild: true 200 | dev: true 201 | optional: true 202 | 203 | /@esbuild/linux-loong64@0.17.18: 204 | resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} 205 | engines: {node: '>=12'} 206 | cpu: [loong64] 207 | os: [linux] 208 | requiresBuild: true 209 | dev: true 210 | optional: true 211 | 212 | /@esbuild/linux-mips64el@0.17.18: 213 | resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} 214 | engines: {node: '>=12'} 215 | cpu: [mips64el] 216 | os: [linux] 217 | requiresBuild: true 218 | dev: true 219 | optional: true 220 | 221 | /@esbuild/linux-ppc64@0.17.18: 222 | resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} 223 | engines: {node: '>=12'} 224 | cpu: [ppc64] 225 | os: [linux] 226 | requiresBuild: true 227 | dev: true 228 | optional: true 229 | 230 | /@esbuild/linux-riscv64@0.17.18: 231 | resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} 232 | engines: {node: '>=12'} 233 | cpu: [riscv64] 234 | os: [linux] 235 | requiresBuild: true 236 | dev: true 237 | optional: true 238 | 239 | /@esbuild/linux-s390x@0.17.18: 240 | resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} 241 | engines: {node: '>=12'} 242 | cpu: [s390x] 243 | os: [linux] 244 | requiresBuild: true 245 | dev: true 246 | optional: true 247 | 248 | /@esbuild/linux-x64@0.17.18: 249 | resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} 250 | engines: {node: '>=12'} 251 | cpu: [x64] 252 | os: [linux] 253 | requiresBuild: true 254 | dev: true 255 | optional: true 256 | 257 | /@esbuild/netbsd-x64@0.17.18: 258 | resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} 259 | engines: {node: '>=12'} 260 | cpu: [x64] 261 | os: [netbsd] 262 | requiresBuild: true 263 | dev: true 264 | optional: true 265 | 266 | /@esbuild/openbsd-x64@0.17.18: 267 | resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} 268 | engines: {node: '>=12'} 269 | cpu: [x64] 270 | os: [openbsd] 271 | requiresBuild: true 272 | dev: true 273 | optional: true 274 | 275 | /@esbuild/sunos-x64@0.17.18: 276 | resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} 277 | engines: {node: '>=12'} 278 | cpu: [x64] 279 | os: [sunos] 280 | requiresBuild: true 281 | dev: true 282 | optional: true 283 | 284 | /@esbuild/win32-arm64@0.17.18: 285 | resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} 286 | engines: {node: '>=12'} 287 | cpu: [arm64] 288 | os: [win32] 289 | requiresBuild: true 290 | dev: true 291 | optional: true 292 | 293 | /@esbuild/win32-ia32@0.17.18: 294 | resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} 295 | engines: {node: '>=12'} 296 | cpu: [ia32] 297 | os: [win32] 298 | requiresBuild: true 299 | dev: true 300 | optional: true 301 | 302 | /@esbuild/win32-x64@0.17.18: 303 | resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} 304 | engines: {node: '>=12'} 305 | cpu: [x64] 306 | os: [win32] 307 | requiresBuild: true 308 | dev: true 309 | optional: true 310 | 311 | /@jridgewell/sourcemap-codec@1.4.15: 312 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 313 | dev: true 314 | 315 | /@juggle/resize-observer@3.4.0: 316 | resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} 317 | dev: true 318 | 319 | /@nodelib/fs.scandir@2.1.5: 320 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 321 | engines: {node: '>= 8'} 322 | dependencies: 323 | '@nodelib/fs.stat': 2.0.5 324 | run-parallel: 1.2.0 325 | dev: true 326 | 327 | /@nodelib/fs.stat@2.0.5: 328 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 329 | engines: {node: '>= 8'} 330 | dev: true 331 | 332 | /@nodelib/fs.walk@1.2.8: 333 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 334 | engines: {node: '>= 8'} 335 | dependencies: 336 | '@nodelib/fs.scandir': 2.1.5 337 | fastq: 1.15.0 338 | dev: true 339 | 340 | /@rollup/pluginutils@5.0.2: 341 | resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} 342 | engines: {node: '>=14.0.0'} 343 | peerDependencies: 344 | rollup: ^1.20.0||^2.0.0||^3.0.0 345 | peerDependenciesMeta: 346 | rollup: 347 | optional: true 348 | dependencies: 349 | '@types/estree': 1.0.1 350 | estree-walker: 2.0.2 351 | picomatch: 2.3.1 352 | dev: true 353 | 354 | /@types/estree@1.0.1: 355 | resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} 356 | dev: true 357 | 358 | /@types/katex@0.14.0: 359 | resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==} 360 | dev: true 361 | 362 | /@types/lodash-es@4.17.7: 363 | resolution: {integrity: sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==} 364 | dependencies: 365 | '@types/lodash': 4.14.194 366 | dev: true 367 | 368 | /@types/lodash@4.14.194: 369 | resolution: {integrity: sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==} 370 | dev: true 371 | 372 | /@types/node@18.16.0: 373 | resolution: {integrity: sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==} 374 | dev: true 375 | 376 | /@types/web-bluetooth@0.0.16: 377 | resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} 378 | 379 | /@vitejs/plugin-vue@4.1.0(vite@4.3.1)(vue@3.2.47): 380 | resolution: {integrity: sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==} 381 | engines: {node: ^14.18.0 || >=16.0.0} 382 | peerDependencies: 383 | vite: ^4.0.0 384 | vue: ^3.2.25 385 | dependencies: 386 | vite: 4.3.1(@types/node@18.16.0)(sass@1.62.0) 387 | vue: 3.2.47 388 | dev: true 389 | 390 | /@volar/language-core@1.4.1: 391 | resolution: {integrity: sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==} 392 | dependencies: 393 | '@volar/source-map': 1.4.1 394 | dev: true 395 | 396 | /@volar/source-map@1.4.1: 397 | resolution: {integrity: sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==} 398 | dependencies: 399 | muggle-string: 0.2.2 400 | dev: true 401 | 402 | /@volar/typescript@1.4.1(typescript@5.0.4): 403 | resolution: {integrity: sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ==} 404 | peerDependencies: 405 | typescript: '*' 406 | dependencies: 407 | '@volar/language-core': 1.4.1 408 | typescript: 5.0.4 409 | dev: true 410 | 411 | /@volar/vue-language-core@1.4.4: 412 | resolution: {integrity: sha512-c3hL6un+CfoOlusGvpypcodmk9ke/ImrWIUc0GkgI+imoQpUGzgu3tEQWlPs604R7AhxeZwWUi8hQNfax0R/zA==} 413 | dependencies: 414 | '@volar/language-core': 1.4.1 415 | '@volar/source-map': 1.4.1 416 | '@vue/compiler-dom': 3.2.47 417 | '@vue/compiler-sfc': 3.2.47 418 | '@vue/reactivity': 3.2.47 419 | '@vue/shared': 3.2.47 420 | minimatch: 9.0.0 421 | muggle-string: 0.2.2 422 | vue-template-compiler: 2.7.14 423 | dev: true 424 | 425 | /@volar/vue-typescript@1.4.4(typescript@5.0.4): 426 | resolution: {integrity: sha512-L61Fk15jlJw3QtIddD4cVE5jei5i6zbLJRiaEMYDDnUKB259/qUrdvnMfnZUFVyDwlevzdstjtaUyreeG/0nPQ==} 427 | peerDependencies: 428 | typescript: '*' 429 | dependencies: 430 | '@volar/typescript': 1.4.1(typescript@5.0.4) 431 | '@volar/vue-language-core': 1.4.4 432 | typescript: 5.0.4 433 | dev: true 434 | 435 | /@vue/compiler-core@3.2.47: 436 | resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} 437 | dependencies: 438 | '@babel/parser': 7.21.4 439 | '@vue/shared': 3.2.47 440 | estree-walker: 2.0.2 441 | source-map: 0.6.1 442 | 443 | /@vue/compiler-dom@3.2.47: 444 | resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} 445 | dependencies: 446 | '@vue/compiler-core': 3.2.47 447 | '@vue/shared': 3.2.47 448 | 449 | /@vue/compiler-sfc@3.2.47: 450 | resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} 451 | dependencies: 452 | '@babel/parser': 7.21.4 453 | '@vue/compiler-core': 3.2.47 454 | '@vue/compiler-dom': 3.2.47 455 | '@vue/compiler-ssr': 3.2.47 456 | '@vue/reactivity-transform': 3.2.47 457 | '@vue/shared': 3.2.47 458 | estree-walker: 2.0.2 459 | magic-string: 0.25.9 460 | postcss: 8.4.23 461 | source-map: 0.6.1 462 | 463 | /@vue/compiler-ssr@3.2.47: 464 | resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} 465 | dependencies: 466 | '@vue/compiler-dom': 3.2.47 467 | '@vue/shared': 3.2.47 468 | 469 | /@vue/devtools-api@6.5.0: 470 | resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} 471 | dev: false 472 | 473 | /@vue/reactivity-transform@3.2.47: 474 | resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} 475 | dependencies: 476 | '@babel/parser': 7.21.4 477 | '@vue/compiler-core': 3.2.47 478 | '@vue/shared': 3.2.47 479 | estree-walker: 2.0.2 480 | magic-string: 0.25.9 481 | 482 | /@vue/reactivity@3.2.47: 483 | resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} 484 | dependencies: 485 | '@vue/shared': 3.2.47 486 | 487 | /@vue/runtime-core@3.2.47: 488 | resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} 489 | dependencies: 490 | '@vue/reactivity': 3.2.47 491 | '@vue/shared': 3.2.47 492 | 493 | /@vue/runtime-dom@3.2.47: 494 | resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} 495 | dependencies: 496 | '@vue/runtime-core': 3.2.47 497 | '@vue/shared': 3.2.47 498 | csstype: 2.6.21 499 | 500 | /@vue/server-renderer@3.2.47(vue@3.2.47): 501 | resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} 502 | peerDependencies: 503 | vue: 3.2.47 504 | dependencies: 505 | '@vue/compiler-ssr': 3.2.47 506 | '@vue/shared': 3.2.47 507 | vue: 3.2.47 508 | 509 | /@vue/shared@3.2.47: 510 | resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} 511 | 512 | /@vue/tsconfig@0.1.3(@types/node@18.16.0): 513 | resolution: {integrity: sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==} 514 | peerDependencies: 515 | '@types/node': '*' 516 | peerDependenciesMeta: 517 | '@types/node': 518 | optional: true 519 | dependencies: 520 | '@types/node': 18.16.0 521 | dev: true 522 | 523 | /@vueuse/components@10.1.0(vue@3.2.47): 524 | resolution: {integrity: sha512-U3c5tPUAxfwWoBSpFbCNFMEM8/jSZ0+5M1n9YWcahyb+uRNo4UmsofX/Hzs6K56PSm0g+uuhZVwSnMq8ttD8Lw==} 525 | dependencies: 526 | '@vueuse/core': 10.1.0(vue@3.2.47) 527 | '@vueuse/shared': 10.1.0(vue@3.2.47) 528 | vue-demi: 0.14.0(vue@3.2.47) 529 | transitivePeerDependencies: 530 | - '@vue/composition-api' 531 | - vue 532 | dev: false 533 | 534 | /@vueuse/core@10.1.0(vue@3.2.47): 535 | resolution: {integrity: sha512-3Znoa5m5RO+z4/C9w6DRaKTR3wCVJvD5rav8HTDGsr+7rOZRHtcgFJ8NcCs0ZvIpmev2kExTa311ns5j2RbzDQ==} 536 | dependencies: 537 | '@types/web-bluetooth': 0.0.16 538 | '@vueuse/metadata': 10.1.0 539 | '@vueuse/shared': 10.1.0(vue@3.2.47) 540 | vue-demi: 0.14.0(vue@3.2.47) 541 | transitivePeerDependencies: 542 | - '@vue/composition-api' 543 | - vue 544 | 545 | /@vueuse/metadata@10.1.0: 546 | resolution: {integrity: sha512-cM28HjDEw5FIrPE9rgSPFZvQ0ZYnOLAOr8hl1XM6tFl80U3WAR5ROdnAqiYybniwP5gt9MKKAJAqd/ab2aHkqg==} 547 | 548 | /@vueuse/shared@10.1.0(vue@3.2.47): 549 | resolution: {integrity: sha512-2X52ogu12i9DkKOQ01yeb/BKg9UO87RNnpm5sXkQvyORlbq8ONS5l39MYkjkeVWWjdT0teJru7a2S41dmHmqjQ==} 550 | dependencies: 551 | vue-demi: 0.14.0(vue@3.2.47) 552 | transitivePeerDependencies: 553 | - '@vue/composition-api' 554 | - vue 555 | 556 | /acorn@8.8.2: 557 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 558 | engines: {node: '>=0.4.0'} 559 | hasBin: true 560 | dev: true 561 | 562 | /ansi-styles@3.2.1: 563 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 564 | engines: {node: '>=4'} 565 | dependencies: 566 | color-convert: 1.9.3 567 | dev: true 568 | 569 | /anymatch@3.1.3: 570 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 571 | engines: {node: '>= 8'} 572 | dependencies: 573 | normalize-path: 3.0.0 574 | picomatch: 2.3.1 575 | dev: true 576 | 577 | /array-buffer-byte-length@1.0.0: 578 | resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} 579 | dependencies: 580 | call-bind: 1.0.2 581 | is-array-buffer: 3.0.2 582 | dev: true 583 | 584 | /async-validator@4.2.5: 585 | resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} 586 | dev: true 587 | 588 | /available-typed-arrays@1.0.5: 589 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 590 | engines: {node: '>= 0.4'} 591 | dev: true 592 | 593 | /balanced-match@1.0.2: 594 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 595 | dev: true 596 | 597 | /binary-extensions@2.2.0: 598 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 599 | engines: {node: '>=8'} 600 | dev: true 601 | 602 | /brace-expansion@1.1.11: 603 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 604 | dependencies: 605 | balanced-match: 1.0.2 606 | concat-map: 0.0.1 607 | dev: true 608 | 609 | /brace-expansion@2.0.1: 610 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 611 | dependencies: 612 | balanced-match: 1.0.2 613 | dev: true 614 | 615 | /braces@3.0.2: 616 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 617 | engines: {node: '>=8'} 618 | dependencies: 619 | fill-range: 7.0.1 620 | dev: true 621 | 622 | /call-bind@1.0.2: 623 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 624 | dependencies: 625 | function-bind: 1.1.1 626 | get-intrinsic: 1.2.0 627 | dev: true 628 | 629 | /chalk@2.4.2: 630 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 631 | engines: {node: '>=4'} 632 | dependencies: 633 | ansi-styles: 3.2.1 634 | escape-string-regexp: 1.0.5 635 | supports-color: 5.5.0 636 | dev: true 637 | 638 | /chokidar@3.5.3: 639 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 640 | engines: {node: '>= 8.10.0'} 641 | dependencies: 642 | anymatch: 3.1.3 643 | braces: 3.0.2 644 | glob-parent: 5.1.2 645 | is-binary-path: 2.1.0 646 | is-glob: 4.0.3 647 | normalize-path: 3.0.0 648 | readdirp: 3.6.0 649 | optionalDependencies: 650 | fsevents: 2.3.2 651 | dev: true 652 | 653 | /color-convert@1.9.3: 654 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 655 | dependencies: 656 | color-name: 1.1.3 657 | dev: true 658 | 659 | /color-name@1.1.3: 660 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 661 | dev: true 662 | 663 | /concat-map@0.0.1: 664 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 665 | dev: true 666 | 667 | /cross-spawn@6.0.5: 668 | resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} 669 | engines: {node: '>=4.8'} 670 | dependencies: 671 | nice-try: 1.0.5 672 | path-key: 2.0.1 673 | semver: 5.7.1 674 | shebang-command: 1.2.0 675 | which: 1.3.1 676 | dev: true 677 | 678 | /css-render@0.15.12: 679 | resolution: {integrity: sha512-eWzS66patiGkTTik+ipO9qNGZ+uNuGyTmnz6/+EJIiFg8+3yZRpnMwgFo8YdXhQRsiePzehnusrxVvugNjXzbw==} 680 | dependencies: 681 | '@emotion/hash': 0.8.0 682 | csstype: 3.0.11 683 | dev: true 684 | 685 | /csstype@2.6.21: 686 | resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} 687 | 688 | /csstype@3.0.11: 689 | resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} 690 | dev: true 691 | 692 | /date-fns-tz@1.3.8(date-fns@2.29.3): 693 | resolution: {integrity: sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==} 694 | peerDependencies: 695 | date-fns: '>=2.0.0' 696 | dependencies: 697 | date-fns: 2.29.3 698 | dev: true 699 | 700 | /date-fns@2.29.3: 701 | resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} 702 | engines: {node: '>=0.11'} 703 | dev: true 704 | 705 | /de-indent@1.0.2: 706 | resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 707 | dev: true 708 | 709 | /debug@4.3.4: 710 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 711 | engines: {node: '>=6.0'} 712 | peerDependencies: 713 | supports-color: '*' 714 | peerDependenciesMeta: 715 | supports-color: 716 | optional: true 717 | dependencies: 718 | ms: 2.1.2 719 | dev: true 720 | 721 | /define-properties@1.2.0: 722 | resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} 723 | engines: {node: '>= 0.4'} 724 | dependencies: 725 | has-property-descriptors: 1.0.0 726 | object-keys: 1.1.1 727 | dev: true 728 | 729 | /error-ex@1.3.2: 730 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 731 | dependencies: 732 | is-arrayish: 0.2.1 733 | dev: true 734 | 735 | /es-abstract@1.21.2: 736 | resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} 737 | engines: {node: '>= 0.4'} 738 | dependencies: 739 | array-buffer-byte-length: 1.0.0 740 | available-typed-arrays: 1.0.5 741 | call-bind: 1.0.2 742 | es-set-tostringtag: 2.0.1 743 | es-to-primitive: 1.2.1 744 | function.prototype.name: 1.1.5 745 | get-intrinsic: 1.2.0 746 | get-symbol-description: 1.0.0 747 | globalthis: 1.0.3 748 | gopd: 1.0.1 749 | has: 1.0.3 750 | has-property-descriptors: 1.0.0 751 | has-proto: 1.0.1 752 | has-symbols: 1.0.3 753 | internal-slot: 1.0.5 754 | is-array-buffer: 3.0.2 755 | is-callable: 1.2.7 756 | is-negative-zero: 2.0.2 757 | is-regex: 1.1.4 758 | is-shared-array-buffer: 1.0.2 759 | is-string: 1.0.7 760 | is-typed-array: 1.1.10 761 | is-weakref: 1.0.2 762 | object-inspect: 1.12.3 763 | object-keys: 1.1.1 764 | object.assign: 4.1.4 765 | regexp.prototype.flags: 1.5.0 766 | safe-regex-test: 1.0.0 767 | string.prototype.trim: 1.2.7 768 | string.prototype.trimend: 1.0.6 769 | string.prototype.trimstart: 1.0.6 770 | typed-array-length: 1.0.4 771 | unbox-primitive: 1.0.2 772 | which-typed-array: 1.1.9 773 | dev: true 774 | 775 | /es-set-tostringtag@2.0.1: 776 | resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} 777 | engines: {node: '>= 0.4'} 778 | dependencies: 779 | get-intrinsic: 1.2.0 780 | has: 1.0.3 781 | has-tostringtag: 1.0.0 782 | dev: true 783 | 784 | /es-to-primitive@1.2.1: 785 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 786 | engines: {node: '>= 0.4'} 787 | dependencies: 788 | is-callable: 1.2.7 789 | is-date-object: 1.0.5 790 | is-symbol: 1.0.4 791 | dev: true 792 | 793 | /esbuild@0.17.18: 794 | resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} 795 | engines: {node: '>=12'} 796 | hasBin: true 797 | requiresBuild: true 798 | optionalDependencies: 799 | '@esbuild/android-arm': 0.17.18 800 | '@esbuild/android-arm64': 0.17.18 801 | '@esbuild/android-x64': 0.17.18 802 | '@esbuild/darwin-arm64': 0.17.18 803 | '@esbuild/darwin-x64': 0.17.18 804 | '@esbuild/freebsd-arm64': 0.17.18 805 | '@esbuild/freebsd-x64': 0.17.18 806 | '@esbuild/linux-arm': 0.17.18 807 | '@esbuild/linux-arm64': 0.17.18 808 | '@esbuild/linux-ia32': 0.17.18 809 | '@esbuild/linux-loong64': 0.17.18 810 | '@esbuild/linux-mips64el': 0.17.18 811 | '@esbuild/linux-ppc64': 0.17.18 812 | '@esbuild/linux-riscv64': 0.17.18 813 | '@esbuild/linux-s390x': 0.17.18 814 | '@esbuild/linux-x64': 0.17.18 815 | '@esbuild/netbsd-x64': 0.17.18 816 | '@esbuild/openbsd-x64': 0.17.18 817 | '@esbuild/sunos-x64': 0.17.18 818 | '@esbuild/win32-arm64': 0.17.18 819 | '@esbuild/win32-ia32': 0.17.18 820 | '@esbuild/win32-x64': 0.17.18 821 | dev: true 822 | 823 | /escape-string-regexp@1.0.5: 824 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 825 | engines: {node: '>=0.8.0'} 826 | dev: true 827 | 828 | /escape-string-regexp@5.0.0: 829 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 830 | engines: {node: '>=12'} 831 | dev: true 832 | 833 | /estree-walker@2.0.2: 834 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 835 | 836 | /evtd@0.2.4: 837 | resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} 838 | dev: true 839 | 840 | /fast-glob@3.2.12: 841 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 842 | engines: {node: '>=8.6.0'} 843 | dependencies: 844 | '@nodelib/fs.stat': 2.0.5 845 | '@nodelib/fs.walk': 1.2.8 846 | glob-parent: 5.1.2 847 | merge2: 1.4.1 848 | micromatch: 4.0.5 849 | dev: true 850 | 851 | /fastq@1.15.0: 852 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 853 | dependencies: 854 | reusify: 1.0.4 855 | dev: true 856 | 857 | /fill-range@7.0.1: 858 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 859 | engines: {node: '>=8'} 860 | dependencies: 861 | to-regex-range: 5.0.1 862 | dev: true 863 | 864 | /for-each@0.3.3: 865 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 866 | dependencies: 867 | is-callable: 1.2.7 868 | dev: true 869 | 870 | /fsevents@2.3.2: 871 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 872 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 873 | os: [darwin] 874 | requiresBuild: true 875 | dev: true 876 | optional: true 877 | 878 | /function-bind@1.1.1: 879 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 880 | dev: true 881 | 882 | /function.prototype.name@1.1.5: 883 | resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} 884 | engines: {node: '>= 0.4'} 885 | dependencies: 886 | call-bind: 1.0.2 887 | define-properties: 1.2.0 888 | es-abstract: 1.21.2 889 | functions-have-names: 1.2.3 890 | dev: true 891 | 892 | /functions-have-names@1.2.3: 893 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 894 | dev: true 895 | 896 | /get-intrinsic@1.2.0: 897 | resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} 898 | dependencies: 899 | function-bind: 1.1.1 900 | has: 1.0.3 901 | has-symbols: 1.0.3 902 | dev: true 903 | 904 | /get-symbol-description@1.0.0: 905 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 906 | engines: {node: '>= 0.4'} 907 | dependencies: 908 | call-bind: 1.0.2 909 | get-intrinsic: 1.2.0 910 | dev: true 911 | 912 | /glob-parent@5.1.2: 913 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 914 | engines: {node: '>= 6'} 915 | dependencies: 916 | is-glob: 4.0.3 917 | dev: true 918 | 919 | /globalthis@1.0.3: 920 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 921 | engines: {node: '>= 0.4'} 922 | dependencies: 923 | define-properties: 1.2.0 924 | dev: true 925 | 926 | /gopd@1.0.1: 927 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 928 | dependencies: 929 | get-intrinsic: 1.2.0 930 | dev: true 931 | 932 | /graceful-fs@4.2.11: 933 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 934 | dev: true 935 | 936 | /has-bigints@1.0.2: 937 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 938 | dev: true 939 | 940 | /has-flag@3.0.0: 941 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 942 | engines: {node: '>=4'} 943 | dev: true 944 | 945 | /has-property-descriptors@1.0.0: 946 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 947 | dependencies: 948 | get-intrinsic: 1.2.0 949 | dev: true 950 | 951 | /has-proto@1.0.1: 952 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 953 | engines: {node: '>= 0.4'} 954 | dev: true 955 | 956 | /has-symbols@1.0.3: 957 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 958 | engines: {node: '>= 0.4'} 959 | dev: true 960 | 961 | /has-tostringtag@1.0.0: 962 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 963 | engines: {node: '>= 0.4'} 964 | dependencies: 965 | has-symbols: 1.0.3 966 | dev: true 967 | 968 | /has@1.0.3: 969 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 970 | engines: {node: '>= 0.4.0'} 971 | dependencies: 972 | function-bind: 1.1.1 973 | dev: true 974 | 975 | /he@1.2.0: 976 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 977 | hasBin: true 978 | dev: true 979 | 980 | /highlight.js@11.7.0: 981 | resolution: {integrity: sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==} 982 | engines: {node: '>=12.0.0'} 983 | dev: true 984 | 985 | /hosted-git-info@2.8.9: 986 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 987 | dev: true 988 | 989 | /immutable@4.3.0: 990 | resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} 991 | dev: true 992 | 993 | /internal-slot@1.0.5: 994 | resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} 995 | engines: {node: '>= 0.4'} 996 | dependencies: 997 | get-intrinsic: 1.2.0 998 | has: 1.0.3 999 | side-channel: 1.0.4 1000 | dev: true 1001 | 1002 | /is-array-buffer@3.0.2: 1003 | resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} 1004 | dependencies: 1005 | call-bind: 1.0.2 1006 | get-intrinsic: 1.2.0 1007 | is-typed-array: 1.1.10 1008 | dev: true 1009 | 1010 | /is-arrayish@0.2.1: 1011 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1012 | dev: true 1013 | 1014 | /is-bigint@1.0.4: 1015 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 1016 | dependencies: 1017 | has-bigints: 1.0.2 1018 | dev: true 1019 | 1020 | /is-binary-path@2.1.0: 1021 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1022 | engines: {node: '>=8'} 1023 | dependencies: 1024 | binary-extensions: 2.2.0 1025 | dev: true 1026 | 1027 | /is-boolean-object@1.1.2: 1028 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1029 | engines: {node: '>= 0.4'} 1030 | dependencies: 1031 | call-bind: 1.0.2 1032 | has-tostringtag: 1.0.0 1033 | dev: true 1034 | 1035 | /is-callable@1.2.7: 1036 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1037 | engines: {node: '>= 0.4'} 1038 | dev: true 1039 | 1040 | /is-core-module@2.12.0: 1041 | resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} 1042 | dependencies: 1043 | has: 1.0.3 1044 | dev: true 1045 | 1046 | /is-date-object@1.0.5: 1047 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1048 | engines: {node: '>= 0.4'} 1049 | dependencies: 1050 | has-tostringtag: 1.0.0 1051 | dev: true 1052 | 1053 | /is-extglob@2.1.1: 1054 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1055 | engines: {node: '>=0.10.0'} 1056 | dev: true 1057 | 1058 | /is-glob@4.0.3: 1059 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1060 | engines: {node: '>=0.10.0'} 1061 | dependencies: 1062 | is-extglob: 2.1.1 1063 | dev: true 1064 | 1065 | /is-negative-zero@2.0.2: 1066 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 1067 | engines: {node: '>= 0.4'} 1068 | dev: true 1069 | 1070 | /is-number-object@1.0.7: 1071 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 1072 | engines: {node: '>= 0.4'} 1073 | dependencies: 1074 | has-tostringtag: 1.0.0 1075 | dev: true 1076 | 1077 | /is-number@7.0.0: 1078 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1079 | engines: {node: '>=0.12.0'} 1080 | dev: true 1081 | 1082 | /is-regex@1.1.4: 1083 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1084 | engines: {node: '>= 0.4'} 1085 | dependencies: 1086 | call-bind: 1.0.2 1087 | has-tostringtag: 1.0.0 1088 | dev: true 1089 | 1090 | /is-shared-array-buffer@1.0.2: 1091 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 1092 | dependencies: 1093 | call-bind: 1.0.2 1094 | dev: true 1095 | 1096 | /is-string@1.0.7: 1097 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1098 | engines: {node: '>= 0.4'} 1099 | dependencies: 1100 | has-tostringtag: 1.0.0 1101 | dev: true 1102 | 1103 | /is-symbol@1.0.4: 1104 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1105 | engines: {node: '>= 0.4'} 1106 | dependencies: 1107 | has-symbols: 1.0.3 1108 | dev: true 1109 | 1110 | /is-typed-array@1.1.10: 1111 | resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} 1112 | engines: {node: '>= 0.4'} 1113 | dependencies: 1114 | available-typed-arrays: 1.0.5 1115 | call-bind: 1.0.2 1116 | for-each: 0.3.3 1117 | gopd: 1.0.1 1118 | has-tostringtag: 1.0.0 1119 | dev: true 1120 | 1121 | /is-weakref@1.0.2: 1122 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1123 | dependencies: 1124 | call-bind: 1.0.2 1125 | dev: true 1126 | 1127 | /isexe@2.0.0: 1128 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1129 | dev: true 1130 | 1131 | /json-parse-better-errors@1.0.2: 1132 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 1133 | dev: true 1134 | 1135 | /jsonc-parser@3.2.0: 1136 | resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} 1137 | dev: true 1138 | 1139 | /load-json-file@4.0.0: 1140 | resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} 1141 | engines: {node: '>=4'} 1142 | dependencies: 1143 | graceful-fs: 4.2.11 1144 | parse-json: 4.0.0 1145 | pify: 3.0.0 1146 | strip-bom: 3.0.0 1147 | dev: true 1148 | 1149 | /local-pkg@0.4.3: 1150 | resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} 1151 | engines: {node: '>=14'} 1152 | dev: true 1153 | 1154 | /lodash-es@4.17.21: 1155 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 1156 | dev: true 1157 | 1158 | /lodash@4.17.21: 1159 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1160 | dev: true 1161 | 1162 | /lru-cache@6.0.0: 1163 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1164 | engines: {node: '>=10'} 1165 | dependencies: 1166 | yallist: 4.0.0 1167 | dev: true 1168 | 1169 | /magic-string@0.25.9: 1170 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 1171 | dependencies: 1172 | sourcemap-codec: 1.4.8 1173 | 1174 | /magic-string@0.30.0: 1175 | resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} 1176 | engines: {node: '>=12'} 1177 | dependencies: 1178 | '@jridgewell/sourcemap-codec': 1.4.15 1179 | dev: true 1180 | 1181 | /memorystream@0.3.1: 1182 | resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} 1183 | engines: {node: '>= 0.10.0'} 1184 | dev: true 1185 | 1186 | /merge2@1.4.1: 1187 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1188 | engines: {node: '>= 8'} 1189 | dev: true 1190 | 1191 | /micromatch@4.0.5: 1192 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1193 | engines: {node: '>=8.6'} 1194 | dependencies: 1195 | braces: 3.0.2 1196 | picomatch: 2.3.1 1197 | dev: true 1198 | 1199 | /minimatch@3.1.2: 1200 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1201 | dependencies: 1202 | brace-expansion: 1.1.11 1203 | dev: true 1204 | 1205 | /minimatch@7.4.6: 1206 | resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} 1207 | engines: {node: '>=10'} 1208 | dependencies: 1209 | brace-expansion: 2.0.1 1210 | dev: true 1211 | 1212 | /minimatch@9.0.0: 1213 | resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==} 1214 | engines: {node: '>=16 || 14 >=14.17'} 1215 | dependencies: 1216 | brace-expansion: 2.0.1 1217 | dev: true 1218 | 1219 | /mlly@1.2.0: 1220 | resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} 1221 | dependencies: 1222 | acorn: 8.8.2 1223 | pathe: 1.1.0 1224 | pkg-types: 1.0.2 1225 | ufo: 1.1.1 1226 | dev: true 1227 | 1228 | /ms@2.1.2: 1229 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1230 | dev: true 1231 | 1232 | /muggle-string@0.2.2: 1233 | resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==} 1234 | dev: true 1235 | 1236 | /naive-ui@2.34.3(vue@3.2.47): 1237 | resolution: {integrity: sha512-fUMr0dzb/iGsOTWgoblPVobY5X5dihQ1eam5dA+H74oyLYAvgX4pL96xQFPBLIYqvyRFBAsN85kHN5pLqdtpxA==} 1238 | peerDependencies: 1239 | vue: ^3.0.0 1240 | dependencies: 1241 | '@css-render/plugin-bem': 0.15.12(css-render@0.15.12) 1242 | '@css-render/vue3-ssr': 0.15.12(vue@3.2.47) 1243 | '@types/katex': 0.14.0 1244 | '@types/lodash': 4.14.194 1245 | '@types/lodash-es': 4.17.7 1246 | async-validator: 4.2.5 1247 | css-render: 0.15.12 1248 | date-fns: 2.29.3 1249 | date-fns-tz: 1.3.8(date-fns@2.29.3) 1250 | evtd: 0.2.4 1251 | highlight.js: 11.7.0 1252 | lodash: 4.17.21 1253 | lodash-es: 4.17.21 1254 | seemly: 0.3.6 1255 | treemate: 0.3.11 1256 | vdirs: 0.1.8(vue@3.2.47) 1257 | vooks: 0.2.12(vue@3.2.47) 1258 | vue: 3.2.47 1259 | vueuc: 0.4.51(vue@3.2.47) 1260 | dev: true 1261 | 1262 | /nanoid@3.3.6: 1263 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1264 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1265 | hasBin: true 1266 | 1267 | /nice-try@1.0.5: 1268 | resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} 1269 | dev: true 1270 | 1271 | /normalize-package-data@2.5.0: 1272 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1273 | dependencies: 1274 | hosted-git-info: 2.8.9 1275 | resolve: 1.22.2 1276 | semver: 5.7.1 1277 | validate-npm-package-license: 3.0.4 1278 | dev: true 1279 | 1280 | /normalize-path@3.0.0: 1281 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1282 | engines: {node: '>=0.10.0'} 1283 | dev: true 1284 | 1285 | /npm-run-all@4.1.5: 1286 | resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} 1287 | engines: {node: '>= 4'} 1288 | hasBin: true 1289 | dependencies: 1290 | ansi-styles: 3.2.1 1291 | chalk: 2.4.2 1292 | cross-spawn: 6.0.5 1293 | memorystream: 0.3.1 1294 | minimatch: 3.1.2 1295 | pidtree: 0.3.1 1296 | read-pkg: 3.0.0 1297 | shell-quote: 1.8.1 1298 | string.prototype.padend: 3.1.4 1299 | dev: true 1300 | 1301 | /object-inspect@1.12.3: 1302 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 1303 | dev: true 1304 | 1305 | /object-keys@1.1.1: 1306 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1307 | engines: {node: '>= 0.4'} 1308 | dev: true 1309 | 1310 | /object.assign@4.1.4: 1311 | resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} 1312 | engines: {node: '>= 0.4'} 1313 | dependencies: 1314 | call-bind: 1.0.2 1315 | define-properties: 1.2.0 1316 | has-symbols: 1.0.3 1317 | object-keys: 1.1.1 1318 | dev: true 1319 | 1320 | /parse-json@4.0.0: 1321 | resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} 1322 | engines: {node: '>=4'} 1323 | dependencies: 1324 | error-ex: 1.3.2 1325 | json-parse-better-errors: 1.0.2 1326 | dev: true 1327 | 1328 | /path-key@2.0.1: 1329 | resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 1330 | engines: {node: '>=4'} 1331 | dev: true 1332 | 1333 | /path-parse@1.0.7: 1334 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1335 | dev: true 1336 | 1337 | /path-type@3.0.0: 1338 | resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} 1339 | engines: {node: '>=4'} 1340 | dependencies: 1341 | pify: 3.0.0 1342 | dev: true 1343 | 1344 | /pathe@1.1.0: 1345 | resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} 1346 | dev: true 1347 | 1348 | /picocolors@1.0.0: 1349 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1350 | 1351 | /picomatch@2.3.1: 1352 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1353 | engines: {node: '>=8.6'} 1354 | dev: true 1355 | 1356 | /pidtree@0.3.1: 1357 | resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} 1358 | engines: {node: '>=0.10'} 1359 | hasBin: true 1360 | dev: true 1361 | 1362 | /pify@3.0.0: 1363 | resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} 1364 | engines: {node: '>=4'} 1365 | dev: true 1366 | 1367 | /pinia@2.0.35(typescript@5.0.4)(vue@3.2.47): 1368 | resolution: {integrity: sha512-P1IKKQWhxGXiiZ3atOaNI75bYlFUbRxtJdhPLX059Z7+b9Z04rnTZdSY8Aph1LA+/4QEMAYHsTQ638Wfe+6K5g==} 1369 | peerDependencies: 1370 | '@vue/composition-api': ^1.4.0 1371 | typescript: '>=4.4.4' 1372 | vue: ^2.6.14 || ^3.2.0 1373 | peerDependenciesMeta: 1374 | '@vue/composition-api': 1375 | optional: true 1376 | typescript: 1377 | optional: true 1378 | dependencies: 1379 | '@vue/devtools-api': 6.5.0 1380 | typescript: 5.0.4 1381 | vue: 3.2.47 1382 | vue-demi: 0.14.0(vue@3.2.47) 1383 | dev: false 1384 | 1385 | /pkg-types@1.0.2: 1386 | resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} 1387 | dependencies: 1388 | jsonc-parser: 3.2.0 1389 | mlly: 1.2.0 1390 | pathe: 1.1.0 1391 | dev: true 1392 | 1393 | /postcss@8.4.23: 1394 | resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} 1395 | engines: {node: ^10 || ^12 || >=14} 1396 | dependencies: 1397 | nanoid: 3.3.6 1398 | picocolors: 1.0.0 1399 | source-map-js: 1.0.2 1400 | 1401 | /queue-microtask@1.2.3: 1402 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1403 | dev: true 1404 | 1405 | /read-pkg@3.0.0: 1406 | resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} 1407 | engines: {node: '>=4'} 1408 | dependencies: 1409 | load-json-file: 4.0.0 1410 | normalize-package-data: 2.5.0 1411 | path-type: 3.0.0 1412 | dev: true 1413 | 1414 | /readdirp@3.6.0: 1415 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1416 | engines: {node: '>=8.10.0'} 1417 | dependencies: 1418 | picomatch: 2.3.1 1419 | dev: true 1420 | 1421 | /regexp.prototype.flags@1.5.0: 1422 | resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} 1423 | engines: {node: '>= 0.4'} 1424 | dependencies: 1425 | call-bind: 1.0.2 1426 | define-properties: 1.2.0 1427 | functions-have-names: 1.2.3 1428 | dev: true 1429 | 1430 | /resolve@1.22.2: 1431 | resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} 1432 | hasBin: true 1433 | dependencies: 1434 | is-core-module: 2.12.0 1435 | path-parse: 1.0.7 1436 | supports-preserve-symlinks-flag: 1.0.0 1437 | dev: true 1438 | 1439 | /reusify@1.0.4: 1440 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1441 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1442 | dev: true 1443 | 1444 | /rollup@3.21.0: 1445 | resolution: {integrity: sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ==} 1446 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1447 | hasBin: true 1448 | optionalDependencies: 1449 | fsevents: 2.3.2 1450 | dev: true 1451 | 1452 | /run-parallel@1.2.0: 1453 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1454 | dependencies: 1455 | queue-microtask: 1.2.3 1456 | dev: true 1457 | 1458 | /safe-regex-test@1.0.0: 1459 | resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} 1460 | dependencies: 1461 | call-bind: 1.0.2 1462 | get-intrinsic: 1.2.0 1463 | is-regex: 1.1.4 1464 | dev: true 1465 | 1466 | /sass@1.62.0: 1467 | resolution: {integrity: sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==} 1468 | engines: {node: '>=14.0.0'} 1469 | hasBin: true 1470 | dependencies: 1471 | chokidar: 3.5.3 1472 | immutable: 4.3.0 1473 | source-map-js: 1.0.2 1474 | dev: true 1475 | 1476 | /scule@1.0.0: 1477 | resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} 1478 | dev: true 1479 | 1480 | /seemly@0.3.6: 1481 | resolution: {integrity: sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==} 1482 | dev: true 1483 | 1484 | /semver@5.7.1: 1485 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1486 | hasBin: true 1487 | dev: true 1488 | 1489 | /semver@7.5.0: 1490 | resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} 1491 | engines: {node: '>=10'} 1492 | hasBin: true 1493 | dependencies: 1494 | lru-cache: 6.0.0 1495 | dev: true 1496 | 1497 | /shebang-command@1.2.0: 1498 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 1499 | engines: {node: '>=0.10.0'} 1500 | dependencies: 1501 | shebang-regex: 1.0.0 1502 | dev: true 1503 | 1504 | /shebang-regex@1.0.0: 1505 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 1506 | engines: {node: '>=0.10.0'} 1507 | dev: true 1508 | 1509 | /shell-quote@1.8.1: 1510 | resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} 1511 | dev: true 1512 | 1513 | /side-channel@1.0.4: 1514 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1515 | dependencies: 1516 | call-bind: 1.0.2 1517 | get-intrinsic: 1.2.0 1518 | object-inspect: 1.12.3 1519 | dev: true 1520 | 1521 | /source-map-js@1.0.2: 1522 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1523 | engines: {node: '>=0.10.0'} 1524 | 1525 | /source-map@0.6.1: 1526 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1527 | engines: {node: '>=0.10.0'} 1528 | 1529 | /sourcemap-codec@1.4.8: 1530 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1531 | deprecated: Please use @jridgewell/sourcemap-codec instead 1532 | 1533 | /spdx-correct@3.2.0: 1534 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1535 | dependencies: 1536 | spdx-expression-parse: 3.0.1 1537 | spdx-license-ids: 3.0.13 1538 | dev: true 1539 | 1540 | /spdx-exceptions@2.3.0: 1541 | resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} 1542 | dev: true 1543 | 1544 | /spdx-expression-parse@3.0.1: 1545 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1546 | dependencies: 1547 | spdx-exceptions: 2.3.0 1548 | spdx-license-ids: 3.0.13 1549 | dev: true 1550 | 1551 | /spdx-license-ids@3.0.13: 1552 | resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} 1553 | dev: true 1554 | 1555 | /string.prototype.padend@3.1.4: 1556 | resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} 1557 | engines: {node: '>= 0.4'} 1558 | dependencies: 1559 | call-bind: 1.0.2 1560 | define-properties: 1.2.0 1561 | es-abstract: 1.21.2 1562 | dev: true 1563 | 1564 | /string.prototype.trim@1.2.7: 1565 | resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} 1566 | engines: {node: '>= 0.4'} 1567 | dependencies: 1568 | call-bind: 1.0.2 1569 | define-properties: 1.2.0 1570 | es-abstract: 1.21.2 1571 | dev: true 1572 | 1573 | /string.prototype.trimend@1.0.6: 1574 | resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} 1575 | dependencies: 1576 | call-bind: 1.0.2 1577 | define-properties: 1.2.0 1578 | es-abstract: 1.21.2 1579 | dev: true 1580 | 1581 | /string.prototype.trimstart@1.0.6: 1582 | resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} 1583 | dependencies: 1584 | call-bind: 1.0.2 1585 | define-properties: 1.2.0 1586 | es-abstract: 1.21.2 1587 | dev: true 1588 | 1589 | /strip-bom@3.0.0: 1590 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1591 | engines: {node: '>=4'} 1592 | dev: true 1593 | 1594 | /strip-literal@1.0.1: 1595 | resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} 1596 | dependencies: 1597 | acorn: 8.8.2 1598 | dev: true 1599 | 1600 | /supports-color@5.5.0: 1601 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1602 | engines: {node: '>=4'} 1603 | dependencies: 1604 | has-flag: 3.0.0 1605 | dev: true 1606 | 1607 | /supports-preserve-symlinks-flag@1.0.0: 1608 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1609 | engines: {node: '>= 0.4'} 1610 | dev: true 1611 | 1612 | /to-fast-properties@2.0.0: 1613 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1614 | engines: {node: '>=4'} 1615 | 1616 | /to-regex-range@5.0.1: 1617 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1618 | engines: {node: '>=8.0'} 1619 | dependencies: 1620 | is-number: 7.0.0 1621 | dev: true 1622 | 1623 | /treemate@0.3.11: 1624 | resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} 1625 | dev: true 1626 | 1627 | /typed-array-length@1.0.4: 1628 | resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} 1629 | dependencies: 1630 | call-bind: 1.0.2 1631 | for-each: 0.3.3 1632 | is-typed-array: 1.1.10 1633 | dev: true 1634 | 1635 | /typescript@5.0.4: 1636 | resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} 1637 | engines: {node: '>=12.20'} 1638 | hasBin: true 1639 | 1640 | /ufo@1.1.1: 1641 | resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} 1642 | dev: true 1643 | 1644 | /unbox-primitive@1.0.2: 1645 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 1646 | dependencies: 1647 | call-bind: 1.0.2 1648 | has-bigints: 1.0.2 1649 | has-symbols: 1.0.3 1650 | which-boxed-primitive: 1.0.2 1651 | dev: true 1652 | 1653 | /unimport@3.0.6: 1654 | resolution: {integrity: sha512-GYxGJ1Bri1oqx8VFDjdgooGzeK7jBk3bvhXmamTIpu3nONOcUMGwZbX7X0L5RA7OWMXpR4vzpSQP7pXUzJg1/Q==} 1655 | dependencies: 1656 | '@rollup/pluginutils': 5.0.2 1657 | escape-string-regexp: 5.0.0 1658 | fast-glob: 3.2.12 1659 | local-pkg: 0.4.3 1660 | magic-string: 0.30.0 1661 | mlly: 1.2.0 1662 | pathe: 1.1.0 1663 | pkg-types: 1.0.2 1664 | scule: 1.0.0 1665 | strip-literal: 1.0.1 1666 | unplugin: 1.3.1 1667 | transitivePeerDependencies: 1668 | - rollup 1669 | dev: true 1670 | 1671 | /unplugin-auto-import@0.15.3(@vueuse/core@10.1.0): 1672 | resolution: {integrity: sha512-RLT8SqbPn4bT7yBshZId0uPSofKWnwr66RyDaxWaFb/+f7OTDOWAsVNz+hOQLBWSjvbekr2xZY9ccS8TDHJbCQ==} 1673 | engines: {node: '>=14'} 1674 | peerDependencies: 1675 | '@nuxt/kit': ^3.2.2 1676 | '@vueuse/core': '*' 1677 | peerDependenciesMeta: 1678 | '@nuxt/kit': 1679 | optional: true 1680 | '@vueuse/core': 1681 | optional: true 1682 | dependencies: 1683 | '@antfu/utils': 0.7.2 1684 | '@rollup/pluginutils': 5.0.2 1685 | '@vueuse/core': 10.1.0(vue@3.2.47) 1686 | local-pkg: 0.4.3 1687 | magic-string: 0.30.0 1688 | minimatch: 9.0.0 1689 | unimport: 3.0.6 1690 | unplugin: 1.3.1 1691 | transitivePeerDependencies: 1692 | - rollup 1693 | dev: true 1694 | 1695 | /unplugin-vue-components@0.24.1(vue@3.2.47): 1696 | resolution: {integrity: sha512-T3A8HkZoIE1Cja95xNqolwza0yD5IVlgZZ1PVAGvVCx8xthmjsv38xWRCtHtwl+rvZyL9uif42SRkDGw9aCfMA==} 1697 | engines: {node: '>=14'} 1698 | peerDependencies: 1699 | '@babel/parser': ^7.15.8 1700 | '@nuxt/kit': ^3.2.2 1701 | vue: 2 || 3 1702 | peerDependenciesMeta: 1703 | '@babel/parser': 1704 | optional: true 1705 | '@nuxt/kit': 1706 | optional: true 1707 | dependencies: 1708 | '@antfu/utils': 0.7.2 1709 | '@rollup/pluginutils': 5.0.2 1710 | chokidar: 3.5.3 1711 | debug: 4.3.4 1712 | fast-glob: 3.2.12 1713 | local-pkg: 0.4.3 1714 | magic-string: 0.30.0 1715 | minimatch: 7.4.6 1716 | resolve: 1.22.2 1717 | unplugin: 1.3.1 1718 | vue: 3.2.47 1719 | transitivePeerDependencies: 1720 | - rollup 1721 | - supports-color 1722 | dev: true 1723 | 1724 | /unplugin@1.3.1: 1725 | resolution: {integrity: sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw==} 1726 | dependencies: 1727 | acorn: 8.8.2 1728 | chokidar: 3.5.3 1729 | webpack-sources: 3.2.3 1730 | webpack-virtual-modules: 0.5.0 1731 | dev: true 1732 | 1733 | /validate-npm-package-license@3.0.4: 1734 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1735 | dependencies: 1736 | spdx-correct: 3.2.0 1737 | spdx-expression-parse: 3.0.1 1738 | dev: true 1739 | 1740 | /vdirs@0.1.8(vue@3.2.47): 1741 | resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} 1742 | peerDependencies: 1743 | vue: ^3.0.11 1744 | dependencies: 1745 | evtd: 0.2.4 1746 | vue: 3.2.47 1747 | dev: true 1748 | 1749 | /vfonts@0.0.3: 1750 | resolution: {integrity: sha512-nguyw8L6Un8eelg1vQ31vIU2ESxqid7EYmy8V+MDeMaHBqaRSkg3dTBToC1PR00D89UzS/SLkfYPnx0Wf23IQQ==} 1751 | dev: true 1752 | 1753 | /vite@4.3.1(@types/node@18.16.0)(sass@1.62.0): 1754 | resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} 1755 | engines: {node: ^14.18.0 || >=16.0.0} 1756 | hasBin: true 1757 | peerDependencies: 1758 | '@types/node': '>= 14' 1759 | less: '*' 1760 | sass: '*' 1761 | stylus: '*' 1762 | sugarss: '*' 1763 | terser: ^5.4.0 1764 | peerDependenciesMeta: 1765 | '@types/node': 1766 | optional: true 1767 | less: 1768 | optional: true 1769 | sass: 1770 | optional: true 1771 | stylus: 1772 | optional: true 1773 | sugarss: 1774 | optional: true 1775 | terser: 1776 | optional: true 1777 | dependencies: 1778 | '@types/node': 18.16.0 1779 | esbuild: 0.17.18 1780 | postcss: 8.4.23 1781 | rollup: 3.21.0 1782 | sass: 1.62.0 1783 | optionalDependencies: 1784 | fsevents: 2.3.2 1785 | dev: true 1786 | 1787 | /vooks@0.2.12(vue@3.2.47): 1788 | resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} 1789 | peerDependencies: 1790 | vue: ^3.0.0 1791 | dependencies: 1792 | evtd: 0.2.4 1793 | vue: 3.2.47 1794 | dev: true 1795 | 1796 | /vue-demi@0.14.0(vue@3.2.47): 1797 | resolution: {integrity: sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==} 1798 | engines: {node: '>=12'} 1799 | hasBin: true 1800 | requiresBuild: true 1801 | peerDependencies: 1802 | '@vue/composition-api': ^1.0.0-rc.1 1803 | vue: ^3.0.0-0 || ^2.6.0 1804 | peerDependenciesMeta: 1805 | '@vue/composition-api': 1806 | optional: true 1807 | dependencies: 1808 | vue: 3.2.47 1809 | 1810 | /vue-router@4.1.6(vue@3.2.47): 1811 | resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==} 1812 | peerDependencies: 1813 | vue: ^3.2.0 1814 | dependencies: 1815 | '@vue/devtools-api': 6.5.0 1816 | vue: 3.2.47 1817 | dev: false 1818 | 1819 | /vue-template-compiler@2.7.14: 1820 | resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} 1821 | dependencies: 1822 | de-indent: 1.0.2 1823 | he: 1.2.0 1824 | dev: true 1825 | 1826 | /vue-tsc@1.4.4(typescript@5.0.4): 1827 | resolution: {integrity: sha512-2XsCjF2mLo6gwOVcOpngwJkP8GzYQjNh20A+Pr2FGdsWzr9jjXJ0k08/DfcslfncsuCrTrnWtb4KEL3gcDtlNA==} 1828 | hasBin: true 1829 | peerDependencies: 1830 | typescript: '*' 1831 | dependencies: 1832 | '@volar/vue-language-core': 1.4.4 1833 | '@volar/vue-typescript': 1.4.4(typescript@5.0.4) 1834 | semver: 7.5.0 1835 | typescript: 5.0.4 1836 | dev: true 1837 | 1838 | /vue@3.2.47: 1839 | resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} 1840 | dependencies: 1841 | '@vue/compiler-dom': 3.2.47 1842 | '@vue/compiler-sfc': 3.2.47 1843 | '@vue/runtime-dom': 3.2.47 1844 | '@vue/server-renderer': 3.2.47(vue@3.2.47) 1845 | '@vue/shared': 3.2.47 1846 | 1847 | /vueuc@0.4.51(vue@3.2.47): 1848 | resolution: {integrity: sha512-pLiMChM4f+W8czlIClGvGBYo656lc2Y0/mXFSCydcSmnCR1izlKPGMgiYBGjbY9FDkFG8a2HEVz7t0DNzBWbDw==} 1849 | peerDependencies: 1850 | vue: ^3.0.11 1851 | dependencies: 1852 | '@css-render/vue3-ssr': 0.15.12(vue@3.2.47) 1853 | '@juggle/resize-observer': 3.4.0 1854 | css-render: 0.15.12 1855 | evtd: 0.2.4 1856 | seemly: 0.3.6 1857 | vdirs: 0.1.8(vue@3.2.47) 1858 | vooks: 0.2.12(vue@3.2.47) 1859 | vue: 3.2.47 1860 | dev: true 1861 | 1862 | /webpack-sources@3.2.3: 1863 | resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} 1864 | engines: {node: '>=10.13.0'} 1865 | dev: true 1866 | 1867 | /webpack-virtual-modules@0.5.0: 1868 | resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} 1869 | dev: true 1870 | 1871 | /which-boxed-primitive@1.0.2: 1872 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 1873 | dependencies: 1874 | is-bigint: 1.0.4 1875 | is-boolean-object: 1.1.2 1876 | is-number-object: 1.0.7 1877 | is-string: 1.0.7 1878 | is-symbol: 1.0.4 1879 | dev: true 1880 | 1881 | /which-typed-array@1.1.9: 1882 | resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} 1883 | engines: {node: '>= 0.4'} 1884 | dependencies: 1885 | available-typed-arrays: 1.0.5 1886 | call-bind: 1.0.2 1887 | for-each: 0.3.3 1888 | gopd: 1.0.1 1889 | has-tostringtag: 1.0.0 1890 | is-typed-array: 1.1.10 1891 | dev: true 1892 | 1893 | /which@1.3.1: 1894 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1895 | hasBin: true 1896 | dependencies: 1897 | isexe: 2.0.0 1898 | dev: true 1899 | 1900 | /yallist@4.0.0: 1901 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1902 | dev: true 1903 | 1904 | github.com/gizmo-ds/totp-wasm/7b91ef831b6b93854ffa70786699effd4c944d14: 1905 | resolution: {tarball: https://codeload.github.com/gizmo-ds/totp-wasm/tar.gz/7b91ef831b6b93854ffa70786699effd4c944d14} 1906 | name: totp-wasm 1907 | version: 1.0.0 1908 | dev: false 1909 | --------------------------------------------------------------------------------