diff --git a/api.go b/api.go
index 60629a3..e4ab067 100644
--- a/api.go
+++ b/api.go
@@ -1,5 +1,53 @@
package moto
-func (svr *Server) routes() {
+import (
+ "git.nobla.cn/golang/kos"
+ "git.nobla.cn/golang/kos/entry/http"
+ "git.nobla.cn/golang/moto/internal/user"
+ "git.nobla.cn/golang/moto/internal/user/passport"
+ "git.nobla.cn/golang/moto/internal/user/types"
+)
+func (svr *Server) handleLogin(ctx *http.Context) (err error) {
+ var (
+ tk *types.Tokenize
+ req *passport.LoginRequest
+ )
+ req = &passport.LoginRequest{}
+ if err = ctx.Bind(req); err != nil {
+ return ctx.Error(http.ErrInvalidPayload, err.Error())
+ }
+ if tk, err = passport.Login(ctx.Context(), req); err != nil {
+ return ctx.Error(http.ErrPermissionDenied, err.Error())
+ }
+ return ctx.Success(tk)
+}
+
+func (svr *Server) handleLogout(ctx *http.Context) (err error) {
+ passport.Logout(ctx.Context(), ctx.User().Get("token"))
+ return ctx.Success("logout")
+}
+
+func (svr *Server) handleProfile(ctx *http.Context) (err error) {
+ var (
+ profile *types.Profile
+ )
+ if profile, err = user.Profile(ctx.Context(), ctx.User().ID); err != nil {
+ return ctx.Error(http.ErrTemporaryUnavailable, err.Error())
+ }
+ return ctx.Success(profile)
+}
+
+func (svr *Server) handleGetConfigure(ctx *http.Context) (err error) {
+ return ctx.Success(map[string]string{})
+}
+
+func (svr *Server) routes() {
+ kos.Http().Use(user.AuthMiddleware)
+ user.AllowUri("/passport/login")
+
+ kos.Http().Handle(http.MethodPost, "/passport/login", svr.handleLogin)
+ kos.Http().Handle(http.MethodDelete, "/passport/logout", svr.handleLogout)
+ kos.Http().Handle(http.MethodGet, "/user/profile", svr.handleProfile)
+ kos.Http().Handle(http.MethodGet, "/user/configures", svr.handleGetConfigure)
}
diff --git a/go.mod b/go.mod
index e769a48..fee40a1 100644
--- a/go.mod
+++ b/go.mod
@@ -6,6 +6,8 @@ require (
git.nobla.cn/golang/kos v0.1.32
git.nobla.cn/golang/rest v0.0.1
github.com/go-sql-driver/mysql v1.8.1
+ github.com/google/uuid v1.6.0
+ github.com/mssola/useragent v1.0.0
gopkg.in/yaml.v3 v3.0.1
gorm.io/driver/mysql v1.5.7
gorm.io/gorm v1.25.12
@@ -13,21 +15,14 @@ require (
require (
filippo.io/edwards25519 v1.1.0 // indirect
- github.com/gabriel-vasile/mimetype v1.4.3 // indirect
- github.com/go-playground/locales v0.14.1 // indirect
- github.com/go-playground/universal-translator v0.18.1 // indirect
- github.com/go-playground/validator/v10 v10.23.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/kr/text v0.2.0 // indirect
- github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-runewidth v0.0.3 // indirect
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
github.com/peterh/liner v1.2.2 // indirect
- github.com/rs/xid v1.6.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
- golang.org/x/crypto v0.19.0 // indirect
- golang.org/x/net v0.21.0 // indirect
+ github.com/stretchr/testify v1.8.4 // indirect
golang.org/x/sys v0.17.0 // indirect
golang.org/x/text v0.14.0 // indirect
)
diff --git a/go.sum b/go.sum
index c675e54..455679e 100644
--- a/go.sum
+++ b/go.sum
@@ -7,19 +7,11 @@ git.nobla.cn/golang/rest v0.0.1/go.mod h1:tGDOul2GGJtxk6fAeu+YLpMt/Up/TsBonTkygy
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
-github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
-github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
-github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
-github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
-github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
-github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o=
-github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
@@ -28,10 +20,10 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
-github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mssola/useragent v1.0.0 h1:WRlDpXyxHDNfvZaPEut5Biveq86Ze4o4EMffyMxmH5o=
+github.com/mssola/useragent v1.0.0/go.mod h1:hz9Cqz4RXusgg1EdI4Al0INR62kP7aPSRNHnpU+b85Y=
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw=
@@ -40,16 +32,10 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
-github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
-github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
-golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
-golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
-golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
diff --git a/internal/user/middleware.go b/internal/user/middleware.go
new file mode 100644
index 0000000..8a54389
--- /dev/null
+++ b/internal/user/middleware.go
@@ -0,0 +1,80 @@
+package user
+
+import (
+ "git.nobla.cn/golang/kos/entry/http"
+ "git.nobla.cn/golang/moto/internal/user/passport"
+ "git.nobla.cn/golang/moto/internal/user/types"
+ "os"
+ "strings"
+)
+
+var (
+ allowUris []string
+
+ CookieName = "MOTO_US"
+)
+
+func init() {
+ allowUris = make([]string, 0, 10)
+}
+
+func AllowUri(s string) {
+ allowUris = append(allowUris, s)
+}
+
+func isAllowed(uriPath string) bool {
+ for _, s := range allowUris {
+ sl := len(s)
+ if sl <= 0 {
+ continue
+ }
+ if s[sl-1] == '*' {
+ if strings.HasPrefix(uriPath, s[:sl-1]) {
+ return true
+ }
+ } else if s == uriPath {
+ return true
+ }
+ }
+ return false
+}
+
+func AuthMiddleware(next http.HandleFunc) http.HandleFunc {
+ return func(ctx *http.Context) (err error) {
+ if isAllowed(ctx.Request().URL.Path) {
+ return next(ctx)
+ }
+ var (
+ pos int
+ accessToken string
+ ui *http.Userinfo
+ tk *types.Tokenize
+ )
+ if accessToken = ctx.Query("access_token"); accessToken != "" {
+ goto __end
+ }
+ if accessToken = ctx.GetCookieValue(CookieName); accessToken != "" {
+ goto __end
+ }
+ if accessToken = ctx.Request().Header.Get("Authorization"); accessToken != "" {
+ goto __end
+ }
+ __end:
+ accessToken = strings.TrimSpace(accessToken)
+ if pos = strings.IndexByte(accessToken, ' '); pos > -1 {
+ accessToken = accessToken[pos+1:]
+ }
+ if tk, err = passport.Validate(ctx.Context(), accessToken); err != nil {
+ err = ctx.Error(http.ErrAccessDenied, "access denied")
+ err = os.ErrPermission
+ return
+ }
+ ui = &http.Userinfo{
+ ID: tk.UID,
+ Name: tk.Name,
+ }
+ ui.Set("token", tk.Token)
+ ctx.SetUser(ui)
+ return next(ctx)
+ }
+}
diff --git a/internal/user/passport/login.go b/internal/user/passport/login.go
new file mode 100644
index 0000000..fd0277a
--- /dev/null
+++ b/internal/user/passport/login.go
@@ -0,0 +1,108 @@
+package passport
+
+import (
+ "context"
+ "fmt"
+ "git.nobla.cn/golang/kos/pkg/cache"
+ "git.nobla.cn/golang/moto/common/db"
+ "git.nobla.cn/golang/moto/internal/user/types"
+ "git.nobla.cn/golang/moto/models"
+ "github.com/mssola/useragent"
+ "strings"
+ "sync"
+ "time"
+)
+
+var (
+ tokenizeLocker sync.RWMutex
+ tokenizes map[string]*types.Tokenize
+
+ LoginMaxTires = 5
+)
+
+func init() {
+ tokenizes = make(map[string]*types.Tokenize)
+}
+
+func Login(ctx context.Context, req *LoginRequest) (tk *types.Tokenize, err error) {
+ var (
+ tires int
+ duration time.Duration
+ )
+ tx := db.WithContext(ctx)
+ userModel := &models.User{}
+ if req.Remember {
+ duration = time.Hour * 24
+ } else {
+ duration = time.Hour * 2
+ }
+ cacheKey := fmt.Sprintf("passport:login:%s:attempts", req.RealIP)
+ if LoginMaxTires > 0 {
+ if err = cache.Load(ctx, cacheKey, &tires); err == nil {
+ if tires > LoginMaxTires {
+ err = ErrTooManyAttempts
+ return
+ }
+ }
+ }
+ if err = tx.Where("uid=?", req.Username).First(userModel).Error; err == nil {
+ if userModel.Password == req.Password || md5Hash(req.Password) == userModel.Password {
+ tk = types.NewTokenize(userModel.UID, duration)
+ tokenizeLocker.Lock()
+ tokenizes[tk.Token] = tk
+ tokenizeLocker.Unlock()
+
+ tk.Name = userModel.Username
+ ua := useragent.New(req.UserAgent)
+ loginModel := &models.Login{
+ UID: userModel.UID,
+ IP: req.RealIP,
+ Os: ua.OS(),
+ Platform: ua.Platform(),
+ AccessToken: tk.Token,
+ UserAgent: req.UserAgent,
+ }
+ browser, browserVersion := ua.Browser()
+ loginModel.Browser = browser + "/" + browserVersion
+ tx.Save(loginModel)
+ } else {
+ err = ErrInvalidPassword
+ _ = cache.StoreEx(ctx, cacheKey, tires+1, time.Minute*10)
+ }
+ } else {
+ _ = cache.StoreEx(ctx, cacheKey, tires+1, time.Minute*10)
+ }
+ return
+}
+
+func Validate(ctx context.Context, token string) (tk *types.Tokenize, err error) {
+ var (
+ ok bool
+ )
+ tokenizeLocker.Lock()
+ defer tokenizeLocker.Unlock()
+ token = strings.TrimSpace(token)
+ if token == "" {
+ return nil, ErrPermissionDenied
+ }
+ if tk, ok = tokenizes[token]; !ok {
+ return nil, ErrPermissionDenied
+ } else {
+ if tk.Validate() {
+ return tk, nil
+ } else {
+ delete(tokenizes, token)
+ return nil, ErrPermissionDenied
+ }
+ }
+ return
+}
+
+func Logout(ctx context.Context, token string) (ok bool) {
+ tokenizeLocker.Lock()
+ if _, ok = tokenizes[token]; ok {
+ delete(tokenizes, token)
+ }
+ tokenizeLocker.Unlock()
+ return
+}
diff --git a/internal/user/passport/types.go b/internal/user/passport/types.go
new file mode 100644
index 0000000..5de41df
--- /dev/null
+++ b/internal/user/passport/types.go
@@ -0,0 +1,19 @@
+package passport
+
+import (
+ "errors"
+)
+
+var (
+ ErrPermissionDenied = errors.New("permission denied")
+ ErrInvalidPassword = errors.New("invalid password")
+ ErrTooManyAttempts = errors.New("too many attempts")
+)
+
+type LoginRequest struct {
+ Username string `json:"username"`
+ Password string `json:"password"`
+ Remember bool `json:"remember"`
+ RealIP string `json:"real_ip"`
+ UserAgent string `json:"user_agent"`
+}
diff --git a/internal/user/passport/utils.go b/internal/user/passport/utils.go
new file mode 100644
index 0000000..87ccec0
--- /dev/null
+++ b/internal/user/passport/utils.go
@@ -0,0 +1,13 @@
+package passport
+
+import (
+ "crypto/md5"
+ "encoding/hex"
+ "git.nobla.cn/golang/kos/util/bs"
+)
+
+func md5Hash(s string) string {
+ hash := md5.New()
+ hash.Write(bs.StringToBytes(s))
+ return hex.EncodeToString(hash.Sum(nil))
+}
diff --git a/internal/user/profile.go b/internal/user/profile.go
new file mode 100644
index 0000000..e7ad564
--- /dev/null
+++ b/internal/user/profile.go
@@ -0,0 +1,17 @@
+package user
+
+import (
+ "context"
+ "git.nobla.cn/golang/moto/common/db"
+ "git.nobla.cn/golang/moto/internal/user/types"
+)
+
+func Profile(ctx context.Context, uid string) (profile *types.Profile, err error) {
+ profile = &types.Profile{}
+ tx := db.WithContext(ctx)
+ err = tx.Table("users AS u").
+ Select("u.uid as id", "u.username", "u.avatar", "u.email", "u.description", "u.role", "r.permissions").
+ Joins("left join roles AS r on r.id = u.role").Where("u.uid=? ", uid).
+ First(profile).Error
+ return
+}
diff --git a/internal/user/types/profile.go b/internal/user/types/profile.go
new file mode 100644
index 0000000..94af401
--- /dev/null
+++ b/internal/user/types/profile.go
@@ -0,0 +1,13 @@
+package types
+
+type (
+ Profile struct {
+ ID string `json:"id"`
+ Username string `json:"username"`
+ Role string `json:"role"`
+ Email string `json:"email"`
+ Avatar string `json:"avatar"`
+ Description string `json:"description"`
+ Permissions string `json:"permissions"`
+ }
+)
diff --git a/internal/user/types/tokenize.go b/internal/user/types/tokenize.go
new file mode 100644
index 0000000..1b49dbf
--- /dev/null
+++ b/internal/user/types/tokenize.go
@@ -0,0 +1,29 @@
+package types
+
+import (
+ "git.nobla.cn/golang/kos/util/random"
+ "github.com/google/uuid"
+ "strings"
+ "time"
+)
+
+type Tokenize struct {
+ UID string `json:"uid"`
+ Name string `json:"name"`
+ Token string `json:"token"`
+ ExpireIn int `json:"expire_in"`
+ ExpiredAt time.Time `json:"-"`
+}
+
+func (tk *Tokenize) Validate() bool {
+ return time.Now().Before(tk.ExpiredAt)
+}
+
+func NewTokenize(uid string, duration time.Duration) *Tokenize {
+ return &Tokenize{
+ UID: uid,
+ Token: random.String(32) + strings.ReplaceAll(uuid.New().String(), "-", ""),
+ ExpireIn: int(duration / time.Second),
+ ExpiredAt: time.Now().Add(duration),
+ }
+}
diff --git a/models/login.go b/models/login.go
new file mode 100644
index 0000000..7334607
--- /dev/null
+++ b/models/login.go
@@ -0,0 +1,18 @@
+package models
+
+type Login struct {
+ ID string `json:"id" gorm:"primaryKey;size:20" comment:"ID" scenarios:"view;export"`
+ CreatedAt int64 `json:"created_at" gorm:"autoCreateTime" comment:"登录时间" scenarios:"list;search;view;export" position:"2"`
+ Domain string `json:"domain" gorm:"index;size:60;not null;default:'default'" comment:"域" scenarios:"export"`
+ UID string `json:"uid" gorm:"column:uid;index;size:20;not null;default:''" props:"match:exactly" comment:"座席" format:"user" scenarios:"search;list;export" position:"1"`
+ IP string `json:"ip" gorm:"size:20;not null;default:''" comment:"IP" scenarios:"search;list;export"`
+ Browser string `json:"browser" gorm:"size:200;not null;default:''" comment:"浏览器" scenarios:"search;list;export"`
+ Os string `json:"os" gorm:"size:200;not null;default:''" comment:"操作系统" scenarios:"search;list;export"`
+ Platform string `json:"platform" gorm:"size:200;not null;default:''" comment:"平台" scenarios:"search;list;export"`
+ AccessToken string `json:"access_token" gorm:"size:200;not null;default:''" comment:"访问令牌" scenarios:"export"`
+ UserAgent string `json:"user_agent" gorm:"size:1024;not null;default:''" comment:"UserAgent" scenarios:"export"`
+}
+
+func (model *Login) TableName() string {
+ return "user_logins"
+}
diff --git a/server.go b/server.go
index 60f88a2..d6fa461 100644
--- a/server.go
+++ b/server.go
@@ -26,6 +26,7 @@ func (svr *Server) prepare() (err error) {
values := []any{
&models.User{},
&models.Role{},
+ &models.Login{},
&models.Department{},
}
for _, item := range values {
diff --git a/web/.gitignore b/web/.gitignore
new file mode 100644
index 0000000..8ee54e8
--- /dev/null
+++ b/web/.gitignore
@@ -0,0 +1,30 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.tsbuildinfo
diff --git a/web/README.md b/web/README.md
new file mode 100644
index 0000000..d863828
--- /dev/null
+++ b/web/README.md
@@ -0,0 +1,29 @@
+# web
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vite.dev/config/).
+
+## Project Setup
+
+```sh
+npm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+npm run dev
+```
+
+### Compile and Minify for Production
+
+```sh
+npm run build
+```
diff --git a/web/index.html b/web/index.html
new file mode 100644
index 0000000..8008388
--- /dev/null
+++ b/web/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ MOTO
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/jsconfig.json b/web/jsconfig.json
new file mode 100644
index 0000000..5a1f2d2
--- /dev/null
+++ b/web/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/web/package-lock.json b/web/package-lock.json
new file mode 100644
index 0000000..d25a8d7
--- /dev/null
+++ b/web/package-lock.json
@@ -0,0 +1,4631 @@
+{
+ "name": "web",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "web",
+ "version": "0.0.0",
+ "dependencies": {
+ "@element-plus/icons-vue": "^2.3.1",
+ "axios": "^1.7.9",
+ "color": "^4.2.3",
+ "dayjs": "^1.11.13",
+ "element-plus": "^2.9.0",
+ "normalize.css": "^8.0.1",
+ "pinia": "^2.2.6",
+ "pinia-plugin-persistedstate": "^4.1.3",
+ "pluralize": "^8.0.0",
+ "query-string": "^9.1.1",
+ "sass": "^1.82.0",
+ "screenfull": "^6.0.2",
+ "vue": "^3.5.13",
+ "vue-router": "^4.4.5",
+ "vue3-puzzle-vcode": "^1.1.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^5.2.1",
+ "vite": "^6.0.1",
+ "vite-plugin-vue-devtools": "^7.6.5"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@antfu/utils": {
+ "version": "0.7.10",
+ "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.10.tgz",
+ "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.26.3.tgz",
+ "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.26.0.tgz",
+ "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.0",
+ "@babel/generator": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.0",
+ "@babel/parser": "^7.26.0",
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.26.0",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.26.3.tgz",
+ "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.26.3",
+ "@babel/types": "^7.26.3",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
+ "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
+ "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
+ "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.26.0.tgz",
+ "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.3.tgz",
+ "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.3"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz",
+ "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-decorators": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz",
+ "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz",
+ "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-syntax-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/standalone": {
+ "version": "7.26.4",
+ "resolved": "https://registry.npmmirror.com/@babel/standalone/-/standalone-7.26.4.tgz",
+ "integrity": "sha512-SF+g7S2mhTT1b7CHyfNjDkPU1corxg4LPYsyP0x5KuCl+EbtBQHRLqr9N3q7e7+x7NQ5LYxQf8mJ2PmzebLr0A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.26.4",
+ "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.26.4.tgz",
+ "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.3",
+ "@babel/parser": "^7.26.3",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.3",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.26.3.tgz",
+ "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@ctrl/tinycolor": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+ "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@element-plus/icons-vue": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
+ "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
+ "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
+ "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
+ "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
+ "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
+ "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
+ "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
+ "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
+ "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
+ "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
+ "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
+ "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
+ "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
+ "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
+ "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
+ "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
+ "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
+ "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
+ "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
+ "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
+ "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.8.tgz",
+ "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.12",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.12.tgz",
+ "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.8.tgz",
+ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nuxt/kit": {
+ "version": "3.14.1592",
+ "resolved": "https://registry.npmmirror.com/@nuxt/kit/-/kit-3.14.1592.tgz",
+ "integrity": "sha512-r9r8bISBBisvfcNgNL3dSIQHSBe0v5YkX5zwNblIC2T0CIEgxEVoM5rq9O5wqgb5OEydsHTtT2hL57vdv6VT2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@nuxt/schema": "3.14.1592",
+ "c12": "^2.0.1",
+ "consola": "^3.2.3",
+ "defu": "^6.1.4",
+ "destr": "^2.0.3",
+ "globby": "^14.0.2",
+ "hash-sum": "^2.0.0",
+ "ignore": "^6.0.2",
+ "jiti": "^2.4.0",
+ "klona": "^2.0.6",
+ "knitwork": "^1.1.0",
+ "mlly": "^1.7.3",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.1",
+ "scule": "^1.3.0",
+ "semver": "^7.6.3",
+ "ufo": "^1.5.4",
+ "unctx": "^2.3.1",
+ "unimport": "^3.13.2",
+ "untyped": "^1.5.1"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/@nuxt/kit/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@nuxt/schema": {
+ "version": "3.14.1592",
+ "resolved": "https://registry.npmmirror.com/@nuxt/schema/-/schema-3.14.1592.tgz",
+ "integrity": "sha512-A1d/08ueX8stTXNkvGqnr1eEXZgvKn+vj6s7jXhZNWApUSqMgItU4VK28vrrdpKbjIPwq2SwhnGOHUYvN9HwCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "c12": "^2.0.1",
+ "compatx": "^0.1.8",
+ "consola": "^3.2.3",
+ "defu": "^6.1.4",
+ "hookable": "^5.5.3",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.1",
+ "scule": "^1.3.0",
+ "std-env": "^3.8.0",
+ "ufo": "^1.5.4",
+ "uncrypto": "^0.1.3",
+ "unimport": "^3.13.2",
+ "untyped": "^1.5.1"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.0.tgz",
+ "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.5.0",
+ "@parcel/watcher-darwin-arm64": "2.5.0",
+ "@parcel/watcher-darwin-x64": "2.5.0",
+ "@parcel/watcher-freebsd-x64": "2.5.0",
+ "@parcel/watcher-linux-arm-glibc": "2.5.0",
+ "@parcel/watcher-linux-arm-musl": "2.5.0",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.0",
+ "@parcel/watcher-linux-arm64-musl": "2.5.0",
+ "@parcel/watcher-linux-x64-glibc": "2.5.0",
+ "@parcel/watcher-linux-x64-musl": "2.5.0",
+ "@parcel/watcher-win32-arm64": "2.5.0",
+ "@parcel/watcher-win32-ia32": "2.5.0",
+ "@parcel/watcher-win32-x64": "2.5.0"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz",
+ "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz",
+ "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz",
+ "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz",
+ "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz",
+ "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz",
+ "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz",
+ "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz",
+ "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz",
+ "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz",
+ "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz",
+ "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz",
+ "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
+ "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.28",
+ "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.28.tgz",
+ "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@popperjs/core": {
+ "name": "@sxzz/popperjs-es",
+ "version": "2.11.7",
+ "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+ "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.3.tgz",
+ "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz",
+ "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz",
+ "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz",
+ "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz",
+ "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz",
+ "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz",
+ "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz",
+ "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz",
+ "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz",
+ "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz",
+ "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz",
+ "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz",
+ "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz",
+ "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz",
+ "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz",
+ "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz",
+ "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz",
+ "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz",
+ "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz",
+ "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@sec-ant/readable-stream": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+ "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+ "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.13",
+ "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.13.tgz",
+ "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/lodash-es": {
+ "version": "4.17.12",
+ "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+ "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.16",
+ "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+ "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
+ "license": "MIT"
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
+ "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/babel-helper-vue-transform-on": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz",
+ "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/babel-plugin-jsx": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz",
+ "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/plugin-syntax-jsx": "^7.24.7",
+ "@babel/template": "^7.25.0",
+ "@babel/traverse": "^7.25.6",
+ "@babel/types": "^7.25.6",
+ "@vue/babel-helper-vue-transform-on": "1.2.5",
+ "@vue/babel-plugin-resolve-type": "1.2.5",
+ "html-tags": "^3.3.1",
+ "svg-tags": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz",
+ "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/parser": "^7.25.6",
+ "@vue/compiler-sfc": "^3.5.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+ "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/shared": "3.5.13",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+ "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
+ "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/compiler-core": "3.5.13",
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/compiler-ssr": "3.5.13",
+ "@vue/shared": "3.5.13",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.11",
+ "postcss": "^8.4.48",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+ "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/devtools-core": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-core/-/devtools-core-7.6.8.tgz",
+ "integrity": "sha512-8X4roysTwzQ94o7IobjVcOd1aZF5iunikrMrHPI2uUdigZCi2kFTQc7ffYiFiTNaLElCpjOhCnM7bo7aK1yU7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-kit": "^7.6.8",
+ "@vue/devtools-shared": "^7.6.8",
+ "mitt": "^3.0.1",
+ "nanoid": "^5.0.9",
+ "pathe": "^1.1.2",
+ "vite-hot-client": "^0.2.4"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@vue/devtools-core/node_modules/nanoid": {
+ "version": "5.0.9",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.0.9.tgz",
+ "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.js"
+ },
+ "engines": {
+ "node": "^18 || >=20"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.6.8.tgz",
+ "integrity": "sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-shared": "^7.6.8",
+ "birpc": "^0.2.19",
+ "hookable": "^5.5.3",
+ "mitt": "^3.0.1",
+ "perfect-debounce": "^1.0.0",
+ "speakingurl": "^14.0.1",
+ "superjson": "^2.2.1"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.6.8.tgz",
+ "integrity": "sha512-9MBPO5Z3X1nYGFqTJyohl6Gmf/J7UNN1oicHdyzBVZP4jnhZ4c20MgtaHDIzWmHDHCMYVS5bwKxT3jxh7gOOKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "rfdc": "^1.4.1"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz",
+ "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+ "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+ "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.13",
+ "@vue/runtime-core": "3.5.13",
+ "@vue/shared": "3.5.13",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+ "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.13",
+ "@vue/shared": "3.5.13"
+ },
+ "peerDependencies": {
+ "vue": "3.5.13"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
+ "license": "MIT"
+ },
+ "node_modules/@vueuse/core": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+ "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.16",
+ "@vueuse/metadata": "9.13.0",
+ "@vueuse/shared": "9.13.0",
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+ "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+ "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+ "license": "MIT",
+ "dependencies": {
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/async-validator": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
+ "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.7.9",
+ "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "0.2.19",
+ "resolved": "https://registry.npmmirror.com/birpc/-/birpc-0.2.19.tgz",
+ "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.2",
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.2.tgz",
+ "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001669",
+ "electron-to-chromium": "^1.5.41",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "run-applescript": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/c12": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/c12/-/c12-2.0.1.tgz",
+ "integrity": "sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==",
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^4.0.1",
+ "confbox": "^0.1.7",
+ "defu": "^6.1.4",
+ "dotenv": "^16.4.5",
+ "giget": "^1.2.3",
+ "jiti": "^2.3.0",
+ "mlly": "^1.7.1",
+ "ohash": "^1.1.4",
+ "pathe": "^1.1.2",
+ "perfect-debounce": "^1.0.0",
+ "pkg-types": "^1.2.0",
+ "rc9": "^2.1.2"
+ },
+ "peerDependencies": {
+ "magicast": "^0.3.5"
+ },
+ "peerDependenciesMeta": {
+ "magicast": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001687",
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz",
+ "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.1.tgz",
+ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/citty": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz",
+ "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
+ "license": "MIT",
+ "dependencies": {
+ "consola": "^3.2.3"
+ }
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmmirror.com/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/compatx": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmmirror.com/compatx/-/compatx-0.1.8.tgz",
+ "integrity": "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==",
+ "license": "MIT"
+ },
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "license": "MIT"
+ },
+ "node_modules/consola": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmmirror.com/consola/-/consola-3.2.3.tgz",
+ "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT"
+ },
+ "node_modules/copy-anything": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz",
+ "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-what": "^4.1.8"
+ },
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.13",
+ "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-uri-component": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.4.1.tgz",
+ "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/deep-pick-omit": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz",
+ "integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==",
+ "license": "MIT"
+ },
+ "node_modules/default-browser": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.2.1.tgz",
+ "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-5.0.0.tgz",
+ "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz",
+ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
+ "license": "MIT"
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/destr": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.3.tgz",
+ "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==",
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.7",
+ "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.4.7.tgz",
+ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.73",
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz",
+ "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==",
+ "license": "ISC"
+ },
+ "node_modules/element-plus": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.0.tgz",
+ "integrity": "sha512-ccOFXKsauo2dtokAr4OX7gZsb7TuAoVxA2zGRZo5o2yyDDBLBaZxOoFQPoxITSLcHbBfQuNDGK5Iag5hnyKkZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@ctrl/tinycolor": "^3.4.1",
+ "@element-plus/icons-vue": "^2.3.1",
+ "@floating-ui/dom": "^1.0.1",
+ "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
+ "@types/lodash": "^4.14.182",
+ "@types/lodash-es": "^4.17.6",
+ "@vueuse/core": "^9.1.0",
+ "async-validator": "^4.2.5",
+ "dayjs": "^1.11.13",
+ "escape-html": "^1.0.3",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "lodash-unified": "^1.0.2",
+ "memoize-one": "^6.0.0",
+ "normalize-wheel-es": "^1.2.0"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-stack-parser-es": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmmirror.com/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz",
+ "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.0.tgz",
+ "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.24.0",
+ "@esbuild/android-arm": "0.24.0",
+ "@esbuild/android-arm64": "0.24.0",
+ "@esbuild/android-x64": "0.24.0",
+ "@esbuild/darwin-arm64": "0.24.0",
+ "@esbuild/darwin-x64": "0.24.0",
+ "@esbuild/freebsd-arm64": "0.24.0",
+ "@esbuild/freebsd-x64": "0.24.0",
+ "@esbuild/linux-arm": "0.24.0",
+ "@esbuild/linux-arm64": "0.24.0",
+ "@esbuild/linux-ia32": "0.24.0",
+ "@esbuild/linux-loong64": "0.24.0",
+ "@esbuild/linux-mips64el": "0.24.0",
+ "@esbuild/linux-ppc64": "0.24.0",
+ "@esbuild/linux-riscv64": "0.24.0",
+ "@esbuild/linux-s390x": "0.24.0",
+ "@esbuild/linux-x64": "0.24.0",
+ "@esbuild/netbsd-x64": "0.24.0",
+ "@esbuild/openbsd-arm64": "0.24.0",
+ "@esbuild/openbsd-x64": "0.24.0",
+ "@esbuild/sunos-x64": "0.24.0",
+ "@esbuild/win32-arm64": "0.24.0",
+ "@esbuild/win32-ia32": "0.24.0",
+ "@esbuild/win32-x64": "0.24.0"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/execa": {
+ "version": "9.5.2",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-9.5.2.tgz",
+ "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^4.0.0",
+ "cross-spawn": "^7.0.3",
+ "figures": "^6.1.0",
+ "get-stream": "^9.0.0",
+ "human-signals": "^8.0.0",
+ "is-plain-obj": "^4.1.0",
+ "is-stream": "^4.0.1",
+ "npm-run-path": "^6.0.0",
+ "pretty-ms": "^9.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^4.0.0",
+ "yoctocolors": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/figures": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/figures/-/figures-6.1.0.tgz",
+ "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-unicode-supported": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/filter-obj": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/filter-obj/-/filter-obj-5.1.0.tgz",
+ "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-9.0.1.tgz",
+ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sec-ant/readable-stream": "^0.4.1",
+ "is-stream": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/giget": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/giget/-/giget-1.2.3.tgz",
+ "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==",
+ "license": "MIT",
+ "dependencies": {
+ "citty": "^0.1.6",
+ "consola": "^3.2.3",
+ "defu": "^6.1.4",
+ "node-fetch-native": "^1.6.3",
+ "nypm": "^0.3.8",
+ "ohash": "^1.1.3",
+ "pathe": "^1.1.2",
+ "tar": "^6.2.0"
+ },
+ "bin": {
+ "giget": "dist/cli.mjs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "14.0.2",
+ "resolved": "https://registry.npmmirror.com/globby/-/globby-14.0.2.tgz",
+ "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^2.1.0",
+ "fast-glob": "^3.3.2",
+ "ignore": "^5.2.4",
+ "path-type": "^5.0.0",
+ "slash": "^5.1.0",
+ "unicorn-magic": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby/node_modules/@sindresorhus/merge-streams": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
+ "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby/node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/globby/node_modules/unicorn-magic": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+ "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "license": "MIT"
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "license": "MIT"
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-8.0.0.tgz",
+ "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-6.0.2.tgz",
+ "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.0.3.tgz",
+ "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==",
+ "license": "MIT"
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-4.0.1.tgz",
+ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "4.1.16",
+ "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz",
+ "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.0.tgz",
+ "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/jiti": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.4.1.tgz",
+ "integrity": "sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/knitwork": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/knitwork/-/knitwork-1.1.0.tgz",
+ "integrity": "sha512-oHnmiBUVHz1V+URE77PNot2lv3QiYU2zQf1JjOVkMt3YDKGbu8NAFr+c4mcNOhdsGrB/VpVbRwPwhiXrPhxQbw==",
+ "license": "MIT"
+ },
+ "node_modules/kolorist": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz",
+ "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/local-pkg": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.1.tgz",
+ "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mlly": "^1.7.3",
+ "pkg-types": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash-unified": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
+ "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/lodash-es": "*",
+ "lodash": "*",
+ "lodash-es": "*"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.15",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.15.tgz",
+ "integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/memoize-one": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
+ "license": "MIT"
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.3.tgz",
+ "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.1",
+ "ufo": "^1.5.4"
+ }
+ },
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.0.tgz",
+ "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/node-fetch-native": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.4.tgz",
+ "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==",
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "license": "MIT"
+ },
+ "node_modules/normalize-wheel-es": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+ "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/normalize.css": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmmirror.com/normalize.css/-/normalize.css-8.0.1.tgz",
+ "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==",
+ "license": "MIT"
+ },
+ "node_modules/npm-run-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-6.0.0.tgz",
+ "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nypm": {
+ "version": "0.3.12",
+ "resolved": "https://registry.npmmirror.com/nypm/-/nypm-0.3.12.tgz",
+ "integrity": "sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==",
+ "license": "MIT",
+ "dependencies": {
+ "citty": "^0.1.6",
+ "consola": "^3.2.3",
+ "execa": "^8.0.1",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.0",
+ "ufo": "^1.5.4"
+ },
+ "bin": {
+ "nypm": "dist/cli.mjs"
+ },
+ "engines": {
+ "node": "^14.16.0 || >=16.10.0"
+ }
+ },
+ "node_modules/nypm/node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/nypm/node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nypm/node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/nypm/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nypm/node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nypm/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nypm/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ohash": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/ohash/-/ohash-1.1.4.tgz",
+ "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==",
+ "license": "MIT"
+ },
+ "node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmmirror.com/open/-/open-10.1.0.tgz",
+ "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "default-browser": "^5.2.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "is-wsl": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-ms": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/parse-ms/-/parse-ms-4.0.0.tgz",
+ "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/path-type/-/path-type-5.0.0.tgz",
+ "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "license": "MIT"
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pinia": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.3.0.tgz",
+ "integrity": "sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.3",
+ "vue-demi": "^0.14.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.4.4",
+ "vue": "^2.7.0 || ^3.5.11"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pinia-plugin-persistedstate": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.1.3.tgz",
+ "integrity": "sha512-5Rad7oSoEh0na+j4jEViVQMtAYE38KjU7ixKc+am33QX/clJ1mb19zTZqMJXvq+PnQW7uuEuL33Q6NL0GbkfWw==",
+ "license": "MIT",
+ "dependencies": {
+ "@nuxt/kit": "^3.13.2",
+ "deep-pick-omit": "^1.2.1",
+ "defu": "^6.1.4",
+ "destr": "^2.0.3"
+ },
+ "peerDependencies": {
+ "@pinia/nuxt": ">=0.5.0",
+ "pinia": ">=2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@pinia/nuxt": {
+ "optional": true
+ },
+ "pinia": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.2.1.tgz",
+ "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==",
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.2",
+ "pathe": "^1.1.2"
+ }
+ },
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.49",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz",
+ "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/pretty-ms": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmmirror.com/pretty-ms/-/pretty-ms-9.2.0.tgz",
+ "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse-ms": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/query-string": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmmirror.com/query-string/-/query-string-9.1.1.tgz",
+ "integrity": "sha512-MWkCOVIcJP9QSKU52Ngow6bsAWAPlPK2MludXvcrS2bGZSl+T1qX9MZvRIkqUIkGLJquMJHWfsT6eRqUpp4aWg==",
+ "license": "MIT",
+ "dependencies": {
+ "decode-uri-component": "^0.4.1",
+ "filter-obj": "^5.1.0",
+ "split-on-first": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/rc9": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz",
+ "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
+ "license": "MIT",
+ "dependencies": {
+ "defu": "^6.1.4",
+ "destr": "^2.0.3"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.0.2.tgz",
+ "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/rollup": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.28.1.tgz",
+ "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.28.1",
+ "@rollup/rollup-android-arm64": "4.28.1",
+ "@rollup/rollup-darwin-arm64": "4.28.1",
+ "@rollup/rollup-darwin-x64": "4.28.1",
+ "@rollup/rollup-freebsd-arm64": "4.28.1",
+ "@rollup/rollup-freebsd-x64": "4.28.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.28.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.28.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.28.1",
+ "@rollup/rollup-linux-arm64-musl": "4.28.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.28.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.28.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.28.1",
+ "@rollup/rollup-linux-x64-gnu": "4.28.1",
+ "@rollup/rollup-linux-x64-musl": "4.28.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.28.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.28.1",
+ "@rollup/rollup-win32-x64-msvc": "4.28.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-applescript": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/run-applescript/-/run-applescript-7.0.0.tgz",
+ "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/sass": {
+ "version": "1.82.0",
+ "resolved": "https://registry.npmmirror.com/sass/-/sass-1.82.0.tgz",
+ "integrity": "sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^4.0.0",
+ "immutable": "^5.0.2",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/screenfull": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/screenfull/-/screenfull-6.0.2.tgz",
+ "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/scule": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
+ "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/sirv/-/sirv-3.0.0.tgz",
+ "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/speakingurl": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz",
+ "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split-on-first": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/split-on-first/-/split-on-first-3.0.0.tgz",
+ "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/std-env": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.8.0.tgz",
+ "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
+ "license": "MIT"
+ },
+ "node_modules/strip-final-newline": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
+ "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.1.tgz",
+ "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^9.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/strip-literal/node_modules/js-tokens": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+ "license": "MIT"
+ },
+ "node_modules/superjson": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz",
+ "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "copy-anything": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+ "dev": true
+ },
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmmirror.com/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "license": "ISC",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz",
+ "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
+ "license": "MIT"
+ },
+ "node_modules/uncrypto": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmmirror.com/uncrypto/-/uncrypto-0.1.3.tgz",
+ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==",
+ "license": "MIT"
+ },
+ "node_modules/unctx": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmmirror.com/unctx/-/unctx-2.4.0.tgz",
+ "integrity": "sha512-VSwGlVn3teRLkFS9OH4JoZ25ky133vVPQkS6qHv/itYVrqHBa+7SO46Yh07Zve1WEi9A1X135g9DR6KMv6ZsJg==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.15",
+ "unplugin": "^2.0.0"
+ }
+ },
+ "node_modules/unctx/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unimport": {
+ "version": "3.14.5",
+ "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.14.5.tgz",
+ "integrity": "sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.1.3",
+ "acorn": "^8.14.0",
+ "escape-string-regexp": "^5.0.0",
+ "estree-walker": "^3.0.3",
+ "fast-glob": "^3.3.2",
+ "local-pkg": "^0.5.1",
+ "magic-string": "^0.30.14",
+ "mlly": "^1.7.3",
+ "pathe": "^1.1.2",
+ "picomatch": "^4.0.2",
+ "pkg-types": "^1.2.1",
+ "scule": "^1.3.0",
+ "strip-literal": "^2.1.1",
+ "unplugin": "^1.16.0"
+ }
+ },
+ "node_modules/unimport/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/unimport/node_modules/unplugin": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.16.0.tgz",
+ "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unplugin": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.1.0.tgz",
+ "integrity": "sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/untyped": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/untyped/-/untyped-1.5.1.tgz",
+ "integrity": "sha512-reBOnkJBFfBZ8pCKaeHgfZLcehXtM6UTxc+vqs1JvCps0c4amLNp3fhdGBZwYp+VLyoY9n3X5KOP7lCyWBUX9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.7",
+ "@babel/standalone": "^7.25.7",
+ "@babel/types": "^7.25.7",
+ "defu": "^6.1.4",
+ "jiti": "^2.3.1",
+ "mri": "^1.2.0",
+ "scule": "^1.3.0"
+ },
+ "bin": {
+ "untyped": "dist/cli.mjs"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+ "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmmirror.com/vite/-/vite-6.0.3.tgz",
+ "integrity": "sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.24.0",
+ "postcss": "^8.4.49",
+ "rollup": "^4.23.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-hot-client": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmmirror.com/vite-hot-client/-/vite-hot-client-0.2.4.tgz",
+ "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
+ }
+ },
+ "node_modules/vite-plugin-inspect": {
+ "version": "0.8.9",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz",
+ "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@antfu/utils": "^0.7.10",
+ "@rollup/pluginutils": "^5.1.3",
+ "debug": "^4.3.7",
+ "error-stack-parser-es": "^0.1.5",
+ "fs-extra": "^11.2.0",
+ "open": "^10.1.0",
+ "perfect-debounce": "^1.0.0",
+ "picocolors": "^1.1.1",
+ "sirv": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-vue-devtools": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.6.8.tgz",
+ "integrity": "sha512-32aIps8C1Y7UEoqyWf+ES3J1OozsCYMIqTqd+I5qass+R0Tcf8SaA2bX1/rskAzkcKCteVoBjEENmqwTcMebbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-core": "^7.6.8",
+ "@vue/devtools-kit": "^7.6.8",
+ "@vue/devtools-shared": "^7.6.8",
+ "execa": "^9.5.1",
+ "sirv": "^3.0.0",
+ "vite-plugin-inspect": "~0.8.9",
+ "vite-plugin-vue-inspector": "^5.3.1"
+ },
+ "engines": {
+ "node": ">=v14.21.3"
+ },
+ "peerDependencies": {
+ "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0"
+ }
+ },
+ "node_modules/vite-plugin-vue-inspector": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz",
+ "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.0",
+ "@babel/plugin-proposal-decorators": "^7.23.0",
+ "@babel/plugin-syntax-import-attributes": "^7.22.5",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-transform-typescript": "^7.22.15",
+ "@vue/babel-plugin-jsx": "^1.1.5",
+ "@vue/compiler-dom": "^3.3.4",
+ "kolorist": "^1.8.0",
+ "magic-string": "^0.30.4"
+ },
+ "peerDependencies": {
+ "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0"
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz",
+ "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/compiler-sfc": "3.5.13",
+ "@vue/runtime-dom": "3.5.13",
+ "@vue/server-renderer": "3.5.13",
+ "@vue/shared": "3.5.13"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.0.tgz",
+ "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/vue3-puzzle-vcode": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmmirror.com/vue3-puzzle-vcode/-/vue3-puzzle-vcode-1.1.7.tgz",
+ "integrity": "sha512-mW780dz7HKjrElnE60CeYSeHGidKBKHoMjTDYfqF21330rTkFOsfDK1FQKZ22MktgMtTEoS/imfpEDlM1cxY/g=="
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+ "license": "MIT"
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC"
+ },
+ "node_modules/yoctocolors": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/yoctocolors/-/yoctocolors-2.1.1.tgz",
+ "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/web/package.json b/web/package.json
new file mode 100644
index 0000000..fecf0aa
--- /dev/null
+++ b/web/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "web",
+ "version": "0.0.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "^2.3.1",
+ "axios": "^1.7.9",
+ "color": "^4.2.3",
+ "dayjs": "^1.11.13",
+ "element-plus": "^2.9.0",
+ "normalize.css": "^8.0.1",
+ "pinia": "^2.2.6",
+ "pinia-plugin-persistedstate": "^4.1.3",
+ "pluralize": "^8.0.0",
+ "query-string": "^9.1.1",
+ "sass": "^1.82.0",
+ "screenfull": "^6.0.2",
+ "vue": "^3.5.13",
+ "vue-router": "^4.4.5",
+ "vue3-puzzle-vcode": "^1.1.7"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^5.2.1",
+ "vite": "^6.0.1",
+ "vite-plugin-vue-devtools": "^7.6.5"
+ }
+}
diff --git a/web/public/favicon.ico b/web/public/favicon.ico
new file mode 100644
index 0000000..df36fcf
Binary files /dev/null and b/web/public/favicon.ico differ
diff --git a/web/src/App.vue b/web/src/App.vue
new file mode 100644
index 0000000..2279844
--- /dev/null
+++ b/web/src/App.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/apis/organize.js b/web/src/apis/organize.js
new file mode 100644
index 0000000..083f9eb
--- /dev/null
+++ b/web/src/apis/organize.js
@@ -0,0 +1,117 @@
+import request, { getBaseUrl } from './request'
+
+export function getUserProfile() {
+ return request.get(`/user/profile`)
+}
+
+export function getUserInfo(uid) {
+ return request.get(`/user/info/${uid}`)
+}
+
+export function userLogin(username, password) {
+ let domain = 'test.cc.echo.me';
+ if (process.env.NODE_ENV === 'production') {
+ domain = window.location.hostname;
+ }
+ return request.post(`/passport/login`, {
+ "domain": domain,
+ "username": username,
+ "password": password,
+ "remember": true
+ })
+}
+
+export function getUserTypes() {
+ return request.get('/organize/user-types')
+}
+
+export function userLogout() {
+ return request.delete('/passport/logout')
+}
+
+export function updateProfile(data) {
+ return request.put('/organize/profile', data)
+}
+
+export function resetPassword(oldPwd, newPwd) {
+ return request.put('/organize/password', {
+ old_password: oldPwd,
+ new_password: newPwd
+ })
+}
+
+export function lastLogin() {
+ return request.get('/organize/last-login');
+}
+
+export function getNestedDepartments() {
+ return request.get('/organize/department-nested')
+}
+
+export function getDepartmentUsers(id) {
+ return request.get(`/organize/department-users/${id}`)
+}
+
+export function getUsers(id) {
+ return request.get(`/organize/user-list`)
+}
+
+export function getClientHello() {
+ return request.post(`/organize/client-hello`)
+}
+
+export function getUserAvatar(uid) {
+ return `${getBaseUrl()}/organize/avatar/${uid}`
+}
+
+export function setUserAttr(name, value) {
+ let data = '';
+ if (typeof value !== 'string') {
+ try {
+ data = JSON.stringify(value)
+ } catch (e) {
+ data = value
+ }
+ } else {
+ data = value
+ }
+ return request.put(`/organize/user-variable`, {
+ name: name,
+ value: data,
+ })
+}
+
+export function getUserAttr(name) {
+ return new Promise((resolve, reject) => {
+ request.get(`/organize/user-variable/${name}`).then(res => {
+ if (res.value) {
+ try {
+ let data = JSON.parse(res.value);
+ resolve(data);
+ } catch (e) {
+ resolve(res.value)
+ }
+ } else {
+ reject(new Error("not found"))
+ }
+ }).catch(e => {
+ reject(e);
+ })
+ })
+}
+
+export function getUnreadMsgCount() {
+ return request.get(`/organize/unread/count`)
+}
+
+export function readUserMsg(id) {
+ return request.put(`/organize/notice-read/${id}`)
+}
+
+export function getDepartmentUserNested() {
+ return request.put(`/organize/department-users`)
+}
+
+export function getStatusTypes() {
+ return request.post(`/organize/status-types`)
+}
\ No newline at end of file
diff --git a/web/src/apis/request.js b/web/src/apis/request.js
new file mode 100644
index 0000000..df4d7a6
--- /dev/null
+++ b/web/src/apis/request.js
@@ -0,0 +1,63 @@
+
+import axios from "axios";
+
+
+const client = axios.create({
+ baseURL: getBaseUrl()
+});
+
+export function getBaseHost() {
+ if (process.env.NODE_ENV === 'production') {
+ return location.host;
+ } else {
+ return 'api-dev.echo.me'
+ }
+}
+
+export function getBaseUrl() {
+ let host = getBaseHost();
+ if (process.env.NODE_ENV === 'production') {
+ return location.protocol + '//' + host;
+ } else {
+ return location.protocol + '//' + host
+ }
+}
+
+class HttpError extends Error {
+ constructor(message, code) {
+ super(message)
+ this.code = code
+ this.name = 'HttpError'
+ }
+}
+
+client.interceptors.request.use(req => {
+ let accessToken = sessionStorage.getItem('G_PSID1');
+ if (accessToken) {
+ req.headers.Authorization = accessToken;
+ }
+ return req;
+})
+
+client.interceptors.response.use(res => {
+ if (res.status != 200) {
+ return Promise.reject(new Error(`http response ${res.status}:${res.statusText}`))
+ }
+ if (typeof res.data === 'object' && res.data.hasOwnProperty('code')) {
+ if (res.data['code'] === 0) {
+ return res.data['data']
+ } else {
+ return Promise.reject(new HttpError(res.data['reason'], res.data['code']))
+ }
+ }
+ if (typeof res.data === 'object' && res.data.hasOwnProperty('errno')) {
+ if (res.data['errno'] == 0) {
+ return res.data['result']
+ } else {
+ return Promise.reject(new HttpError(res.data['errmsg'], res.data['errno']))
+ }
+ }
+ return res;
+})
+
+export default client;
\ No newline at end of file
diff --git a/web/src/apis/system.js b/web/src/apis/system.js
new file mode 100644
index 0000000..f5a576d
--- /dev/null
+++ b/web/src/apis/system.js
@@ -0,0 +1,15 @@
+import request from './request'
+
+/**
+ * 连接到指定的endpoint
+ * @param {String} e
+ * @returns
+ */
+export function connectEndpoint(e) {
+ return request.put(`/endpoint/connect/${e}`)
+}
+
+
+export function getConfigure() {
+ return request.get(`/user/configures`)
+}
diff --git a/web/src/assets/js/deepcopy.js b/web/src/assets/js/deepcopy.js
new file mode 100644
index 0000000..4ed074b
--- /dev/null
+++ b/web/src/assets/js/deepcopy.js
@@ -0,0 +1,23 @@
+
+export function deepCopy(v1, v2, ps) {
+ for (let k in v2) {
+ if (ps && typeof ps === 'object' && Array.isArray(ps)) {
+ if (ps.indexOf(k) == -1) {
+ continue
+ }
+ }
+ let v = v2[k];
+ if (typeof v === 'object') {
+ if (!v1[k]) {
+ v1[k] = Array.isArray(v) ? [] : {};
+ }
+ if (typeof v1[k] !== 'object') {
+ continue
+ }
+ v1[k] = deepCopy(v1[k], v)
+ } else {
+ v1[k] = v
+ }
+ }
+ return v1
+}
\ No newline at end of file
diff --git a/web/src/assets/js/formatter.js b/web/src/assets/js/formatter.js
new file mode 100644
index 0000000..64ac7b4
--- /dev/null
+++ b/web/src/assets/js/formatter.js
@@ -0,0 +1,61 @@
+export function durationFormat(duration, sep = null) {
+ duration = parseInt(duration);
+ if (isNaN(duration)) {
+ return '';
+ }
+ var hour = parseInt(duration / 3600);
+ var r = duration % 3600;
+ var min = parseInt(r / 60);
+ var sec = parseInt(r % 60);
+ hour = isNaN(hour) ? 0 : hour;
+ min = isNaN(min) ? 0 : min;
+ sec = isNaN(sec) ? 0 : sec;
+ if (sep) {
+ hour = hour > 9 ? hour : '0' + hour
+ min = min > 9 ? min : '0' + min
+ sec = sec > 9 ? sec : '0' + sec
+ return hour + sep + min + sep + sec;
+ } else {
+ let s = '';
+ if (hour > 0) {
+ s += hour + "h"
+ }
+ if (min > 0 || s != '') {
+ s += min + "m"
+ }
+ s += sec + "s";
+ return s;
+ }
+}
+
+export function monryFormat(number, decimals = 2, decPoint = '.', thousandsSep = ',') {
+ number = (number + '').replace(/[^0-9+-Ee.]/g, '')
+ let n = !isFinite(+number) ? 0 : +number
+ let prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)
+ let sep = (typeof thousandsSep === 'undefined') ? ',' : thousandsSep
+ let dec = (typeof decPoint === 'undefined') ? '.' : decPoint
+ let s = ''
+ let toFixedFix = function (n, prec) {
+ let k = Math.pow(10, prec)
+ return '' + Math.ceil(n * k) / k
+ }
+ s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.')
+ let re = /(-?\d+)(\d{3})/
+ while (re.test(s[0])) {
+ s[0] = s[0].replace(re, '$1' + sep + '$2')
+ }
+ if ((s[1] || '').length < prec) {
+ s[1] = s[1] || ''
+ s[1] += new Array(prec - s[1].length + 1).join('0')
+ }
+ return s.join(dec)
+}
+
+export function byteFormat(bytes) {
+ if (bytes === 0) return '0 B';
+ var k = 1024;
+ let sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
+ let i = Math.floor(Math.log(bytes) / Math.log(k)) //return (bytes / Math.pow(k, i)) + ' ' + sizes[i];
+
+ return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];
+}
\ No newline at end of file
diff --git a/web/src/assets/js/menu.js b/web/src/assets/js/menu.js
new file mode 100644
index 0000000..7dcf012
--- /dev/null
+++ b/web/src/assets/js/menu.js
@@ -0,0 +1,184 @@
+import rawMenus from '@/config/menu'
+import pluralize from 'pluralize'
+import { deepCopy } from './deepcopy';
+
+function capitalize(s) {
+ return s.replace(/\b(\w)(\w*)/g, ($0, $1, $2) => {
+ return $1.toUpperCase() + $2.toLowerCase();
+ })
+}
+
+/**
+ * 获取所有的菜单数据
+ * @returns
+ */
+export function getMenus() {
+ let cloneMenus = deepCopy(rawMenus)
+ return cloneMenus
+}
+
+/**
+ * 序列化对象
+ * @param {Object} menu
+ * @returns
+ */
+export function nameize(menu) {
+ let componentName = menu.name || '';
+ if (componentName === '') {
+ componentName = menu.route.substr(1).split('/').map(v => {
+ return v[0] === ":" ? "" : capitalize(pluralize.singular(v));
+ }).join('')
+ }
+ return componentName
+}
+
+/**
+ * 查找指定路由的导航路径
+ * @param {Array} values
+ * @param {String} target
+ */
+export function findNavigation(values, target) {
+ let paths = [];
+ for (let i in values) {
+ let row = values[i];
+ if (row.route && row.route === target) {
+ paths.push({
+ navigation: row.navigation || false,
+ label: row.label,
+ route: row.route
+ })
+ return paths;
+ }
+ if (row.children && Array.isArray(row.children)) {
+ let vs = findNavigation(row.children, target);
+ if (Array.isArray(vs)) {
+ paths.push({
+ navigation: row.navigation || false,
+ label: row.label,
+ route: row.route
+ });
+ for (let j in vs) {
+ paths.push(vs[j])
+ }
+ return paths;
+ }
+ }
+ }
+ return false;
+}
+
+/**
+ * 通过菜单配置构建菜单菜单路由组件
+ * @param {Array} rows
+ * @param {Object} components
+ * @returns
+ */
+export function buildRoutes(rows, components) {
+ let routes = [];
+ for (let menu of rows) {
+ let route = { name: '', path: menu.route || '/', meta: {}, component: null, props: {} }
+ route.meta.title = menu.label || '';
+ route.props.title = route.meta.title
+ route.name = nameize(menu)
+ route.meta.hidden = menu.hidden ? true : false
+ route.meta.cache = menu.cache ? true : false
+ if (menu.permissions) {
+ route.meta.permissions = menu.permissions
+ }
+ let viewPath = menu.view;
+ if (!viewPath) {
+ let tokens = menu.route.substr(1).split('/').map((v) => {
+ return v[0] === ":" ? "" : v;
+ }).filter((v) => {
+ return v !== "";
+ })
+ let totalLength = tokens.length;
+ if (totalLength > 0) {
+ if (totalLength == 1 || pluralize.isPlural(tokens[totalLength - 1])) {
+ if (pluralize.isPlural(tokens[totalLength - 1])) {
+ tokens[totalLength - 1] = pluralize.singular(tokens[totalLength - 1])
+ }
+ tokens.push('index');
+ totalLength++;
+ }
+ tokens[totalLength - 1] = capitalize(tokens[totalLength - 1]);
+ }
+ viewPath = '../views/' + tokens.join("/") + ".vue"
+ }
+ if (components[viewPath]) {
+ route.component = components[viewPath]
+ }
+ if (Array.isArray(menu.children)) {
+ for (let child of buildRoutes(menu.children, components)) {
+ if (!child.meta) {
+ child.meta = {};
+ }
+ child.meta.children = true;
+ child.meta.route = {
+ parent: menu.route
+ }
+ routes.push(child);
+ }
+ }
+ routes.push(route);
+ }
+ return routes;
+}
+
+/**
+ * 判断该路由是否有权限访问
+ * @param {Object} row
+ * @param {Array} permissions
+ * @returns
+ */
+function isAllowed(row, permissions) {
+ if (row.access && row.access == 'allow') {
+ return true
+ }
+ let name = nameize(row)
+ if (permissions.indexOf(name) > -1) {
+ return true
+ }
+ //只要有页面下面一个权限,那么就要显示该页面
+ if (Array.isArray(row.permissions)) {
+ for (let per of row.permissions) {
+ if (permissions.indexOf(name + '.' + per)) {
+ return true
+ }
+ }
+ }
+ //只要有一个子项目有权限,那么他就有权限
+ if (Array.isArray(row.children)) {
+ for (let child of row.children) {
+ if (isAllowed(child, permissions)) {
+ return true;
+ }
+ }
+ }
+ return false
+}
+
+function filterMenusInner(items, permissions) {
+ let data = [];
+ for (let i in items) {
+ let row = Object.assign({}, items[i]);
+ if (!row.hidden) {
+ if (isAllowed(row, permissions)) {
+ if (Array.isArray(row.children)) {
+ row.children = filterMenusInner(row.children, permissions)
+ }
+ data.push(row)
+ }
+ }
+ }
+ return data
+}
+
+/**
+ * 过滤有权限的菜单
+ * @param {Array} permissions
+ * @returns
+ */
+export function filterMenus(permissions) {
+ return filterMenusInner(getMenus(), permissions)
+}
\ No newline at end of file
diff --git a/web/src/assets/js/status.js b/web/src/assets/js/status.js
new file mode 100644
index 0000000..b4999b6
--- /dev/null
+++ b/web/src/assets/js/status.js
@@ -0,0 +1,125 @@
+
+import Color from 'color'
+
+let statusMap = [
+ {
+ "label": "空闲",
+ "value": "idle",
+ "color": "#198754",
+ "retain": false
+ },
+ {
+ "label": "忙碌",
+ "value": "onBreak",
+ "color": "#F09D00",
+ "retain": false
+ },
+ {
+ "label": "用餐",
+ "value": "dining",
+ "color": "#83261e",
+ "retain": false
+ },
+ {
+ "label": "休假",
+ "value": "holiday",
+ "color": "#b3261e",
+ "retain": false
+ },
+ {
+ "label": "振铃",
+ "value": "ringing",
+ "color": "#e63757",
+ "retain": true
+ },
+ {
+ "label": "通话",
+ "value": "answer",
+ "color": "#b3261e",
+ "retain": true
+ },
+ {
+ "label": "静音",
+ "value": "muted",
+ "color": "#34AB62",
+ "retain": true
+ },
+ {
+ "label": "转接",
+ "value": "transfer",
+ "color": "#C8D541",
+ "retain": true
+ },
+ {
+ "label": "耳语",
+ "value": "whisper",
+ "color": "#43539D",
+ "retain": true
+ },
+ {
+ "label": "监听",
+ "value": "eavesdrop",
+ "color": "#0824F8",
+ "retain": true
+ },
+ {
+ "label": "未注册",
+ "value": "unavailable",
+ "color": "#bbbbbb",
+ "retain": true
+ },
+ {
+ "label": "话后",
+ "value": "wrapUp",
+ "color": "#E36B09",
+ "retain": true
+ }
+]
+
+const statusList = ['answer', 'transfer', 'whisper', 'eavesdrop', 'ringing', 'idle', 'onBreak'];
+
+
+export function updateStatusMap(x) {
+ if (Array.isArray(x)) {
+ statusMap = x;
+ }
+}
+
+export function getStatusPosition(s) {
+ let pos = statusList.indexOf(s);
+ if (pos === -1) {
+ pos = statusList.length + 1
+ }
+ return pos
+}
+
+export function getUserStatus() {
+ return statusMap.filter(v => {
+ return !v.retain;
+ })
+}
+
+export function getStatusText(s) {
+ for (let i in statusMap) {
+ let row = statusMap[i];
+ if (row.value === s) {
+ return row.label;
+ }
+ }
+ return s;
+}
+
+export function getStatusTextColor(s) {
+ for (let i in statusMap) {
+ let row = statusMap[i];
+ if (row.value === s) {
+ return row.color;
+ }
+ }
+ return '#1c1d21'
+}
+
+export function getStatusBGColor(s) {
+ let c = getStatusTextColor(s);
+ return Color(c).fade(0.8).hsl()
+}
\ No newline at end of file
diff --git a/web/src/assets/scss/common.scss b/web/src/assets/scss/common.scss
new file mode 100644
index 0000000..e6b6138
--- /dev/null
+++ b/web/src/assets/scss/common.scss
@@ -0,0 +1,562 @@
+#app {
+ --el-text-color-primary: #213547;
+ --el-text-color-muted: #95aac9;
+ --form-control-width: 210px;
+ --box-shadow: 0px 0px 30px 8px rgba(0, 0, 0, 0.046);
+ --placeholder-text-color: #c1ccdb;
+ --form-control-border-color: #d2ddec;
+ --el-color-available: #00d97e;
+ --el-color-link: #0067b8;
+
+ .el-card {
+ margin-bottom: 1.5rem;
+
+ }
+
+ .el-dialog {
+ --el-dialog-border-radius: 6px;
+
+ .el-dialog__title {
+ --el-dialog-title-font-size: .95rem;
+ font-weight: bold;
+ }
+ }
+
+ .el-footer {
+ --el-footer-padding: 0 20px;
+
+ .d-flex {
+ height: 100%;
+ }
+ }
+
+ .cursor-pointer {
+ cursor: pointer;
+ }
+
+ .el-tag {
+ border: none !important;
+ --el-tag-border-radius: 6px;
+ --el-tag-font-size: .7rem;
+
+ &.el-tag--primary {
+ --el-tag-bg-color: var(--el-color-primary-light-8);
+ }
+
+ &.el-tag--success {
+ --el-tag-bg-color: var(--el-color-success-light-8);
+ }
+
+ &.el-tag--info {
+ --el-tag-bg-color: var(--el-color-info-light-8);
+ }
+
+ &.el-tag--warning {
+ --el-tag-bg-color: var(--el-color-warning-light-8);
+ }
+
+ &.el-tag--danger {
+ --el-tag-bg-color: var(--el-color-danger-light-8);
+ }
+ }
+
+ .el-input {
+ --el-input-border-color: var(--form-control-border-color);
+
+ .el-input__inner {
+ &::placeholder {
+ font-size: .75rem;
+ color: var(--placeholder-text-color);
+ }
+ }
+
+ &.round {
+ .el-input__wrapper {
+ border-radius: 20px;
+ }
+ }
+ }
+
+ .el-textarea {
+ --el-input-border-color: var(--form-control-border-color);
+
+ .el-textarea__inner {
+ &::placeholder {
+ font-size: .75rem;
+ color: var(--placeholder-text-color);
+ }
+ }
+ }
+
+ .el-range-input {
+ &::placeholder {
+ font-size: .75rem;
+ color: var(--placeholder-text-color);
+ }
+ }
+
+ .el-date-editor {
+ font-size: .8rem;
+ --el-input-border-color: var(--form-control-border-color);
+ }
+
+ .el-date-range-picker__time-header {
+ .el-input {
+ width: auto !important;
+ }
+ }
+
+ .el-date-editor--datetimerange {
+ /**
+ * TODO 设置了这个值会导致点击框框后弹出的选择日期的组件错位,小于270像素会导致错位
+ */
+ // --el-date-editor-datetimerange-width: calc( - 20px);
+ --el-date-editor-datetimerange-width: calc(var(--form-control-width) - 16px);
+
+ &.el-input__wrapper {
+ padding: 0 8px;
+ }
+
+ .el-range-input {
+ font-size: .8rem;
+ width: 80px;
+ }
+ }
+
+ .sidebar-drawer {
+ .el-drawer__body {
+ --el-drawer-padding-primary: 0;
+ }
+
+ .el-drawer__close {
+ color: var(--el-color-white);
+ }
+ }
+}
+
+*::-webkit-scrollbar-thumb {
+ position: relative;
+ display: block;
+ cursor: pointer;
+ border-radius: inherit;
+ background-color: rgba(144, 147, 153, 0.3);
+ border-radius: 10px;
+ transition: background-color 0.3s;
+
+ &:hover {
+ background-color: rgba(144, 147, 153, 0.5);
+ }
+}
+
+*::-webkit-scrollbar {
+ z-index: 1;
+ width: 6px;
+ height: 6px;
+ border-radius: 10px;
+ transition: opacity 0.12s ease-out;
+}
+
+.px-1 {
+ padding-left: .5rem;
+ padding-right: .5rem;
+}
+
+.px-2 {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+.py-1 {
+ padding-top: .5rem;
+ padding-bottom: .5rem;
+}
+
+.py-2 {
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-muted {
+ color: var(--el-text-color-muted);
+}
+
+.text-primary {
+ color: var(--el-color-primary);
+}
+
+.text-info {
+ color: var(--el-color-info);
+}
+
+.text-success {
+ color: var(--el-color-success);
+}
+
+.text-warning {
+ color: var(--el-color-warning);
+}
+
+.text-error {
+ color: var(--el-color-error);
+}
+
+.text-danger {
+ color: var(--el-color-error);
+}
+
+.flex-align-center {
+ align-items: center;
+}
+
+.d-flex {
+ display: flex;
+
+ &.align-center {
+ align-items: center;
+ }
+
+ .flex-fill {
+ flex: 1 1 auto !important;
+
+ &.border-right {
+ border-right: 1px solid var(--el-border-color);
+ }
+
+ &.border-left {
+ border-left: 1px solid var(--el-border-color);
+ }
+ }
+
+ .flex-shrink {
+ flex-shrink: 0;
+
+ &.border-right {
+ border-right: 1px solid var(--el-border-color);
+ }
+
+ &.border-left {
+ border-left: 1px solid var(--el-border-color);
+ }
+ }
+
+ &.flex-horizontal,
+ &.flex-row {
+ flex-direction: row;
+ }
+
+ &.flex-vertical,
+ &.flex-column {
+ flex-direction: column;
+ }
+}
+
+
+// for segment element
+.segment-container {
+ .segment-header {
+ align-items: center;
+ box-sizing: border-box;
+ padding: 0rem 0rem 1rem .5rem;
+
+ h3 {
+ font-size: 1.038rem;
+ margin: 0;
+ color: var(--el-text-color-primary);
+ // color: var(--el-color-info);
+ }
+ }
+
+ .segment-body {
+ padding: 1.5rem 1rem;
+ border-radius: 10px;
+ background-color: var(--el-color-white);
+ box-shadow: var(--box-shadow);
+
+ &.plain {
+ padding: .5rem;
+ background-color: transparent;
+ box-shadow: none;
+ }
+ }
+
+ .segment-toolbar {
+ text-align: right;
+ margin-bottom: .38rem;
+
+ .iconfont {
+ margin-left: 1rem;
+ font-size: .9rem;
+ cursor: pointer;
+ color: var(--el-text-color-muted);
+ transition: all ease .5s;
+
+ &:hover {
+ color: var(--el-text-color-primary);
+ }
+ }
+
+ ul {
+ li {
+ display: inline-block;
+ }
+ }
+ }
+
+ &.segment-wrapper {
+ .segment-header {
+ margin-bottom: 1rem;
+ }
+ }
+
+ .el-descriptions {
+ margin-bottom: 1.5rem;
+
+ .el-descriptions__content {
+ word-break: break-all;
+ }
+ }
+}
+
+.loading-more {
+ span {
+ cursor: pointer;
+ font-size: .8rem;
+ color: var(--el-text-color-muted);
+ }
+}
+
+.preview-item,
+.segment-dataview,
+.segment-descriptions {
+ .el-tag {
+ padding-left: 1rem;
+ padding-right: 1rem;
+ border: none;
+
+ .el-tag__content {
+ font-size: .76rem;
+ }
+ }
+
+ .el-pagination {
+ margin-top: 1rem;
+ }
+
+ .el-table {
+ th.el-table__cell {
+ color: var(--el-text-color-primary);
+ background-color: #f9fbfd;
+ }
+
+ td.el-table__cell {
+ font-size: .82rem;
+ }
+
+ .cell {
+ a {
+ color: var(--el-color-link);
+ }
+ }
+ }
+
+ .segment-action {
+ cursor: pointer;
+ }
+
+ .segment-tag {
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+ height: 24px;
+ padding: 0 1rem;
+ line-height: 1;
+ border-radius: 9999px;
+ box-sizing: border-box;
+ white-space: nowrap;
+ font-size: .76rem;
+ }
+}
+
+.segment-descriptions {
+ margin-bottom: 1.5rem;
+
+ .el-descriptions__label {
+ display: inline-block;
+ margin-right: 1rem;
+ }
+
+ .is-bordered {
+ .el-descriptions__label {
+ display: table-cell;
+ margin-right: 0;
+ }
+ }
+}
+
+.segment-form {
+
+ .el-form--inline {
+ .el-form-item__label {
+ min-width: 80px;
+ }
+ }
+
+ .el-textarea {
+ width: auto !important;
+ min-width: 80%;
+ }
+
+ .el-upload-dragger {
+ --el-upload-dragger-padding-horizontal: 1px;
+ --el-upload-dragger-padding-vertical: 20px;
+ font-size: .8rem;
+ }
+
+ .grid-form {
+ .el-textarea {
+ width: 100% !important;
+ }
+ }
+
+ .el-input {
+ width: var(--form-control-width);
+
+ &.round {
+ --el-input-border-radius: 30px;
+ }
+
+
+ .el-input__wrapper {
+ transition: all .8s;
+ padding: 1px 10px;
+
+ &:hover {
+ background-color: var(--el-input-bg-color, var(--el-fill-color-blank));
+ }
+ }
+
+ .el-textarea__inner {
+ background-color: rgb(242, 243, 245);
+ transition: all .8s;
+
+ &:hover {
+ background-color: var(--el-input-bg-color, var(--el-fill-color-blank));
+ }
+ }
+ }
+
+ .icon-info {
+ margin-left: .8rem;
+ }
+}
+
+.segment-action {
+ display: inline-block;
+ margin-right: .5rem;
+
+ &:last-child {
+ margin-right: 0;
+ }
+}
+
+.list-plain {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+a {
+ text-decoration: none;
+}
+
+.avatar-group {
+ display: inline-flex;
+ box-sizing: border-box;
+ padding: 5px 0;
+ align-items: center;
+
+ .avatar-smaples {
+ display: inline-flex;
+ justify-content: center;
+ }
+
+ .avatar-plus {
+ text-align: center;
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+ width: var(--el-avatar-size);
+ height: var(--el-avatar-size);
+ border-radius: var(--el-avatar-size);
+ background-color: var(--el-fill-color);
+ cursor: pointer;
+ transition: all .5s;
+ margin-right: .5rem;
+
+ &:hover {
+ background-color: var(--el-fill-color-darker);
+ }
+ }
+
+ .el-avatar {
+ margin-left: calc(-1* var(--el-avatar-size) / 4);
+
+ &:first-child {
+ margin-left: 0;
+ }
+ }
+}
+
+
+.avatar-container {
+ .avatar-list {
+ margin-bottom: 1rem;
+
+ .el-avatar{
+ margin-right: .25rem;
+ margin-bottom: .25rem;
+ cursor: pointer;
+ }
+ }
+ .avatar-footer{
+ text-align: right;
+ font-size: .8rem;
+ }
+}
+
+.invisible-form {
+ .el-button {
+ --el-button-bg-color: transparent;
+ --el-button-border-color: transparent;
+ --el-button-hover-bg-color: transparent;
+ --el-button-hover-border-color: transparent;
+ }
+
+ .el-select {
+ --el-input-border-color: transparent;
+ --el-select-input-focus-border-color: transparent;
+ --el-select-border-color-hover: transparent;
+ }
+
+ .el-input {
+ --el-input-border-color: transparent !important;
+ --el-input-bg-color: transparent;
+ --el-input-icon-color: var(--el-text-color-primary);
+ }
+}
+
+@media only screen and (max-width: 768px) {
+ #app {
+ .el-main {
+ --el-main-padding: 10px 5px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/web/src/assets/scss/element.scss b/web/src/assets/scss/element.scss
new file mode 100644
index 0000000..7d0dc93
--- /dev/null
+++ b/web/src/assets/scss/element.scss
@@ -0,0 +1,28 @@
+@forward 'element-plus/theme-chalk/src/common/var.scss' with ($colors: ('primary': ('base': #0b57d0,
+ ),
+ 'success': ('base': #00d97e,
+ ),
+ 'warning':('base':#F09D00,
+ ),
+ 'danger':('base':#e63757,
+ ),
+ 'error':('base':#b3261e,
+ ),
+ 'info':('base':#6e84a3,
+ )),
+);
+
+@use "element-plus/theme-chalk/src/index.scss" as *;
+
+@import 'element-plus/theme-chalk/display.css';
+
+
+.el-cascader {
+ .el-input {
+ .icon-arrow-down {
+ &::before {
+ content: none !important;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/web/src/assets/scss/style.scss b/web/src/assets/scss/style.scss
new file mode 100644
index 0000000..f25f3ed
--- /dev/null
+++ b/web/src/assets/scss/style.scss
@@ -0,0 +1,1118 @@
+html,
+body,
+#app {
+ height: 100%;
+}
+
+
+#app {
+
+ // --el-text-color-regular: '',
+ // --el-text-color-secondary: '',
+
+ .page {
+ height: 100%;
+
+ .container {
+ height: calc(100% - var(--el-header-height));
+ overflow: hidden;
+ }
+ }
+
+ >.el-skeleton {
+ height: 100%;
+
+ .skeleton {
+ width: 100%;
+ height: 100%;
+ align-items: center;
+ text-align: center;
+ }
+ }
+
+ .el-header {
+ --el-header-padding: 0px;
+ box-shadow: 0px 0px 20px 4px rgba(0, 0, 0, 0.02), 0px 8px 20px rgba(0, 0, 0, 0.06);
+
+ .header-wrapper {
+ height: 100%;
+ padding: 0 1em;
+ align-items: center;
+
+ .header-avatar {
+ position: relative;
+ border-radius: 50%;
+ }
+
+ .logo {
+ i {
+ cursor: pointer;
+ font-size: 1.38rem;
+ }
+ }
+
+ .user-status {
+ --user-status-size: 12px;
+
+ position: absolute;
+ display: block;
+ right: 0;
+ bottom: 0px;
+ border: 1px solid var(--el-color-white);
+ width: var(--user-status-size);
+ height: var(--user-status-size);
+ border-radius: var(--user-status-size);
+ background-color: var(--el-color-primary);
+ }
+
+ ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+
+ li {
+ display: inline-block;
+ cursor: pointer;
+ vertical-align: middle;
+ padding: 0 15px;
+
+ .iconfont {
+ font-size: 1.36rem;
+ }
+ }
+ }
+ }
+ }
+
+ .el-aside {
+ height: 100%;
+ overflow-y: auto;
+
+ .aside-wrapper {
+ height: 100%;
+
+ >.flex-fill {
+ overflow-y: auto;
+ }
+ }
+
+ .drag-bar {
+ width: 3px;
+ cursor: e-resize;
+
+ &.active {
+ background-color: var(--el-fill-color-dark);
+ }
+ }
+ }
+
+ .el-menu {
+ border-right: none;
+
+ &.el-menu--collapse {
+ .iconfont {
+ margin-right: 0;
+ font-size: 1.3rem;
+ }
+ }
+
+ .iconfont {
+ margin-right: .5rem;
+ font-size: 1.06rem;
+ }
+ }
+
+ .el-footer {
+ --el-footer-height: 40px;
+ box-shadow: var(--box-shadow);
+ border-top: 1px solid var(--el-border-color-light);
+
+ .user-status {
+ display: inline;
+ cursor: pointer;
+ padding: .28em 1.38rem;
+ font-size: .8rem;
+ border-radius: 20px;
+ }
+ }
+
+
+ .webrtc-video-player {
+ position: fixed;
+ top: 60px;
+ right: 5px;
+ z-index: -1;
+ }
+
+ &.call-answering {
+ .webrtc-video-player {
+ z-index: 999;
+ }
+ }
+}
+
+@keyframes shake {
+
+ 10%,
+ 90% {
+ transform: translate3d(-1px, 0, 0);
+ }
+
+ 20%,
+ 80% {
+ transform: translate3d(+2px, 0, 0);
+ }
+
+ 30%,
+ 70% {
+ transform: translate3d(-4px, 0, 0);
+ }
+
+ 40%,
+ 60% {
+ transform: translate3d(+4px, 0, 0);
+ }
+
+ 50% {
+ transform: translate3d(-4px, 0, 0);
+ }
+}
+
+.popup-dialog {
+ position: fixed;
+ z-index: 9;
+ width: 250px;
+ border-radius: 5px;
+ display: block;
+ box-shadow: var(--el-box-shadow);
+ --el-notification-padding: 10px;
+ padding: 0 1rem 1.5rem 1rem;
+ box-sizing: border-box;
+ background-image: linear-gradient(180deg, #e2d1c3 0%, #e7f0fd 100%);
+ // background-image: radial-gradient(transparent 1px, rgba(222, 223, 255, .4) 1px);
+ backdrop-filter: blur(10px);
+
+ &.noanswer {
+ animation: shake 1.5s linear -5s infinite;
+ }
+
+ .popup-header {
+ display: block;
+ text-align: right;
+ cursor: move;
+ padding: 1rem 0 1.5rem 0;
+ }
+
+ .el-notification__group {
+ margin: 0;
+ }
+
+ .popup-container {
+ width: 100%;
+ --button-size: 38px;
+
+ .popup-avatar {
+ box-sizing: border-box;
+ width: 100%;
+ text-align: center;
+ padding: .5rem 0 1rem 0;
+
+ h3 {
+ color: var(--el-text-color-primary);
+ margin: 1rem 0 0rem 0;
+ }
+ }
+
+ .popup-content {
+ box-sizing: border-box;
+ padding: 1rem 0 2rem 0;
+ text-align: center;
+ }
+
+ .popup-actions {
+ text-align: center;
+
+ .el-button--large.is-circle {
+ --el-button-size: 38px;
+ }
+ }
+
+ .popup-button {
+ width: var(--button-size);
+ height: var(--button-size);
+ border-radius: var(--button-size);
+ font-size: 1.6rem;
+ display: inline-block;
+ background-color: var(--el-color-white);
+ margin: 0 1rem;
+ padding: .5rem;
+ text-align: center;
+ cursor: pointer;
+ }
+
+ .popup-timer {
+ font-size: .68rem;
+ text-align: center;
+ width: 100%;
+ display: block;
+ margin-top: 1rem;
+ }
+ }
+}
+
+.status-dialog {
+ --status-icon-size: 20px;
+
+ background-color: var(--el-bg-color-page);
+
+ .current-status {
+ box-sizing: border-box;
+ padding: 2rem 0 4rem 0;
+ text-align: center;
+
+ i {
+ display: inline-block;
+ vertical-align: middle;
+ width: var(--status-icon-size);
+ height: var(--status-icon-size);
+ border-radius: var(--status-icon-size);
+ }
+
+ span {
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: .5rem;
+ }
+ }
+}
+
+.status-item {
+ box-sizing: border-box;
+ padding: 1rem 0;
+ text-align: center;
+ transition: all .5s;
+ background-color: var(--el-color-white);
+ margin-bottom: 10px;
+ border-radius: 6px;
+
+ i {
+ display: inline-block;
+ width: var(--status-icon-size);
+ height: var(--status-icon-size);
+ border-radius: var(--status-icon-size);
+ }
+
+ &:hover,
+ &.active {
+ color: var(--el-color-white);
+ background-color: var(--el-color-primary);
+ cursor: pointer;
+
+ }
+
+ .status-text {
+ padding: .5rem 0;
+ }
+}
+
+.draggable-handle {
+ cursor: move !important;
+}
+
+.form-list-wrapper {
+
+ ul {
+ list-style: none;
+ padding: 0 0 0 0px;
+ margin: 0 0 1rem 0;
+ }
+
+ li {
+ box-sizing: border-box;
+ padding: 0 1.5rem 0 0;
+ display: inline-block;
+
+ i {
+ cursor: pointer;
+ margin-right: .5rem;
+ }
+ }
+}
+
+.user-monitor-item {
+ box-sizing: border-box;
+ padding: 1rem;
+ border-radius: 6px;
+ cursor: pointer;
+ background-color: var(--el-color-white);
+ box-shadow: var(--box-shadow);
+ margin-bottom: 10px;
+
+ &.offline {
+ .user-avatar {
+ background-image: radial-gradient(transparent 1px, rgba(0, 0, 0, .5) 1px);
+ backdrop-filter: saturate(50%) blur(4px);
+ }
+
+ .el-avatar {
+ img {
+ -webkit-filter: grayscale(100%);
+ -moz-filter: grayscale(100%);
+ -ms-filter: grayscale(100%);
+ -o-filter: grayscale(100%);
+ filter: grayscale(100%);
+ filter: gray;
+ }
+ }
+ }
+
+ &.online {
+ .user-avatar {
+ i {
+ background-color: var(--el-color-available);
+ border-color: var(--el-color-white);
+ }
+ }
+ }
+
+ .user-avatar {
+ width: 56px;
+ height: 56px;
+ border-radius: 50%;
+ position: relative;
+ border: 2px solid var(--el-border-color-light);
+
+ i {
+ display: block;
+ width: 12px;
+ height: 12px;
+ border-radius: 50%;
+ position: absolute;
+ right: 6px;
+ bottom: 0px;
+ border: 1px solid transparent;
+ }
+ }
+
+ &:hover {
+ background-color: rgba(0, 0, 0, .055);
+ }
+
+ .user-monitor-bar {
+ padding: .5rem 0;
+ --icon-size: 26px;
+
+ ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+
+ li {
+ display: inline-block;
+ box-sizing: border-box;
+ width: var(--icon-size);
+ height: var(--icon-size);
+ line-height: var(--icon-size);
+ border-radius: var(--icon-size);
+ text-align: center;
+
+ &:hover {
+ background-color: var(--el-bg-color-page);
+ }
+ }
+ }
+ }
+
+ .status-control-wrapper {
+ margin-top: .9rem;
+ }
+
+ .status-control {
+ font-size: .7rem;
+ padding: .28rem 1rem;
+ border-radius: 20px;
+ }
+
+ .user-monitor-content {
+ box-sizing: border-box;
+ padding: 0 0 0 .68rem;
+ }
+
+ h3 {
+ margin: 0;
+ padding: 0;
+ font-size: 1rem;
+ font-weight: normal;
+ }
+
+ p {
+ margin: 3px 0;
+ }
+}
+
+.monitor-wrapper {
+
+ --element-height: 360px;
+
+ &.fullscreen {
+ padding: 2rem;
+ background-color: #021349;
+ --el-text-color-primary: rgba(238, 238, 238, .9);
+ --el-border-color-light: #071d64;
+ --el-bg-color-page: rgba(0, 0, 0, .98);
+ --fullscreen-bg-color: rgba(0, 0, 0, .68);
+
+ .el-card {
+ --el-card-bg-color: var(--fullscreen-bg-color);
+ --el-card-border-color: var(--el-border-color-light);
+ }
+
+ .el-table {
+ --el-table-bg-color: transparent;
+ --el-table-tr-bg-color: transparent;
+ --el-table-border-color: var(--el-border-color-light);
+ --el-table-border: 1px solid var(--el-border-color-light);
+ }
+
+ .el-statistic {
+ background-color: var(--fullscreen-bg-color);
+ }
+
+ .toggle-fullscreen {
+ top: 2rem;
+ }
+ }
+
+ .el-row {
+ margin-bottom: 20px;
+ }
+
+ .el-card {
+ border: none;
+ border-radius: 6px;
+ --el-box-shadow-light: var(--box-shadow);
+ margin-bottom: 0px !important;
+ }
+
+ .el-statistic {
+ background-color: var(--el-color-white);
+ box-shadow: var(--box-shadow);
+ text-align: center;
+ padding: 1.5rem 0;
+ border-radius: 6px;
+
+ .el-statistic__head {
+ font-size: 1rem;
+ color: var(--el-text-color-primary);
+ margin-bottom: 1rem;
+ }
+ }
+
+ .monitor-waiting-container {
+ height: var(--element-height);
+
+ .el-table {
+ th.el-table__cell {
+ background-color: transparent;
+ }
+ }
+
+ ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ width: 200px;
+ height: 100%;
+ overflow-y: auto;
+ border-right: 1px solid var(--el-border-color-light);
+
+ li {
+ box-sizing: border-box;
+ font-size: .8rem;
+ padding: .8rem 1rem;
+ cursor: pointer;
+ display: flex;
+ width: 100%;
+
+ span {
+ flex: 1 1 auto !important;
+ }
+
+ &:hover,
+ &.active {
+ color: var(--el-text-color-primary);
+ background-color: var(--el-bg-color-page);
+ }
+ }
+ }
+ }
+
+ .agent-ranking-container {
+ height: var(--element-height);
+ box-sizing: border-box;
+ padding: 1rem;
+ overflow-y: auto;
+
+ li {
+ box-sizing: border-box;
+ padding: .5rem;
+ cursor: pointer;
+ transition: all .5s;
+ border-radius: 6px;
+
+ &:hover {
+ background-color: var(--el-bg-color-page);
+ }
+
+ &:first {
+ padding-top: 0;
+ }
+ }
+ }
+
+ .toggle-fullscreen {
+ text-align: right;
+ position: fixed;
+ right: 0;
+ top: 80px;
+
+ span {
+ width: 23px;
+ font-size: .78rem;
+ word-break: break-all;
+ cursor: pointer;
+ color: var(--el-color-white);
+ background-color: var(--el-color-info-light-5);
+ display: inline-block;
+ box-sizing: border-box;
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 6px;
+ padding: .8rem .2rem .8rem .3rem;
+ transition: all ease .5s;
+
+ &:hover {
+ background-color: var(--el-color-info);
+ }
+ }
+ }
+}
+
+.percentage-label {
+ margin-right: .5rem;
+
+ &::after {
+ content: ':';
+ }
+}
+
+.shortcut {
+ text-align: center;
+ margin-bottom: 2rem;
+ cursor: pointer;
+
+ &:hover {
+ color: var(--el-color-primary);
+
+ span {
+ color: var(--el-color-primary-3);
+ }
+ }
+
+ .iconfont {
+ font-size: 2rem;
+ }
+
+ span {
+ display: block;
+ text-align: center;
+ color: var(--el-text-color-muted);
+ font-size: .6rem;
+ margin-top: .5rem;
+ }
+}
+
+.statistic-block-card {
+ .el-statistic {
+ background-color: transparent;
+ box-shadow: none;
+ padding: 1.5rem 0;
+ margin-bottom: 1rem;
+ text-align: center;
+
+ .el-statistic__head {
+ font-size: .9rem;
+ color: var(--el-text-color-muted);
+ }
+
+ .el-statistic__number {
+ font-size: 2.3rem;
+ }
+
+ .el-statistic__suffix {
+ display: inline-block;
+ }
+
+ &.block-statistic {
+ .el-statistic__suffix {
+ .el-text {
+ --el-text-font-size: inherit;
+ }
+
+ display: block;
+ font-size: .78rem;
+ margin-top: 1rem;
+ color: var(--el-text-color-muted);
+ }
+ }
+ }
+
+ .metric-chart {
+ box-sizing: border-box;
+ padding-top: 4rem;
+ }
+}
+
+.audio-notification {
+ --el-notification-padding: 0;
+ --el-notification-group-margin-left: 0;
+ --el-notification-group-margin-right: 0;
+ --el-bg-color-overlay: transparent;
+ --el-notification-close-color: var(--el-text-color-primary);
+ --el-notification-close-font-size: 12px;
+ // background-image: linear-gradient(to top, #dad4ec 0%, #dad4ec 1%, #f3e7e9 100%);
+ // background-image: linear-gradient(180deg, #e2d1c3 0%, #e7f0fd 100%);
+ background-image: linear-gradient(120deg, #e1edee 0%, #fcfafa 100%);
+ backdrop-filter: blur(4px);
+
+ // &:before {
+ // content: '';
+ // width: 100%;
+ // height: 100%;
+ // position: absolute;
+ // background-image: url(data:image/png;base64,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);
+ // }
+
+ .el-progress-bar__outer {
+ cursor: pointer;
+ --el-border-color-lighter: #ceddf6;
+ }
+
+ .el-notification__group {
+ width: 100%;
+ position: relative;
+ padding: 1rem .8rem;
+
+ .el-notification__closeBtn {
+ position: absolute;
+ top: 10px;
+ right: 15px;
+ }
+ }
+
+ .el-notification__content {
+ width: 100%;
+
+ .el-icon {
+ color: var(--el-text-color-primary);
+ }
+ }
+
+ .audio-toolbar {
+ margin-bottom: .1rem;
+ }
+
+ .audio-duration {
+ font-size: .68rem;
+ color: var(--el-text-color-muted);
+ text-align: center;
+ }
+
+ .audio-control {
+ display: inline-block;
+ margin-right: .8rem;
+ vertical-align: middle;
+
+ i {
+ cursor: pointer;
+ font-size: 1.2rem;
+ color: var(--el-text-color-primary);
+
+ &.playing {
+ color: var(--el-color-primary);
+ }
+ }
+ }
+}
+
+.viewer-container {
+ .el-card {
+ border: none;
+ border-radius: 6px;
+ box-shadow: var(--box-shadow);
+ }
+
+ .segment-descriptions {
+ padding: 1rem;
+ border-radius: 6px;
+ background-color: var(--el-color-white);
+ box-shadow: var(--box-shadow);
+ }
+}
+
+.dashboard-container {
+ --banner-height: 150px;
+
+ .dashboard-primary-container {
+ .el-statistic {
+ background-color: var(--el-color-white);
+ box-shadow: var(--box-shadow);
+ text-align: center;
+ padding: 1.5rem 0;
+ box-sizing: border-box;
+ border-radius: 6px;
+ height: var(--banner-height);
+ margin-bottom: 1.5rem;
+
+ .el-statistic__head {
+ font-size: 1rem;
+ color: var(--el-text-color-primary);
+ margin-bottom: 1rem;
+ }
+
+ .el-statistic__suffix {
+ display: block;
+ margin-top: 1rem;
+ color: var(--el-text-color-muted);
+ font-size: .83rem;
+ }
+ }
+ }
+
+ .el-card {
+ border: none;
+ border-radius: 6px;
+ box-shadow: var(--box-shadow);
+ }
+
+ .dashboard-banner {
+ height: var(--banner-height);
+ background-image: linear-gradient(90deg, #f8fafc 0%, #fdfefe 100%);
+ border-radius: 6px;
+ box-shadow: var(--box-shadow);
+ margin-bottom: 1.5rem;
+
+
+ .banner-content {
+ box-sizing: border-box;
+ padding: 1rem;
+ line-height: 1.6rem;
+ }
+
+ img {
+ height: var(--banner-height);
+ }
+ }
+
+ .secure-content {
+ display: block;
+ background-color: var(--el-color-white);
+ box-sizing: border-box;
+ padding: 1.5rem;
+ text-align: center;
+ border-radius: 6px;
+ box-shadow: var(--box-shadow);
+ }
+
+ a {
+ color: var(--el-color-primary);
+ }
+}
+
+.dialplate {
+ display: block;
+
+ .dialplate-input {
+ display: block;
+ }
+
+ .dialplate-clear {
+ text-align: right;
+ height: 20px;
+ box-sizing: border-box;
+ padding-top: 5px;
+
+ .el-icon {
+ cursor: pointer;
+ }
+ }
+
+ .el-input {
+ --el-input-border: none;
+ --el-input-bg-color: var(--el-bg-color-page);
+ --el-input-border-color: transparent;
+ --el-input-hover-border-color: transparent;
+ --el-input-focus-border-color: transparent;
+ }
+
+ .dialplate-actions {
+ text-align: center;
+ --action-size: 36px;
+
+ .dialplate-action {
+ .el-button {
+ margin: 0 .5rem;
+ }
+
+ &:first-child {
+ text-align: right;
+ }
+
+ &:last-child {
+ text-align: left;
+ }
+ }
+ }
+
+ .dialplate-button {
+ display: inline-block;
+ width: 33%;
+ text-align: center;
+ padding: 1rem 0;
+ box-sizing: border-box;
+ border-radius: 3px;
+
+ &:hover {
+ color: var(--el-text-color-primary);
+ background-color: var(--el-bg-color-page);
+ cursor: pointer;
+ }
+ }
+}
+
+.v-puzzle-code {
+ .vue-auth-box_ {
+ padding: 10px;
+ }
+
+ .reset_ {
+ width: 22px !important;
+ content: url('data:image/png;base64,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');
+ }
+}
+
+.trail-form {
+ border: 2px solid var(--el-bg-color-page);
+
+ .el-textarea__inner {
+ box-shadow: none;
+ }
+
+ .trail-action {
+
+ background-color: var(--el-bg-color-page);
+ text-align: right;
+ }
+}
+
+.trail-timeline {
+ margin-top: 2rem;
+
+ .el-timeline {
+ padding-left: 5px;
+
+ .el-timeline-item__tail {
+ left: 10px;
+ }
+
+ .preview-item {
+ .preview-item-label {
+ min-width: 2rem;
+ }
+ }
+ }
+}
+
+.trail-container {
+ .el-tabs__header {
+ margin-bottom: 0;
+ }
+
+ .el-tabs__content {
+ background-color: var(--el-color-white);
+ box-sizing: border-box;
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+ color: var(--el-text-color-primary);
+ margin-bottom: 1.5rem;
+ }
+
+ .el-timeline-item__content {
+ position: relative;
+ }
+
+ .trail-actions {
+ position: absolute;
+ right: 0;
+ top: -25px;
+ text-align: right;
+
+ li {
+ display: inline-block;
+ margin-left: .38rem;
+ cursor: pointer;
+
+ &:first-child {
+ margin-left: 0;
+ }
+ }
+ }
+}
+
+.outbound-container {
+ background-color: var(--el-color-white);
+ padding: 2rem 1rem;
+ box-shadow: var(--box-shadow);
+ border-radius: 6px;
+ margin-top: 2.5rem;
+ box-sizing: border-box;
+
+ .outbound-actions {
+ margin-top: 3rem;
+ text-align: center;
+ }
+
+ .outbound-download-template {
+ display: block;
+ margin-bottom: 2rem;
+ }
+
+ .outbound-step {
+ .icon-congratulate {
+ background-image: -webkit-linear-gradient(top, #4f0200, #d75d10, #f5d9ab);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ font-size: 4rem;
+ }
+ }
+}
+
+.campaign-container {
+ .preview-item {
+ margin-bottom: .2rem;
+ }
+
+ .campaign-actions {
+ i {
+ font-size: 1.2rem;
+ cursor: pointer;
+ }
+ }
+
+ .campaign-member {
+ display: block;
+ font-size: .8rem;
+ border-radius: 3px;
+ padding: .38rem .5rem;
+
+ &:hover {
+ background-color: var(--el-fill-color);
+ }
+
+ .campaign-member-name {
+ margin-right: 1rem;
+ }
+ }
+}
+
+.notice-container {
+ .notice-body {
+ display: block;
+ box-sizing: border-box;
+ padding: .5rem 0 1rem 0;
+ }
+
+ .notice-footer {
+ text-align: right;
+ }
+}
+
+.call-widget {
+ cursor: pointer;
+ color: var(--el-color-primary);
+}
+
+.flow-wrapper {
+ width: 100%;
+ height: 400px;
+
+ .vue-flow__node {
+ display: block;
+ padding: 6px 10px;
+ border-radius: 6px;
+ border: none;
+ color: var(--el-color-white);
+ font-size: 12px;
+ background-color: var(--el-color-info);
+
+ &.vue-flow__node-input {
+ background-color: var(--el-color-success);
+
+ &.selected {
+ background-color: var(--el-color-success-dark-2);
+ }
+ }
+
+ &.vue-flow__node-output {
+ background-color: var(--el-color-danger);
+
+ &.selected {
+ background-color: var(--el-color-danger-dark-2);
+ }
+ }
+
+ &.primary-node {
+ background-color: var(--el-color-primary);
+
+ &.selected {
+ background-color: var(--el-color-primary-dark-2);
+ }
+ }
+
+ &.info-node {
+ background-color: var(--el-color-info);
+
+ &.selected {
+ background-color: var(--el-color-info-dark-2);
+ }
+ }
+
+ &.success-node {
+ background-color: var(--el-color-success);
+
+ &.selected {
+ background-color: var(--el-color-success-dark-2);
+ }
+ }
+
+ &.warning-node {
+ background-color: var(--el-color-warning);
+
+ &.selected {
+ background-color: var(--el-color-warning-dark-2);
+ }
+ }
+
+ &.danger-node {
+ background-color: var(--el-color-danger);
+
+ &.selected {
+ background-color: var(--el-color-danger-dark-2);
+ }
+ }
+
+ &.selected {
+ border: none;
+ background-color: var(--el-color-info-dark-2);
+ }
+ }
+}
\ No newline at end of file
diff --git a/web/src/components/fragment/ActiveForm.vue b/web/src/components/fragment/ActiveForm.vue
new file mode 100644
index 0000000..24c6a71
--- /dev/null
+++ b/web/src/components/fragment/ActiveForm.vue
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/Description.vue b/web/src/components/fragment/Description.vue
new file mode 100644
index 0000000..8d6cab0
--- /dev/null
+++ b/web/src/components/fragment/Description.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/GridView.vue b/web/src/components/fragment/GridView.vue
new file mode 100644
index 0000000..fb8cccc
--- /dev/null
+++ b/web/src/components/fragment/GridView.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/PageHeader.vue b/web/src/components/fragment/PageHeader.vue
new file mode 100644
index 0000000..fd27317
--- /dev/null
+++ b/web/src/components/fragment/PageHeader.vue
@@ -0,0 +1,12 @@
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/Skeleton.vue b/web/src/components/fragment/Skeleton.vue
new file mode 100644
index 0000000..ac00181
--- /dev/null
+++ b/web/src/components/fragment/Skeleton.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/Viewer.vue b/web/src/components/fragment/Viewer.vue
new file mode 100644
index 0000000..a913d58
--- /dev/null
+++ b/web/src/components/fragment/Viewer.vue
@@ -0,0 +1,592 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ action.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/Wrapper.vue b/web/src/components/fragment/Wrapper.vue
new file mode 100644
index 0000000..57d6bc2
--- /dev/null
+++ b/web/src/components/fragment/Wrapper.vue
@@ -0,0 +1,77 @@
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/libs/codec.js b/web/src/components/fragment/libs/codec.js
new file mode 100644
index 0000000..17db744
--- /dev/null
+++ b/web/src/components/fragment/libs/codec.js
@@ -0,0 +1,238 @@
+import dayjs from "dayjs"
+
+function mustMarshal(v, s) {
+ let value = null
+ switch (s) {
+ case 'integer':
+ if (v instanceof Date) {
+ value = v.getTime() / 1000
+ } else {
+ value = parseInt(v)
+ value = isNaN(value) ? 0 : value
+ }
+ break
+ case 'decimal':
+ case 'float':
+ value = parseFloat(v)
+ value = isNaN(value) ? 0 : value
+ break
+ case 'boolean':
+ value = Boolean(v)
+ break
+ case 'string':
+ if (v instanceof Date) {
+ value = dayjs(v).format("YYYY-MM-DD HH:mm:ss")
+ } else if (typeof v === 'object') {
+ value = JSON.stringify(v)
+ } else {
+ value = v + ''
+ }
+ break
+ default:
+ value = v
+ }
+ return value
+}
+
+/**
+ * 把对象转换成时间对象
+ * @param {Object} v
+ * @returns
+ */
+export function toDate(v) {
+ if (typeof v === 'string') {
+ return dayjs(v, ['YYYY-MM-DD HH:mm:ss', 'YYYY-MM-DD']).toDate();
+ } else if (typeof v === 'number') {
+ if (v / 1000000000 < 1000) {
+ v = v * 1000;
+ }
+ return new Date(v);
+ }
+ return v;
+}
+
+/**
+ * 模型数据编码为数据库数
+ * @param {Object} raw
+ * @param {Array} schemas
+ * @returns
+ */
+export function encode(raw, schemas, scenario) {
+ let data = {}
+ let excludes = []
+ if (!raw || !schemas) {
+ return data
+ }
+ scenario = scenario || 'unknown';
+ for (let schema of schemas) {
+ if (schema.attribute.live.enable && schema.attribute.live.type == 'cascader') {
+ let columns = schema.attribute.live.columns
+ //级联数据如果没有配置字段,那么对结果进行JSON编码处理
+ if (!Array.isArray(columns) || columns.length == 0) {
+ data[schema.column] = JSON.stringify(raw[schema.column])
+ } else {
+ let vals = raw[schema.column]
+ if (vals && Array.isArray(vals)) {
+ for (let i in vals) {
+ if (columns[i]) {
+ //级联数据所有数据都必须是同一个类型的数据
+ data[columns[i]] = mustMarshal(vals[i], schema.type)
+ excludes.push(columns[i])
+ }
+ }
+ }
+ }
+ } else if (['multiSelect'].indexOf(schema.format) > -1) {
+ try {
+ if (typeof raw[schema.column] === 'object') {
+ data[schema.column] = mustMarshal(
+ JSON.stringify(raw[schema.column]),
+ schema.type
+ )
+ }
+ } catch (e) { }
+ } else if (['date', 'datetime', 'timestamp'].indexOf(schema.format) > -1) {
+ let value = raw[schema.column];
+ if (Array.isArray(value)) {
+ let ps = []
+ for (let i in value) {
+ let row = value[i];
+ ps.push(mustMarshal(toDate(row), schema.type))
+ }
+ data[schema.column] = ps.join('/')
+ } else {
+ data[schema.column] = mustMarshal(toDate(value), schema.type)
+ }
+ } else {
+ //先前已经有过赋值的列数据
+ if (excludes.indexOf(schema.column) > -1) {
+ continue
+ }
+ //如果是bool类型的变量,并且值为空不进行类型转换
+ if (['boolean', 'bool'].indexOf(schema.format) > -1) {
+ if (typeof raw[schema.column] === 'undefined') {
+ continue
+ }
+ if (typeof raw[schema.column] === 'string' && raw[schema.column] == '') {
+ continue
+ }
+ }
+ if (raw[schema.column]) {
+ data[schema.column] = mustMarshal(raw[schema.column], schema.type)
+ } else {
+ data[schema.column] = mustMarshal(
+ scenario === 'create' ? schema.attribute.default_value : '',
+ schema.type
+ )
+ }
+ }
+ }
+ return data
+}
+
+/**
+ * 数据库数据解码为模型数据
+ * @param {Object} raw
+ * @param {Array} schemas
+ * @returns
+ */
+export function decode(raw, schemas, scenario) {
+ let data = {}
+ scenario = scenario || 'unknown';
+ if (!raw || !schemas) {
+ return data
+ }
+ for (let schema of schemas) {
+ if (
+ schema.attribute.live.enable &&
+ schema.attribute.live.type == 'cascader'
+ ) {
+ let columns = schema.attribute.live.columns
+ //级联数据如果没有配置字段,那么对结果进行JSON解码处理
+ if (!Array.isArray(columns) || columns.length == 0) {
+ if (raw[schema.column]) {
+ data[schema.column] = JSON.parse(raw[schema.column])
+ } else {
+ data[schema.column] = []
+ }
+ } else {
+ data[schema.column] = []
+ for (let column of columns) {
+ let v = raw[column]
+ if (!v) {
+ break
+ }
+ data[schema.column].push(mustMarshal(v, schema.type))
+ }
+ }
+ } else if (
+ (schema.attribute.live.enable &&
+ schema.attribute.live.type == 'dropdown') ||
+ schema.format == 'dropdown'
+ ) {
+ //强制重新设置字段的format
+ if (schema.format !== 'dropdown') {
+ schema.format = 'dropdown';
+ }
+ //下拉列转成字符串显示
+ let v = null;
+ if (raw.hasOwnProperty(schema.column)) {
+ v = raw[schema.column];
+ } else if (scenario === 'create') {
+ v = schema.attribute.default_value;
+ }
+ data[schema.column] = mustMarshal(v || '', 'string')
+ } else if (schema.format === 'multiSelect') {
+ try {
+ if (typeof raw[schema.column] === 'string') {
+ data[schema.column] = JSON.parse(raw[schema.column])
+ }
+ } catch (e) { }
+ } else if (['time', 'date', 'datetime', 'timestamp'].indexOf(schema.format) > -1) {
+ if (raw.hasOwnProperty(schema.column)) {
+ let v = raw[schema.column];
+ if (v) {
+ if (typeof v === 'string' && v.indexOf('/') > -1) {
+ let ss = v.split('/', 2);
+ let st = toDate(ss[0]);
+ let et = toDate(ss[1]);
+ switch (schema.format) {
+ case 'time':
+ data[schema.column] = [dayjs(st).format('HH:mm'), dayjs(et).format('HH:mm')]
+ break;
+ case 'date':
+ data[schema.column] = [dayjs(st).format('YYYY-MM-DD'), dayjs(et).format('YYYY-MM-DD')];
+ break;
+ default:
+ data[schema.column] = [dayjs(st).format('YYYY-MM-DD HH:mm:ss'), dayjs(et).format('YYYY-MM-DD HH:mm:ss')];
+ break
+ }
+ } else {
+ let ts = toDate(v);
+ switch (schema.format) {
+ case 'time':
+ data[schema.column] = dayjs(ts).format('HH:mm');
+ break;
+ case 'date':
+ data[schema.column] = dayjs(ts).format('YYYY-MM-DD');
+ break;
+ default:
+ data[schema.column] = dayjs(ts).format('YYYY-MM-DD HH:mm:ss');
+ break
+ }
+ }
+
+ }
+ }
+ } else {
+ let v = null;
+ if (raw.hasOwnProperty(schema.column)) {
+ v = raw[schema.column];
+ } else if (scenario === 'create') {
+ v = schema.attribute.default_value;
+ }
+ data[schema.column] = mustMarshal(v || '', schema.type)
+ }
+ }
+ return data
+}
\ No newline at end of file
diff --git a/web/src/components/fragment/libs/crud.js b/web/src/components/fragment/libs/crud.js
new file mode 100644
index 0000000..16b80e3
--- /dev/null
+++ b/web/src/components/fragment/libs/crud.js
@@ -0,0 +1,680 @@
+import httpclicent from '@/apis/request'
+import pluralize from 'pluralize';
+import { getModelValue } from './model';
+
+class CRUD {
+ constructor(opts) {
+ opts = Object.assign({
+ moduleName: '',
+ tableName: '',
+ apiPrefix: '/v1',
+ schemas: [],
+ }, opts);
+ this.opts = opts
+ this.primaryKey = ''
+ this.modelName = opts.moduleName
+ this.tableName = opts.tableName
+ this.models = []
+ this.sortable = []
+ this.queryParams = {}
+ this.fixedQueueParams = {}
+ this.pagination = {
+ index: 1,
+ size: 15,
+ totalCount: 0,
+ }
+ //初始化schema
+ if (Array.isArray(opts.schemas)) {
+ this.schemas = opts.schemas
+ } else if (!Array.isArray(opts.schemas) && typeof opts.Array === 'object') {
+ this.schemas = [];
+ for (let k in opts.schemas) {
+ this.schemas.push(opts.schemas[k])
+ }
+ } else {
+ this.schemas = []
+ }
+ }
+
+ /**
+ * 预处理一些变量
+ */
+ __prepare() {
+ for (let i in this.schemas) {
+ let schema = this.schemas[i]
+ this.schemas[i].error = ''
+ if (schema.attribute.primary_key) {
+ this.primaryKey = schema.column
+ }
+ if (schema.attribute.live.enable) {
+ this._lazyFetach(schema).then(res => {
+ schema.attribute.values = res
+ }).catch(e => {
+ console.log(e.message)
+ })
+ }
+ }
+ }
+
+ _lazyFetach(schema) {
+ return new Promise((resolve, reject) => {
+ if (schema.attribute.live.method === 'post') {
+ httpclicent.post(
+ schema.attribute.live.url,
+ schema.attribute.live.body,
+ {
+ headers: { 'Content-Type': schema.attribute.live.content_type }
+ }
+ ).then(res => {
+ resolve(res)
+ }).catch(e => {
+ reject(e)
+ })
+ } else {
+ httpclicent.get(schema.attribute.live.url).then(res => {
+ resolve(res)
+ }).catch(e => {
+ reject(e)
+ })
+ }
+ })
+
+ }
+
+ /**
+ * 刷新列表的一个模型数据
+ * @param {*} primaryKey
+ */
+ __refreshModel(primaryKey) {
+ return new Promise((resolve, reject) => {
+ let qs = {}
+ qs[this.primaryKey] = primaryKey
+ qs['__format'] = 'both'
+ qs['scenario'] = 'list'
+ this.getModel(qs).then(res => {
+ let isExists = false;
+ let primaryKey = this.findModelPrimaryKey(res);
+ if (primaryKey === false) {
+ reject('can not find model primary key')
+ return
+ }
+ for (let k in this.models) {
+ let pk = getModelValue(this.models[k], this.primaryKey);
+ if (pk == primaryKey) {
+ isExists = true
+ this.models[k] = res
+ break
+ }
+ }
+ if (!isExists) {
+ this.models.push(res)
+ }
+ resolve(res)
+ }).catch(e => { reject(e) })
+ })
+
+ }
+
+ /**
+ * 删除一个模型
+ * @param {*} primaryKey
+ */
+ __removeModel(primaryKey) {
+ for (let k in this.models) {
+ let pk = getModelValue(this.models[k], this.primaryKey);
+ if (primaryKey === pk) {
+ this.models.splice(k, 1)
+ }
+ }
+ }
+
+ /**
+ * 构建请求的接口地址
+ * @param {String} scenario
+ * @param {any} primaryKey
+ * @returns
+ */
+ __buildUri(scenario, primaryKey) {
+ return this.__buildModelUri(this.modelName, this.tableName, scenario, primaryKey);
+ }
+
+ __buildModelUri(moduleName, tableNanme, scenario, primaryKey) {
+ primaryKey = primaryKey || ''
+ let uri = this.opts.apiPrefix ? this.opts.apiPrefix : '';
+ let pluralizeName = pluralize.plural(tableNanme);
+ let singularName = pluralize.singular(tableNanme);
+ switch (scenario) {
+ case 'create':
+ uri += `/${moduleName}/${singularName}`
+ break
+ case 'update':
+ uri += `/${moduleName}/${singularName}/${primaryKey}`
+ break
+ case 'delete':
+ uri += `/${moduleName}/${singularName}/${primaryKey}`
+ break
+ case 'get':
+ uri += `/${moduleName}/${singularName}/${primaryKey}`
+ break
+ case 'search':
+ uri += `/${moduleName}/${pluralizeName}`
+ break
+ case 'export':
+ uri += `/${moduleName}/${singularName}-export`
+ break
+ case 'import':
+ uri += `/${moduleName}/${singularName}-import`
+ break
+ }
+ return uri
+ }
+
+ /**
+ * 初始化CRUD组件
+ * @returns
+ */
+ initialize() {
+ return new Promise((resolve, reject) => {
+ if (Array.isArray(this.schemas) && this.schemas.length > 0) {
+ this.__prepare()
+ resolve(this, this.schemas)
+ return
+ }
+ httpclicent.get(`/rest/schema/${this.modelName}/${this.tableName}`).then(res => {
+ this.schemas = res;
+ this.__prepare()
+ resolve(this, this.schemas);
+ }).catch(e => {
+ reject(e)
+ })
+ })
+ }
+
+ /**
+ * 获取所有的字段描述信息
+ * @returns
+ */
+ getSchemas() {
+ return this.schemas
+ }
+
+ /**
+ * 设置指定列的错误信息
+ * @param {string} column
+ * @param {string} error
+ */
+ setColumnError(column, error) {
+ for (let i in this.schemas) {
+ if (this.schemas[i].column === column) {
+ this.schemas[i].error = error
+ }
+ }
+ }
+
+ /**
+ * 重置所有列的错误信息
+ */
+ resetError() {
+ for (let i in this.schemas) {
+ this.schemas[i].error = ''
+ }
+ }
+
+ /**
+ * 获取所有模型集合
+ * @returns
+ */
+ getModels() {
+ return this.models;
+ }
+
+ /**
+ * 设置分页索引
+ * @param {Number} index 分页索引
+ * @returns CRUD
+ */
+ setPaginationIndex(index) {
+ this.pagination.index = index
+ return this
+ }
+
+ /**
+ * 获取当前分页的索引
+ * @returns
+ */
+ getPaginationIndex() {
+ return this.pagination.index
+ }
+
+ /**
+ * 设置分页大小
+ * @returns CRUD
+ * @param {Number} pageSize 分页大小
+ */
+ setPaginationSize(pageSize) {
+ this.pagination.size = pageSize
+ return this
+ }
+
+ /**
+ * 获取分页大小
+ * @returns
+ */
+ getPaginationSize() {
+ return this.pagination.size || 10
+ }
+
+
+ /**
+ * 获取分页信息中的总数据条数
+ * @returns
+ */
+ getPaginationCount() {
+ return this.pagination.totalCount
+ }
+
+ /**
+ * 重置分页配置
+ * @returns CRUD
+ */
+ resetPagination() {
+ this.pagination.index = 1
+ return this
+ }
+
+ /**
+ * 设置字段排序
+ * @param {String} column 字段列
+ * @param {String} order 排序规则
+ * @returns CRUD
+ */
+ setSortable(column, order) {
+ if (!column) {
+ this.sortable = {}
+ } else {
+ this.sortable = {
+ column: column,
+ order: order || 'ascending',
+ }
+ }
+ return this;
+ }
+
+ /**
+ * 添加固定的查询参数
+ * @param {*} k
+ * @param {*} v
+ */
+ addFixedQueueParams(k, v) {
+ this.fixedQueueParams[k] = v;
+ }
+
+ /**
+ * 设置查询参数
+ * @param {Object} qs 查询参数
+ * @returns
+ */
+ setQueryParams(qs) {
+ this.queryParams = qs
+ return this
+ }
+
+ /**
+ * 添加查询参数
+ * @param {String} k
+ * @param {String} v
+ */
+ addQueryParams(k, v) {
+ this.queryParams[k] = v;
+ }
+
+ /**
+ * 查找模型的主键的值
+ * @param {Object} model 表模型
+ * @returns Boolean | mixed
+ */
+ findModelPrimaryKey(model) {
+ if (typeof model === 'object') {
+ return getModelValue(model, this.primaryKey);
+ } else {
+ return model;
+ }
+ }
+
+ /**
+ * 创建一个模型
+ * @param {Object} model
+ */
+ createModel(model) {
+ return new Promise((resolve, reject) => {
+ httpclicent.post(this.__buildUri('create'), model).then(res => {
+ this.__refreshModel(res.id).then(res => {
+ resolve(res)
+ }).catch(e => { reject(e) })
+ }).catch(e => { reject(e) })
+ })
+ }
+
+
+ /**
+ * 创建一个资源
+ * @param {String} moduleName
+ * @param {String} tableName
+ * @param {Object} model
+ * @returns
+ */
+ createResource(moduleName, tableName, model) {
+ return new Promise((resolve, reject) => {
+ httpclicent.post(this.__buildModelUri(moduleName, tableName, 'create'), model).then(res => {
+ resolve(res)
+ }).catch(e => { reject(e) })
+ })
+ }
+
+ /**
+ * 更新一个模型
+ * @param {Object} model
+ */
+ updateModel(model) {
+ return new Promise((resolve, reject) => {
+ let primaryKey = this.findModelPrimaryKey(model);
+ if (primaryKey === false) {
+ reject('can not find model primary key')
+ return
+ }
+ httpclicent.put(this.__buildUri('update', primaryKey), model).then(res => {
+ this.__refreshModel(primaryKey).then(res => {
+ resolve(res)
+ }).catch(e => { reject(e) })
+ }).catch(e => { reject(e) })
+ })
+ }
+
+ /**
+ * 更新一个资源
+ * @param {String} moduleName
+ * @param {String} tableName
+ * @param {Object} model
+ */
+ updateResource(moduleName, tableName, model) {
+ return new Promise((resolve, reject) => {
+ let primaryKey = this.findModelPrimaryKey(model);
+ if (primaryKey === false) {
+ reject('can not find model primary key')
+ return
+ }
+ httpclicent.put(this.__buildModelUri(moduleName, tableName, 'update', primaryKey), model).then(res => {
+ resolve(res)
+ }).catch(e => { reject(e) })
+ })
+ }
+
+ /**
+ * 删除一个模型
+ * @param {Object} model
+ */
+ deleteModel(model) {
+ let primaryKey = '';
+ if (typeof model === 'object') {
+ primaryKey = this.findModelPrimaryKey(model)
+ } else {
+ primaryKey = model
+ }
+ return new Promise((resolve, reject) => {
+ httpclicent.delete(this.__buildUri('delete', primaryKey), model).then(res => {
+ this.__removeModel(primaryKey)
+ resolve(res)
+ }).catch(e => { reject(e) })
+ })
+ }
+
+ /**
+ * 删除一个资源
+ * @param {String} moduleName
+ * @param {String} tableName
+ * @param {Object} model
+ * @returns
+ */
+ deleteResource(moduleName, tableName, model) {
+ let primaryKey = '';
+ if (typeof model === 'object') {
+ primaryKey = this.findModelPrimaryKey(model)
+ } else {
+ primaryKey = model
+ }
+ return new Promise((resolve, reject) => {
+ httpclicent.delete(this.__buildModelUri(moduleName, tableName, 'delete', primaryKey), model).then(res => {
+ resolve(res)
+ }).catch(e => { reject(e) })
+ })
+ }
+
+
+ /**
+ * 获取一个资源
+ * @param {String} moduleName
+ * @param {String} tableName
+ * @param {Object} model
+ * @returns
+ */
+ getResource(moduleName, tableName, qs) {
+ return new Promise((resolve, reject) => {
+ let primaryKey = '';
+ let params = {}
+ if (typeof qs === 'object') {
+ for (let k in qs) {
+ if (k === this.primaryKey) {
+ primaryKey = qs[k]
+ } else {
+ params[k] = qs[k]
+ }
+ }
+ } else {
+ primaryKey = qs
+ }
+ if (!primaryKey) {
+ reject('can not find model primary key')
+ return
+ }
+ httpclicent.get(this.__buildModelUri(moduleName, tableName, 'get', primaryKey), { params: params }).then(res => {
+ resolve(res)
+ }).catch(e => { reject(e) })
+ })
+ }
+
+ /**
+ *
+ * @param {*} pk
+ * @param {*} qs
+ * @returns
+ */
+ fetchModel(pk, qs) {
+ if (typeof qs !== 'object') {
+ qs = {}
+ }
+ qs[this.primaryKey] = pk
+ return this.getModel(qs)
+ }
+
+ /**
+ * 获取一个模型数据
+ * @param {*} qs
+ */
+ getModel(qs) {
+ return new Promise((resolve, reject) => {
+ let primaryKey = '';
+ let params = {}
+ if (typeof qs === 'object') {
+ for (let k in qs) {
+ if (k === this.primaryKey) {
+ primaryKey = qs[k]
+ } else {
+ params[k] = qs[k]
+ }
+ }
+ } else {
+ primaryKey = qs
+ }
+ if (!primaryKey) {
+ reject('can not find model primary key')
+ return
+ }
+ httpclicent.get(this.__buildUri('get', primaryKey), { params: params }).then(res => {
+ resolve(res)
+ }).catch(e => { reject(e) })
+ })
+ }
+
+
+ /**
+ * 查询模型数据
+ */
+ searchModel() {
+ let queryParams = Object.assign({}, this.queryParams);
+ queryParams['page'] = this.pagination.index
+ queryParams['pagesize'] = this.pagination.size || 15
+ if (this.sortable && this.sortable.column != '') {
+ queryParams['sort'] = this.sortable.order == 'descending' ? '-' + this.sortable.column : this.sortable.column
+ }
+ queryParams['__format'] = 'both';
+ if (typeof this.fixedQueueParams === 'object') {
+ for (let k in this.fixedQueueParams) {
+ queryParams[k] = this.fixedQueueParams[k];
+ }
+ }
+ return new Promise((resolve, reject) => {
+ httpclicent.get(this.__buildUri('search'), { params: queryParams }).then(res => {
+ this.pagination.index = parseInt(res.page);
+ this.pagination.size = parseInt(res.pagesize);
+ this.pagination.totalCount = parseInt(res.totalCount);
+ this.models = res.data
+ resolve()
+ }).catch(e => { reject(e) })
+ })
+ }
+
+ /**
+ * 批量删除模型
+ * @param {Array} data
+ */
+ deleteModels(data) {
+ let pks = [];
+ for (let val of data) {
+ if (typeof val === 'object') {
+ let pk = this.findModelPrimaryKey(val)
+ if (pk) {
+ pks.push(pk)
+ }
+ } else {
+ pks.push(val)
+ }
+ }
+ if (pks.length <= 0) {
+ return
+ }
+ let ps = [];
+ for (let pk of pks) {
+ ps.push(this.deleteModel(pk))
+ }
+ return new Promise((resolve, reject) => {
+ Promise.all(ps).then(res => {
+ let data = {
+ total: 0,
+ success: 0,
+ responses: res,
+ };
+ data.total = pks.length
+ data.success = res.length
+ resolve(data)
+ }).catch(e => {
+ reject(e)
+ })
+ })
+ }
+
+ /**
+ * 下载指定资源的导入模板
+ * @param {String} moduleName
+ * @param {String} tableName
+ * @returns
+ */
+ downloadResourceTemplate(moduleName, tableName) {
+ return new Promise((resolve, reject) => {
+ httpclicent.get(this.__buildModelUri(moduleName, tableName, 'import')).then(res => {
+ let element = document.createElement('a')
+ let disposition = res.headers['content-disposition']
+ let filename = this.tableName + '.csv';
+ //获取文件名称
+ if (disposition) {
+ let pos = -1;
+ let ps = disposition.split(';')
+ for (let s of ps) {
+ pos = s.indexOf('filename=')
+ if (pos === 0) {
+ filename = s.substring(9)
+ break
+ }
+ }
+ }
+ element.style.display = 'none'
+ element.href = window.URL.createObjectURL(new Blob([res.data], { type: res.headers['content-type'] }))
+ element.target = '_blank'
+ element.setAttribute('download', filename)
+ document.body.appendChild(element)
+ element.click()
+ window.URL.revokeObjectURL(element.href)
+ document.body.removeChild(element)
+ }).catch(e => { reject(e) })
+ })
+ }
+
+ /**
+ * 下载导入模板
+ * @returns
+ */
+ downloadTemplate() {
+ return this.downloadResourceTemplate(this.modelName, this.tableName);
+ }
+
+ /**
+ * 导出模型数据
+ * @returns
+ */
+ exportModels() {
+ let queryParams = Object.assign({}, this.queryParams);
+ if (this.sortable && this.sortable.column != '') {
+ queryParams['sort'] = this.sortable.order == 'descending' ? '-' + this.sortable.column : this.sortable.column
+ }
+ return new Promise((resolve, reject) => {
+ httpclicent.get(this.__buildUri('export'), { params: queryParams }).then(res => {
+ let element = document.createElement('a')
+ let disposition = res.headers['content-disposition']
+ let filename = this.tableName + '.csv';
+ //获取文件名称
+ if (disposition) {
+ let pos = -1;
+ let ps = disposition.split(';')
+ for (let s of ps) {
+ pos = s.indexOf('filename=')
+ if (pos === 0) {
+ filename = s.substring(9)
+ break
+ }
+ }
+ }
+ element.style.display = 'none'
+ element.href = window.URL.createObjectURL(new Blob([res.data], { type: res.headers['content-type'] }))
+ element.target = '_blank'
+ element.setAttribute('download', filename)
+ document.body.appendChild(element)
+ element.click()
+ window.URL.revokeObjectURL(element.href)
+ document.body.removeChild(element)
+ }).catch(e => { reject(e) })
+ })
+ }
+
+
+}
+
+export default CRUD
\ No newline at end of file
diff --git a/web/src/components/fragment/libs/error.js b/web/src/components/fragment/libs/error.js
new file mode 100644
index 0000000..a2f913d
--- /dev/null
+++ b/web/src/components/fragment/libs/error.js
@@ -0,0 +1,9 @@
+class ValidateError extends Error {
+ constructor(column) {
+ super(column.message)
+ this.schema = column
+ this.name = 'ValidateError'
+ }
+}
+
+export default ValidateError
\ No newline at end of file
diff --git a/web/src/components/fragment/libs/form.js b/web/src/components/fragment/libs/form.js
new file mode 100644
index 0000000..7a0bc39
--- /dev/null
+++ b/web/src/components/fragment/libs/form.js
@@ -0,0 +1,161 @@
+
+/**
+ * 清理搜索模型的空字段
+ * @param {Object} model
+ * @param {Array} schemas
+ */
+export function clearSearchModel(model, schemas) {
+ let ps = {}
+ for (let schema of schemas) {
+ if (schema.type === 'string') {
+ if (model[schema.column] === '') {
+ continue
+ }
+ }
+ if (['integer', 'double'].indexOf(schema.type) > -1 && ['boolean', 'bool'].indexOf(schema.format) === -1) {
+ if (model[schema.column] === 0) {
+ continue
+ }
+ }
+ ps[schema.column] = model[schema.column]
+ }
+ return ps;
+}
+
+
+/**
+ * 判断指定的字段是否显示
+ * @param {Object} schema
+ * @param {Object} model
+ */
+export function checkSchemaVisible(schema, model) {
+ if (!Array.isArray(schema.attribute.visible)) {
+ return true
+ }
+ if (schema.attribute.visible.length <= 0) {
+ return true
+ }
+ for (let cond of schema.attribute.visible) {
+ let column = cond['column']
+ let values = cond['values']
+ if (!column || column === '') {
+ continue
+ }
+ values.map((v) => {
+ return v + ''
+ })
+ let compareValue = model[column]
+ if (typeof compareValue === 'undefined') {
+ return false
+ }
+ if (values.indexOf(compareValue + '') === -1) {
+ return false
+ }
+ }
+ return true
+}
+
+
+/**
+ * 生成规则
+ * @param {Object} schema
+ * @param {String} scenario
+ * @returns
+ */
+export function generateSchemaRule(schema, scenario) {
+ let rules = []
+ if (schema.rule.required.indexOf(scenario) > -1) {
+ rules.push({
+ required: true,
+ message: `${schema.label}字段的值不能为空`,
+ trigger: 'blur',
+ })
+ }
+ //长度过滤把在线搜索的情况过滤掉
+ if (['string', 'text'].indexOf(schema.type) > -1 && schema.format !== 'cascader') {
+ rules.push({
+ type: 'string',
+ message: `${schema.label}字段的值不是有效的字符串`,
+ trigger: 'blur',
+ })
+ if (schema.rule.max > 0 && schema.rule.min > 0) {
+ rules.push({
+ max: schema.rule.max,
+ min: schema.rule.min,
+ message: `${schema.label}字段长度必须在${schema.rule.min} - ${schema.rule.max}个字符之间`,
+ trigger: 'blur',
+ })
+ } else if (schema.rule.max > 0) {
+ rules.push({
+ max: schema.rule.max,
+ message: `${schema.label}字段长度不能大于${schema.rule.max}个字符`,
+ trigger: 'blur',
+ })
+ }
+
+ }
+ if (['integer', 'decimal', 'number'].indexOf(schema.type) > -1) {
+ if (['date', 'datetime', 'timestamp'].indexOf(schema.format) == -1) {
+ rules.push({
+ type: 'number',
+ message: `${schema.label}字段的值不是有效的数字`,
+ trigger: 'blur',
+ })
+ if (schema.rule.min !== 0 && schema.rule.max !== 0) {
+ rules.push({
+ max: schema.rule.max,
+ min: schema.rule.min,
+ message: `${schema.label}的值必须在${schema.rule.min} - ${schema.rule.max}之间`,
+ trigger: 'blur',
+ })
+ } else if (schema.rule.max !== 0) {
+ // rules.push({
+ // max: schema.rule.max,
+ // message: `${schema.label}最大值不能大于${schema.rule.max}`,
+ // trigger: 'blur',
+ // })
+ }
+ }
+ }
+ if (['date', 'datetime', 'timestamp'].indexOf(schema.format) > -1) {
+ rules.push({
+ type: 'date',
+ message: `${schema.label}字段的值是无效的`,
+ trigger: 'blur',
+ })
+ }
+ if (schema.rule.regular !== '') {
+ rules.push({
+ type: 'regexp',
+ pattern: schema.rule.regular,
+ message: `${schema.label}字段的值不符合规范`,
+ trigger: 'blur',
+ })
+ }
+ return rules
+}
+
+export function generateSchemaDescription(schema, scenario) {
+ if (typeof schema.attribute.description === 'string' && schema.attribute.description !== '') {
+ return schema.attribute.description
+ }
+ let messages = []
+ if (schema.rule.required.indexOf(scenario) > -1) {
+ messages.push("不能为空")
+ }
+ if (['string', 'text'].indexOf(schema.type) > -1) {
+ if (schema.rule.max > 0 && schema.rule.min > 0) {
+ messages.push(`长度必须在${schema.rule.min} - ${schema.rule.max}个字符之间`)
+ } else if (schema.rule.max > 0) {
+ messages.push(`长度必须小于${schema.rule.max}个字符`)
+ }
+ }
+ if (['integer', 'decimal', 'number'].indexOf(schema.type) > -1) {
+ if (schema.rule.max > 0 && schema.rule.min > 0) {
+ messages.push(`值必须在${schema.rule.min} - ${schema.rule.max}之间`)
+ } else if (schema.rule.max > 0) {
+ messages.push(`值必须小于${schema.rule.max}`)
+ }
+ }
+ return messages.join(', ')
+}
\ No newline at end of file
diff --git a/web/src/components/fragment/libs/model.js b/web/src/components/fragment/libs/model.js
new file mode 100644
index 0000000..0ad4922
--- /dev/null
+++ b/web/src/components/fragment/libs/model.js
@@ -0,0 +1,60 @@
+export function getModelValue(model, column) {
+ if (typeof model !== 'object') {
+ return null;
+ }
+ if (!model.hasOwnProperty(column)) {
+ return null;
+ }
+ let value = model[column];
+ if (typeof value === 'object' && value.hasOwnProperty('value')) {
+ return value['value']
+ }
+ return value;
+}
+
+
+export function getModelLabel(model, column) {
+ if (typeof model !== 'object') {
+ return null;
+ }
+ if (!model.hasOwnProperty(column)) {
+ return null;
+ }
+ let value = model[column];
+ if (typeof value === 'object' && value.hasOwnProperty('label')) {
+ return value['label']
+ }
+ return value;
+}
+
+export function modelValueOf(model) {
+ if (typeof model !== 'object') {
+ return {};
+ }
+ let result = {}
+ for (let i in model) {
+ let row = model[i];
+ if (typeof row === 'object' && row.hasOwnProperty('value')) {
+ result[i] = row['value']
+ } else {
+ result[i] = row
+ }
+ }
+ return result;
+}
+
+export function modelLabelOf(model) {
+ if (typeof model !== 'object') {
+ return {};
+ }
+ let result = {}
+ for (let i in model) {
+ let row = model[i];
+ if (typeof row === 'object' && row.hasOwnProperty('label')) {
+ result[i] = row['label']
+ } else {
+ result[i] = row
+ }
+ }
+ return result;
+}
\ No newline at end of file
diff --git a/web/src/components/fragment/parts/Action.vue b/web/src/components/fragment/parts/Action.vue
new file mode 100644
index 0000000..cb63d4d
--- /dev/null
+++ b/web/src/components/fragment/parts/Action.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ action.label }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/parts/Cell.vue b/web/src/components/fragment/parts/Cell.vue
new file mode 100644
index 0000000..0197cbc
--- /dev/null
+++ b/web/src/components/fragment/parts/Cell.vue
@@ -0,0 +1,195 @@
+
+
+
+ {{ value }}
+
+
+
+ {{ formatBoolean(isTrue) }}
+
+
+ {{ value }}
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/parts/FormItem.vue b/web/src/components/fragment/parts/FormItem.vue
new file mode 100644
index 0000000..e97f50e
--- /dev/null
+++ b/web/src/components/fragment/parts/FormItem.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ schema.attribute.suffix }}
+
+
+
+
+
+
+ {{ schema.attribute.suffix }}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/parts/LevelSelect.vue b/web/src/components/fragment/parts/LevelSelect.vue
new file mode 100644
index 0000000..77642e5
--- /dev/null
+++ b/web/src/components/fragment/parts/LevelSelect.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/parts/RouteLink.vue b/web/src/components/fragment/parts/RouteLink.vue
new file mode 100644
index 0000000..62ada7e
--- /dev/null
+++ b/web/src/components/fragment/parts/RouteLink.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/fragment/parts/Upload.vue b/web/src/components/fragment/parts/Upload.vue
new file mode 100644
index 0000000..abf0f49
--- /dev/null
+++ b/web/src/components/fragment/parts/Upload.vue
@@ -0,0 +1,64 @@
+
+
+ {{ label }}
+
+ 已上传
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/Action.vue b/web/src/components/widgets/Action.vue
new file mode 100644
index 0000000..2281fe5
--- /dev/null
+++ b/web/src/components/widgets/Action.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/Audio.vue b/web/src/components/widgets/Audio.vue
new file mode 100644
index 0000000..0ad5410
--- /dev/null
+++ b/web/src/components/widgets/Audio.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/Avatar.vue b/web/src/components/widgets/Avatar.vue
new file mode 100644
index 0000000..0cbd691
--- /dev/null
+++ b/web/src/components/widgets/Avatar.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/Call.vue b/web/src/components/widgets/Call.vue
new file mode 100644
index 0000000..e6eeba9
--- /dev/null
+++ b/web/src/components/widgets/Call.vue
@@ -0,0 +1,44 @@
+
+
+ {{ value }}
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/Icon.vue b/web/src/components/widgets/Icon.vue
new file mode 100644
index 0000000..f5f7b43
--- /dev/null
+++ b/web/src/components/widgets/Icon.vue
@@ -0,0 +1,28 @@
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/Import.vue b/web/src/components/widgets/Import.vue
new file mode 100644
index 0000000..327c23c
--- /dev/null
+++ b/web/src/components/widgets/Import.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+ 拖动文件到此或 点击上传
+
+
+
+ 如需要模板请点击 下载
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/Loadmore.vue b/web/src/components/widgets/Loadmore.vue
new file mode 100644
index 0000000..d9af8a1
--- /dev/null
+++ b/web/src/components/widgets/Loadmore.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+ 加载更多
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/MenuItem.vue b/web/src/components/widgets/MenuItem.vue
new file mode 100644
index 0000000..9bc76a5
--- /dev/null
+++ b/web/src/components/widgets/MenuItem.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+ {{ menu.label }}
+
+
+
+
+
+
+
+
+
+ {{ menu.label }}
+
+
+
+
+
diff --git a/web/src/components/widgets/Percentage.vue b/web/src/components/widgets/Percentage.vue
new file mode 100644
index 0000000..b5f2b68
--- /dev/null
+++ b/web/src/components/widgets/Percentage.vue
@@ -0,0 +1,50 @@
+
+ {{ text }}
+
+
+ {{ displayValue }}%
+
+
+
+ {{ displayValue }}%
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/Preview.vue b/web/src/components/widgets/Preview.vue
new file mode 100644
index 0000000..947d526
--- /dev/null
+++ b/web/src/components/widgets/Preview.vue
@@ -0,0 +1,57 @@
+
+
+
+
+ {{ label }}
+
+
+
+
+ {{ value }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/Tag.vue b/web/src/components/widgets/Tag.vue
new file mode 100644
index 0000000..c83ae0e
--- /dev/null
+++ b/web/src/components/widgets/Tag.vue
@@ -0,0 +1,37 @@
+
+
+
+ {{ text }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/UserPanel.vue b/web/src/components/widgets/UserPanel.vue
new file mode 100644
index 0000000..ce5289c
--- /dev/null
+++ b/web/src/components/widgets/UserPanel.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/components/widgets/UserPick.vue b/web/src/components/widgets/UserPick.vue
new file mode 100644
index 0000000..b9755ff
--- /dev/null
+++ b/web/src/components/widgets/UserPick.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+ 全选
+
+
+
+
+
+
+ {{ item.username }} ({{ item.uid }})
+
+
+
+
+
+
+
+
+
+
+
+ 已选择: {{ props.modelValue.length }}
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/config/menu.js b/web/src/config/menu.js
new file mode 100644
index 0000000..0a0b631
--- /dev/null
+++ b/web/src/config/menu.js
@@ -0,0 +1,708 @@
+const menu = [
+ {
+ label: "控制面板",
+ icon: "dashboard",
+ hidden: false,
+ route: "/dashboard",
+ children: [
+ {
+ label: "字段配置",
+ hidden: true,
+ access: 'allow',
+ route: "/setting/schemas"
+ },
+ {
+ label: "消息通知",
+ hidden: true,
+ access: 'allow',
+ route: "/organize/user/notice"
+ }
+ ]
+ },
+ {
+ label: "组织架构",
+ icon: "org",
+ hidden: false,
+ route: '/organizers',
+ children: [
+ {
+ label: "个人设置",
+ hidden: true,
+ access: 'allow',
+ route: "/organize/user/profile"
+ },
+ {
+ label: "角色管理",
+ route: "/organize/roles",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "部门管理",
+ route: "/organize/departments",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "座席管理",
+ route: "/organize/users",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ ]
+ },
+ {
+ label: "客户管理",
+ icon: "group",
+ hidden: false,
+ route: "/customer",
+ children: [
+ {
+ label: "联系人",
+ navigation: true,
+ route: "/customer/contacts",
+ children: [
+ {
+ label: "新建联系人",
+ hidden: true,
+ route: "/customer/contact/create",
+ view: '../views/customer/contact/Form.vue'
+ },
+ {
+ label: "编辑联系人",
+ hidden: true,
+ route: "/customer/contact/update",
+ view: '../views/customer/contact/Form.vue'
+ },
+ {
+ label: "联系人详情",
+ hidden: true,
+ route: "/customer/contact/view",
+ view: '../views/customer/contact/View.vue'
+ },
+ ],
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ },
+ {
+ label: '详情',
+ value: 'view'
+ }
+ ]
+ }
+ ]
+ },
+ {
+ label: "呼叫任务",
+ icon: "outbound",
+ hidden: false,
+ route: "/outbounds",
+ children: [
+ {
+ label: "全部任务",
+ hidden: false,
+ navigation: true,
+ route: "/outbound/campaigns",
+ children: [
+ {
+ label: "新建任务",
+ hidden: true,
+ route: "/outbound/campaign/create",
+ view: '../views/outbound/campaign/Form.vue'
+ },
+ {
+ label: "编辑任务",
+ hidden: true,
+ route: "/outbound/campaign/update",
+ view: '../views/outbound/campaign/Form.vue'
+ },
+ {
+ label: "任务详情",
+ hidden: true,
+ route: "/outbound/campaign/view",
+ view: '../views/outbound/campaign/View.vue'
+ },
+ ],
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ },
+ {
+ label: '详情',
+ value: 'view'
+ },
+ {
+ label: '启动',
+ value: 'start'
+ },
+ {
+ label: '暂停',
+ value: 'pause'
+ },
+ {
+ label: '停止',
+ value: 'stop'
+ },
+ {
+ label: '导入',
+ value: 'import'
+ }
+ ]
+ }
+ ]
+ },
+ {
+ label: "记录报表",
+ icon: "data",
+ route: "/record",
+ children: [
+ {
+ label: "话单记录",
+ route: "/record/cdrs",
+ children: [
+ {
+ label: "通话记录",
+ route: "/record/cdr/logs"
+ },
+ {
+ label: "来电未接",
+ route: "/record/cdr/noanswers"
+ },
+ {
+ label: "座席未接",
+ route: "/record/cdr/usernoanswers"
+ },
+ ]
+ },
+ {
+ label: "话单报表",
+ route: "/record/reports",
+ children: [
+ {
+ label: "座席报表",
+ route: "/record/report/users"
+ },
+ {
+ label: "呼入报表",
+ route: "/record/report/inbounds"
+ },
+ ]
+ },
+ {
+ label: "日志记录",
+ route: "/record/log",
+ children: [
+ {
+ label: "登录记录",
+ route: "/record/log/logins"
+ },
+ {
+ label: "考勤记录",
+ route: "/record/log/attendances"
+ },
+ {
+ label: "操作记录",
+ route: "/record/log/activities"
+ },
+ {
+ label: "导入导出",
+ route: "/record/log/genfiles"
+ },
+ ]
+ },
+ ]
+ },
+ {
+ label: "状态监控",
+ icon: "jiankong",
+ route: "/monitor",
+ children: [
+ {
+ label: "座席监控",
+ route: "/monitor/users",
+ },
+ {
+ label: "话务监控",
+ route: "/monitor/calls",
+ },
+ {
+ label: "系统监控",
+ hidden: true,
+ route: "/monitor/systems",
+ },
+ ]
+ },
+ {
+ label: "系统配置",
+ icon: "set",
+ hidden: false,
+ route: "/settings",
+ children: [
+ {
+ label: "匹配规则",
+ route: "/setting/rules",
+ children: [
+ {
+ label: "号码匹配",
+ navigation: true,
+ route: "/setting/rule/numbersets",
+ children: [
+ {
+ label: "号码列表",
+ hidden: true,
+ route: "/setting/rule/numberset/list"
+ }
+ ],
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "正则匹配",
+ route: "/setting/rule/regexps",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "时间匹配",
+ route: "/setting/rule/timeslots",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "地区匹配",
+ route: "/setting/rule/zones",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ }
+ ]
+ },
+ {
+ label: "应用配置",
+ route: "/setting/destinations",
+ children: [
+ {
+ label: "语言导航",
+ navigation: true,
+ route: "/setting/destination/ivrs",
+ children: [
+ {
+ label: "新建技能组",
+ hidden: true,
+ route: "/setting/destination/ivr/create",
+ view: '../views/setting/destination/ivr/Form.vue'
+ },
+ {
+ label: "编辑技能组",
+ hidden: true,
+ route: "/setting/destination/ivr/update",
+ view: '../views/setting/destination/ivr/Form.vue'
+ },
+ ],
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "呼叫队列",
+ navigation: true,
+ route: "/setting/destination/queues",
+ children: [
+ {
+ label: "新建队列",
+ hidden: true,
+ route: "/setting/destination/queue/create",
+ view: '../views/setting/destination/queue/Form.vue'
+ },
+ {
+ label: "编辑队列",
+ hidden: true,
+ route: "/setting/destination/queue/update",
+ view: '../views/setting/destination/queue/Form.vue'
+ },
+ ],
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "语言文件",
+ route: "/setting/destination/sounds",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "脚本程序",
+ route: "/setting/destination/scripts",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "快捷功能",
+ route: "/setting/destination/shortcuts",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "网关管理",
+ navigation: true,
+ route: "/setting/destination/gateways",
+ children: [
+ {
+ label: "新建网关",
+ hidden: true,
+ route: "/setting/destination/gateway/create",
+ view: '../views/setting/destination/gateway/Form.vue'
+ },
+ {
+ label: "编辑网关",
+ hidden: true,
+ route: "/setting/destination/gateway/update",
+ view: '../views/setting/destination/gateway/Form.vue'
+ },
+ ],
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "设备列表",
+ route: "/setting/destination/devices",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ ]
+ },
+ {
+ label: "路由配置",
+ route: "/setting/routes",
+ children: [
+ {
+ label: "呼入路由",
+ route: "/setting/route/inbounds",
+ navigation: true,
+ children: [
+ {
+ label: "新增路由",
+ hidden: true,
+ route: "/setting/route/inbound/create",
+ view: '../views/setting/route/inbound/Form.vue'
+ },
+ {
+ label: "更新路由",
+ hidden: true,
+ route: "/setting/route/inbound/update",
+ view: '../views/setting/route/inbound/Form.vue'
+ },
+ ],
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "呼出路由",
+ route: "/setting/route/outbounds",
+ navigation: true,
+ children: [
+ {
+ label: "新增路由",
+ hidden: true,
+ route: "/setting/route/outbound/create",
+ view: '../views/setting/route/outbound/Form.vue'
+ },
+ {
+ label: "更新路由",
+ hidden: true,
+ route: "/setting/route/outbound/update",
+ view: '../views/setting/route/outbound/Form.vue'
+ },
+ ],
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ ]
+ },
+ {
+ label: "高级设置",
+ route: "/setting/advanced",
+ children: [
+ {
+ label: "访问控制",
+ navigation: true,
+ route: "/setting/advanced/acls",
+ children: [
+ {
+ label: "规则列表",
+ hidden: true,
+ route: "/setting/advanced/acl/list"
+ }
+ ],
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "变量设置",
+ route: "/setting/advanced/variables",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "状态设置",
+ route: "/setting/advanced/statuses",
+ permissions: [
+ {
+ label: '新建',
+ value: 'create'
+ },
+ {
+ label: '更新',
+ value: 'update'
+ },
+ {
+ label: '删除',
+ value: 'delete'
+ }
+ ]
+ },
+ {
+ label: "字段配置",
+ hidden: true,
+ route: "/setting/schemas",
+ },
+ ]
+ },
+ ]
+ },
+];
+
+export default menu;
\ No newline at end of file
diff --git a/web/src/directive/permission.js b/web/src/directive/permission.js
new file mode 100644
index 0000000..81ce8c3
--- /dev/null
+++ b/web/src/directive/permission.js
@@ -0,0 +1,26 @@
+import useUserStore from '@/stores/user'
+const installPermission = (app) => {
+ app.directive("permission", {
+ mounted: function (el, binding) {
+ const { hasPermission } = useUserStore();
+ let permission = binding.value;
+ if (typeof permission !== 'string') {
+ return;
+ }
+ if (permission.indexOf('.') === -1) {
+ if (app.config.globalProperties && app.config.globalProperties.$route) {
+ permission = app.config.globalProperties.$route.name + '.' + permission;
+ }
+ }
+ if (!hasPermission(permission)) {
+ if (el.parentNode) {
+ el.parentNode.removeChild(el)
+ }
+ }
+ },
+ });
+};
+
+export default {
+ install: installPermission
+}
\ No newline at end of file
diff --git a/web/src/i18n/index.js b/web/src/i18n/index.js
new file mode 100644
index 0000000..ccd8c8e
--- /dev/null
+++ b/web/src/i18n/index.js
@@ -0,0 +1,4 @@
+const messages = {}
+
+
+export default messages
\ No newline at end of file
diff --git a/web/src/i18n/locale/en.js b/web/src/i18n/locale/en.js
new file mode 100644
index 0000000..c0060f0
--- /dev/null
+++ b/web/src/i18n/locale/en.js
@@ -0,0 +1,3 @@
+export default {
+
+}
\ No newline at end of file
diff --git a/web/src/i18n/locale/zh-cn.js b/web/src/i18n/locale/zh-cn.js
new file mode 100644
index 0000000..c0060f0
--- /dev/null
+++ b/web/src/i18n/locale/zh-cn.js
@@ -0,0 +1,3 @@
+export default {
+
+}
\ No newline at end of file
diff --git a/web/src/layouts/default/Headerbar.vue b/web/src/layouts/default/Headerbar.vue
new file mode 100644
index 0000000..3ca6d03
--- /dev/null
+++ b/web/src/layouts/default/Headerbar.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+ {{ userStateText }}
+
+
+
+
+
+
+
+
+
{{ item.label }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/layouts/default/Layout.vue b/web/src/layouts/default/Layout.vue
new file mode 100644
index 0000000..a527317
--- /dev/null
+++ b/web/src/layouts/default/Layout.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/layouts/default/Sidebar.vue b/web/src/layouts/default/Sidebar.vue
new file mode 100644
index 0000000..0315670
--- /dev/null
+++ b/web/src/layouts/default/Sidebar.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/layouts/default/Statusbar.vue b/web/src/layouts/default/Statusbar.vue
new file mode 100644
index 0000000..7436520
--- /dev/null
+++ b/web/src/layouts/default/Statusbar.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/layouts/default/Viewer.vue b/web/src/layouts/default/Viewer.vue
new file mode 100644
index 0000000..733e193
--- /dev/null
+++ b/web/src/layouts/default/Viewer.vue
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/web/src/layouts/default/parts/Callbar.vue b/web/src/layouts/default/parts/Callbar.vue
new file mode 100644
index 0000000..0405628
--- /dev/null
+++ b/web/src/layouts/default/parts/Callbar.vue
@@ -0,0 +1,345 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/layouts/default/parts/Notice.vue b/web/src/layouts/default/parts/Notice.vue
new file mode 100644
index 0000000..d994dde
--- /dev/null
+++ b/web/src/layouts/default/parts/Notice.vue
@@ -0,0 +1,30 @@
+
+
+
+ {{ data.content }}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/layouts/default/parts/Popup.vue b/web/src/layouts/default/parts/Popup.vue
new file mode 100644
index 0000000..c4ca374
--- /dev/null
+++ b/web/src/layouts/default/parts/Popup.vue
@@ -0,0 +1,229 @@
+
+
+
+
\ No newline at end of file
diff --git a/web/src/main.js b/web/src/main.js
new file mode 100644
index 0000000..df8e463
--- /dev/null
+++ b/web/src/main.js
@@ -0,0 +1,23 @@
+import ElementPlus from 'element-plus'
+import piniaPersistState from 'pinia-plugin-persistedstate'
+import 'normalize.css'
+import '@/assets/scss/element.scss'
+import '@/assets/scss/common.scss'
+import '@/assets/scss/style.scss'
+import permission from '@/directive/permission'
+
+
+import { createApp } from 'vue'
+import { createPinia } from 'pinia'
+
+import App from './App.vue'
+import router from './router'
+
+const app = createApp(App)
+
+app.use(createPinia().use(piniaPersistState))
+app.use(router)
+app.use(ElementPlus)
+app.use(permission)
+
+app.mount('#app')
diff --git a/web/src/router/index.js b/web/src/router/index.js
new file mode 100644
index 0000000..1e71422
--- /dev/null
+++ b/web/src/router/index.js
@@ -0,0 +1,36 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+import LayoutView from '@/layouts/default/Layout.vue'
+import { getMenus, buildRoutes } from '@/assets/js/menu'
+
+const components = import.meta.glob("../views/**/**.vue")
+
+const childRoutes = buildRoutes(getMenus(), components);
+
+const router = createRouter({
+ history: createWebHashHistory(import.meta.env.BASE_URL),
+ routes: [
+ {
+ path: '/',
+ redirect: '/dashboard'
+ },
+ {
+ path: '/',
+ name: 'App',
+ component: LayoutView,
+ children: childRoutes
+ },
+ {
+ path: '/login',
+ name: 'Login',
+ meta: { allowGuest: true },
+ component: () => import('../views/account/Login.vue')
+ },
+ {
+ path: '/redirect/:path*',
+ component: () => import('../views/redirect/Redirect.vue'),
+ }
+ ]
+})
+
+
+export default router
diff --git a/web/src/stores/counter.js b/web/src/stores/counter.js
new file mode 100644
index 0000000..b6757ba
--- /dev/null
+++ b/web/src/stores/counter.js
@@ -0,0 +1,12 @@
+import { ref, computed } from 'vue'
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore('counter', () => {
+ const count = ref(0)
+ const doubleCount = computed(() => count.value * 2)
+ function increment() {
+ count.value++
+ }
+
+ return { count, doubleCount, increment }
+})
diff --git a/web/src/stores/system.js b/web/src/stores/system.js
new file mode 100644
index 0000000..a5f4de7
--- /dev/null
+++ b/web/src/stores/system.js
@@ -0,0 +1,67 @@
+import { defineStore } from 'pinia'
+
+const useSystemStore = defineStore('system', {
+ state: () => {
+ return {
+ loading: false,
+ collapse: false,
+ sidebarWidth: 200,
+ flowSidebarVisible: false,
+ lang: 'zh-CN',
+ logoUrl: '//s3.tebi.io/tenos/images/logo/jc.png',
+ copyright: '2005-2023 JUSTCALL 版权 © 2023 集时股份呼叫中心开发团队',
+ productName: '呼叫中心平台',
+ variables: {},
+ }
+ },
+ getters: {
+ },
+ actions: {
+ activeLoading() {
+ this.loading = true
+ },
+ inactiveLoading() {
+ this.loading = false
+ },
+ setLanguage(lang) {
+ this.lang = lang
+ },
+ toggleFlowSidebarVisible() {
+ this.flowSidebarVisible = !this.flowSidebarVisible;
+ if (this.flowSidebarVisible) {
+ this.collapse = false;
+ } else {
+ this.sidebarWidth = 200;
+ }
+ },
+ closeFlowSidebar() {
+ if (this.flowSidebarVisible) {
+ this.toggleFlowSidebarVisible();
+ }
+ },
+ toggleCollapse() {
+ this.collapse = !this.collapse;
+ },
+ setAttributeValue(attr, value) {
+ switch (attr) {
+ case 'name':
+ this.productName = value;
+ break
+ case 'logo':
+ this.logoUrl = value;
+ break;
+ case 'copyright':
+ this.copyright = value;
+ break;
+ default:
+ this.variables[attr] = value
+ }
+ }
+ },
+ persist: {
+ key: 'G_PTST4',
+ paths: ['lang', 'collapse', 'sidebarWidth']
+ },
+})
+
+export default useSystemStore
\ No newline at end of file
diff --git a/web/src/stores/theme.js b/web/src/stores/theme.js
new file mode 100644
index 0000000..7c7b98d
--- /dev/null
+++ b/web/src/stores/theme.js
@@ -0,0 +1,18 @@
+import { defineStore } from 'pinia'
+
+const useThemeStore = defineStore('theme', {
+ state: () => {
+ return {
+ name: 'light',
+ backgroundColor: '#F9FBFD',
+ headerBackgroundColor: '#FFFFFF',
+ sidebarBackgroundColor: '#152e4d',
+ sidebarTextColor: '#a8b5c8',
+ sidebarActiveTextColor: '#ffffff',
+ }
+ },
+ getters: {},
+ persist: true,
+})
+
+export default useThemeStore
\ No newline at end of file
diff --git a/web/src/stores/user.js b/web/src/stores/user.js
new file mode 100644
index 0000000..22ca25c
--- /dev/null
+++ b/web/src/stores/user.js
@@ -0,0 +1,123 @@
+import { defineStore } from 'pinia'
+import { getBaseUrl } from '@/apis/request'
+
+const useUserStore = defineStore('user', {
+ state: () => {
+ return {
+ uid: '',
+ username: '',
+ email: '',
+ avatar: '//rd.echo.me/fake/users/user-1.jpg',
+ pwdhash: '',
+ accessToken: '*',
+ tokenExpiredAt: 0,
+ permissions: [],
+ description: '',
+ loginDevice: false,
+ hiddlePhone: false, //号码是否隐藏
+ deviceRegistered: false,
+ unreadMsgCount: 0,
+ }
+ },
+ getters: {},
+ actions: {
+ setUserID(uid) {
+ this.uid = uid
+ },
+ setAccessToken(token, ttl) {
+ this.accessToken = token
+ if (ttl <= 0) {
+ this.tokenExpiredAt = 0;
+ sessionStorage.removeItem('G_PSID1');
+ } else {
+ this.tokenExpiredAt = ((new Date()).getTime() / 1000) + ttl;
+ sessionStorage.setItem('G_PSID1', this.accessToken);
+ }
+ },
+ setUsername(s) {
+ this.username = s
+ },
+
+ setEmail(s) {
+ this.email = s
+ },
+ setPassword(s) {
+ this.pwdhash = btoa(s)
+ },
+ setAvatar(s) {
+ if (s.indexOf('//') === -1) {
+ s = getBaseUrl() + s;
+ }
+ this.avatar = s
+ },
+ setAutoLoginDevice(s) {
+ this.loginDevice = s;
+ },
+ setDeviceRegisterState(ok) {
+ this.deviceRegistered = ok
+ },
+ setPermissions(s) {
+ if (typeof s === 'string') {
+ try {
+ this.permissions = JSON.parse(s)
+ } catch (e) { }
+ } else {
+ this.permissions = s
+ }
+ },
+ isAuthorization() {
+ let timestamp = (new Date()).getTime() / 1000;
+ return this.tokenExpiredAt > timestamp;
+ },
+ incUnreadMsgCount() {
+ this.unreadMsgCount++
+ },
+ decUnreadMsgCount() {
+ this.unreadMsgCount--
+ },
+ setUnreadMsgCount(n) {
+ this.unreadMsgCount = n
+ },
+ getUserID() {
+ return this.uid;
+ },
+ getAccessToken() {
+ return this.accessToken;
+ },
+ getAutoLoginDevice() {
+ return this.loginDevice
+ },
+ getPassword() {
+ return atob(this.pwdhash);
+ },
+ getUnreadMsgCount() {
+ return this.unreadMsgCount
+ },
+ getDeviceRegistered() {
+ return this.deviceRegistered;
+ },
+ hasPermission(permission) {
+ let ret = false
+ if (typeof permission === 'boolean') {
+ ret = permission
+ } else if (Array.isArray(permission)) {
+ for (let s of permission) {
+ if (this.permissions.indexOf(s) > -1) {
+ ret = true
+ break
+ }
+ }
+ } else {
+ ret = this.permissions.indexOf(permission) > -1
+ }
+ return ret
+ },
+ },
+ persist: {
+ key: 'G_PTST3',
+ paths: ['accessToken', 'tokenExpiredAt', 'pwdhash', 'loginDevice'],
+ storage: sessionStorage,
+ },
+})
+
+export default useUserStore
\ No newline at end of file
diff --git a/web/src/views/account/Login.vue b/web/src/views/account/Login.vue
new file mode 100644
index 0000000..d54faa6
--- /dev/null
+++ b/web/src/views/account/Login.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 记住密码
+
+
+
+ 登录
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/views/dashboard/Index.vue b/web/src/views/dashboard/Index.vue
new file mode 100644
index 0000000..a825ec6
--- /dev/null
+++ b/web/src/views/dashboard/Index.vue
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/views/organize/department/Index.vue b/web/src/views/organize/department/Index.vue
new file mode 100644
index 0000000..e34c443
--- /dev/null
+++ b/web/src/views/organize/department/Index.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/views/redirect/Redirect.vue b/web/src/views/redirect/Redirect.vue
new file mode 100644
index 0000000..c6aa70e
--- /dev/null
+++ b/web/src/views/redirect/Redirect.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/web/vite.config.js b/web/vite.config.js
new file mode 100644
index 0000000..4217010
--- /dev/null
+++ b/web/vite.config.js
@@ -0,0 +1,18 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import vueDevTools from 'vite-plugin-vue-devtools'
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [
+ vue(),
+ vueDevTools(),
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ },
+ },
+})