From 3541d207d9c956dc3830e7533fc09cdcde6ec50f Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 20 Sep 2023 00:25:05 +0800 Subject: [PATCH 01/55] Try to add quic-go for GT --- .gitignore | 1 + client/client.go | 10 +++ conn/quicConn.go | 80 +++++++++++++++++ go.mod | 10 +++ go.sum | 228 +++++++++-------------------------------------- server/server.go | 14 +++ 6 files changed, 156 insertions(+), 187 deletions(-) create mode 100644 conn/quicConn.go diff --git a/.gitignore b/.gitignore index e400d188..a2458277 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ build release .vscode .dockerignore +.idea diff --git a/client/client.go b/client/client.go index adc89baf..1d2a41d4 100644 --- a/client/client.go +++ b/client/client.go @@ -227,6 +227,12 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { } d.host = u.Host d.dialFn = d.dial + case "quic": + if len(u.Port()) < 1 { + u.Host = net.JoinHostPort(u.Host, "80") + } + d.host = u.Host + d.dialFn = d.quicDial default: err = fmt.Errorf("remote url (-remote option) '%s' is invalid", remote) } @@ -284,6 +290,10 @@ func (d *dialer) tlsDial() (conn net.Conn, err error) { return tls.Dial("tcp", d.host, d.tlsConfig) } +func (d *dialer) quicDial() (conn net.Conn, err error) { + return connection.QuicDial(d.host) +} + // Start runs the client agent. func (c *Client) Start() (err error) { c.Logger.Info().Msg(predef.Version) diff --git a/conn/quicConn.go b/conn/quicConn.go new file mode 100644 index 00000000..9ca9ca98 --- /dev/null +++ b/conn/quicConn.go @@ -0,0 +1,80 @@ +package conn + +import ( + "context" + "crypto/rand" + "crypto/rsa" + "crypto/tls" + "crypto/x509" + "encoding/pem" + "github.com/quic-go/quic-go" + "math/big" + "net" +) + +type QuicConnection struct { + quic.Connection + quic.Stream +} + +type QuicListener struct { + quic.Listener +} + +var _ net.Conn = &QuicConnection{} +var _ net.Listener = &QuicListener{} + +func QuicDial(addr string) (net.Conn, error) { + tlsConf := &tls.Config{ + InsecureSkipVerify: true, + NextProtos: []string{"quic-echo-example"}, + } + conn, _ := quic.DialAddr(context.Background(), addr, tlsConf, &quic.Config{}) + stream, err := conn.OpenStreamSync(context.Background()) + nc := &QuicConnection{ + Connection: conn, + Stream: stream, + } + return nc, err +} + +func QuicListen(addr string) (net.Listener, error) { + listener, err := quic.ListenAddr(addr, GenerateTLSConfig(), nil) + ln := &QuicListener{ + Listener: *listener, + } + return ln, err +} + +func (ln *QuicListener) Accept() (net.Conn, error) { + conn, _ := ln.Listener.Accept(context.Background()) + stream, err := conn.AcceptStream(context.Background()) + nc := &QuicConnection{ + Connection: conn, + Stream: stream, + } + return nc, err +} + +func GenerateTLSConfig() *tls.Config { + key, err := rsa.GenerateKey(rand.Reader, 1024) + if err != nil { + panic(err) + } + template := x509.Certificate{SerialNumber: big.NewInt(1)} + certDER, err := x509.CreateCertificate(rand.Reader, &template, &template, &key.PublicKey, key) + if err != nil { + panic(err) + } + keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)}) + certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER}) + + tlsCert, err := tls.X509KeyPair(certPEM, keyPEM) + if err != nil { + panic(err) + } + return &tls.Config{ + Certificates: []tls.Certificate{tlsCert}, + NextProtos: []string{"quic-echo-example"}, + } +} diff --git a/go.mod b/go.mod index 22ee5a5a..7595fd29 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/pion/logging v0.2.2 github.com/pion/turn/v3 v3.0.1 github.com/pkg/errors v0.9.1 + github.com/quic-go/quic-go v0.38.1 github.com/rs/zerolog v1.30.0 github.com/shirou/gopsutil v3.21.11+incompatible github.com/stretchr/testify v1.8.4 @@ -24,20 +25,29 @@ require ( require ( github.com/getsentry/sentry-go v0.24.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect + github.com/kr/pretty v0.3.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect + github.com/onsi/ginkgo/v2 v2.9.5 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/randutil v0.1.0 // indirect github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.4 // indirect github.com/pion/transport/v3 v3.0.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/quic-go/qtls-go1-20 v0.3.3 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect golang.org/x/crypto v0.13.0 // indirect + golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect + golang.org/x/mod v0.10.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sys v0.12.0 // indirect golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.9.1 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect ) diff --git a/go.sum b/go.sum index 53b0dd0a..d80c9484 100644 --- a/go.sum +++ b/go.sum @@ -1,143 +1,60 @@ -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/archdx/zerolog-sentry v1.0.1 h1:J9Nfw1U3B+OLk502NaSvoLnkWLlFtwQy/MwhWiEM+DM= -github.com/archdx/zerolog-sentry v1.0.1/go.mod h1:3H8gClGFafB90fKMsvfP017bdmkG5MD6UiA+6iPEwGw= github.com/archdx/zerolog-sentry v1.5.0 h1:wc3arq95hz749M2iPwfSb7jzdYhTch4AK/opofXHcNs= github.com/archdx/zerolog-sentry v1.5.0/go.mod h1:shfLC+5jaXkS1iBcAD/k07g5QH1M/jbPcVr5DkZyxk4= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/sentry-go v0.12.0 h1:era7g0re5iY13bHSdN/xMkyV+5zZppjRVQhZrXCaEIk= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.24.1 h1:W6/0GyTy8J6ge6lVCc94WB6Gx2ZuLrgopnn9w8Hiwuk= github.com/getsentry/sentry-go v0.24.1/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/strftime v1.0.5 h1:A7H3tT8DhTz8u65w+JRpiBxM4dINQhUXAZnhBa2xeOE= github.com/lestrrat-go/strftime v1.0.5/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= +github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= +github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= @@ -153,38 +70,28 @@ github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouAN github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= github.com/pion/turn/v3 v3.0.1 h1:wLi7BTQr6/Q20R0vt/lHbjv6y4GChFtC33nkYbasoT8= github.com/pion/turn/v3 v3.0.1/go.mod h1:MrJDKgqryDyWy1/4NT9TWfXWGMC7UHT6pJIv1+gMeNE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= +github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= +github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE= +github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= +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.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= -github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -194,56 +101,28 @@ github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+Kd github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/exp v0.0.0-20221205204356-47842c84f3db h1:D/cFflL63o2KSLJIwjlcIt8PR064j/xsmdEJL/YvY/o= +golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= @@ -251,31 +130,20 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -294,41 +162,27 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/server/server.go b/server/server.go index d68fee1e..cdb8649a 100644 --- a/server/server.go +++ b/server/server.go @@ -20,6 +20,7 @@ import ( "encoding/json" "errors" "fmt" + connection "github.com/isrc-cas/gt/conn" "io" "math" "net" @@ -145,6 +146,19 @@ func (s *Server) listen() (err error) { return } +func (s *Server) quicListen() (err error) { + s.listener, err = connection.QuicListen(s.config.Addr) + if err != nil { + err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.Addr, err.Error()) + return + } + s.Logger.Info().Str("addr", s.listener.Addr().String()).Msg("Listening") + go s.acceptLoop(s.listener, func(c *conn) { + c.handle(c.handleHTTP) + }) + return +} + func (s *Server) sniListen() (err error) { s.sniListener, err = net.Listen("tcp", s.config.SNIAddr) if err != nil { From de89cdb352786c9003735c67544a1359bb93fe62 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 20 Sep 2023 00:40:33 +0800 Subject: [PATCH 02/55] Try to add quic-go for GT --- go.mod | 2 +- go.sum | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 7595fd29..7725e545 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/pion/logging v0.2.2 github.com/pion/turn/v3 v3.0.1 github.com/pkg/errors v0.9.1 - github.com/quic-go/quic-go v0.38.1 + github.com/quic-go/quic-go v0.35.0 github.com/rs/zerolog v1.30.0 github.com/shirou/gopsutil v3.21.11+incompatible github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index d80c9484..0f7cb823 100644 --- a/go.sum +++ b/go.sum @@ -78,6 +78,7 @@ 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/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= +github.com/quic-go/quic-go v0.35.0/go.mod h1:+4CVgVppm0FNjpG3UcX8Joi/frKOH7/ciD5yGcwOO1g= github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE= github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= From 25224f9476e50bd705a1dea1ac688071e7a42e74 Mon Sep 17 00:00:00 2001 From: DrakenLibra Date: Tue, 19 Sep 2023 16:57:15 +0000 Subject: [PATCH 03/55] try --- go.mod | 1 + go.sum | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 7725e545..7dd01d09 100644 --- a/go.mod +++ b/go.mod @@ -38,6 +38,7 @@ require ( github.com/pion/transport/v2 v2.2.4 // indirect github.com/pion/transport/v3 v3.0.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/quic-go/qtls-go1-19 v0.3.2 // indirect github.com/quic-go/qtls-go1-20 v0.3.3 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect diff --git a/go.sum b/go.sum index 0f7cb823..b9c54acc 100644 --- a/go.sum +++ b/go.sum @@ -76,11 +76,12 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= +github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= +github.com/quic-go/quic-go v0.35.0 h1:JXIf219xJK+4qGeY52rlnrVqeB2AXUAwfLU9JSoWXwg= github.com/quic-go/quic-go v0.35.0/go.mod h1:+4CVgVppm0FNjpG3UcX8Joi/frKOH7/ciD5yGcwOO1g= -github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE= -github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4= 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.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= From f7f4faaf0d7dba7ed08183fa6aa51dd6e33f07e1 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 20 Sep 2023 01:04:17 +0800 Subject: [PATCH 04/55] Try to add quic-go for GT --- server/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/server/server.go b/server/server.go index cdb8649a..ca5877b3 100644 --- a/server/server.go +++ b/server/server.go @@ -148,6 +148,7 @@ func (s *Server) listen() (err error) { func (s *Server) quicListen() (err error) { s.listener, err = connection.QuicListen(s.config.Addr) + fmt.Printf("Already astablish QUIC connection") if err != nil { err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.Addr, err.Error()) return From 86d2cfd7cc8dd33e402fe46816714b2884520ec5 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 20 Sep 2023 01:09:09 +0800 Subject: [PATCH 05/55] Try to add quic-go for GT --- server/server.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/server.go b/server/server.go index ca5877b3..d5c68d74 100644 --- a/server/server.go +++ b/server/server.go @@ -293,7 +293,8 @@ func (s *Server) Start() (err error) { if strings.IndexByte(s.config.Addr, ':') == -1 { s.config.Addr = ":" + s.config.Addr } - err = s.listen() + //err = s.listen() + err = s.quicListen() if err != nil { return } From 43e69e00578d7fe67ba494bb9a39e9400d6fad07 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 20 Sep 2023 01:18:38 +0800 Subject: [PATCH 06/55] Try to add quic-go for GT --- server/config.go | 2 ++ server/server.go | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/server/config.go b/server/config.go index d639b069..6e5e2801 100644 --- a/server/config.go +++ b/server/config.go @@ -89,6 +89,8 @@ type Options struct { LogFileMaxCount uint `yaml:"logFileMaxCount" usage:"Max count of the log files"` LogLevel string `yaml:"logLevel" usage:"Log level: trace, debug, info, warn, error, fatal, panic, disable"` Version bool `arg:"version" yaml:"-" usage:"Show the version of this program"` + + QuicAddr string `yaml:"quicAddr" usage:"The address for quic to listen on. Supports values like: '80', ':80' or '0.0.0.0:80'"` } func defaultConfig() Config { diff --git a/server/server.go b/server/server.go index d5c68d74..cec8a4a9 100644 --- a/server/server.go +++ b/server/server.go @@ -293,7 +293,16 @@ func (s *Server) Start() (err error) { if strings.IndexByte(s.config.Addr, ':') == -1 { s.config.Addr = ":" + s.config.Addr } - //err = s.listen() + err = s.listen() + if err != nil { + return + } + listening = true + } + if len(s.config.QuicAddr) > 0 { + if strings.IndexByte(s.config.Addr, ':') == -1 { + s.config.Addr = ":" + s.config.Addr + } err = s.quicListen() if err != nil { return From da463b7660cf9040f66e78110d9e574a8447c5a4 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 20 Sep 2023 01:27:11 +0800 Subject: [PATCH 07/55] Try to add quic-go for GT --- server/server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/server.go b/server/server.go index cec8a4a9..dc1b133a 100644 --- a/server/server.go +++ b/server/server.go @@ -300,8 +300,8 @@ func (s *Server) Start() (err error) { listening = true } if len(s.config.QuicAddr) > 0 { - if strings.IndexByte(s.config.Addr, ':') == -1 { - s.config.Addr = ":" + s.config.Addr + if strings.IndexByte(s.config.QuicAddr, ':') == -1 { + s.config.QuicAddr = ":" + s.config.QuicAddr } err = s.quicListen() if err != nil { From 2180d30b0ca69fbe8334c77985eec528beaa1090 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 20 Sep 2023 01:31:03 +0800 Subject: [PATCH 08/55] Try to add quic-go for GT --- server/server.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/server.go b/server/server.go index dc1b133a..b9214baa 100644 --- a/server/server.go +++ b/server/server.go @@ -289,21 +289,21 @@ func (s *Server) Start() (err error) { } listening = true } - if len(s.config.Addr) > 0 { - if strings.IndexByte(s.config.Addr, ':') == -1 { - s.config.Addr = ":" + s.config.Addr + if len(s.config.QuicAddr) > 0 { + if strings.IndexByte(s.config.QuicAddr, ':') == -1 { + s.config.QuicAddr = ":" + s.config.QuicAddr } - err = s.listen() + err = s.quicListen() if err != nil { return } listening = true } - if len(s.config.QuicAddr) > 0 { - if strings.IndexByte(s.config.QuicAddr, ':') == -1 { - s.config.QuicAddr = ":" + s.config.QuicAddr + if len(s.config.Addr) > 0 { + if strings.IndexByte(s.config.Addr, ':') == -1 { + s.config.Addr = ":" + s.config.Addr } - err = s.quicListen() + err = s.listen() if err != nil { return } From 8633e983dc087572547f44f52a90a77e672a8ee8 Mon Sep 17 00:00:00 2001 From: Shadow Date: Thu, 21 Sep 2023 17:25:25 +0800 Subject: [PATCH 09/55] Try to add quic-go for GT. Remove additional workflow check. --- .github/workflows/container.yml | 382 ++++++++++++++++---------------- server/server.go | 4 +- 2 files changed, 193 insertions(+), 193 deletions(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 90e8c947..7e0ceba0 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -82,194 +82,194 @@ jobs: echo "Status: ${{ steps.buildx.outputs.status }}" echo "Flags: ${{ steps.buildx.outputs.flags }}" echo "Platforms: ${{ steps.buildx.outputs.platforms }}" - - - name: Log into registry ${{ env.REGISTRY }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Log into registry ${{ env.EULIX_REGISTRY }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.EULIX_REGISTRY }} - username: ${{ secrets.EULIX_REGISTRY_USERNAME }} - password: ${{ secrets.EULIX_REGISTRY_PASSWORD }} - - - name: Log into registry Docker Hub - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_HUB_REGISTRY_USERNAME }} - password: ${{ secrets.DOCKER_HUB_REGISTRY_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SH }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_SH }} - username: cn-east-3@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_BJ }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_BJ }} - username: cn-north-4@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_GZ }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_GZ }} - username: cn-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SG }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_SG }} - username: ap-southeast-3@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_HK }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_HK }} - username: ap-southeast-1@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_AF }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_AF }} - username: af-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_LA }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_LA }} - username: la-north-2@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Extract Docker metadata for Server - id: meta-server - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} - aospace/${{ env.GITHUB_REPOSITORY_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} - flavor: | - prefix=server- - - - name: Build and push Docker image for Server - id: build-and-push-server - uses: docker/build-push-action@v4.2.1 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-server.outputs.tags }} - labels: ${{ steps.meta-server.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-server - provenance: false - - - name: Extract Docker metadata for Client - id: meta-client - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} - aospace/${{ env.GITHUB_REPOSITORY_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} - flavor: | - prefix=client- - - - name: Build and push Docker image for Client - id: build-and-push-client - uses: docker/build-push-action@v4.2.1 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-client.outputs.tags }} - labels: ${{ steps.meta-client.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-client - provenance: false - - - name: Extract Docker metadata for Server - id: meta-opensource-server - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-server - flavor: | - prefix=opensource-server- - - - name: Build and push Docker image for Server - id: build-and-push-opensource-server - uses: docker/build-push-action@v2 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-opensource-server.outputs.tags }} - labels: ${{ steps.meta-opensource-server.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-server - - - name: Extract Docker metadata for Client - id: meta-opensource-client - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-client - flavor: | - prefix=opensource-client- - - - name: Build and push Docker image for Client - id: build-and-push-opensource-client - uses: docker/build-push-action@v2 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-opensource-client.outputs.tags }} - labels: ${{ steps.meta-opensource-client.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-client +# +# - name: Log into registry ${{ env.REGISTRY }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.REGISTRY }} +# username: ${{ github.actor }} +# password: ${{ secrets.GITHUB_TOKEN }} +# +# - name: Log into registry ${{ env.EULIX_REGISTRY }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.EULIX_REGISTRY }} +# username: ${{ secrets.EULIX_REGISTRY_USERNAME }} +# password: ${{ secrets.EULIX_REGISTRY_PASSWORD }} +# +# - name: Log into registry Docker Hub +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# username: ${{ secrets.DOCKER_HUB_REGISTRY_USERNAME }} +# password: ${{ secrets.DOCKER_HUB_REGISTRY_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SH }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_SH }} +# username: cn-east-3@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_BJ }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_BJ }} +# username: cn-north-4@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_GZ }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_GZ }} +# username: cn-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SG }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_SG }} +# username: ap-southeast-3@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_HK }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_HK }} +# username: ap-southeast-1@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_AF }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_AF }} +# username: af-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_LA }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_LA }} +# username: la-north-2@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Extract Docker metadata for Server +# id: meta-server +# uses: docker/metadata-action@v2 +# with: +# images: | +# ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} +# ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} +# aospace/${{ env.GITHUB_REPOSITORY_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} +# flavor: | +# prefix=server- +# +# - name: Build and push Docker image for Server +# id: build-and-push-server +# uses: docker/build-push-action@v4.2.1 +# with: +# context: . +# push: ${{ github.event_name != 'pull_request' }} +# tags: ${{ steps.meta-server.outputs.tags }} +# labels: ${{ steps.meta-server.outputs.labels }} +# builder: ${{ steps.buildx.outputs.name }} +# platforms: linux/amd64,linux/arm64 +# cache-from: type=gha +# cache-to: type=gha,mode=max +# file: Dockerfile-server +# provenance: false +# +# - name: Extract Docker metadata for Client +# id: meta-client +# uses: docker/metadata-action@v2 +# with: +# images: | +# ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} +# ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} +# aospace/${{ env.GITHUB_REPOSITORY_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} +# flavor: | +# prefix=client- +# +# - name: Build and push Docker image for Client +# id: build-and-push-client +# uses: docker/build-push-action@v4.2.1 +# with: +# context: . +# push: ${{ github.event_name != 'pull_request' }} +# tags: ${{ steps.meta-client.outputs.tags }} +# labels: ${{ steps.meta-client.outputs.labels }} +# builder: ${{ steps.buildx.outputs.name }} +# platforms: linux/amd64,linux/arm64 +# cache-from: type=gha +# cache-to: type=gha,mode=max +# file: Dockerfile-client +# provenance: false +# +# - name: Extract Docker metadata for Server +# id: meta-opensource-server +# uses: docker/metadata-action@v2 +# with: +# images: | +# ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-server +# flavor: | +# prefix=opensource-server- +# +# - name: Build and push Docker image for Server +# id: build-and-push-opensource-server +# uses: docker/build-push-action@v2 +# with: +# context: . +# push: ${{ github.event_name != 'pull_request' }} +# tags: ${{ steps.meta-opensource-server.outputs.tags }} +# labels: ${{ steps.meta-opensource-server.outputs.labels }} +# builder: ${{ steps.buildx.outputs.name }} +# platforms: linux/amd64,linux/arm64 +# cache-from: type=gha +# cache-to: type=gha,mode=max +# file: Dockerfile-server +# +# - name: Extract Docker metadata for Client +# id: meta-opensource-client +# uses: docker/metadata-action@v2 +# with: +# images: | +# ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-client +# flavor: | +# prefix=opensource-client- +# +# - name: Build and push Docker image for Client +# id: build-and-push-opensource-client +# uses: docker/build-push-action@v2 +# with: +# context: . +# push: ${{ github.event_name != 'pull_request' }} +# tags: ${{ steps.meta-opensource-client.outputs.tags }} +# labels: ${{ steps.meta-opensource-client.outputs.labels }} +# builder: ${{ steps.buildx.outputs.name }} +# platforms: linux/amd64,linux/arm64 +# cache-from: type=gha +# cache-to: type=gha,mode=max +# file: Dockerfile-client diff --git a/server/server.go b/server/server.go index b9214baa..331b2a7d 100644 --- a/server/server.go +++ b/server/server.go @@ -147,10 +147,10 @@ func (s *Server) listen() (err error) { } func (s *Server) quicListen() (err error) { - s.listener, err = connection.QuicListen(s.config.Addr) + s.listener, err = connection.QuicListen(s.config.QuicAddr) //// fmt.Printf("Already astablish QUIC connection") if err != nil { - err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.Addr, err.Error()) + err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicAddr, err.Error()) return } s.Logger.Info().Str("addr", s.listener.Addr().String()).Msg("Listening") From 3a5e672cd048a10fbf304bd50b6b52f3499070d0 Mon Sep 17 00:00:00 2001 From: Shadow Date: Thu, 21 Sep 2023 23:48:25 +0800 Subject: [PATCH 10/55] Try to add quic-go for GT. --- server/conn.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/conn.go b/server/conn.go index f3706974..84900e05 100644 --- a/server/conn.go +++ b/server/conn.go @@ -141,7 +141,7 @@ func (c *conn) handle(handleFunc func() bool) { remoteAddr, ok := c.RemoteAddr().(*net.TCPAddr) if !ok { c.Logger.Warn().Msg("conn is not tcp conn") - return + //return // 为了QUIC删除了这个内容 } remoteIP := remoteAddr.IP.String() c.server.reconnectRWMutex.RLock() From 682bde6fd663cd1ebadb87b9dd48ceae824d33c7 Mon Sep 17 00:00:00 2001 From: Shadow Date: Fri, 22 Sep 2023 00:11:38 +0800 Subject: [PATCH 11/55] Try to add quic-go for GT. --- server/conn.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/conn.go b/server/conn.go index 84900e05..f97eda8a 100644 --- a/server/conn.go +++ b/server/conn.go @@ -138,10 +138,11 @@ func (c *conn) handle(handleFunc func() bool) { c.Logger = c.Logger.With().Time("tunnel", time.Now()).Logger() // 判断 IP 是否处于被限制状态 - remoteAddr, ok := c.RemoteAddr().(*net.TCPAddr) + //remoteAddr, ok := c.RemoteAddr().(*net.TCPAddr) + remoteAddr, ok := c.RemoteAddr().(*net.IPAddr) if !ok { c.Logger.Warn().Msg("conn is not tcp conn") - //return // 为了QUIC删除了这个内容 + return // 为了QUIC删除了这个内容 } remoteIP := remoteAddr.IP.String() c.server.reconnectRWMutex.RLock() From aa66fec81a6b7c1c3ea44fb2e0b62b9189ab2b3a Mon Sep 17 00:00:00 2001 From: Shadow Date: Fri, 22 Sep 2023 00:16:40 +0800 Subject: [PATCH 12/55] Try to add quic-go for GT. --- server/conn.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/conn.go b/server/conn.go index f97eda8a..33f23405 100644 --- a/server/conn.go +++ b/server/conn.go @@ -18,6 +18,7 @@ import ( "bytes" "crypto/sha256" "errors" + "fmt" "io" "net" "runtime/debug" @@ -139,7 +140,8 @@ func (c *conn) handle(handleFunc func() bool) { // 判断 IP 是否处于被限制状态 //remoteAddr, ok := c.RemoteAddr().(*net.TCPAddr) - remoteAddr, ok := c.RemoteAddr().(*net.IPAddr) + remoteAddr, ok := c.RemoteAddr().(*net.TCPAddr) + fmt.Println(remoteAddr) if !ok { c.Logger.Warn().Msg("conn is not tcp conn") return // 为了QUIC删除了这个内容 From e60931a16d53f676b8ae183e21198b999a3d4c0c Mon Sep 17 00:00:00 2001 From: Shadow Date: Fri, 22 Sep 2023 00:18:05 +0800 Subject: [PATCH 13/55] Try to add quic-go for GT. --- server/conn.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/conn.go b/server/conn.go index 33f23405..21190cb1 100644 --- a/server/conn.go +++ b/server/conn.go @@ -140,7 +140,7 @@ func (c *conn) handle(handleFunc func() bool) { // 判断 IP 是否处于被限制状态 //remoteAddr, ok := c.RemoteAddr().(*net.TCPAddr) - remoteAddr, ok := c.RemoteAddr().(*net.TCPAddr) + remoteAddr, ok := c.RemoteAddr().(*net.IPAddr) fmt.Println(remoteAddr) if !ok { c.Logger.Warn().Msg("conn is not tcp conn") From dddf2eb760f27cea3a4e1f5b838b1a18ee8368fb Mon Sep 17 00:00:00 2001 From: Shadow Date: Fri, 22 Sep 2023 00:19:08 +0800 Subject: [PATCH 14/55] Try to add quic-go for GT. --- server/conn.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/conn.go b/server/conn.go index 21190cb1..ee7be333 100644 --- a/server/conn.go +++ b/server/conn.go @@ -141,7 +141,7 @@ func (c *conn) handle(handleFunc func() bool) { // 判断 IP 是否处于被限制状态 //remoteAddr, ok := c.RemoteAddr().(*net.TCPAddr) remoteAddr, ok := c.RemoteAddr().(*net.IPAddr) - fmt.Println(remoteAddr) + fmt.Println(c.RemoteAddr().String()) if !ok { c.Logger.Warn().Msg("conn is not tcp conn") return // 为了QUIC删除了这个内容 From 9fa3d60513f25d722da4eb0a7c8e1292fd8536e5 Mon Sep 17 00:00:00 2001 From: Shadow Date: Fri, 22 Sep 2023 00:26:15 +0800 Subject: [PATCH 15/55] Try to add quic-go for GT. --- server/conn.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/server/conn.go b/server/conn.go index ee7be333..8d42bbbf 100644 --- a/server/conn.go +++ b/server/conn.go @@ -18,7 +18,6 @@ import ( "bytes" "crypto/sha256" "errors" - "fmt" "io" "net" "runtime/debug" @@ -140,13 +139,16 @@ func (c *conn) handle(handleFunc func() bool) { // 判断 IP 是否处于被限制状态 //remoteAddr, ok := c.RemoteAddr().(*net.TCPAddr) - remoteAddr, ok := c.RemoteAddr().(*net.IPAddr) - fmt.Println(c.RemoteAddr().String()) - if !ok { - c.Logger.Warn().Msg("conn is not tcp conn") - return // 为了QUIC删除了这个内容 - } - remoteIP := remoteAddr.IP.String() + ////fmt.Println(c.RemoteAddr().String()) + //if !ok { + // c.Logger.Warn().Msg("conn is not tcp conn") + // return // 为了QUIC删除了这个内容 + //} + //remoteIP := remoteAddr.IP.String() + + remoteAddr := c.RemoteAddr().String() + remoteIP := strings.Split(remoteAddr, ":")[0] + c.server.reconnectRWMutex.RLock() reconnectTimes := c.server.reconnect[remoteIP] c.server.reconnectRWMutex.RUnlock() From 843143dcfc6961b5651841ac0a0f638bb66e0a96 Mon Sep 17 00:00:00 2001 From: Shadow Date: Sun, 24 Sep 2023 18:07:39 +0800 Subject: [PATCH 16/55] Add quic-go for GT successfully. --- client/client.go | 2 +- server/config.go | 2 +- server/conn.go | 9 --------- server/server.go | 3 +-- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/client/client.go b/client/client.go index 1d2a41d4..48fd0f9a 100644 --- a/client/client.go +++ b/client/client.go @@ -229,7 +229,7 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { d.dialFn = d.dial case "quic": if len(u.Port()) < 1 { - u.Host = net.JoinHostPort(u.Host, "80") + u.Host = net.JoinHostPort(u.Host, "10080") } d.host = u.Host d.dialFn = d.quicDial diff --git a/server/config.go b/server/config.go index 6e5e2801..95549a12 100644 --- a/server/config.go +++ b/server/config.go @@ -90,7 +90,7 @@ type Options struct { LogLevel string `yaml:"logLevel" usage:"Log level: trace, debug, info, warn, error, fatal, panic, disable"` Version bool `arg:"version" yaml:"-" usage:"Show the version of this program"` - QuicAddr string `yaml:"quicAddr" usage:"The address for quic to listen on. Supports values like: '80', ':80' or '0.0.0.0:80'"` + QuicAddr string `yaml:"quicAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '10080', ':10080' or '0.0.0.0:10080'"` } func defaultConfig() Config { diff --git a/server/conn.go b/server/conn.go index 8d42bbbf..f15b56e4 100644 --- a/server/conn.go +++ b/server/conn.go @@ -137,15 +137,6 @@ func (c *conn) handle(handleFunc func() bool) { c.Logger = c.Logger.With().Time("tunnel", time.Now()).Logger() - // 判断 IP 是否处于被限制状态 - //remoteAddr, ok := c.RemoteAddr().(*net.TCPAddr) - ////fmt.Println(c.RemoteAddr().String()) - //if !ok { - // c.Logger.Warn().Msg("conn is not tcp conn") - // return // 为了QUIC删除了这个内容 - //} - //remoteIP := remoteAddr.IP.String() - remoteAddr := c.RemoteAddr().String() remoteIP := strings.Split(remoteAddr, ":")[0] diff --git a/server/server.go b/server/server.go index 331b2a7d..6a8fe1f4 100644 --- a/server/server.go +++ b/server/server.go @@ -147,8 +147,7 @@ func (s *Server) listen() (err error) { } func (s *Server) quicListen() (err error) { - s.listener, err = connection.QuicListen(s.config.QuicAddr) //// - fmt.Printf("Already astablish QUIC connection") + s.listener, err = connection.QuicListen(s.config.QuicAddr) if err != nil { err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicAddr, err.Error()) return From 71669a5930818c90e957307c13c5b9f0986a567d Mon Sep 17 00:00:00 2001 From: Shadow Date: Sun, 24 Sep 2023 18:25:07 +0800 Subject: [PATCH 17/55] Add 'Internal QUIC Penetration' description for GT. --- README.md | 17 +++++++++++++++++ README_CN.md | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/README.md b/README.md index 487cfbe3..18a99f9c 100644 --- a/README.md +++ b/README.md @@ -326,6 +326,23 @@ options: ./release/linux-amd64-client -local tcp://127.0.0.1:22 -remote tcp://id1.example.com:8080 -id id1 -secret secret1 -remoteTCPPort 2222 -remoteTCPRandom ``` +#### Internal QUIC Penetration + +- Requirements: There is an intranet server and a public network server, and id1.example.com resolves to the address of the public network server. Hopefully by accessing id1.example.com:8080 + To access the web page served by port 80 on the intranet server. At the same time, QUIC is used to build a transport connection between the client and the server. + +- Server (Public network server) + +```shell +./release/linux-amd64-server -addr 8080 -quicAddr 10080 -id id1 -secret secret1 +``` + +- Client (Internal network server) + +```shell +./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:10080 -id id1 -secret secret1 +``` + #### Client Start Multiple Services Simultaneously - Requirement: There is an internal network server and a public network server, and id1-1.example.com and diff --git a/README_CN.md b/README_CN.md index 25794409..2076ee02 100644 --- a/README_CN.md +++ b/README_CN.md @@ -308,6 +308,23 @@ options: ./release/linux-amd64-client -local tcp://127.0.0.1:22 -remote tcp://id1.example.com:8080 -id id1 -secret secret1 -remoteTCPPort 2222 -remoteTCPRandom ``` +#### QUIC 内网穿透 + +- 需求:有一台内网服务器和一台公网服务器,id1.example.com 解析到公网服务器的地址。希望通过访问 id1.example.com:8080 + 来访问内网服务器上 80 端口服务的网页。同时用 QUIC 为客户端与服务端之间构建传输连接。 + +- 服务端(公网服务器) + +```shell +./release/linux-amd64-server -addr 8080 -quicAddr 10080 -id id1 -secret secret1 +``` + +- 客户端(内网服务器) + +```shell +./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:10080 -id id1 -secret secret1 +``` + #### 客户端同时开启多个服务 - 需求:有一台内网服务器和一台公网服务器,id1-1.example.com 和 id1-2.example.com 解析到公网服务器的地址。希望通过访问 From a6ee6d029d98eac3d3ca43ca6dea862e645d5666 Mon Sep 17 00:00:00 2001 From: Shadow Date: Sun, 24 Sep 2023 23:16:45 +0800 Subject: [PATCH 18/55] Add 'QUIC test' for GT. --- server/server.go | 16 +++++-- test/quic_test.go | 105 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 test/quic_test.go diff --git a/server/server.go b/server/server.go index 6a8fe1f4..d96e8013 100644 --- a/server/server.go +++ b/server/server.go @@ -58,6 +58,7 @@ type Server struct { tlsListener net.Listener listener net.Listener sniListener net.Listener + quicListener net.Listener accepted uint64 served uint64 failed uint64 @@ -147,13 +148,13 @@ func (s *Server) listen() (err error) { } func (s *Server) quicListen() (err error) { - s.listener, err = connection.QuicListen(s.config.QuicAddr) + s.quicListener, err = connection.QuicListen(s.config.QuicAddr) if err != nil { err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicAddr, err.Error()) return } - s.Logger.Info().Str("addr", s.listener.Addr().String()).Msg("Listening") - go s.acceptLoop(s.listener, func(c *conn) { + s.Logger.Info().Str("addr", s.quicListener.Addr().String()).Msg("Listening") + go s.acceptLoop(s.quicListener, func(c *conn) { c.handle(c.handleHTTP) }) return @@ -959,6 +960,15 @@ func (s *Server) GetTLSListenerAddrPort() (addrPort netip.AddrPort) { return } +// GetQuicListenerAddrPort 获取 QUIC listener 地址,返回值可能为空 +func (s *Server) GetQuicListenerAddrPort() (addrPort string) { + if s.tlsListener == nil { + return + } + addrPort = s.quicListener.Addr().String() + return +} + // GetAPIListenerAddrPort 获取 api listener 地址,返回值可能为空 func (s *Server) GetAPIListenerAddrPort() (addrPort netip.AddrPort) { if s.apiListener == nil { diff --git a/test/quic_test.go b/test/quic_test.go new file mode 100644 index 00000000..611c3487 --- /dev/null +++ b/test/quic_test.go @@ -0,0 +1,105 @@ +package test + +import ( + "errors" + "fmt" + "io" + "net" + "net/http" + "testing" + "time" +) + +func TestQuic(t *testing.T) { + t.Parallel() + mux := http.NewServeMux() + mux.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) { + err := request.ParseForm() + if err != nil { + panic(err) + } + if request.FormValue("hello") != "world" { + writer.WriteHeader(http.StatusBadRequest) + return + } + _, err = writer.Write([]byte("ok")) + if err != nil { + panic(err) + } + }) + hs := &http.Server{Handler: mux} + l, err := net.Listen("tcp", "127.0.0.1:12080") + if err != nil { + t.Fatal(err) + } + defer func() { + err := hs.Close() + if err != nil { + t.Fatal(err) + } + }() + go func() { + err := hs.Serve(l) + if err != nil && !errors.Is(err, http.ErrServerClosed) { + panic(err) + } + }() + + s, err := setupServer([]string{ + "server", + "-addr", "127.0.0.1:8080", + "-quicAddr", "127.0.0.1:10080", + "-id", "05797ac9-86ae-40b0-b767-7a41e03a5486", + "-secret", "eec1eabf-2c59-4e19-bf10-34707c17ed89", + "-timeout", "10s", + }, nil) + if err != nil { + t.Fatal(err) + } + defer s.Close() + c, err := setupClient([]string{ + "client", + "-id", "05797ac9-86ae-40b0-b767-7a41e03a5486", + "-secret", "eec1eabf-2c59-4e19-bf10-34707c17ed89", + "-local", "http://" + l.Addr().String(), + "-remote", fmt.Sprintf("quic://%v", s.GetQuicListenerAddrPort()), + "-remoteTimeout", "5s", + }, nil) + if err != nil { + t.Fatal(err) + } + defer c.Close() + c.OnTunnelClose.Store(func() { + panic("tunnel should not be closed") + }) + + conn, err := net.Dial("tcp", s.GetListenerAddrPort().String()) + if err != nil { + t.Fatal(err) + } + _, err = conn.Write([]byte("GET ")) + if err != nil { + t.Fatal(err) + } + time.Sleep(12 * time.Second) + + httpClient := setupHTTPClient(s.GetListenerAddrPort().String(), nil) + resp, err := httpClient.Get("http://05797ac9-86ae-40b0-b767-7a41e03a5486.example.com/test?hello=world") + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + t.Fatal("invalid status code") + } + all, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + if string(all) != "ok" { + t.Fatal("invalid resp") + } + c.OnTunnelClose.Store(func() {}) + t.Logf("%s", all) + s.Shutdown() +} From ea107ef5ec999754aecdae7070fe759410f74ee5 Mon Sep 17 00:00:00 2001 From: Shadow Date: Sun, 24 Sep 2023 23:23:45 +0800 Subject: [PATCH 19/55] Fix. --- .github/workflows/container.yml | 382 ++++++++++++++++---------------- 1 file changed, 191 insertions(+), 191 deletions(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 7e0ceba0..fe572ee0 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -82,194 +82,194 @@ jobs: echo "Status: ${{ steps.buildx.outputs.status }}" echo "Flags: ${{ steps.buildx.outputs.flags }}" echo "Platforms: ${{ steps.buildx.outputs.platforms }}" -# -# - name: Log into registry ${{ env.REGISTRY }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.REGISTRY }} -# username: ${{ github.actor }} -# password: ${{ secrets.GITHUB_TOKEN }} -# -# - name: Log into registry ${{ env.EULIX_REGISTRY }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.EULIX_REGISTRY }} -# username: ${{ secrets.EULIX_REGISTRY_USERNAME }} -# password: ${{ secrets.EULIX_REGISTRY_PASSWORD }} -# -# - name: Log into registry Docker Hub -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# username: ${{ secrets.DOCKER_HUB_REGISTRY_USERNAME }} -# password: ${{ secrets.DOCKER_HUB_REGISTRY_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SH }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_SH }} -# username: cn-east-3@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_BJ }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_BJ }} -# username: cn-north-4@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_GZ }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_GZ }} -# username: cn-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SG }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_SG }} -# username: ap-southeast-3@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_HK }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_HK }} -# username: ap-southeast-1@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_AF }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_AF }} -# username: af-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_LA }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_LA }} -# username: la-north-2@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Extract Docker metadata for Server -# id: meta-server -# uses: docker/metadata-action@v2 -# with: -# images: | -# ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} -# ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} -# aospace/${{ env.GITHUB_REPOSITORY_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} -# flavor: | -# prefix=server- -# -# - name: Build and push Docker image for Server -# id: build-and-push-server -# uses: docker/build-push-action@v4.2.1 -# with: -# context: . -# push: ${{ github.event_name != 'pull_request' }} -# tags: ${{ steps.meta-server.outputs.tags }} -# labels: ${{ steps.meta-server.outputs.labels }} -# builder: ${{ steps.buildx.outputs.name }} -# platforms: linux/amd64,linux/arm64 -# cache-from: type=gha -# cache-to: type=gha,mode=max -# file: Dockerfile-server -# provenance: false -# -# - name: Extract Docker metadata for Client -# id: meta-client -# uses: docker/metadata-action@v2 -# with: -# images: | -# ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} -# ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} -# aospace/${{ env.GITHUB_REPOSITORY_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} -# flavor: | -# prefix=client- -# -# - name: Build and push Docker image for Client -# id: build-and-push-client -# uses: docker/build-push-action@v4.2.1 -# with: -# context: . -# push: ${{ github.event_name != 'pull_request' }} -# tags: ${{ steps.meta-client.outputs.tags }} -# labels: ${{ steps.meta-client.outputs.labels }} -# builder: ${{ steps.buildx.outputs.name }} -# platforms: linux/amd64,linux/arm64 -# cache-from: type=gha -# cache-to: type=gha,mode=max -# file: Dockerfile-client -# provenance: false -# -# - name: Extract Docker metadata for Server -# id: meta-opensource-server -# uses: docker/metadata-action@v2 -# with: -# images: | -# ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-server -# flavor: | -# prefix=opensource-server- -# -# - name: Build and push Docker image for Server -# id: build-and-push-opensource-server -# uses: docker/build-push-action@v2 -# with: -# context: . -# push: ${{ github.event_name != 'pull_request' }} -# tags: ${{ steps.meta-opensource-server.outputs.tags }} -# labels: ${{ steps.meta-opensource-server.outputs.labels }} -# builder: ${{ steps.buildx.outputs.name }} -# platforms: linux/amd64,linux/arm64 -# cache-from: type=gha -# cache-to: type=gha,mode=max -# file: Dockerfile-server -# -# - name: Extract Docker metadata for Client -# id: meta-opensource-client -# uses: docker/metadata-action@v2 -# with: -# images: | -# ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-client -# flavor: | -# prefix=opensource-client- -# -# - name: Build and push Docker image for Client -# id: build-and-push-opensource-client -# uses: docker/build-push-action@v2 -# with: -# context: . -# push: ${{ github.event_name != 'pull_request' }} -# tags: ${{ steps.meta-opensource-client.outputs.tags }} -# labels: ${{ steps.meta-opensource-client.outputs.labels }} -# builder: ${{ steps.buildx.outputs.name }} -# platforms: linux/amd64,linux/arm64 -# cache-from: type=gha -# cache-to: type=gha,mode=max -# file: Dockerfile-client + + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Log into registry ${{ env.EULIX_REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.EULIX_REGISTRY }} + username: ${{ secrets.EULIX_REGISTRY_USERNAME }} + password: ${{ secrets.EULIX_REGISTRY_PASSWORD }} + + - name: Log into registry Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_REGISTRY_USERNAME }} + password: ${{ secrets.DOCKER_HUB_REGISTRY_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SH }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_SH }} + username: cn-east-3@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_BJ }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_BJ }} + username: cn-north-4@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_GZ }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_GZ }} + username: cn-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SG }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_SG }} + username: ap-southeast-3@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_HK }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_HK }} + username: ap-southeast-1@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_AF }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_AF }} + username: af-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_LA }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_LA }} + username: la-north-2@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Extract Docker metadata for Server + id: meta-server + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} + aospace/${{ env.GITHUB_REPOSITORY_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} + flavor: | + prefix=server- + + - name: Build and push Docker image for Server + id: build-and-push-server + uses: docker/build-push-action@v4.2.1 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-server.outputs.tags }} + labels: ${{ steps.meta-server.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-server + provenance: false + + - name: Extract Docker metadata for Client + id: meta-client + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} + aospace/${{ env.GITHUB_REPOSITORY_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} + flavor: | + prefix=client- + + - name: Build and push Docker image for Client + id: build-and-push-client + uses: docker/build-push-action@v4.2.1 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-client.outputs.tags }} + labels: ${{ steps.meta-client.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-client + provenance: false + + - name: Extract Docker metadata for Server + id: meta-opensource-server + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-server + flavor: | + prefix=opensource-server- + + - name: Build and push Docker image for Server + id: build-and-push-opensource-server + uses: docker/build-push-action@v2 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-opensource-server.outputs.tags }} + labels: ${{ steps.meta-opensource-server.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-server + + - name: Extract Docker metadata for Client + id: meta-opensource-client + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-client + flavor: | + prefix=opensource-client- + + - name: Build and push Docker image for Client + id: build-and-push-opensource-client + uses: docker/build-push-action@v2 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-opensource-client.outputs.tags }} + labels: ${{ steps.meta-opensource-client.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-client \ No newline at end of file From a57e3971a87f40ac246042758a4710ac404ce21b Mon Sep 17 00:00:00 2001 From: Shadow Date: Sun, 24 Sep 2023 23:27:06 +0800 Subject: [PATCH 20/55] Fix. --- .github/workflows/container.yml | 488 ++++++++++++++++---------------- 1 file changed, 244 insertions(+), 244 deletions(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index fe572ee0..af30d82c 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -29,247 +29,247 @@ jobs: id-token: write steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Set up Go - uses: actions/setup-go@v3 - with: - go-version: 1.19 - - - name: package-server - run: |- - sudo apt-get update && sudo apt-get install make git gn ninja-build python3 python3-pip libgtk-3-dev gcc-aarch64-linux-gnu g++-aarch64-linux-gnu gcc-x86-64-linux-gnu g++-x86-64-linux-gnu -y - GOARCH=amd64 make release_server && mv release/linux-amd64-server release/linux-x86_64-server - TARGET=aarch64-linux-gnu GOOS=linux GOARCH=arm64 make release_server && mv release/linux-arm64-server release/linux-aarch64-server - ls -al release - - - name: package-client - run: |- - sudo apt-get update && sudo apt-get install make git gn ninja-build python3 python3-pip libgtk-3-dev gcc-aarch64-linux-gnu g++-aarch64-linux-gnu gcc-x86-64-linux-gnu g++-x86-64-linux-gnu -y - GOARCH=amd64 make release_client && mv release/linux-amd64-client release/linux-x86_64-client - TARGET=aarch64-linux-gnu GOOS=linux GOARCH=arm64 make release_client && mv release/linux-arm64-client release/linux-aarch64-client - ls -al release - - - name: Archive Server artifacts - uses: actions/upload-artifact@v3 - with: - name: gt-server - path: | - release/*-server - - - name: Archive Client artifacts - uses: actions/upload-artifact@v3 - with: - name: gt-client - path: | - release/*-client - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Setup Docker buildx - uses: docker/setup-buildx-action@v2 - - - run: echo "GITHUB_REPOSITORY_NAME=${GITHUB_REPOSITORY#*/}" >> $GITHUB_ENV - shell: bash - - - name: Inspect builder - run: | - echo "Name: ${{ steps.buildx.outputs.name }}" - echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" - echo "Status: ${{ steps.buildx.outputs.status }}" - echo "Flags: ${{ steps.buildx.outputs.flags }}" - echo "Platforms: ${{ steps.buildx.outputs.platforms }}" - - - name: Log into registry ${{ env.REGISTRY }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Log into registry ${{ env.EULIX_REGISTRY }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.EULIX_REGISTRY }} - username: ${{ secrets.EULIX_REGISTRY_USERNAME }} - password: ${{ secrets.EULIX_REGISTRY_PASSWORD }} - - - name: Log into registry Docker Hub - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_HUB_REGISTRY_USERNAME }} - password: ${{ secrets.DOCKER_HUB_REGISTRY_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SH }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_SH }} - username: cn-east-3@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_BJ }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_BJ }} - username: cn-north-4@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_GZ }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_GZ }} - username: cn-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SG }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_SG }} - username: ap-southeast-3@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_HK }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_HK }} - username: ap-southeast-1@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_AF }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_AF }} - username: af-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_LA }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_LA }} - username: la-north-2@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Extract Docker metadata for Server - id: meta-server - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} - aospace/${{ env.GITHUB_REPOSITORY_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} - flavor: | - prefix=server- - - - name: Build and push Docker image for Server - id: build-and-push-server - uses: docker/build-push-action@v4.2.1 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-server.outputs.tags }} - labels: ${{ steps.meta-server.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-server - provenance: false - - - name: Extract Docker metadata for Client - id: meta-client - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} - aospace/${{ env.GITHUB_REPOSITORY_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} - flavor: | - prefix=client- - - - name: Build and push Docker image for Client - id: build-and-push-client - uses: docker/build-push-action@v4.2.1 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-client.outputs.tags }} - labels: ${{ steps.meta-client.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-client - provenance: false - - - name: Extract Docker metadata for Server - id: meta-opensource-server - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-server - flavor: | - prefix=opensource-server- - - - name: Build and push Docker image for Server - id: build-and-push-opensource-server - uses: docker/build-push-action@v2 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-opensource-server.outputs.tags }} - labels: ${{ steps.meta-opensource-server.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-server - - - name: Extract Docker metadata for Client - id: meta-opensource-client - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-client - flavor: | - prefix=opensource-client- - - - name: Build and push Docker image for Client - id: build-and-push-opensource-client - uses: docker/build-push-action@v2 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-opensource-client.outputs.tags }} - labels: ${{ steps.meta-opensource-client.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-client \ No newline at end of file + - uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Set up Go + uses: actions/setup-go@v3 + with: + go-version: 1.19 + + - name: package-server + run: |- + sudo apt-get update && sudo apt-get install make git gn ninja-build python3 python3-pip libgtk-3-dev gcc-aarch64-linux-gnu g++-aarch64-linux-gnu gcc-x86-64-linux-gnu g++-x86-64-linux-gnu -y + GOARCH=amd64 make release_server && mv release/linux-amd64-server release/linux-x86_64-server + TARGET=aarch64-linux-gnu GOOS=linux GOARCH=arm64 make release_server && mv release/linux-arm64-server release/linux-aarch64-server + ls -al release + + - name: package-client + run: |- + sudo apt-get update && sudo apt-get install make git gn ninja-build python3 python3-pip libgtk-3-dev gcc-aarch64-linux-gnu g++-aarch64-linux-gnu gcc-x86-64-linux-gnu g++-x86-64-linux-gnu -y + GOARCH=amd64 make release_client && mv release/linux-amd64-client release/linux-x86_64-client + TARGET=aarch64-linux-gnu GOOS=linux GOARCH=arm64 make release_client && mv release/linux-arm64-client release/linux-aarch64-client + ls -al release + + - name: Archive Server artifacts + uses: actions/upload-artifact@v3 + with: + name: gt-server + path: | + release/*-server + + - name: Archive Client artifacts + uses: actions/upload-artifact@v3 + with: + name: gt-client + path: | + release/*-client + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Setup Docker buildx + uses: docker/setup-buildx-action@v2 + + - run: echo "GITHUB_REPOSITORY_NAME=${GITHUB_REPOSITORY#*/}" >> $GITHUB_ENV + shell: bash + + - name: Inspect builder + run: | + echo "Name: ${{ steps.buildx.outputs.name }}" + echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" + echo "Status: ${{ steps.buildx.outputs.status }}" + echo "Flags: ${{ steps.buildx.outputs.flags }}" + echo "Platforms: ${{ steps.buildx.outputs.platforms }}" + + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Log into registry ${{ env.EULIX_REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.EULIX_REGISTRY }} + username: ${{ secrets.EULIX_REGISTRY_USERNAME }} + password: ${{ secrets.EULIX_REGISTRY_PASSWORD }} + + - name: Log into registry Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_REGISTRY_USERNAME }} + password: ${{ secrets.DOCKER_HUB_REGISTRY_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SH }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_SH }} + username: cn-east-3@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_BJ }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_BJ }} + username: cn-north-4@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_GZ }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_GZ }} + username: cn-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SG }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_SG }} + username: ap-southeast-3@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_HK }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_HK }} + username: ap-southeast-1@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_AF }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_AF }} + username: af-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_LA }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_LA }} + username: la-north-2@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Extract Docker metadata for Server + id: meta-server + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} + aospace/${{ env.GITHUB_REPOSITORY_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} + flavor: | + prefix=server- + + - name: Build and push Docker image for Server + id: build-and-push-server + uses: docker/build-push-action@v4.2.1 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-server.outputs.tags }} + labels: ${{ steps.meta-server.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-server + provenance: false + + - name: Extract Docker metadata for Client + id: meta-client + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} + aospace/${{ env.GITHUB_REPOSITORY_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} + flavor: | + prefix=client- + + - name: Build and push Docker image for Client + id: build-and-push-client + uses: docker/build-push-action@v4.2.1 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-client.outputs.tags }} + labels: ${{ steps.meta-client.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-client + provenance: false + + - name: Extract Docker metadata for Server + id: meta-opensource-server + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-server + flavor: | + prefix=opensource-server- + + - name: Build and push Docker image for Server + id: build-and-push-opensource-server + uses: docker/build-push-action@v2 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-opensource-server.outputs.tags }} + labels: ${{ steps.meta-opensource-server.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-server + + - name: Extract Docker metadata for Client + id: meta-opensource-client + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-client + flavor: | + prefix=opensource-client- + + - name: Build and push Docker image for Client + id: build-and-push-opensource-client + uses: docker/build-push-action@v2 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-opensource-client.outputs.tags }} + labels: ${{ steps.meta-opensource-client.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-client \ No newline at end of file From 5e362877e264900ba22c297985f351dd3765de3a Mon Sep 17 00:00:00 2001 From: Shadow Date: Mon, 25 Sep 2023 21:40:51 +0800 Subject: [PATCH 21/55] Add QUIC support for GT. --- README.md | 11 ++++++----- README_CN.md | 9 +++++---- client/client.go | 24 ++++++++++++++++++++++-- conn/quicConn.go | 36 ++++++++++++++++++++++++------------ server/conn.go | 15 +++++++++++++-- server/server.go | 13 +++++++++++-- 6 files changed, 81 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 18a99f9c..88ded3f9 100644 --- a/README.md +++ b/README.md @@ -329,18 +329,19 @@ options: #### Internal QUIC Penetration - Requirements: There is an intranet server and a public network server, and id1.example.com resolves to the address of the public network server. Hopefully by accessing id1.example.com:8080 - To access the web page served by port 80 on the intranet server. At the same time, QUIC is used to build a transport connection between the client and the server. + To access the web page served by port 80 on the intranet server. Use QUIC to build a transport connection between the client and the server. QUIC uses TLS 1.3 for transport encryption. When the user also gives certFile + and keyFile, use them for encrypted communication. Otherwise, keys and certificates are automatically generated using the ECDSA encryption algorithm. -- Server (Public network server) +- Server (public network server) ```shell -./release/linux-amd64-server -addr 8080 -quicAddr 10080 -id id1 -secret secret1 +./release/linux-amd64-server -addr 8080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 ``` -- Client (Internal network server) +- Client (internal network server), because a self-signed certificate is used, the `-remoteCertInsecure` option is used. This option is prohibited from being used in other cases (man-in-the-middle attacks cause encrypted content to be decrypted ```shell -./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:10080 -id id1 -secret secret1 +./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 ``` #### Client Start Multiple Services Simultaneously diff --git a/README_CN.md b/README_CN.md index 2076ee02..74b1b023 100644 --- a/README_CN.md +++ b/README_CN.md @@ -311,18 +311,19 @@ options: #### QUIC 内网穿透 - 需求:有一台内网服务器和一台公网服务器,id1.example.com 解析到公网服务器的地址。希望通过访问 id1.example.com:8080 - 来访问内网服务器上 80 端口服务的网页。同时用 QUIC 为客户端与服务端之间构建传输连接。 + 来访问内网服务器上 80 端口服务的网页。使用 QUIC 为客户端与服务端之间构建传输连接,QUIC 使用 TLS 1.3 进行传输加密。当用户同时给出certFile + 和keyFile时,使用他们进行加密通信。否则,会使用 ECDSA 加密算法自动生成密钥和证书。 - 服务端(公网服务器) ```shell -./release/linux-amd64-server -addr 8080 -quicAddr 10080 -id id1 -secret secret1 +./release/linux-amd64-server -addr 8080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 ``` -- 客户端(内网服务器) +- 客户端(内网服务器),因为使用了自签名证书,所以使用了 `-remoteCertInsecure` 选项,其它情况禁止使用此选项(中间人攻击导致加密内容被解密 ```shell -./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:10080 -id id1 -secret secret1 +./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 ``` #### 客户端同时开启多个服务 diff --git a/client/client.go b/client/client.go index 48fd0f9a..4e00b691 100644 --- a/client/client.go +++ b/client/client.go @@ -229,9 +229,29 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { d.dialFn = d.dial case "quic": if len(u.Port()) < 1 { - u.Host = net.JoinHostPort(u.Host, "10080") + u.Host = net.JoinHostPort(u.Host, "443") + } + tlsConfig := &tls.Config{} + if len(c.Config().RemoteCert) > 0 { + var cf []byte + cf, err = os.ReadFile(c.Config().RemoteCert) + if err != nil { + err = fmt.Errorf("failed to read remote cert file (-remoteCert option) '%s', cause %s", c.Config().RemoteCert, err.Error()) + return + } + roots := x509.NewCertPool() + ok := roots.AppendCertsFromPEM(cf) + if !ok { + err = fmt.Errorf("failed to parse remote cert file (-remoteCert option) '%s'", c.Config().RemoteCert) + return + } + tlsConfig.RootCAs = roots + } + if c.Config().RemoteCertInsecure { + tlsConfig.InsecureSkipVerify = true } d.host = u.Host + d.tlsConfig = tlsConfig d.dialFn = d.quicDial default: err = fmt.Errorf("remote url (-remote option) '%s' is invalid", remote) @@ -291,7 +311,7 @@ func (d *dialer) tlsDial() (conn net.Conn, err error) { } func (d *dialer) quicDial() (conn net.Conn, err error) { - return connection.QuicDial(d.host) + return connection.QuicDial(d.host, d.tlsConfig) } // Start runs the client agent. diff --git a/conn/quicConn.go b/conn/quicConn.go index 9ca9ca98..71162724 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -2,8 +2,9 @@ package conn import ( "context" + "crypto/ecdsa" + "crypto/elliptic" "crypto/rand" - "crypto/rsa" "crypto/tls" "crypto/x509" "encoding/pem" @@ -24,13 +25,16 @@ type QuicListener struct { var _ net.Conn = &QuicConnection{} var _ net.Listener = &QuicListener{} -func QuicDial(addr string) (net.Conn, error) { - tlsConf := &tls.Config{ - InsecureSkipVerify: true, - NextProtos: []string{"quic-echo-example"}, +func QuicDial(addr string, config *tls.Config) (net.Conn, error) { + config.NextProtos = []string{"gt-quic"} + conn, err := quic.DialAddr(context.Background(), addr, config, &quic.Config{}) + if err != nil { + panic(err) } - conn, _ := quic.DialAddr(context.Background(), addr, tlsConf, &quic.Config{}) stream, err := conn.OpenStreamSync(context.Background()) + if err != nil { + panic(err) + } nc := &QuicConnection{ Connection: conn, Stream: stream, @@ -38,8 +42,12 @@ func QuicDial(addr string) (net.Conn, error) { return nc, err } -func QuicListen(addr string) (net.Listener, error) { - listener, err := quic.ListenAddr(addr, GenerateTLSConfig(), nil) +func QuicListen(addr string, config *tls.Config) (net.Listener, error) { + config.NextProtos = []string{"gt-quic"} + listener, err := quic.ListenAddr(addr, config, &quic.Config{}) + if err != nil { + panic(err) + } ln := &QuicListener{ Listener: *listener, } @@ -57,16 +65,20 @@ func (ln *QuicListener) Accept() (net.Conn, error) { } func GenerateTLSConfig() *tls.Config { - key, err := rsa.GenerateKey(rand.Reader, 1024) + ecdsaKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { panic(err) } template := x509.Certificate{SerialNumber: big.NewInt(1)} - certDER, err := x509.CreateCertificate(rand.Reader, &template, &template, &key.PublicKey, key) + certDER, err := x509.CreateCertificate(rand.Reader, &template, &template, &ecdsaKey.PublicKey, ecdsaKey) + if err != nil { + panic(err) + } + keyBytes, err := x509.MarshalECPrivateKey(ecdsaKey) if err != nil { panic(err) } - keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)}) + keyPEM := pem.EncodeToMemory(&pem.Block{Type: "ECDSA PRIVATE KEY", Bytes: keyBytes}) certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER}) tlsCert, err := tls.X509KeyPair(certPEM, keyPEM) @@ -75,6 +87,6 @@ func GenerateTLSConfig() *tls.Config { } return &tls.Config{ Certificates: []tls.Certificate{tlsCert}, - NextProtos: []string{"quic-echo-example"}, + NextProtos: []string{"gt-quic"}, } } diff --git a/server/conn.go b/server/conn.go index f15b56e4..3be6eef8 100644 --- a/server/conn.go +++ b/server/conn.go @@ -137,8 +137,19 @@ func (c *conn) handle(handleFunc func() bool) { c.Logger = c.Logger.With().Time("tunnel", time.Now()).Logger() - remoteAddr := c.RemoteAddr().String() - remoteIP := strings.Split(remoteAddr, ":")[0] + remoteTcpAddr, okTcp := c.RemoteAddr().(*net.TCPAddr) + var remoteIP string + if okTcp { + remoteIP = remoteTcpAddr.IP.String() + } else { + remoteUdpAddr, okUdp := c.RemoteAddr().(*net.UDPAddr) + if okUdp { + remoteIP = remoteUdpAddr.IP.String() + } else { + c.Logger.Warn().Msg("conn is not tcp/udp conn") + return + } + } c.server.reconnectRWMutex.RLock() reconnectTimes := c.server.reconnect[remoteIP] diff --git a/server/server.go b/server/server.go index d96e8013..99a5d388 100644 --- a/server/server.go +++ b/server/server.go @@ -148,12 +148,21 @@ func (s *Server) listen() (err error) { } func (s *Server) quicListen() (err error) { - s.quicListener, err = connection.QuicListen(s.config.QuicAddr) + var tlsConfig *tls.Config + if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { + tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) + } else { + tlsConfig = connection.GenerateTLSConfig() + } + if err != nil { + return + } + s.quicListener, err = connection.QuicListen(s.config.QuicAddr, tlsConfig) if err != nil { err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicAddr, err.Error()) return } - s.Logger.Info().Str("addr", s.quicListener.Addr().String()).Msg("Listening") + s.Logger.Info().Str("QuicAddr", s.quicListener.Addr().String()).Msg("Listening") go s.acceptLoop(s.quicListener, func(c *conn) { c.handle(c.handleHTTP) }) From e44abff985cb5276cea44ad224f7c6c89ed106a9 Mon Sep 17 00:00:00 2001 From: Shadow Date: Tue, 26 Sep 2023 23:24:01 +0800 Subject: [PATCH 22/55] Add QUIC support for GT. --- server/server.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/server/server.go b/server/server.go index 99a5d388..360a86c5 100644 --- a/server/server.go +++ b/server/server.go @@ -169,6 +169,28 @@ func (s *Server) quicListen() (err error) { return } +func (s *Server) autoListen() (err error) { + var tlsConfig *tls.Config + if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { + tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) + } else { + tlsConfig = connection.GenerateTLSConfig() + } + if err != nil { + return + } + s.quicListener, err = connection.QuicListen(s.config.QuicAddr, tlsConfig) + if err != nil { + err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicAddr, err.Error()) + return + } + s.Logger.Info().Str("QuicAddr", s.quicListener.Addr().String()).Msg("Listening") + go s.acceptLoop(s.quicListener, func(c *conn) { + c.handle(c.handleHTTP) + }) + return +} + func (s *Server) sniListen() (err error) { s.sniListener, err = net.Listen("tcp", s.config.SNIAddr) if err != nil { From 03ec09b8dd0e5648073111ec312dd320bf69a4d0 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 27 Sep 2023 01:02:32 +0800 Subject: [PATCH 23/55] Add QUIC support for GT. --- .github/workflows/container.yml | 380 ++++++++++++++++---------------- README.md | 17 ++ README_CN.md | 19 +- client/client.go | 24 ++ go.mod | 7 +- go.sum | 6 + server/config.go | 3 +- server/server.go | 29 +-- 8 files changed, 270 insertions(+), 215 deletions(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index af30d82c..ea0d0b58 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -83,193 +83,193 @@ jobs: echo "Flags: ${{ steps.buildx.outputs.flags }}" echo "Platforms: ${{ steps.buildx.outputs.platforms }}" - - name: Log into registry ${{ env.REGISTRY }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Log into registry ${{ env.EULIX_REGISTRY }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.EULIX_REGISTRY }} - username: ${{ secrets.EULIX_REGISTRY_USERNAME }} - password: ${{ secrets.EULIX_REGISTRY_PASSWORD }} - - - name: Log into registry Docker Hub - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_HUB_REGISTRY_USERNAME }} - password: ${{ secrets.DOCKER_HUB_REGISTRY_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SH }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_SH }} - username: cn-east-3@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_BJ }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_BJ }} - username: cn-north-4@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_GZ }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_GZ }} - username: cn-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SG }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_SG }} - username: ap-southeast-3@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_HK }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_HK }} - username: ap-southeast-1@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_AF }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_AF }} - username: af-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_LA }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ${{ env.HUAWEICLOUD_REGISTRY_LA }} - username: la-north-2@${{ secrets.HUAWEICLOUD_USERNAME }} - password: ${{ secrets.HUAWEICLOUD_PASSWORD }} - - - name: Extract Docker metadata for Server - id: meta-server - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} - aospace/${{ env.GITHUB_REPOSITORY_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} - flavor: | - prefix=server- - - - name: Build and push Docker image for Server - id: build-and-push-server - uses: docker/build-push-action@v4.2.1 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-server.outputs.tags }} - labels: ${{ steps.meta-server.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-server - provenance: false - - - name: Extract Docker metadata for Client - id: meta-client - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} - aospace/${{ env.GITHUB_REPOSITORY_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} - ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} - flavor: | - prefix=client- - - - name: Build and push Docker image for Client - id: build-and-push-client - uses: docker/build-push-action@v4.2.1 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-client.outputs.tags }} - labels: ${{ steps.meta-client.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-client - provenance: false - - - name: Extract Docker metadata for Server - id: meta-opensource-server - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-server - flavor: | - prefix=opensource-server- - - - name: Build and push Docker image for Server - id: build-and-push-opensource-server - uses: docker/build-push-action@v2 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-opensource-server.outputs.tags }} - labels: ${{ steps.meta-opensource-server.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-server - - - name: Extract Docker metadata for Client - id: meta-opensource-client - uses: docker/metadata-action@v2 - with: - images: | - ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-client - flavor: | - prefix=opensource-client- - - - name: Build and push Docker image for Client - id: build-and-push-opensource-client - uses: docker/build-push-action@v2 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta-opensource-client.outputs.tags }} - labels: ${{ steps.meta-opensource-client.outputs.labels }} - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64,linux/arm64 - cache-from: type=gha - cache-to: type=gha,mode=max - file: Dockerfile-client \ No newline at end of file +# - name: Log into registry ${{ env.REGISTRY }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.REGISTRY }} +# username: ${{ github.actor }} +# password: ${{ secrets.GITHUB_TOKEN }} +# +# - name: Log into registry ${{ env.EULIX_REGISTRY }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.EULIX_REGISTRY }} +# username: ${{ secrets.EULIX_REGISTRY_USERNAME }} +# password: ${{ secrets.EULIX_REGISTRY_PASSWORD }} +# +# - name: Log into registry Docker Hub +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# username: ${{ secrets.DOCKER_HUB_REGISTRY_USERNAME }} +# password: ${{ secrets.DOCKER_HUB_REGISTRY_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SH }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_SH }} +# username: cn-east-3@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_BJ }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_BJ }} +# username: cn-north-4@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_GZ }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_GZ }} +# username: cn-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SG }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_SG }} +# username: ap-southeast-3@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_HK }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_HK }} +# username: ap-southeast-1@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_AF }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_AF }} +# username: af-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_LA }} +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v2 +# with: +# registry: ${{ env.HUAWEICLOUD_REGISTRY_LA }} +# username: la-north-2@${{ secrets.HUAWEICLOUD_USERNAME }} +# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} +# +# - name: Extract Docker metadata for Server +# id: meta-server +# uses: docker/metadata-action@v2 +# with: +# images: | +# ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} +# ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} +# aospace/${{ env.GITHUB_REPOSITORY_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} +# flavor: | +# prefix=server- +# +# - name: Build and push Docker image for Server +# id: build-and-push-server +# uses: docker/build-push-action@v4.2.1 +# with: +# context: . +# push: ${{ github.event_name != 'pull_request' }} +# tags: ${{ steps.meta-server.outputs.tags }} +# labels: ${{ steps.meta-server.outputs.labels }} +# builder: ${{ steps.buildx.outputs.name }} +# platforms: linux/amd64,linux/arm64 +# cache-from: type=gha +# cache-to: type=gha,mode=max +# file: Dockerfile-server +# provenance: false +# +# - name: Extract Docker metadata for Client +# id: meta-client +# uses: docker/metadata-action@v2 +# with: +# images: | +# ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} +# ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} +# aospace/${{ env.GITHUB_REPOSITORY_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} +# ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} +# flavor: | +# prefix=client- +# +# - name: Build and push Docker image for Client +# id: build-and-push-client +# uses: docker/build-push-action@v4.2.1 +# with: +# context: . +# push: ${{ github.event_name != 'pull_request' }} +# tags: ${{ steps.meta-client.outputs.tags }} +# labels: ${{ steps.meta-client.outputs.labels }} +# builder: ${{ steps.buildx.outputs.name }} +# platforms: linux/amd64,linux/arm64 +# cache-from: type=gha +# cache-to: type=gha,mode=max +# file: Dockerfile-client +# provenance: false +# +# - name: Extract Docker metadata for Server +# id: meta-opensource-server +# uses: docker/metadata-action@v2 +# with: +# images: | +# ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-server +# flavor: | +# prefix=opensource-server- +# +# - name: Build and push Docker image for Server +# id: build-and-push-opensource-server +# uses: docker/build-push-action@v2 +# with: +# context: . +# push: ${{ github.event_name != 'pull_request' }} +# tags: ${{ steps.meta-opensource-server.outputs.tags }} +# labels: ${{ steps.meta-opensource-server.outputs.labels }} +# builder: ${{ steps.buildx.outputs.name }} +# platforms: linux/amd64,linux/arm64 +# cache-from: type=gha +# cache-to: type=gha,mode=max +# file: Dockerfile-server +# +# - name: Extract Docker metadata for Client +# id: meta-opensource-client +# uses: docker/metadata-action@v2 +# with: +# images: | +# ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-client +# flavor: | +# prefix=opensource-client- +# +# - name: Build and push Docker image for Client +# id: build-and-push-opensource-client +# uses: docker/build-push-action@v2 +# with: +# context: . +# push: ${{ github.event_name != 'pull_request' }} +# tags: ${{ steps.meta-opensource-client.outputs.tags }} +# labels: ${{ steps.meta-opensource-client.outputs.labels }} +# builder: ${{ steps.buildx.outputs.name }} +# platforms: linux/amd64,linux/arm64 +# cache-from: type=gha +# cache-to: type=gha,mode=max +# file: Dockerfile-client \ No newline at end of file diff --git a/README.md b/README.md index 88ded3f9..d81290cc 100644 --- a/README.md +++ b/README.md @@ -344,6 +344,23 @@ options: ./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 ``` +#### Intelligent Internal Penetration (Adaptive Selection of TCP/QUIC) + +- Requirements: There is an intranet server and a public network server, and id1.example.com resolves to the address of the public network server. Hopefully by accessing id1.example.com:8080 + To access the web page served by port 80 on the intranet server. GT adaptively selects whether to use TCP or QUIC for intranet penetration based on the network delay and packet loss rate between the intranet server and the public network server. + +- Server (public network server) + +```shell +./release/linux-amd64-server -addr 8080 -autoAddr 443 -id id1 -secret secret1 +``` + +- Client (intranet server). If QUIC is selected, a self-signed certificate is required, so the `-remoteCertInsecure` option is used. + +```shell +./release/linux-amd64-client -local http://127.0.0.1:80 -remote auto://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 +``` + #### Client Start Multiple Services Simultaneously - Requirement: There is an internal network server and a public network server, and id1-1.example.com and diff --git a/README_CN.md b/README_CN.md index 74b1b023..f474d918 100644 --- a/README_CN.md +++ b/README_CN.md @@ -320,12 +320,29 @@ options: ./release/linux-amd64-server -addr 8080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 ``` -- 客户端(内网服务器),因为使用了自签名证书,所以使用了 `-remoteCertInsecure` 选项,其它情况禁止使用此选项(中间人攻击导致加密内容被解密 +- 客户端(内网服务器),因为使用了自签名证书,所以使用了 `-remoteCertInsecure` 选项,其它情况禁止使用此选项(中间人攻击导致加密内容被解密)。 ```shell ./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 ``` +#### 智能内网穿透(自适应选择 TCP/QUIC ) + +- 需求:有一台内网服务器和一台公网服务器,id1.example.com 解析到公网服务器的地址。希望通过访问 id1.example.com:8080 + 来访问内网服务器上 80 端口服务的网页。GT根据内网服务器和公网服务器之间网络的时延和丢包率,自适应选择使用 TCP 还是 QUIC 进行内网穿透。 + +- 服务端(公网服务器) + +```shell +./release/linux-amd64-server -addr 8080 -autoAddr 443 -id id1 -secret secret1 +``` + +- 客户端(内网服务器)。如果选择了QUIC则需要使用自签名证书,所以使用了 `-remoteCertInsecure` 选项。 + +```shell +./release/linux-amd64-client -local http://127.0.0.1:80 -remote auto://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 +``` + #### 客户端同时开启多个服务 - 需求:有一台内网服务器和一台公网服务器,id1-1.example.com 和 id1-2.example.com 解析到公网服务器的地址。希望通过访问 diff --git a/client/client.go b/client/client.go index 4e00b691..c5a6ea1d 100644 --- a/client/client.go +++ b/client/client.go @@ -46,6 +46,7 @@ import ( "github.com/isrc-cas/gt/pool" "github.com/isrc-cas/gt/predef" "github.com/isrc-cas/gt/util" + probing "github.com/prometheus-community/pro-bing" "github.com/shirou/gopsutil/process" ) @@ -227,6 +228,29 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { } d.host = u.Host d.dialFn = d.dial + case "auto": + if len(u.Port()) < 1 { + u.Host = net.JoinHostPort(u.Host, "443") + } + d.host = u.Host + + pinger, err := probing.NewPinger(u.Host) + if err != nil { + panic(err) + } + pinger.Count = 10 + err = pinger.Run() + if err != nil { + panic(err) + } + stats := pinger.Statistics() + avgRtt := float64(stats.AvgRtt.Microseconds()) / 1000 + pktLoss := stats.PacketLoss + if pktLoss < 1 || avgRtt < 1000 { + d.dialFn = d.dial + } else { + d.dialFn = d.quicDial + } case "quic": if len(u.Port()) < 1 { u.Host = net.JoinHostPort(u.Host, "443") diff --git a/go.mod b/go.mod index 7dd01d09..73022cfc 100644 --- a/go.mod +++ b/go.mod @@ -10,11 +10,13 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/hashicorp/golang-lru/v2 v2.0.3 github.com/jonboulle/clockwork v0.2.2 + github.com/kr/pretty v0.3.1 github.com/lestrrat-go/strftime v1.0.5 github.com/mattn/go-pointer v0.0.1 github.com/pion/logging v0.2.2 github.com/pion/turn/v3 v3.0.1 github.com/pkg/errors v0.9.1 + github.com/prometheus-community/pro-bing v0.3.0 github.com/quic-go/quic-go v0.35.0 github.com/rs/zerolog v1.30.0 github.com/shirou/gopsutil v3.21.11+incompatible @@ -28,7 +30,8 @@ require ( github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang/mock v1.6.0 // indirect github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect - github.com/kr/pretty v0.3.1 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/onsi/ginkgo/v2 v2.9.5 // indirect @@ -40,6 +43,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/quic-go/qtls-go1-19 v0.3.2 // indirect github.com/quic-go/qtls-go1-20 v0.3.3 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect @@ -47,6 +51,7 @@ require ( golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect golang.org/x/mod v0.10.0 // indirect golang.org/x/net v0.15.0 // indirect + golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.12.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.9.1 // indirect diff --git a/go.sum b/go.sum index b9c54acc..8f118c60 100644 --- a/go.sum +++ b/go.sum @@ -27,6 +27,8 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= @@ -76,6 +78,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus-community/pro-bing v0.3.0 h1:SFT6gHqXwbItEDJhTkzPWVqU6CLEtqEfNAPp47RUON4= +github.com/prometheus-community/pro-bing v0.3.0/go.mod h1:p9dLb9zdmv+eLxWfCT6jESWuDrS+YzpPkQBgysQF8a0= github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= @@ -136,6 +140,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/server/config.go b/server/config.go index 95549a12..bf910103 100644 --- a/server/config.go +++ b/server/config.go @@ -90,7 +90,8 @@ type Options struct { LogLevel string `yaml:"logLevel" usage:"Log level: trace, debug, info, warn, error, fatal, panic, disable"` Version bool `arg:"version" yaml:"-" usage:"Show the version of this program"` - QuicAddr string `yaml:"quicAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '10080', ':10080' or '0.0.0.0:10080'"` + QuicAddr string `yaml:"quicAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` + AutoAddr string `yaml:"autoAddr" usage:"The address for intelligent Internal penetration to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` } func defaultConfig() Config { diff --git a/server/server.go b/server/server.go index 360a86c5..e8bce6b9 100644 --- a/server/server.go +++ b/server/server.go @@ -169,28 +169,6 @@ func (s *Server) quicListen() (err error) { return } -func (s *Server) autoListen() (err error) { - var tlsConfig *tls.Config - if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { - tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) - } else { - tlsConfig = connection.GenerateTLSConfig() - } - if err != nil { - return - } - s.quicListener, err = connection.QuicListen(s.config.QuicAddr, tlsConfig) - if err != nil { - err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicAddr, err.Error()) - return - } - s.Logger.Info().Str("QuicAddr", s.quicListener.Addr().String()).Msg("Listening") - go s.acceptLoop(s.quicListener, func(c *conn) { - c.handle(c.handleHTTP) - }) - return -} - func (s *Server) sniListen() (err error) { s.sniListener, err = net.Listen("tcp", s.config.SNIAddr) if err != nil { @@ -320,6 +298,13 @@ func (s *Server) Start() (err error) { } listening = true } + if len(s.config.AutoAddr) > 0 { + if strings.IndexByte(s.config.AutoAddr, ':') == -1 { + s.config.AutoAddr = ":" + s.config.AutoAddr + } + s.config.QuicAddr = s.config.AutoAddr + s.config.Addr = s.config.AutoAddr + } if len(s.config.QuicAddr) > 0 { if strings.IndexByte(s.config.QuicAddr, ':') == -1 { s.config.QuicAddr = ":" + s.config.QuicAddr From 6938a5cc5a797e5c5ea722a24b8fadf977765893 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 27 Sep 2023 01:20:18 +0800 Subject: [PATCH 24/55] Add intelligent switch support for GT. --- client/client.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/client.go b/client/client.go index c5a6ea1d..9c0c575e 100644 --- a/client/client.go +++ b/client/client.go @@ -234,7 +234,8 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { } d.host = u.Host - pinger, err := probing.NewPinger(u.Host) + pureAddr, _, _ := net.SplitHostPort(d.host) + pinger, err := probing.NewPinger(pureAddr) if err != nil { panic(err) } @@ -327,6 +328,7 @@ func (d *dialer) initWithRemoteAPI(c *Client) (err error) { } func (d *dialer) dial() (conn net.Conn, err error) { + fmt.Println("GT chooses TCP !!!") return net.Dial("tcp", d.host) } @@ -335,6 +337,7 @@ func (d *dialer) tlsDial() (conn net.Conn, err error) { } func (d *dialer) quicDial() (conn net.Conn, err error) { + fmt.Println("GT chooses QUIC !!!") return connection.QuicDial(d.host, d.tlsConfig) } From f28aeb6369923b3c0d3afcb1320d4502dce1066f Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 27 Sep 2023 17:39:05 +0800 Subject: [PATCH 25/55] Add intelligent switch support for GT. --- README.md | 4 ++-- README_CN.md | 4 ++-- client/client.go | 29 ++++++++++++++++++++++++++--- server/server.go | 14 +++++++------- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index d81290cc..f22bb24e 100644 --- a/README.md +++ b/README.md @@ -347,12 +347,12 @@ options: #### Intelligent Internal Penetration (Adaptive Selection of TCP/QUIC) - Requirements: There is an intranet server and a public network server, and id1.example.com resolves to the address of the public network server. Hopefully by accessing id1.example.com:8080 - To access the web page served by port 80 on the intranet server. GT adaptively selects whether to use TCP or QUIC for intranet penetration based on the network delay and packet loss rate between the intranet server and the public network server. + To access the web page served by port 80 on the intranet server. GT adaptively selects whether to use TCP+TLS or QUIC for intranet penetration based on the network delay and packet loss rate between the intranet server and the public network server. - Server (public network server) ```shell -./release/linux-amd64-server -addr 8080 -autoAddr 443 -id id1 -secret secret1 +./release/linux-amd64-server -addr 8080 -autoAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 ``` - Client (intranet server). If QUIC is selected, a self-signed certificate is required, so the `-remoteCertInsecure` option is used. diff --git a/README_CN.md b/README_CN.md index f474d918..91b5c462 100644 --- a/README_CN.md +++ b/README_CN.md @@ -329,12 +329,12 @@ options: #### 智能内网穿透(自适应选择 TCP/QUIC ) - 需求:有一台内网服务器和一台公网服务器,id1.example.com 解析到公网服务器的地址。希望通过访问 id1.example.com:8080 - 来访问内网服务器上 80 端口服务的网页。GT根据内网服务器和公网服务器之间网络的时延和丢包率,自适应选择使用 TCP 还是 QUIC 进行内网穿透。 + 来访问内网服务器上 80 端口服务的网页。GT根据内网服务器和公网服务器之间网络的时延和丢包率,自适应选择使用 TCP+TLS 还是 QUIC 进行内网穿透。 - 服务端(公网服务器) ```shell -./release/linux-amd64-server -addr 8080 -autoAddr 443 -id id1 -secret secret1 +./release/linux-amd64-server -addr 8080 -autoAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 ``` - 客户端(内网服务器)。如果选择了QUIC则需要使用自签名证书,所以使用了 `-remoteCertInsecure` 选项。 diff --git a/client/client.go b/client/client.go index 9c0c575e..f66f0e39 100644 --- a/client/client.go +++ b/client/client.go @@ -232,8 +232,29 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { if len(u.Port()) < 1 { u.Host = net.JoinHostPort(u.Host, "443") } + tlsConfig := &tls.Config{} + if len(c.Config().RemoteCert) > 0 { + var cf []byte + cf, err = os.ReadFile(c.Config().RemoteCert) + if err != nil { + err = fmt.Errorf("failed to read remote cert file (-remoteCert option) '%s', cause %s", c.Config().RemoteCert, err.Error()) + return + } + roots := x509.NewCertPool() + ok := roots.AppendCertsFromPEM(cf) + if !ok { + err = fmt.Errorf("failed to parse remote cert file (-remoteCert option) '%s'", c.Config().RemoteCert) + return + } + tlsConfig.RootCAs = roots + } + if c.Config().RemoteCertInsecure { + tlsConfig.InsecureSkipVerify = true + } d.host = u.Host + d.tlsConfig = tlsConfig + fmt.Println("GT is waiting to probes to get network conditions !") pureAddr, _, _ := net.SplitHostPort(d.host) pinger, err := probing.NewPinger(pureAddr) if err != nil { @@ -247,11 +268,15 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { stats := pinger.Statistics() avgRtt := float64(stats.AvgRtt.Microseconds()) / 1000 pktLoss := stats.PacketLoss + if pktLoss < 1 || avgRtt < 1000 { - d.dialFn = d.dial + fmt.Println("According to network conditions, GT has choose to establish TCP+TLS connection for penetration !") + d.dialFn = d.tlsDial } else { + fmt.Println("According to network conditions, GT has choose to establish QUIC connection for penetration !") d.dialFn = d.quicDial } + case "quic": if len(u.Port()) < 1 { u.Host = net.JoinHostPort(u.Host, "443") @@ -328,7 +353,6 @@ func (d *dialer) initWithRemoteAPI(c *Client) (err error) { } func (d *dialer) dial() (conn net.Conn, err error) { - fmt.Println("GT chooses TCP !!!") return net.Dial("tcp", d.host) } @@ -337,7 +361,6 @@ func (d *dialer) tlsDial() (conn net.Conn, err error) { } func (d *dialer) quicDial() (conn net.Conn, err error) { - fmt.Println("GT chooses QUIC !!!") return connection.QuicDial(d.host, d.tlsConfig) } diff --git a/server/server.go b/server/server.go index e8bce6b9..73e5f051 100644 --- a/server/server.go +++ b/server/server.go @@ -288,6 +288,13 @@ func (s *Server) Start() (err error) { } var listening bool + if len(s.config.AutoAddr) > 0 { + if strings.IndexByte(s.config.AutoAddr, ':') == -1 { + s.config.AutoAddr = ":" + s.config.AutoAddr + } + s.config.QuicAddr = s.config.AutoAddr + s.config.TLSAddr = s.config.AutoAddr + } if len(s.config.TLSAddr) > 0 && len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { if strings.IndexByte(s.config.TLSAddr, ':') == -1 { s.config.TLSAddr = ":" + s.config.TLSAddr @@ -298,13 +305,6 @@ func (s *Server) Start() (err error) { } listening = true } - if len(s.config.AutoAddr) > 0 { - if strings.IndexByte(s.config.AutoAddr, ':') == -1 { - s.config.AutoAddr = ":" + s.config.AutoAddr - } - s.config.QuicAddr = s.config.AutoAddr - s.config.Addr = s.config.AutoAddr - } if len(s.config.QuicAddr) > 0 { if strings.IndexByte(s.config.QuicAddr, ':') == -1 { s.config.QuicAddr = ":" + s.config.QuicAddr From 06817587ada4e28e240c46dc6e094b6dd7e9d3e4 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 27 Sep 2023 21:04:56 +0800 Subject: [PATCH 26/55] Add intelligent switch support for GT. --- client/client.go | 11 +- conn/quicXgboost.go | 14053 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 14060 insertions(+), 4 deletions(-) create mode 100644 conn/quicXgboost.go diff --git a/client/client.go b/client/client.go index f66f0e39..6b67e15a 100644 --- a/client/client.go +++ b/client/client.go @@ -254,7 +254,7 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { d.host = u.Host d.tlsConfig = tlsConfig - fmt.Println("GT is waiting to probes to get network conditions !") + fmt.Println("GT is waiting for probes to get network conditions !") pureAddr, _, _ := net.SplitHostPort(d.host) pinger, err := probing.NewPinger(pureAddr) if err != nil { @@ -269,12 +269,15 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { avgRtt := float64(stats.AvgRtt.Microseconds()) / 1000 pktLoss := stats.PacketLoss - if pktLoss < 1 || avgRtt < 1000 { + var networkCondition = []float64{0, 0, 0, 0, avgRtt, pktLoss, 0, 0, 0, 0} + result := connection.PredictWithRttAndLoss(networkCondition) + + if result[1] > result[0] { fmt.Println("According to network conditions, GT has choose to establish TCP+TLS connection for penetration !") - d.dialFn = d.tlsDial + d.dialFn = d.quicDial } else { fmt.Println("According to network conditions, GT has choose to establish QUIC connection for penetration !") - d.dialFn = d.quicDial + d.dialFn = d.tlsDial } case "quic": diff --git a/conn/quicXgboost.go b/conn/quicXgboost.go new file mode 100644 index 00000000..c3a5ece2 --- /dev/null +++ b/conn/quicXgboost.go @@ -0,0 +1,14053 @@ +// 基于网络数据训练的XGBOOST模型,通过输入10种网络参数来判断在TCP和QUIC之间进行切换 +// 其中,第5个参数是Average RTT,第6个参数是Retransmission Rate(也就是Loss Rate) +// 我目前只用了这两个参数,并且将其他参数设置为中间值(归一化后为0.5) +package conn + +import "math" + +func PredictWithRttAndLoss(input []float64) (output []float64) { + // 0.0, 714.0, 0.0, 1.0 + minmax := [40]float64{59.98, 25034.82, 17.07, 19686.81, 0.0, 714.0, 0.0, 1.0, 0.0, 0.04, 0.0, 5.97, 0.0, 64.95, 0.05, 173.0, 0.0, 3653.28, 1444.62, 22247439.28, 0.78, 332.95, 0.0, 3653.28, 1.05, 24609.41, 0.0, 0.0, 1470.8, 23098448.76, 17.0, 55957.0, 0.01, 346.34, 22.0, 7648.0, 0.02, 19.7, 4.0, 3329.0} + index := [10]int{19, 18, 0, 1, 2, 3, 10, 12, 17, 16} + var min, max float64 + var i int + for i = 0; i < 10; i++ { + if i == 4 || i == 5 { + min = minmax[(index[i])*2] + max = minmax[(index[i])*2+1] + input[i] = (input[i] - min) / (max - min) + } else { + input[i] = 0.5 + } + } + output = PredictQuic(input) + return +} + +func PredictQuic(input []float64) (output []float64) { + var var0 float64 + if (input[5]) >= (0.0149999997) { + if (input[0]) >= (0.159849614) { + if (input[0]) >= (0.216691732) { + var0 = -0.572813094 + } else { + var0 = -0.311111122 + } + } else { + if (input[8]) >= (0.0152766854) { + var0 = 0.444334298 + } else { + var0 = 0.0242833067 + } + } + } else { + if (input[0]) >= (0.00436090212) { + if (input[8]) >= (0.031930238) { + var0 = 0.0370392464 + } else { + var0 = -0.353850394 + } + } else { + if (input[8]) >= (0.00963808037) { + var0 = 0.36658439 + } else { + var0 = -0.283420235 + } + } + } + var var1 float64 + if (input[5]) >= (0.0149999997) { + if (input[4]) >= (0.454481781) { + if (input[8]) >= (0.0550091788) { + var1 = -0.42011413 + } else { + var1 = 0.192185894 + } + } else { + if (input[1]) >= (0.00584349595) { + var1 = 0.264506042 + } else { + var1 = -0.145630911 + } + } + } else { + if (input[8]) >= (0.0147521636) { + if (input[4]) >= (0.586134434) { + var1 = -0.5554263 + } else { + var1 = -0.00105327053 + } + } else { + if (input[4]) >= (0.0231092442) { + var1 = -0.386027604 + } else { + var1 = -0.043842759 + } + } + } + var var2 float64 + if (input[0]) >= (0.121954888) { + if (input[0]) >= (0.215488732) { + if (input[0]) >= (0.286766917) { + var2 = -0.531239867 + } else { + var2 = -0.41979903 + } + } else { + if (input[5]) >= (0.0649999976) { + var2 = -0.0372177586 + } else { + var2 = -0.35158816 + } + } + } else { + if (input[5]) >= (0.0350000001) { + if (input[5]) >= (0.075000003) { + var2 = 0.378035128 + } else { + var2 = 0.237042323 + } + } else { + if (input[4]) >= (0.171568632) { + var2 = 0.220630035 + } else { + var2 = -0.138115883 + } + } + } + var var3 float64 + if (input[0]) >= (0.00586466165) { + if (input[3]) >= (0.00966230407) { + if (input[0]) >= (0.121654138) { + var3 = -0.202393159 + } else { + var3 = 0.183222726 + } + } else { + if (input[1]) >= (0.0266768299) { + var3 = -0.292001992 + } else { + var3 = 0.0334668532 + } + } + } else { + if (input[1]) >= (0.0363312997) { + if (input[3]) >= (0.0055948887) { + var3 = 0.356681138 + } else { + var3 = 0.0126470951 + } + } else { + if (input[1]) >= (0.0261687003) { + var3 = 0.305369139 + } else { + var3 = 0.466962814 + } + } + } + var var4 float64 + if (input[5]) >= (0.0149999997) { + if (input[0]) >= (0.155338347) { + if (input[0]) >= (0.230827063) { + var4 = -0.383458346 + } else { + var4 = -0.197610915 + } + } else { + if (input[8]) >= (0.015670076) { + var4 = 0.221789971 + } else { + var4 = -0.0485177711 + } + } + } else { + if (input[0]) >= (0.00646616518) { + if (input[8]) >= (0.0219643321) { + var4 = 0.00712656416 + } else { + var4 = -0.272471577 + } + } else { + if (input[8]) >= (0.0135719907) { + var4 = 0.432083249 + } else { + var4 = 0.00331402221 + } + } + } + var var5 float64 + if (input[8]) >= (0.0147521636) { + if (input[4]) >= (0.565126061) { + if (input[2]) >= (0.0166273341) { + var5 = -0.349328935 + } else { + var5 = 0.249086246 + } + } else { + if (input[8]) >= (0.0329792798) { + var5 = 0.106953658 + } else { + var5 = -0.0184853766 + } + } + } else { + if (input[8]) >= (0.0108182533) { + if (input[5]) >= (0.0949999988) { + var5 = 0.439800948 + } else { + var5 = -0.254668027 + } + } else { + if (input[4]) >= (0.0231092442) { + var5 = -0.0696059614 + } else { + var5 = 0.157901287 + } + } + } + var var6 float64 + if (input[8]) >= (0.015014424) { + if (input[2]) >= (0.0036883119) { + if (input[8]) >= (0.0325858891) { + var6 = 0.0545697547 + } else { + var6 = -0.0370239913 + } + } else { + if (input[9]) >= (0.0732538328) { + var6 = 0.323456496 + } else { + var6 = 0.133118644 + } + } + } else { + if (input[8]) >= (0.0106871231) { + if (input[7]) >= (8.55400358e-05) { + var6 = -0.193980068 + } else { + var6 = 0.150658861 + } + } else { + if (input[6]) >= (0.00787247531) { + var6 = -0.263908774 + } else { + var6 = 0.118103497 + } + } + } + var var7 float64 + if (input[0]) >= (0.1075188) { + if (input[2]) >= (0.0375131518) { + if (input[0]) >= (0.176090226) { + var7 = -0.344046384 + } else { + var7 = -0.0107122902 + } + } else { + if (input[1]) >= (0.0419207327) { + var7 = -0.567163348 + } else { + var7 = -0.240396991 + } + } + } else { + if (input[5]) >= (0.0649999976) { + if (input[4]) >= (0.495098054) { + var7 = -0.68991518 + } else { + var7 = 0.267367035 + } + } else { + if (input[4]) >= (0.217787117) { + var7 = 0.258573234 + } else { + var7 = -0.0335255414 + } + } + } + var var8 float64 + if (input[0]) >= (0.0172932334) { + if (input[3]) >= (0.00642814813) { + if (input[0]) >= (0.122255638) { + var8 = -0.142944843 + } else { + var8 = 0.0434174277 + } + } else { + if (input[0]) >= (0.0278195478) { + var8 = -0.266739219 + } else { + var8 = -0.119459212 + } + } + } else { + if (input[4]) >= (0.132352948) { + if (input[0]) >= (0.00766917318) { + var8 = 0.479572266 + } else { + var8 = 0.335826516 + } + } else { + if (input[0]) >= (0.00827067718) { + var8 = -0.0726271048 + } else { + var8 = 0.151928633 + } + } + } + var var9 float64 + if (input[0]) >= (0.0121804513) { + if (input[8]) >= (0.0325858891) { + if (input[0]) >= (0.084360905) { + var9 = -0.109497108 + } else { + var9 = 0.257994056 + } + } else { + if (input[0]) >= (0.0275187977) { + var9 = -0.341441959 + } else { + var9 = -0.0719165206 + } + } + } else { + if (input[8]) >= (0.0135719907) { + if (input[1]) >= (0.139989838) { + var9 = -0.0641734675 + } else { + var9 = 0.328368425 + } + } else { + if (input[0]) >= (0.00105263153) { + var9 = -0.111253507 + } else { + var9 = 0.282268524 + } + } + } + var var10 float64 + if (input[5]) >= (0.0649999976) { + if (input[5]) >= (0.625) { + if (input[4]) >= (0.172969192) { + var10 = -0.660194814 + } else { + var10 = -0.204253778 + } + } else { + if (input[4]) >= (0.416666687) { + var10 = -0.14922218 + } else { + var10 = 0.145580709 + } + } + } else { + if (input[1]) >= (0.0398882106) { + if (input[1]) >= (0.0546239838) { + var10 = 0.00831717253 + } else { + var10 = -0.196665064 + } + } else { + if (input[4]) >= (0.622549057) { + var10 = -0.336426407 + } else { + var10 = 0.0308342408 + } + } + } + var var11 float64 + if (input[8]) >= (0.0167191196) { + if (input[4]) >= (0.623949587) { + if (input[3]) >= (0.143703982) { + var11 = 0.431336462 + } else { + var11 = -0.319225132 + } + } else { + if (input[8]) >= (0.111657485) { + var11 = 0.151656374 + } else { + var11 = 0.0258173104 + } + } + } else { + if (input[4]) >= (0.0231092442) { + if (input[8]) >= (0.00793338567) { + var11 = -0.161223009 + } else { + var11 = 0.412308931 + } + } else { + if (input[4]) >= (0.0161064435) { + var11 = 0.153145105 + } else { + var11 = -0.228751853 + } + } + } + var var12 float64 + if (input[0]) >= (0.0175939836) { + if (input[0]) >= (0.2106767) { + if (input[0]) >= (0.286466181) { + var12 = -0.38020426 + } else { + var12 = -0.200548694 + } + } else { + if (input[2]) >= (0.0153922904) { + var12 = 0.0264828317 + } else { + var12 = -0.130721197 + } + } + } else { + if (input[1]) >= (0.0256605688) { + if (input[0]) >= (0.00436090212) { + var12 = -0.0115547795 + } else { + var12 = 0.151040763 + } + } else { + if (input[5]) >= (0.0549999997) { + var12 = 0.208390415 + } else { + var12 = 0.346486598 + } + } + } + var var13 float64 + if (input[0]) >= (0.181804508) { + if (input[8]) >= (0.0557959601) { + if (input[8]) >= (0.166076586) { + var13 = -0.113172494 + } else { + var13 = -0.314911723 + } + } else { + if (input[4]) >= (0.0357142873) { + var13 = -0.0658165365 + } else { + var13 = 0.60520792 + } + } + } else { + if (input[8]) >= (0.0337660648) { + if (input[0]) >= (0.0663157851) { + var13 = -0.0417664088 + } else { + var13 = 0.240204453 + } + } else { + if (input[0]) >= (0.0212030075) { + var13 = -0.208579049 + } else { + var13 = 0.056724593 + } + } + } + var var14 float64 + if (input[8]) >= (0.0167191196) { + if (input[0]) >= (0.0275187977) { + if (input[8]) >= (0.0308811963) { + var14 = 0.0174447391 + } else { + var14 = -0.222359404 + } + } else { + if (input[4]) >= (0.15196079) { + var14 = 0.394873649 + } else { + var14 = 0.110791735 + } + } + } else { + if (input[0]) >= (0.00827067718) { + if (input[4]) >= (0.116946779) { + var14 = -0.0899498239 + } else { + var14 = -0.3130413 + } + } else { + if (input[8]) >= (0.0133097302) { + var14 = 0.211262539 + } else { + var14 = -0.00744245201 + } + } + } + var var15 float64 + if (input[0]) >= (0.286466181) { + var15 = -0.343626708 + } else { + if (input[8]) >= (0.106412277) { + if (input[4]) >= (0.667366982) { + var15 = -0.276257426 + } else { + var15 = 0.228582308 + } + } else { + if (input[0]) >= (0.0882706791) { + var15 = -0.13722305 + } else { + var15 = 0.0201168247 + } + } + } + var var16 float64 + if (input[0]) >= (0.286466181) { + var16 = -0.32989648 + } else { + if (input[1]) >= (0.0251524393) { + if (input[3]) >= (0.00777463242) { + var16 = 0.0254658889 + } else { + var16 = -0.079253532 + } + } else { + if (input[0]) >= (0.0353383459) { + var16 = -0.0234273244 + } else { + var16 = 0.189634115 + } + } + } + var var17 float64 + if (input[8]) >= (0.0712693408) { + if (input[5]) >= (0.625) { + if (input[5]) >= (0.855000019) { + var17 = -0.663322926 + } else { + var17 = -0.271148592 + } + } else { + if (input[7]) >= (0.000999253942) { + var17 = 0.0624868572 + } else { + var17 = 0.208845958 + } + } + } else { + if (input[1]) >= (0.039380081) { + if (input[1]) >= (0.0561483726) { + var17 = 0.00382913044 + } else { + var17 = -0.134786919 + } + } else { + if (input[2]) >= (0.0916712582) { + var17 = -0.317375243 + } else { + var17 = 0.0267927125 + } + } + } + var var18 float64 + if (input[0]) >= (0.00436090212) { + if (input[3]) >= (0.00614878489) { + if (input[0]) >= (0.216691732) { + var18 = -0.25690043 + } else { + var18 = 0.0211390778 + } + } else { + if (input[0]) >= (0.0230075195) { + var18 = -0.143771589 + } else { + var18 = -0.0207569618 + } + } + } else { + if (input[4]) >= (0.0259103645) { + if (input[4]) >= (0.0882352963) { + var18 = 0.0731432587 + } else { + var18 = 0.451496929 + } + } else { + if (input[4]) >= (0.021708684) { + var18 = -0.301004559 + } else { + var18 = 0.163224563 + } + } + } + var var19 float64 + if (input[8]) >= (0.0165879875) { + if (input[0]) >= (0.0275187977) { + if (input[8]) >= (0.0303566754) { + var19 = 0.0221756846 + } else { + var19 = -0.166503578 + } + } else { + if (input[4]) >= (0.15196079) { + var19 = 0.334065378 + } else { + var19 = 0.0631137416 + } + } + } else { + if (input[0]) >= (0.00827067718) { + if (input[4]) >= (0.116946779) { + var19 = -0.058943741 + } else { + var19 = -0.282993317 + } + } else { + if (input[4]) >= (0.0161064435) { + var19 = 0.0625061542 + } else { + var19 = -0.216944978 + } + } + } + var var20 float64 + if (input[0]) >= (0.104210526) { + if (input[8]) >= (0.0708759502) { + if (input[0]) >= (0.122255638) { + var20 = -0.0727870241 + } else { + var20 = 0.271377712 + } + } else { + if (input[4]) >= (0.14635855) { + var20 = -0.373509854 + } else { + var20 = 0.0388139226 + } + } + } else { + if (input[8]) >= (0.0344217159) { + if (input[4]) >= (0.174369752) { + var20 = -0.0201347563 + } else { + var20 = 0.232145876 + } + } else { + if (input[4]) >= (0.203781515) { + var20 = 0.179765791 + } else { + var20 = -0.0439592823 + } + } + } + var var21 float64 + if (input[0]) >= (0.0121804513) { + if (input[8]) >= (0.0255048517) { + if (input[0]) >= (0.0326315798) { + var21 = -0.0227400903 + } else { + var21 = 0.263679087 + } + } else { + if (input[0]) >= (0.0681203008) { + var21 = 0.71792233 + } else { + var21 = -0.16471675 + } + } + } else { + if (input[8]) >= (0.0135719907) { + if (input[4]) >= (0.0315126069) { + var21 = 0.277873278 + } else { + var21 = 0.054375086 + } + } else { + if (input[0]) >= (0.00105263153) { + var21 = -0.0604105964 + } else { + var21 = 0.192309693 + } + } + } + var var22 float64 + if (input[5]) >= (0.114999995) { + if (input[8]) >= (0.0310123265) { + if (input[3]) >= (0.00515766861) { + var22 = 0.0904029608 + } else { + var22 = -0.170648903 + } + } else { + if (input[8]) >= (0.0230133757) { + var22 = 0.284125447 + } else { + var22 = 0.402268916 + } + } + } else { + if (input[6]) >= (0.0547460616) { + if (input[6]) >= (0.177966103) { + var22 = -0.555282474 + } else { + var22 = -0.137755647 + } + } else { + if (input[1]) >= (0.0419207327) { + var22 = -0.0501996242 + } else { + var22 = 0.0169438105 + } + } + } + var var23 float64 + if (input[4]) >= (0.618347347) { + if (input[0]) >= (0.0557894707) { + if (input[2]) >= (0.111178294) { + var23 = -0.0808938742 + } else { + var23 = -0.326835692 + } + } else { + var23 = 0.394457906 + } + } else { + if (input[0]) >= (0.286466181) { + var23 = -0.315463096 + } else { + if (input[5]) >= (0.114999995) { + var23 = 0.0944778845 + } else { + var23 = -0.0043493635 + } + } + } + var var24 float64 + if (input[8]) >= (0.133556262) { + if (input[4]) >= (0.0875350162) { + if (input[5]) >= (0.474999994) { + var24 = -0.176793694 + } else { + var24 = 0.237827122 + } + } else { + if (input[2]) >= (0.230654538) { + var24 = -0.550774276 + } else { + var24 = -0.139267176 + } + } + } else { + if (input[4]) >= (0.415266097) { + if (input[5]) >= (0.0949999988) { + var24 = -0.492633671 + } else { + var24 = -0.101628713 + } + } else { + if (input[8]) >= (0.0723183826) { + var24 = 0.0746133849 + } else { + var24 = -0.01057842 + } + } + } + var var25 float64 + if (input[8]) >= (0.00793338567) { + if (input[8]) >= (0.00911355857) { + if (input[4]) >= (0.640756309) { + var25 = -0.242975041 + } else { + var25 = 0.0066553154 + } + } else { + if (input[4]) >= (0.0259103645) { + var25 = 0.560866177 + } else { + var25 = -0.32564646 + } + } + } else { + if (input[1]) >= (0.0434451215) { + if (input[8]) >= (0.00491738785) { + var25 = 0.0347166434 + } else { + var25 = 0.484109372 + } + } else { + var25 = 0.748150885 + } + } + var var26 float64 + if (input[0]) >= (0.00285714283) { + if (input[8]) >= (0.0143587729) { + if (input[0]) >= (0.0145864664) { + var26 = -0.00986585487 + } else { + var26 = 0.121390909 + } + } else { + if (input[8]) >= (0.0106871231) { + var26 = -0.183703855 + } else { + var26 = 0.0568781793 + } + } + } else { + if (input[8]) >= (0.00937581994) { + if (input[0]) >= (0.00105263153) { + var26 = 0.19825463 + } else { + var26 = 0.389317423 + } + } else { + if (input[8]) >= (0.00832677633) { + var26 = -0.347230077 + } else { + var26 = -0.129909441 + } + } + } + var var27 float64 + if (input[0]) >= (0.00827067718) { + if (input[8]) >= (0.015670076) { + if (input[9]) >= (0.176666766) { + var27 = -0.263784438 + } else { + var27 = 0.0073127728 + } + } else { + if (input[5]) >= (0.075000003) { + var27 = 0.429045528 + } else { + var27 = -0.256443411 + } + } + } else { + if (input[8]) >= (0.0133097302) { + if (input[8]) >= (0.0379622355) { + var27 = -0.565389395 + } else { + var27 = 0.168336481 + } + } else { + if (input[6]) >= (0.00754131936) { + var27 = -0.101397805 + } else { + var27 = 0.077026993 + } + } + } + var var28 float64 + if (input[0]) >= (0.0921804532) { + if (input[8]) >= (0.0716627315) { + if (input[0]) >= (0.185112774) { + var28 = -0.229581967 + } else { + var28 = 0.0519057326 + } + } else { + if (input[4]) >= (0.226190478) { + var28 = -0.330083191 + } else { + var28 = -0.0124392314 + } + } + } else { + if (input[8]) >= (0.0454366654) { + if (input[4]) >= (0.172969192) { + var28 = 0.0542706922 + } else { + var28 = 0.262478292 + } + } else { + if (input[4]) >= (0.262605071) { + var28 = 0.19488956 + } else { + var28 = -0.0242337324 + } + } + } + var var29 float64 + if (input[1]) >= (0.207571134) { + if (input[8]) >= (0.0231445059) { + if (input[0]) >= (0.128421053) { + var29 = -0.0468559712 + } else { + var29 = -0.685421646 + } + } else { + if (input[0]) >= (0.00586466165) { + var29 = -0.291550547 + } else { + var29 = 0.0851533562 + } + } + } else { + if (input[0]) >= (0.0545864664) { + if (input[8]) >= (0.0264227651) { + var29 = -0.0538973771 + } else { + var29 = 0.278168768 + } + } else { + if (input[8]) >= (0.0299632829) { + var29 = 0.135819137 + } else { + var29 = -0.0228871312 + } + } + } + var var30 float64 + if (input[0]) >= (0.0175939836) { + if (input[8]) >= (0.0295698922) { + if (input[0]) >= (0.0509774461) { + var30 = -0.0362095311 + } else { + var30 = 0.134576112 + } + } else { + if (input[4]) >= (0.189775914) { + var30 = 0.110627048 + } else { + var30 = -0.162670135 + } + } + } else { + if (input[4]) >= (0.14775911) { + if (input[8]) >= (0.0131786) { + var30 = 0.28423661 + } else { + var30 = -0.284755439 + } + } else { + if (input[3]) >= (0.00302774715) { + var30 = -0.021532381 + } else { + var30 = 0.0976749361 + } + } + } + var var31 float64 + if (input[8]) >= (0.138145819) { + if (input[0]) >= (0.221503764) { + var31 = -0.316284448 + } else { + if (input[4]) >= (0.0693277344) { + var31 = 0.23669593 + } else { + var31 = -0.115045242 + } + } + } else { + if (input[0]) >= (0.122255638) { + if (input[4]) >= (0.172969192) { + var31 = -0.15549694 + } else { + var31 = 0.0663940087 + } + } else { + if (input[8]) >= (0.0708759502) { + var31 = 0.180226147 + } else { + var31 = -0.0127736554 + } + } + } + var var32 float64 + if (input[0]) >= (0.00285714283) { + if (input[4]) >= (0.021708684) { + if (input[4]) >= (0.032913167) { + var32 = -0.00954950042 + } else { + var32 = 0.102335446 + } + } else { + if (input[5]) >= (0.00499999989) { + var32 = 0.0681381673 + } else { + var32 = -0.295330226 + } + } + } else { + if (input[4]) >= (0.021708684) { + if (input[4]) >= (0.0259103645) { + var32 = 0.226346865 + } else { + var32 = -0.390549183 + } + } else { + if (input[4]) >= (0.0161064435) { + var32 = 0.294218421 + } else { + var32 = -0.17620708 + } + } + } + var var33 float64 + if (input[5]) >= (0.86500001) { + if (input[8]) >= (0.0506818779) { + if (input[0]) >= (0.124360904) { + var33 = -0.461648107 + } else { + var33 = -0.971438646 + } + } else { + var33 = -0.0222659539 + } + } else { + if (input[8]) >= (0.0990689769) { + if (input[0]) >= (0.2218045) { + var33 = -0.271005005 + } else { + var33 = 0.119335398 + } + } else { + if (input[0]) >= (0.0281203017) { + var33 = -0.039206557 + } else { + var33 = 0.0298813786 + } + } + } + var var34 float64 + if (input[2]) >= (0.400580525) { + if (input[0]) >= (0.120300755) { + if (input[1]) >= (0.118902437) { + var34 = 0.0354767926 + } else { + var34 = -0.474155307 + } + } else { + var34 = -1.15165257 + } + } else { + if (input[6]) >= (0.0760905594) { + if (input[8]) >= (0.0711382106) { + var34 = 0.0793998465 + } else { + var34 = -0.215196773 + } + } else { + if (input[3]) >= (0.0115392981) { + var34 = 0.0383832827 + } else { + var34 = -0.01483439 + } + } + } + var var35 float64 + if (input[0]) >= (0.00436090212) { + if (input[8]) >= (0.0171125103) { + if (input[0]) >= (0.0275187977) { + var35 = -0.015087246 + } else { + var35 = 0.0594244488 + } + } else { + if (input[0]) >= (0.00827067718) { + var35 = -0.156426743 + } else { + var35 = 0.00703513715 + } + } + } else { + if (input[8]) >= (0.00950695015) { + if (input[0]) >= (0.00105263153) { + var35 = 0.0771276727 + } else { + var35 = 0.344308347 + } + } else { + if (input[0]) >= (0.00345864659) { + var35 = 0.239082128 + } else { + var35 = -0.212378129 + } + } + } + var var36 float64 + if (input[6]) >= (0.0212692283) { + if (input[2]) >= (0.0046602902) { + if (input[6]) >= (0.147138506) { + var36 = -0.32909283 + } else { + var36 = -0.014357632 + } + } else { + if (input[0]) >= (0.00315789459) { + var36 = -0.230289802 + } else { + var36 = 0.000359835918 + } + } + } else { + if (input[0]) >= (0.000150375941) { + if (input[0]) >= (0.00105263153) { + var36 = 0.0080949543 + } else { + var36 = 0.210141391 + } + } else { + var36 = -0.445842773 + } + } + var var37 float64 + if (input[4]) >= (0.684173703) { + if (input[3]) >= (0.171706378) { + var37 = 0.128316104 + } else { + var37 = -0.320279062 + } + } else { + if (input[8]) >= (0.0833333358) { + if (input[4]) >= (0.0553221293) { + var37 = 0.0878700837 + } else { + var37 = -0.1695389 + } + } else { + if (input[4]) >= (0.0665266141) { + var37 = -0.0263895858 + } else { + var37 = 0.0276795719 + } + } + } + var var38 float64 + if (input[0]) >= (0.286466181) { + var38 = -0.299754083 + } else { + if (input[0]) >= (0.275338352) { + if (input[8]) >= (0.0689089969) { + var38 = -0.25500527 + } else { + var38 = 0.948396266 + } + } else { + if (input[7]) >= (0.0112215932) { + var38 = 0.0329480879 + } else { + var38 = -0.012819035 + } + } + } + var var39 float64 + if (input[4]) >= (0.685574234) { + if (input[3]) >= (0.159394085) { + var39 = 0.0372105427 + } else { + var39 = -0.307810545 + } + } else { + if (input[9]) >= (0.00859007239) { + if (input[0]) >= (0.121654138) { + var39 = -0.0721839815 + } else { + var39 = 0.00283383112 + } + } else { + if (input[2]) >= (0.334310651) { + var39 = -0.369843483 + } else { + var39 = 0.0615457594 + } + } + } + var var40 float64 + if (input[6]) >= (0.0952674896) { + if (input[5]) >= (0.254999995) { + var40 = 0.266057879 + } else { + if (input[6]) >= (0.189135075) { + var40 = -0.455252081 + } else { + var40 = -0.16092959 + } + } + } else { + if (input[1]) >= (0.254065037) { + if (input[5]) >= (0.204999998) { + var40 = 0.171405852 + } else { + var40 = -0.497929841 + } + } else { + if (input[8]) >= (0.165683195) { + var40 = 0.140502438 + } else { + var40 = -0.00324732484 + } + } + } + var var41 float64 + if (input[4]) >= (0.633753538) { + if (input[3]) >= (0.165618598) { + var41 = 0.318831801 + } else { + if (input[2]) >= (0.0165836904) { + var41 = -0.277226508 + } else { + var41 = 0.200899377 + } + } + } else { + if (input[3]) >= (0.0225597806) { + if (input[5]) >= (0.0149999997) { + var41 = -0.0186447985 + } else { + var41 = 0.107980765 + } + } else { + if (input[3]) >= (0.00298046647) { + var41 = -0.0198372789 + } else { + var41 = 0.0463156216 + } + } + } + var var42 float64 + if (input[8]) >= (0.00793338567) { + if (input[5]) >= (0.784999967) { + if (input[8]) >= (0.0517964847) { + var42 = -0.501639068 + } else { + var42 = 0.173977554 + } + } else { + if (input[8]) >= (0.0143587729) { + var42 = 0.00614444446 + } else { + var42 = -0.0434169993 + } + } + } else { + if (input[0]) >= (0.00616541365) { + if (input[1]) >= (0.101371951) { + var42 = 0.37578845 + } else { + var42 = -0.275188982 + } + } else { + if (input[4]) >= (0.0154061634) { + var42 = 0.45450744 + } else { + var42 = -0.088946268 + } + } + } + var var43 float64 + if (input[0]) >= (0.28406015) { + var43 = -0.287354499 + } else { + if (input[8]) >= (0.120836608) { + if (input[5]) >= (0.685000002) { + var43 = -0.452988923 + } else { + var43 = 0.0968504846 + } + } else { + if (input[0]) >= (0.075939849) { + var43 = -0.0440812036 + } else { + var43 = 0.013372059 + } + } + } + var var44 float64 + if (input[1]) >= (0.176575199) { + if (input[4]) >= (0.397058845) { + var44 = 0.254734188 + } else { + if (input[2]) >= (0.212456822) { + var44 = -0.593228817 + } else { + var44 = -0.200251624 + } + } + } else { + if (input[4]) >= (0.586134434) { + if (input[3]) >= (0.111825317) { + var44 = 0.247283205 + } else { + var44 = -0.212081224 + } + } else { + if (input[3]) >= (0.0226037558) { + var44 = 0.0536214635 + } else { + var44 = -0.00735966256 + } + } + } + var var45 float64 + if (input[9]) >= (0.0657032281) { + if (input[0]) >= (0.00766917318) { + if (input[8]) >= (0.0152766854) { + var45 = -0.0435701497 + } else { + var45 = -0.231140018 + } + } else { + if (input[3]) >= (0.00285463873) { + var45 = -0.0257420298 + } else { + var45 = 0.165478796 + } + } + } else { + if (input[0]) >= (0.0569924787) { + if (input[8]) >= (0.022619985) { + var45 = -0.0350094102 + } else { + var45 = 0.432442248 + } + } else { + if (input[8]) >= (0.0450432748) { + var45 = 0.204315975 + } else { + var45 = 0.00848712306 + } + } + } + var var46 float64 + if (input[8]) >= (0.0685156062) { + if (input[5]) >= (0.0350000001) { + if (input[3]) >= (0.00615793606) { + var46 = -0.00547375996 + } else { + var46 = -0.205405518 + } + } else { + if (input[3]) >= (0.0226027388) { + var46 = 0.181025118 + } else { + var46 = 0.00534206163 + } + } + } else { + if (input[5]) >= (0.114999995) { + if (input[8]) >= (0.0342905857) { + var46 = 0.0135424864 + } else { + var46 = 0.274831563 + } + } else { + if (input[8]) >= (0.0626147389) { + var46 = -0.164425164 + } else { + var46 = -0.00842097308 + } + } + } + var var47 float64 + if (input[4]) >= (0.0161064435) { + if (input[2]) >= (0.333559692) { + if (input[4]) >= (0.198179275) { + var47 = -0.100290649 + } else { + var47 = -0.755023658 + } + } else { + if (input[5]) >= (0.234999999) { + var47 = 0.109863274 + } else { + var47 = 0.00200071977 + } + } + } else { + if (input[8]) >= (0.0379622355) { + if (input[5]) >= (0.340000004) { + var47 = 0.0225960389 + } else { + var47 = -0.691998363 + } + } else { + if (input[5]) >= (0.0949999988) { + var47 = 0.232441589 + } else { + var47 = -0.14310658 + } + } + } + var var48 float64 + if (input[0]) >= (0.0278195478) { + if (input[8]) >= (0.0337660648) { + if (input[0]) >= (0.0509774461) { + var48 = -0.0114587294 + } else { + var48 = 0.1420331 + } + } else { + if (input[0]) >= (0.0738345832) { + var48 = 0.173401624 + } else { + var48 = -0.131375387 + } + } + } else { + if (input[8]) >= (0.0256359819) { + if (input[0]) >= (0.0139849624) { + var48 = 0.252238214 + } else { + var48 = 0.0486185215 + } + } else { + if (input[0]) >= (0.0212030075) { + var48 = -0.178774327 + } else { + var48 = 0.0158827659 + } + } + } + var var49 float64 + if (input[7]) >= (0.00118679181) { + if (input[4]) >= (0.360644281) { + if (input[5]) >= (0.375) { + var49 = -0.901833355 + } else { + var49 = -0.0578524359 + } + } else { + if (input[2]) >= (0.00237438967) { + var49 = 0.021668978 + } else { + var49 = 0.222485527 + } + } + } else { + if (input[8]) >= (0.0311434567) { + if (input[5]) >= (0.0149999997) { + var49 = -0.0942836106 + } else { + var49 = 0.0964765921 + } + } else { + if (input[5]) >= (0.0649999976) { + var49 = 0.185189947 + } else { + var49 = -0.0803708211 + } + } + } + var var50 float64 + if (input[0]) >= (0.00436090212) { + if (input[9]) >= (0.233895421) { + if (input[0]) >= (0.0100751882) { + var50 = -0.335006416 + } else { + var50 = -0.0961027741 + } + } else { + if (input[8]) >= (0.00911355857) { + var50 = -0.00283080316 + } else { + var50 = 0.205673814 + } + } + } else { + if (input[8]) >= (0.0116050355) { + if (input[0]) >= (0.00135338353) { + var50 = 0.185261995 + } else { + var50 = -0.438791841 + } + } else { + if (input[0]) >= (0.00105263153) { + var50 = -0.0627073348 + } else { + var50 = 0.119181477 + } + } + } + var var51 float64 + if (input[5]) >= (0.0249999985) { + if (input[0]) >= (0.039849624) { + if (input[0]) >= (0.119849622) { + var51 = -0.0243600179 + } else { + var51 = -0.217614174 + } + } else { + if (input[5]) >= (0.0949999988) { + var51 = 0.258749306 + } else { + var51 = 0.0542611703 + } + } + } else { + if (input[4]) >= (0.0161064435) { + if (input[3]) >= (0.00302164629) { + var51 = 0.00341847376 + } else { + var51 = 0.07880757 + } + } else { + if (input[0]) >= (0.00496240612) { + var51 = -0.319318205 + } else { + var51 = -0.0421217196 + } + } + } + var var52 float64 + if (input[4]) >= (0.685574234) { + if (input[3]) >= (0.177440822) { + var52 = -0.0603435449 + } else { + var52 = -0.306178689 + } + } else { + if (input[3]) >= (0.0634909272) { + if (input[4]) >= (0.0987394974) { + var52 = 0.13219589 + } else { + var52 = -0.182864487 + } + } else { + if (input[6]) >= (0.206400335) { + var52 = -0.471036732 + } else { + var52 = -0.00148937979 + } + } + } + var var53 float64 + if (input[8]) >= (0.0773013383) { + if (input[5]) >= (0.0649999976) { + if (input[3]) >= (0.00623038225) { + var53 = 0.00483682379 + } else { + var53 = -0.179307953 + } + } else { + if (input[7]) >= (0.00320988474) { + var53 = 0.0471738987 + } else { + var53 = 0.156259224 + } + } + } else { + if (input[7]) >= (0.0931315571) { + if (input[8]) >= (0.0624180436) { + var53 = -0.020441629 + } else { + var53 = -0.255031854 + } + } else { + if (input[7]) >= (0.000281814777) { + var53 = 0.00141502626 + } else { + var53 = -0.053272482 + } + } + } + var var54 float64 + if (input[1]) >= (0.162347555) { + if (input[0]) >= (0.124360904) { + if (input[0]) >= (0.165263146) { + var54 = 0.356097758 + } else { + var54 = 0.0349060223 + } + } else { + if (input[8]) >= (0.125295043) { + var54 = -0.83570987 + } else { + var54 = -0.172690049 + } + } + } else { + if (input[0]) >= (0.286466181) { + var54 = -0.289608032 + } else { + if (input[0]) >= (0.273834586) { + var54 = 0.350739658 + } else { + var54 = 0.00390034379 + } + } + } + var var55 float64 + if (input[0]) >= (0.00285714283) { + if (input[4]) >= (0.021708684) { + if (input[0]) >= (0.0145864664) { + var55 = -0.00855578016 + } else { + var55 = 0.0437418893 + } + } else { + if (input[8]) >= (0.0116050355) { + var55 = -0.0150791267 + } else { + var55 = -0.28798458 + } + } + } else { + if (input[8]) >= (0.00924468972) { + if (input[4]) >= (0.0882352963) { + var55 = -0.390152603 + } else { + var55 = 0.213675484 + } + } else { + if (input[8]) >= (0.00845790748) { + var55 = -0.390442103 + } else { + var55 = -0.0780192837 + } + } + } + var var56 float64 + if (input[6]) >= (0.0212090202) { + if (input[8]) >= (0.0458300561) { + if (input[4]) >= (0.164565831) { + var56 = -0.0577122159 + } else { + var56 = 0.171905577 + } + } else { + if (input[4]) >= (0.240196079) { + var56 = 0.129441619 + } else { + var56 = -0.0970272273 + } + } + } else { + if (input[0]) >= (0.0882706791) { + if (input[4]) >= (0.0245098043) { + var56 = -0.0160587989 + } else { + var56 = -0.373520195 + } + } else { + if (input[4]) >= (0.264005601) { + var56 = 0.140205145 + } else { + var56 = 0.00363377784 + } + } + } + var var57 float64 + if (input[6]) >= (0.00197188184) { + if (input[4]) >= (0.174369752) { + if (input[0]) >= (0.0206015036) { + var57 = -0.0363936834 + } else { + var57 = 0.163100794 + } + } else { + if (input[2]) >= (0.0099630272) { + var57 = 0.0490520671 + } else { + var57 = -0.0121400943 + } + } + } else { + if (input[4]) >= (0.0245098043) { + if (input[5]) >= (0.00499999989) { + var57 = -0.124995105 + } else { + var57 = 0.000665210711 + } + } else { + if (input[5]) >= (0.00499999989) { + var57 = 0.0405129232 + } else { + var57 = -0.237474099 + } + } + } + var var58 float64 + if (input[9]) >= (0.0657032281) { + if (input[5]) >= (0.0949999988) { + if (input[8]) >= (0.0379622355) { + var58 = -0.0863649622 + } else { + var58 = 0.28073594 + } + } else { + if (input[6]) >= (0.00519312406) { + var58 = -0.061413832 + } else { + var58 = 0.00650844676 + } + } + } else { + if (input[5]) >= (0.0249999985) { + if (input[3]) >= (0.00454632333) { + var58 = 0.00568365026 + } else { + var58 = -0.156469226 + } + } else { + if (input[7]) >= (0.0112215932) { + var58 = 0.0680932105 + } else { + var58 = 0.00331812678 + } + } + } + var var59 float64 + if (input[5]) >= (0.185000002) { + if (input[4]) >= (0.320028007) { + if (input[5]) >= (0.340000004) { + var59 = -0.751533031 + } else { + var59 = -0.0821505114 + } + } else { + if (input[0]) >= (0.171278208) { + var59 = -0.132254183 + } else { + var59 = 0.176801816 + } + } + } else { + if (input[4]) >= (0.0063025211) { + if (input[4]) >= (0.0119047621) { + var59 = -0.00440405589 + } else { + var59 = -0.148658827 + } + } else { + if (input[4]) >= (0.00490196096) { + var59 = 0.140768483 + } else { + var59 = 0.350664854 + } + } + } + var var60 float64 + if (input[1]) >= (0.0429369919) { + if (input[1]) >= (0.0480182916) { + if (input[9]) >= (0.116594002) { + var60 = -0.102537565 + } else { + var60 = 0.0120711168 + } + } else { + if (input[5]) >= (0.0149999997) { + var60 = 0.0871903747 + } else { + var60 = -0.12257605 + } + } + } else { + if (input[3]) >= (0.0065933764) { + if (input[0]) >= (0.121654138) { + var60 = -0.0304677356 + } else { + var60 = 0.0676648691 + } + } else { + if (input[0]) >= (0.00105263153) { + var60 = -0.0110558337 + } else { + var60 = 0.182563081 + } + } + } + var var61 float64 + if (input[0]) >= (0.00827067718) { + if (input[2]) >= (0.0072721187) { + if (input[4]) >= (0.174369752) { + var61 = -0.0175676141 + } else { + var61 = 0.0212861542 + } + } else { + if (input[1]) >= (0.0297256093) { + var61 = -0.157087296 + } else { + var61 = 0.0397030264 + } + } + } else { + if (input[0]) >= (0.00706766918) { + if (input[4]) >= (0.0175070036) { + var61 = 0.29746896 + } else { + var61 = -0.215615198 + } + } else { + if (input[4]) >= (0.0231092442) { + var61 = -0.0457295962 + } else { + var61 = 0.0742075741 + } + } + } + var var62 float64 + if (input[8]) >= (0.148373991) { + if (input[5]) >= (0.305000007) { + if (input[4]) >= (0.30252102) { + var62 = -0.431491196 + } else { + var62 = 0.0481870845 + } + } else { + if (input[4]) >= (0.184173673) { + var62 = 0.243601143 + } else { + var62 = -0.123877004 + } + } + } else { + if (input[5]) >= (0.284999996) { + if (input[5]) >= (0.625) { + var62 = -0.200812891 + } else { + var62 = 0.192099884 + } + } else { + if (input[5]) >= (0.0249999985) { + var62 = -0.0416302495 + } else { + var62 = 0.00593543472 + } + } + } + var var63 float64 + if (input[4]) >= (0.65196079) { + if (input[3]) >= (0.161528066) { + if (input[4]) >= (0.707983196) { + var63 = -0.0899664462 + } else { + var63 = 0.322766781 + } + } else { + if (input[8]) >= (0.0527144) { + var63 = -0.293584853 + } else { + var63 = 0.187979877 + } + } + } else { + if (input[8]) >= (0.0961841047) { + if (input[0]) >= (0.156842113) { + var63 = -0.106119491 + } else { + var63 = 0.125702992 + } + } else { + if (input[0]) >= (0.0350375921) { + var63 = -0.0268263798 + } else { + var63 = 0.0142555572 + } + } + } + var var64 float64 + if (input[0]) >= (0.000150375941) { + if (input[0]) >= (0.00105263153) { + if (input[2]) >= (0.00161722768) { + var64 = 0.00111045409 + } else { + var64 = -0.0768416822 + } + } else { + if (input[4]) >= (0.0224089641) { + var64 = -0.0887310654 + } else { + var64 = 0.300011128 + } + } + } else { + var64 = -0.390776604 + } + var var65 float64 + if (input[3]) >= (0.00207781093) { + if (input[7]) >= (0.439143658) { + var65 = -0.464211673 + } else { + if (input[3]) >= (0.00241563935) { + var65 = 0.000459081435 + } else { + var65 = -0.119567484 + } + } + } else { + if (input[0]) >= (0.00917293224) { + if (input[7]) >= (0.00857554097) { + var65 = 0.192073569 + } else { + var65 = -0.210251316 + } + } else { + if (input[1]) >= (0.0205792673) { + var65 = 0.123285308 + } else { + var65 = 0.321597934 + } + } + } + var var66 float64 + if (input[0]) >= (0.286466181) { + var66 = -0.282670498 + } else { + if (input[0]) >= (0.000150375941) { + if (input[0]) >= (0.00766917318) { + var66 = -0.00459707389 + } else { + var66 = 0.0313954577 + } + } else { + var66 = -0.338898867 + } + } + var var67 float64 + if (input[5]) >= (0.784999967) { + if (input[9]) >= (0.0237057135) { + var67 = 0.0696140826 + } else { + if (input[2]) >= (0.0803144276) { + var67 = -0.425103754 + } else { + var67 = -0.174536571 + } + } + } else { + if (input[9]) >= (0.0238933973) { + if (input[5]) >= (0.284999996) { + var67 = 0.214611426 + } else { + var67 = -0.0105478894 + } + } else { + if (input[0]) >= (0.0756390989) { + var67 = -0.00446681352 + } else { + var67 = 0.0521040969 + } + } + } + var var68 float64 + if (input[8]) >= (0.00793338567) { + if (input[8]) >= (0.0135719907) { + if (input[0]) >= (0.00496240612) { + var68 = -9.80415571e-05 + } else { + var68 = 0.191178605 + } + } else { + if (input[4]) >= (0.0371148475) { + var68 = -0.246011645 + } else { + var68 = 0.00743888691 + } + } + } else { + if (input[4]) >= (0.0315126069) { + if (input[4]) >= (0.138655469) { + var68 = 0.281557769 + } else { + var68 = -0.339205354 + } + } else { + if (input[6]) >= (0.0023632478) { + var68 = 0.344240695 + } else { + var68 = -0.0382838994 + } + } + } + var var69 float64 + if (input[8]) >= (0.0685156062) { + if (input[0]) >= (0.121954888) { + if (input[2]) >= (0.0860618129) { + var69 = 0.0945601761 + } else { + var69 = -0.0943377987 + } + } else { + if (input[0]) >= (0.119849622) { + var69 = 0.305908203 + } else { + var69 = 0.00725052459 + } + } + } else { + if (input[0]) >= (0.194135338) { + if (input[8]) >= (0.0557959601) { + var69 = 0.0243753754 + } else { + var69 = 0.450308442 + } + } else { + if (input[0]) >= (0.107218042) { + var69 = -0.120318107 + } else { + var69 = -0.000368774345 + } + } + } + var var70 float64 + if (input[6]) >= (0.189089924) { + if (input[4]) >= (0.30112046) { + var70 = -0.0039761723 + } else { + if (input[3]) >= (0.00329338363) { + var70 = -0.483454973 + } else { + var70 = -0.0453006402 + } + } + } else { + if (input[4]) >= (0.685574234) { + if (input[3]) >= (0.1855205) { + var70 = -0.0268479586 + } else { + var70 = -0.293679446 + } + } else { + if (input[8]) >= (0.148373991) { + var70 = 0.0855231434 + } else { + var70 = 0.000505772943 + } + } + } + var var71 float64 + if (input[4]) >= (0.0245098043) { + if (input[4]) >= (0.032913167) { + if (input[8]) >= (0.0138342511) { + var71 = 0.00857743714 + } else { + var71 = -0.168726325 + } + } else { + if (input[0]) >= (0.0365413539) { + var71 = 0.334990561 + } else { + var71 = 0.0487056337 + } + } + } else { + if (input[4]) >= (0.0231092442) { + if (input[0]) >= (0.00736842118) { + var71 = 0.0473516211 + } else { + var71 = -0.35587132 + } + } else { + if (input[0]) >= (0.0485714301) { + var71 = -0.304941654 + } else { + var71 = 0.0247289594 + } + } + } + var var72 float64 + if (input[4]) >= (0.685574234) { + var72 = -0.276174217 + } else { + if (input[8]) >= (0.0833333358) { + if (input[4]) >= (0.493697464) { + var72 = -0.111761406 + } else { + var72 = 0.0561834164 + } + } else { + if (input[4]) >= (0.0665266141) { + var72 = -0.0197163373 + } else { + var72 = 0.0120168198 + } + } + } + var var73 float64 + if (input[1]) >= (0.223577231) { + if (input[5]) >= (0.204999998) { + var73 = 0.303820401 + } else { + if (input[2]) >= (0.0377650075) { + var73 = -0.322835207 + } else { + var73 = 0.137270167 + } + } + } else { + if (input[4]) >= (0.0259103645) { + if (input[8]) >= (0.00937581994) { + var73 = 0.00198190333 + } else { + var73 = 0.240280673 + } + } else { + if (input[5]) >= (0.00499999989) { + var73 = 0.0547016338 + } else { + var73 = -0.0707016587 + } + } + } + var var74 float64 + if (input[5]) >= (0.0249999985) { + if (input[4]) >= (0.188375354) { + if (input[0]) >= (0.12045113) { + var74 = -0.0145008247 + } else { + var74 = -0.508666456 + } + } else { + if (input[2]) >= (0.247245029) { + var74 = -0.503781438 + } else { + var74 = 0.0430011936 + } + } + } else { + if (input[4]) >= (0.188375354) { + if (input[0]) >= (0.0801503733) { + var74 = -0.0366654098 + } else { + var74 = 0.0991560444 + } + } else { + if (input[0]) >= (0.12736842) { + var74 = 0.134874642 + } else { + var74 = -0.0140978368 + } + } + } + var var75 float64 + if (input[0]) >= (0.00315789459) { + if (input[4]) >= (0.0189075638) { + if (input[8]) >= (0.00924468972) { + var75 = -0.000224242816 + } else { + var75 = 0.170978561 + } + } else { + if (input[8]) >= (0.0131786) { + var75 = -0.0400259048 + } else { + var75 = -0.274014562 + } + } + } else { + if (input[8]) >= (0.00911355857) { + if (input[4]) >= (0.0882352963) { + var75 = -0.240306228 + } else { + var75 = 0.162668601 + } + } else { + if (input[8]) >= (0.00845790748) { + var75 = -0.375939935 + } else { + var75 = -0.0707179159 + } + } + } + var var76 float64 + if (input[0]) >= (0.286466181) { + var76 = -0.280112207 + } else { + if (input[4]) >= (0.00350140082) { + if (input[4]) >= (0.0119047621) { + var76 = 0.00230477797 + } else { + var76 = -0.152240932 + } + } else { + if (input[5]) >= (0.784999967) { + var76 = -0.234420657 + } else { + var76 = 0.279333055 + } + } + } + var var77 float64 + if (input[0]) >= (0.00796992518) { + if (input[8]) >= (0.0151455551) { + if (input[0]) >= (0.0221052617) { + var77 = -0.0120887421 + } else { + var77 = 0.0372003168 + } + } else { + if (input[1]) >= (0.0734247938) { + var77 = 0.0372776501 + } else { + var77 = -0.220527187 + } + } + } else { + if (input[8]) >= (0.0349462368) { + if (input[0]) >= (0.00526315812) { + var77 = -1.15129054 + } else { + var77 = 0.132991552 + } + } else { + if (input[7]) >= (0.000921434839) { + var77 = 0.0847387537 + } else { + var77 = -0.0179769937 + } + } + } + var var78 float64 + if (input[8]) >= (0.00150799891) { + if (input[2]) >= (0.475341976) { + if (input[4]) >= (0.406862736) { + var78 = -0.166963786 + } else { + var78 = -0.499946982 + } + } else { + if (input[1]) >= (0.0439532511) { + var78 = -0.020062875 + } else { + var78 = 0.00789602194 + } + } + } else { + var78 = 0.572091877 + } + var var79 float64 + if (input[3]) >= (0.00207781093) { + if (input[6]) >= (0.0945299119) { + if (input[9]) >= (0.0206017382) { + var79 = -0.0459142439 + } else { + var79 = -0.235742286 + } + } else { + if (input[3]) >= (0.114606753) { + var79 = 0.115663275 + } else { + var79 = -0.000967400323 + } + } + } else { + if (input[1]) >= (0.0210873988) { + if (input[2]) >= (0.00300962897) { + var79 = -0.19450447 + } else { + var79 = 0.150479212 + } + } else { + if (input[6]) >= (0.062543273) { + var79 = 0.0757033601 + } else { + var79 = 0.327922523 + } + } + } + var var80 float64 + if (input[0]) >= (0.159248114) { + if (input[8]) >= (0.0597298704) { + if (input[8]) >= (0.166601107) { + var80 = 0.107864425 + } else { + var80 = -0.164368838 + } + } else { + if (input[1]) >= (0.0134654474) { + var80 = -0.055564899 + } else { + var80 = 0.305301607 + } + } + } else { + if (input[8]) >= (0.0677288249) { + if (input[0]) >= (0.121654138) { + var80 = -0.00632492779 + } else { + var80 = 0.093042016 + } + } else { + if (input[0]) >= (0.0672180429) { + var80 = -0.0701212659 + } else { + var80 = 0.00240272097 + } + } + } + var var81 float64 + if (input[4]) >= (0.125350147) { + if (input[8]) >= (0.0256359819) { + if (input[4]) >= (0.156162471) { + var81 = -0.0260594562 + } else { + var81 = 0.118602015 + } + } else { + if (input[1]) >= (0.0292174798) { + var81 = 0.0459964201 + } else { + var81 = 0.226418257 + } + } + } else { + if (input[8]) >= (0.0261605028) { + if (input[8]) >= (0.107854709) { + var81 = -0.166503102 + } else { + var81 = 0.0645119846 + } + } else { + if (input[4]) >= (0.0665266141) { + var81 = -0.186870784 + } else { + var81 = -0.00211787899 + } + } + } + var var82 float64 + if (input[9]) >= (0.0257124715) { + if (input[1]) >= (0.014989838) { + if (input[4]) >= (0.0077030817) { + var82 = -0.0054807961 + } else { + var82 = 0.261680484 + } + } else { + if (input[4]) >= (0.164565831) { + var82 = -0.245189562 + } else { + var82 = -0.0199352447 + } + } + } else { + if (input[4]) >= (0.416666687) { + if (input[5]) >= (0.114999995) { + var82 = -0.285777807 + } else { + var82 = 0.0128018437 + } + } else { + if (input[1]) >= (0.117123984) { + var82 = -0.0802750587 + } else { + var82 = 0.0350131691 + } + } + } + var var83 float64 + if (input[8]) >= (0.0458300561) { + if (input[0]) >= (0.0590977445) { + if (input[8]) >= (0.0685156062) { + var83 = 0.0217146017 + } else { + var83 = -0.063220486 + } + } else { + if (input[8]) >= (0.111067399) { + var83 = -0.273925871 + } else { + var83 = 0.158429176 + } + } + } else { + if (input[1]) >= (0.0129573178) { + if (input[5]) >= (0.114999995) { + var83 = 0.151839375 + } else { + var83 = -0.00610355008 + } + } else { + if (input[9]) >= (0.0430803001) { + var83 = -0.399477869 + } else { + var83 = -0.0923261866 + } + } + } + var var84 float64 + if (input[8]) >= (0.100118019) { + if (input[5]) >= (0.63499999) { + if (input[3]) >= (0.138229847) { + var84 = -0.00873858109 + } else { + var84 = -0.448209196 + } + } else { + if (input[3]) >= (0.00651635462) { + var84 = 0.0717797875 + } else { + var84 = -0.0482409187 + } + } + } else { + if (input[5]) >= (0.305000007) { + if (input[7]) >= (0.229440123) { + var84 = -0.342827976 + } else { + var84 = 0.201320991 + } + } else { + if (input[5]) >= (0.0249999985) { + var84 = -0.0364255831 + } else { + var84 = 0.00283409888 + } + } + } + var var85 float64 + if (input[6]) >= (0.0678417683) { + if (input[0]) >= (0.115639098) { + if (input[0]) >= (0.130676687) { + var85 = -0.150669739 + } else { + var85 = 0.217826098 + } + } else { + if (input[8]) >= (0.0329792798) { + var85 = -0.238209143 + } else { + var85 = -0.0208676402 + } + } + } else { + if (input[0]) >= (0.0281203017) { + if (input[8]) >= (0.03311041) { + var85 = 0.00799535215 + } else { + var85 = -0.0613433234 + } + } else { + if (input[8]) >= (0.0261605028) { + var85 = 0.134910792 + } else { + var85 = 0.000760196883 + } + } + } + var var86 float64 + if (input[3]) >= (0.00297944969) { + if (input[9]) >= (0.156599194) { + if (input[4]) >= (0.0203081239) { + var86 = -0.123827316 + } else { + var86 = 0.0579396524 + } + } else { + if (input[1]) >= (0.111534551) { + var86 = -0.055729609 + } else { + var86 = 0.000652362942 + } + } + } else { + if (input[5]) >= (0.0350000001) { + if (input[5]) >= (0.114999995) { + var86 = 0.122355014 + } else { + var86 = -0.186418205 + } + } else { + if (input[8]) >= (0.0168502498) { + var86 = 0.144800797 + } else { + var86 = 0.014749934 + } + } + } + var var87 float64 + if (input[7]) >= (0.423489422) { + var87 = -0.406787097 + } else { + if (input[4]) >= (0.0119047621) { + if (input[3]) >= (0.300652921) { + var87 = -0.482897073 + } else { + var87 = 0.00436963933 + } + } else { + if (input[8]) >= (0.0108182533) { + var87 = -0.116776653 + } else { + var87 = 0.246469855 + } + } + } + var var88 float64 + if (input[0]) >= (0.00105263153) { + if (input[0]) >= (0.00195488706) { + if (input[0]) >= (0.00255639106) { + var88 = -0.00143280486 + } else { + var88 = 0.158687294 + } + } else { + if (input[3]) >= (0.00449090824) { + var88 = 0.0765692219 + } else { + var88 = -0.223963976 + } + } + } else { + if (input[4]) >= (0.0287114866) { + var88 = 0.365044773 + } else { + if (input[4]) >= (0.0224089641) { + var88 = -0.323876649 + } else { + var88 = 0.188858822 + } + } + } + var var89 float64 + if (input[6]) >= (0.00118915015) { + if (input[3]) >= (0.00298046647) { + if (input[3]) >= (0.00418993831) { + var89 = 0.00635303184 + } else { + var89 = -0.0314252861 + } + } else { + if (input[6]) >= (0.011605503) { + var89 = -0.0445525944 + } else { + var89 = 0.063242346 + } + } + } else { + if (input[7]) >= (0.000143447192) { + if (input[2]) >= (0.0184177347) { + var89 = -0.00925727002 + } else { + var89 = -0.213141814 + } + } else { + var89 = 0.102692276 + } + } + var var90 float64 + if (input[0]) >= (0.00827067718) { + if (input[9]) >= (0.17593047) { + if (input[5]) >= (0.0249999985) { + var90 = 0.343772948 + } else { + var90 = -0.221835926 + } + } else { + if (input[2]) >= (0.00744489254) { + var90 = 0.00403431011 + } else { + var90 = -0.0375701189 + } + } + } else { + if (input[0]) >= (0.00706766918) { + if (input[5]) >= (0.00499999989) { + var90 = 0.2627922 + } else { + var90 = 0.0111245057 + } + } else { + if (input[5]) >= (0.0850000009) { + var90 = -0.336912066 + } else { + var90 = 0.0100989277 + } + } + } + var var91 float64 + if (input[8]) >= (0.00976921059) { + if (input[8]) >= (0.0102937315) { + if (input[9]) >= (0.161854297) { + var91 = -0.0537579805 + } else { + var91 = 0.00243335939 + } + } else { + if (input[6]) >= (0.00347713521) { + var91 = 0.0283897799 + } else { + var91 = 0.216859028 + } + } + } else { + if (input[5]) >= (0.00499999989) { + var91 = -0.459523469 + } else { + if (input[7]) >= (0.000554689555) { + var91 = 0.075264141 + } else { + var91 = -0.137274683 + } + } + } + var var92 float64 + if (input[1]) >= (0.320121944) { + if (input[9]) >= (0.00281523401) { + var92 = -0.466544241 + } else { + var92 = -0.0629050136 + } + } else { + if (input[4]) >= (0.685574234) { + if (input[2]) >= (0.185972571) { + var92 = -0.0635989532 + } else { + var92 = -0.285467863 + } + } else { + if (input[4]) >= (0.212184876) { + var92 = -0.0161312371 + } else { + var92 = 0.00648842193 + } + } + } + var var93 float64 + if (input[7]) >= (0.26622498) { + if (input[5]) >= (0.0199999996) { + if (input[0]) >= (0.128571421) { + var93 = -0.170514435 + } else { + var93 = -0.467014045 + } + } else { + if (input[0]) >= (0.131879702) { + var93 = -0.279649943 + } else { + var93 = 0.163631767 + } + } + } else { + if (input[2]) >= (0.203194901) { + if (input[2]) >= (0.23077184) { + var93 = 0.00896277651 + } else { + var93 = 0.250300944 + } + } else { + if (input[0]) >= (0.000150375941) { + var93 = -0.000812978891 + } else { + var93 = -0.320379227 + } + } + } + var var94 float64 + if (input[3]) >= (0.121799268) { + if (input[9]) >= (0.00931192748) { + var94 = 0.39591974 + } else { + if (input[1]) >= (0.210365862) { + var94 = -0.108574733 + } else { + var94 = 0.154940248 + } + } + } else { + if (input[9]) >= (0.716412067) { + if (input[7]) >= (0.00228113541) { + var94 = 0.333740085 + } else { + var94 = 0.00728256721 + } + } else { + if (input[8]) >= (0.00426173629) { + var94 = -0.00433406373 + } else { + var94 = 0.252547026 + } + } + } + var var95 float64 + if (input[4]) >= (0.00350140082) { + if (input[4]) >= (0.0161064435) { + if (input[5]) >= (0.685000002) { + var95 = -0.233180091 + } else { + var95 = 0.00114596763 + } + } else { + if (input[5]) >= (0.145000011) { + var95 = -0.389273703 + } else { + var95 = -0.0317125656 + } + } + } else { + if (input[7]) >= (0.195825323) { + var95 = -0.245654166 + } else { + if (input[5]) >= (0.784999967) { + var95 = 0.00872725714 + } else { + var95 = 0.297403693 + } + } + } + var var96 float64 + if (input[0]) >= (0.00105263153) { + if (input[5]) >= (0.114999995) { + if (input[0]) >= (0.0741353408) { + var96 = -0.010054796 + } else { + var96 = 0.188875318 + } + } else { + if (input[4]) >= (0.0077030817) { + var96 = -0.00601599552 + } else { + var96 = 0.299144506 + } + } + } else { + if (input[8]) >= (0.00937581994) { + if (input[0]) >= (0.000751879707) { + var96 = -0.0229117479 + } else { + var96 = 0.320491403 + } + } else { + if (input[4]) >= (0.0196078438) { + var96 = 0.127602771 + } else { + var96 = -0.395168841 + } + } + } + var var97 float64 + if (input[0]) >= (0.286466181) { + var97 = -0.271149933 + } else { + if (input[2]) >= (0.003614838) { + if (input[0]) >= (0.00436090212) { + var97 = 0.000261748384 + } else { + var97 = 0.0781365782 + } + } else { + if (input[0]) >= (0.00616541365) { + var97 = -0.0698476136 + } else { + var97 = -0.00467303721 + } + } + } + var var98 float64 + if (input[7]) >= (2.98678988e-05) { + if (input[4]) >= (0.0245098043) { + if (input[0]) >= (0.0175939836) { + var98 = -0.00519643258 + } else { + var98 = 0.0361424163 + } + } else { + if (input[4]) >= (0.0231092442) { + var98 = -0.234900132 + } else { + var98 = -0.00274063158 + } + } + } else { + if (input[0]) >= (0.0198496245) { + var98 = -0.280595928 + } else { + if (input[0]) >= (0.00315789459) { + var98 = 0.388148874 + } else { + var98 = 0.0318337381 + } + } + } + var var99 float64 + if (input[4]) >= (0.12114846) { + if (input[0]) >= (0.0196992494) { + if (input[4]) >= (0.133753508) { + var99 = -0.00308614224 + } else { + var99 = 0.121284604 + } + } else { + if (input[8]) >= (0.0140965115) { + var99 = 0.189820156 + } else { + var99 = -0.194369376 + } + } + } else { + if (input[8]) >= (0.048977185) { + if (input[4]) >= (0.0497198887) { + var99 = 0.14546074 + } else { + var99 = -0.0577622503 + } + } else { + if (input[0]) >= (0.0377443582) { + var99 = -0.155487567 + } else { + var99 = -0.0057259351 + } + } + } + var var100 float64 + if (input[0]) >= (0.162255645) { + if (input[8]) >= (0.0576317869) { + if (input[4]) >= (0.398459375) { + var100 = 0.20340018 + } else { + var100 = -0.150473848 + } + } else { + if (input[1]) >= (0.00990853645) { + var100 = 0.0648944527 + } else { + var100 = 0.40326184 + } + } + } else { + if (input[8]) >= (0.100118019) { + if (input[4]) >= (0.493697464) { + var100 = -0.111520477 + } else { + var100 = 0.11796052 + } + } else { + if (input[7]) >= (0.099432677) { + var100 = -0.103333659 + } else { + var100 = 0.000719776144 + } + } + } + var var101 float64 + if (input[4]) >= (0.262605071) { + if (input[0]) >= (0.0789473653) { + if (input[8]) >= (0.0670731738) { + var101 = 0.00383618264 + } else { + var101 = -0.235705093 + } + } else { + if (input[5]) >= (0.00499999989) { + var101 = -0.271310031 + } else { + var101 = 0.193909615 + } + } + } else { + if (input[4]) >= (0.212184876) { + if (input[0]) >= (0.0657142848) { + var101 = 0.0607793964 + } else { + var101 = -0.174820423 + } + } else { + if (input[8]) >= (0.0329792798) { + var101 = 0.0411589891 + } else { + var101 = -0.0213418566 + } + } + } + var var102 float64 + if (input[0]) >= (0.00345864659) { + if (input[4]) >= (0.0189075638) { + if (input[8]) >= (0.011867296) { + var102 = -0.0052998797 + } else { + var102 = 0.0461234748 + } + } else { + if (input[4]) >= (0.0147058824) { + var102 = -0.179890111 + } else { + var102 = 0.0156200761 + } + } + } else { + if (input[8]) >= (0.00950695015) { + if (input[4]) >= (0.0189075638) { + var102 = 0.020123627 + } else { + var102 = 0.207051978 + } + } else { + if (input[4]) >= (0.0301120467) { + var102 = 0.341580123 + } else { + var102 = -0.149347827 + } + } + } + var var103 float64 + if (input[0]) >= (0.00105263153) { + if (input[2]) >= (0.00161802839) { + if (input[0]) >= (0.00436090212) { + var103 = -0.00331460079 + } else { + var103 = 0.0457229242 + } + } else { + if (input[7]) >= (0.000375278993) { + var103 = 0.0939382836 + } else { + var103 = -0.120965004 + } + } + } else { + if (input[4]) >= (0.0189075638) { + if (input[4]) >= (0.0224089641) { + var103 = 0.0117833233 + } else { + var103 = 0.394975334 + } + } else { + if (input[2]) >= (0.0011069139) { + var103 = 0.0390520617 + } else { + var103 = -0.194492102 + } + } + } + var var104 float64 + if (input[6]) >= (0.176506013) { + if (input[0]) >= (0.0222556386) { + if (input[3]) >= (0.00621513044) { + var104 = -0.19416143 + } else { + var104 = 0.167571411 + } + } else { + var104 = -0.529426098 + } + } else { + if (input[3]) >= (0.00183251023) { + if (input[6]) >= (0.0211789142) { + var104 = -0.017798055 + } else { + var104 = 0.00704984041 + } + } else { + if (input[0]) >= (0.00766917318) { + var104 = 0.0607308485 + } else { + var104 = 0.304542124 + } + } + } + var var105 float64 + if (input[0]) >= (0.181804508) { + if (input[1]) >= (0.0759654492) { + if (input[4]) >= (0.179971993) { + var105 = 0.293977827 + } else { + var105 = -0.0854395628 + } + } else { + if (input[4]) >= (0.0763305351) { + var105 = -0.13126567 + } else { + var105 = 0.0135152396 + } + } + } else { + if (input[4]) >= (0.0119047621) { + if (input[6]) >= (0.203450039) { + var105 = -0.244897425 + } else { + var105 = 0.00562332664 + } + } else { + if (input[4]) >= (0.0077030817) { + var105 = -0.149814829 + } else { + var105 = 0.0688502789 + } + } + } + var var106 float64 + if (input[6]) >= (0.00185146159) { + if (input[1]) >= (0.00330284564) { + if (input[5]) >= (0.86500001) { + var106 = -0.235077411 + } else { + var106 = 0.00454800203 + } + } else { + if (input[9]) >= (0.0243265107) { + var106 = 0.060991291 + } else { + var106 = -0.277412832 + } + } + } else { + if (input[9]) >= (0.159775347) { + if (input[5]) >= (0.0350000001) { + var106 = 0.0990184322 + } else { + var106 = -0.177583158 + } + } else { + if (input[1]) >= (0.118140243) { + var106 = -0.194555029 + } else { + var106 = -0.0163350087 + } + } + } + var var107 float64 + if (input[8]) >= (0.00976921059) { + if (input[8]) >= (0.0105559928) { + if (input[4]) >= (0.0273109246) { + var107 = 0.0123843709 + } else { + var107 = -0.045518741 + } + } else { + if (input[4]) >= (0.0273109246) { + var107 = -0.245683357 + } else { + var107 = 0.210123703 + } + } + } else { + if (input[5]) >= (0.00499999989) { + var107 = -0.363547087 + } else { + if (input[4]) >= (0.0483193286) { + var107 = 0.27536726 + } else { + var107 = -0.0471846871 + } + } + } + var var108 float64 + if (input[0]) >= (0.00105263153) { + if (input[0]) >= (0.00195488706) { + if (input[0]) >= (0.00255639106) { + var108 = 8.20997375e-05 + } else { + var108 = 0.150972873 + } + } else { + if (input[4]) >= (0.0161064435) { + var108 = -0.0512363054 + } else { + var108 = -0.363469094 + } + } + } else { + if (input[4]) >= (0.0287114866) { + var108 = 0.311502278 + } else { + if (input[4]) >= (0.0224089641) { + var108 = -0.297801763 + } else { + var108 = 0.175135627 + } + } + } + var var109 float64 + if (input[3]) >= (0.00207933597) { + if (input[3]) >= (0.00241563935) { + if (input[4]) >= (0.633753538) { + var109 = -0.138077125 + } else { + var109 = 0.000789805257 + } + } else { + if (input[8]) >= (0.0160634667) { + var109 = 0.0661266297 + } else { + var109 = -0.185510427 + } + } + } else { + if (input[3]) >= (0.00138105545) { + if (input[9]) >= (0.162850469) { + var109 = 0.00529784197 + } else { + var109 = 0.251780123 + } + } else { + var109 = -0.0781100243 + } + } + var var110 float64 + if (input[0]) >= (0.286466181) { + var110 = -0.257048219 + } else { + if (input[4]) >= (0.684173703) { + if (input[3]) >= (0.182485893) { + var110 = -0.037820816 + } else { + var110 = -0.26898703 + } + } else { + if (input[7]) >= (2.98678988e-05) { + var110 = 0.00392430276 + } else { + var110 = 0.125180557 + } + } + } + var var111 float64 + if (input[8]) >= (0.148373991) { + if (input[4]) >= (0.198179275) { + if (input[5]) >= (0.405000001) { + var111 = -0.390388787 + } else { + var111 = 0.19688642 + } + } else { + if (input[3]) >= (0.0253007915) { + var111 = -0.304027438 + } else { + var111 = 0.0247479454 + } + } + } else { + if (input[5]) >= (0.275000006) { + if (input[4]) >= (0.322829127) { + var111 = -0.371938825 + } else { + var111 = 0.131871164 + } + } else { + if (input[6]) >= (0.0610380247) { + var111 = -0.0630374253 + } else { + var111 = -0.00408200454 + } + } + } + var var112 float64 + if (input[3]) >= (0.300652921) { + var112 = -0.372335076 + } else { + if (input[3]) >= (0.0223696381) { + if (input[4]) >= (0.0623249337) { + var112 = 0.0343450904 + } else { + var112 = -0.151382953 + } + } else { + if (input[4]) >= (0.212184876) { + var112 = -0.0491784625 + } else { + var112 = 0.00353563856 + } + } + } + var var113 float64 + if (input[4]) >= (0.240196079) { + if (input[1]) >= (0.03125) { + if (input[3]) >= (0.0217038952) { + var113 = 0.0171060227 + } else { + var113 = 0.137512341 + } + } else { + if (input[8]) >= (0.111132964) { + var113 = 0.0580299236 + } else { + var113 = -0.0986677334 + } + } + } else { + if (input[4]) >= (0.221988797) { + if (input[8]) >= (0.0286519807) { + var113 = -0.257346302 + } else { + var113 = 0.171087191 + } + } else { + if (input[1]) >= (0.0353150405) { + var113 = -0.0274365898 + } else { + var113 = 0.0206221379 + } + } + } + var var114 float64 + if (input[1]) >= (0.0673272386) { + if (input[4]) >= (0.143557429) { + if (input[2]) >= (0.0257102754) { + var114 = 0.0388073623 + } else { + var114 = 0.180818915 + } + } else { + if (input[4]) >= (0.0231092442) { + var114 = -0.0400297865 + } else { + var114 = 0.0899960995 + } + } + } else { + if (input[4]) >= (0.574929953) { + if (input[3]) >= (0.0224926714) { + var114 = -0.230021387 + } else { + var114 = 0.162359819 + } + } else { + if (input[3]) >= (0.0223861635) { + var114 = 0.029477017 + } else { + var114 = -0.0116269495 + } + } + } + var var115 float64 + if (input[0]) >= (0.0804511309) { + if (input[8]) >= (0.0245869402) { + if (input[0]) >= (0.119849622) { + var115 = 1.70739952e-06 + } else { + var115 = -0.134306028 + } + } else { + if (input[0]) >= (0.106917292) { + var115 = -0.226166919 + } else { + var115 = 0.364914417 + } + } + } else { + if (input[8]) >= (0.0586808287) { + if (input[2]) >= (0.130370602) { + var115 = -0.200198486 + } else { + var115 = 0.15689221 + } + } else { + if (input[7]) >= (0.0777881965) { + var115 = -0.22090514 + } else { + var115 = 0.00376549247 + } + } + } + var var116 float64 + if (input[0]) >= (0.00796992518) { + if (input[8]) >= (0.0151455551) { + if (input[0]) >= (0.0350375921) { + var116 = -0.0086769145 + } else { + var116 = 0.0190493837 + } + } else { + if (input[2]) >= (0.0187338553) { + var116 = 0.161135659 + } else { + var116 = -0.177371174 + } + } + } else { + if (input[5]) >= (0.0149999997) { + if (input[5]) >= (0.0450000018) { + var116 = -0.0829395279 + } else { + var116 = 0.288338065 + } + } else { + if (input[2]) >= (0.0214403775) { + var116 = -0.331983596 + } else { + var116 = 0.00266320258 + } + } + } + var var117 float64 + if (input[4]) >= (0.712184906) { + var117 = -0.275763988 + } else { + if (input[8]) >= (0.00150799891) { + if (input[3]) >= (0.121799268) { + var117 = 0.100804955 + } else { + var117 = 3.66393251e-05 + } + } else { + var117 = 0.336973011 + } + } + var var118 float64 + if (input[7]) >= (0.0124138705) { + if (input[4]) >= (0.415266097) { + if (input[2]) >= (0.111952268) { + var118 = 0.112126507 + } else { + var118 = -0.160864264 + } + } else { + if (input[4]) >= (0.0553221293) { + var118 = 0.0382908694 + } else { + var118 = -0.0283828937 + } + } + } else { + if (input[4]) >= (0.472689092) { + if (input[5]) >= (0.0450000018) { + var118 = -0.213127285 + } else { + var118 = 0.26966086 + } + } else { + if (input[4]) >= (0.0665266141) { + var118 = -0.0276819896 + } else { + var118 = 0.0197456609 + } + } + } + var var119 float64 + if (input[9]) >= (0.254843652) { + if (input[0]) >= (0.00616541365) { + if (input[9]) >= (0.281725526) { + var119 = -0.285425395 + } else { + var119 = -0.0482162274 + } + } else { + if (input[1]) >= (0.0485264212) { + var119 = -0.168016255 + } else { + var119 = 0.0479509942 + } + } + } else { + if (input[7]) >= (2.98678988e-05) { + if (input[0]) >= (0.158646613) { + var119 = -0.035405986 + } else { + var119 = 0.0027063298 + } + } else { + if (input[4]) >= (0.0231092442) { + var119 = 0.00618083728 + } else { + var119 = 0.254611731 + } + } + } + var var120 float64 + if (input[1]) >= (0.103912599) { + if (input[0]) >= (0.12045113) { + if (input[5]) >= (0.175000012) { + var120 = -0.117579542 + } else { + var120 = 0.141733766 + } + } else { + if (input[8]) >= (0.0109493835) { + var120 = -0.0944417119 + } else { + var120 = 0.0431197174 + } + } + } else { + if (input[0]) >= (0.121654138) { + if (input[1]) >= (0.014989838) { + var120 = -0.058864858 + } else { + var120 = 0.0610758811 + } + } else { + if (input[0]) >= (0.12045113) { + var120 = 0.132870913 + } else { + var120 = 0.00166407996 + } + } + } + var var121 float64 + if (input[8]) >= (0.0135719907) { + if (input[0]) >= (0.00496240612) { + if (input[0]) >= (0.00616541365) { + var121 = 0.00748342695 + } else { + var121 = -0.260428578 + } + } else { + if (input[0]) >= (0.00225563906) { + var121 = 0.233885914 + } else { + var121 = -0.139178395 + } + } + } else { + if (input[5]) >= (0.0149999997) { + if (input[8]) >= (0.0108182533) { + var121 = 0.302204281 + } else { + var121 = -0.374258548 + } + } else { + if (input[8]) >= (0.0119984262) { + var121 = -0.255583793 + } else { + var121 = -0.0115750153 + } + } + } + var var122 float64 + if (input[5]) >= (0.194999993) { + if (input[4]) >= (0.3494398) { + if (input[5]) >= (0.254999995) { + var122 = -0.318196803 + } else { + var122 = 0.0204219781 + } + } else { + if (input[4]) >= (0.184173673) { + var122 = 0.193645999 + } else { + var122 = 0.013671428 + } + } + } else { + if (input[5]) >= (0.145000011) { + if (input[4]) >= (0.282212913) { + var122 = -0.230274901 + } else { + var122 = -0.024874026 + } + } else { + if (input[4]) >= (0.0077030817) { + var122 = 0.000786224438 + } else { + var122 = 0.239714861 + } + } + } + var var123 float64 + if (input[0]) >= (0.0118796993) { + if (input[8]) >= (0.0261605028) { + if (input[0]) >= (0.0347368419) { + var123 = -0.0140690124 + } else { + var123 = 0.107350774 + } + } else { + if (input[0]) >= (0.0503759384) { + var123 = 0.17428875 + } else { + var123 = -0.0710003451 + } + } + } else { + if (input[4]) >= (0.143557429) { + if (input[8]) >= (0.0127852084) { + var123 = 0.310619414 + } else { + var123 = -0.231911078 + } + } else { + if (input[4]) >= (0.142156869) { + var123 = -0.870025098 + } else { + var123 = 0.0123206424 + } + } + } + var var124 float64 + if (input[5]) >= (0.114999995) { + if (input[4]) >= (0.489495814) { + if (input[7]) >= (0.103298433) { + var124 = 0.039091114 + } else { + var124 = -0.366690069 + } + } else { + if (input[0]) >= (0.0741353408) { + var124 = 0.0180911347 + } else { + var124 = 0.160818905 + } + } + } else { + if (input[4]) >= (0.458683491) { + if (input[9]) >= (0.0531285182) { + var124 = 0.417920023 + } else { + var124 = 0.0465288013 + } + } else { + if (input[4]) >= (0.212184876) { + var124 = -0.0291729979 + } else { + var124 = 0.00264581735 + } + } + } + var var125 float64 + if (input[4]) >= (0.740196109) { + var125 = -0.316857755 + } else { + if (input[8]) >= (0.0829399452) { + if (input[0]) >= (0.121654138) { + var125 = -0.0169537459 + } else { + var125 = 0.118023172 + } + } else { + if (input[0]) >= (0.23593986) { + var125 = 0.174380749 + } else { + var125 = -0.00535024423 + } + } + } + var var126 float64 + if (input[0]) >= (0.250075191) { + if (input[8]) >= (0.0688434318) { + var126 = -0.301149189 + } else { + if (input[1]) >= (0.010416666) { + var126 = -0.143621773 + } else { + var126 = 0.334566027 + } + } + } else { + if (input[8]) >= (0.100118019) { + if (input[4]) >= (0.0721288547) { + var126 = 0.069352068 + } else { + var126 = -0.175869375 + } + } else { + if (input[0]) >= (0.0281203017) { + var126 = -0.012853439 + } else { + var126 = 0.0105679799 + } + } + } + var var127 float64 + if (input[9]) >= (0.000187682264) { + if (input[9]) >= (0.0114197442) { + if (input[3]) >= (0.138764411) { + var127 = 0.376213312 + } else { + var127 = -0.00374712795 + } + } else { + if (input[1]) >= (0.00533536542) { + var127 = 0.0262175351 + } else { + var127 = -0.191218495 + } + } + } else { + var127 = 0.331110358 + } + var var128 float64 + if (input[4]) >= (0.684173703) { + var128 = -0.241803482 + } else { + if (input[3]) >= (0.022961922) { + if (input[4]) >= (0.065126054) { + var128 = 0.0298298113 + } else { + var128 = -0.0770601556 + } + } else { + if (input[4]) >= (0.610644281) { + var128 = 0.285727799 + } else { + var128 = -0.00581280515 + } + } + } + var var129 float64 + if (input[2]) >= (0.00451914826) { + if (input[2]) >= (0.00548912399) { + if (input[0]) >= (0.0221052617) { + var129 = -0.00104936014 + } else { + var129 = 0.02481254 + } + } else { + if (input[7]) >= (0.000166610043) { + var129 = 0.112581015 + } else { + var129 = -0.154138625 + } + } + } else { + if (input[6]) >= (0.0215702802) { + if (input[0]) >= (0.00195488706) { + var129 = -0.10938298 + } else { + var129 = -0.529833138 + } + } else { + if (input[6]) >= (0.0212391242) { + var129 = 0.506786644 + } else { + var129 = -0.00931506976 + } + } + } + var var130 float64 + if (input[6]) >= (0.00305566425) { + if (input[9]) >= (0.065818727) { + if (input[0]) >= (0.0224060155) { + var130 = -0.0764299259 + } else { + var130 = -0.00783626828 + } + } else { + if (input[0]) >= (0.0545864664) { + var130 = -0.0130933551 + } else { + var130 = 0.0203839801 + } + } + } else { + if (input[8]) >= (0.0108182533) { + if (input[8]) >= (0.0163257271) { + var130 = 0.0259690322 + } else { + var130 = -0.0873820335 + } + } else { + if (input[6]) >= (0.00185146159) { + var130 = 0.147375077 + } else { + var130 = -0.104355223 + } + } + } + var var131 float64 + if (input[2]) >= (0.333648801) { + if (input[3]) >= (0.0125538018) { + if (input[4]) >= (0.345938385) { + var131 = -0.135189548 + } else { + var131 = -0.446047574 + } + } else { + var131 = 0.069308497 + } + } else { + if (input[4]) >= (0.0161064435) { + if (input[0]) >= (0.00255639106) { + var131 = 0.00153335172 + } else { + var131 = 0.0852574036 + } + } else { + if (input[0]) >= (0.00255639106) { + var131 = -0.0171162356 + } else { + var131 = -0.326134086 + } + } + } + var var132 float64 + if (input[8]) >= (0.00976921059) { + if (input[0]) >= (0.0224060155) { + if (input[4]) >= (0.0301120449) { + var132 = -0.0115240207 + } else { + var132 = 0.123582989 + } + } else { + if (input[4]) >= (0.188375354) { + var132 = 0.170507476 + } else { + var132 = 0.00219723186 + } + } + } else { + if (input[0]) >= (0.00496240612) { + if (input[4]) >= (0.0315126069) { + var132 = -0.115836762 + } else { + var132 = 0.127661929 + } + } else { + if (input[4]) >= (0.0301120449) { + var132 = 0.144599751 + } else { + var132 = -0.141905576 + } + } + } + var var133 float64 + if (input[7]) >= (0.0111986334) { + if (input[0]) >= (0.00616541365) { + if (input[0]) >= (0.0356390998) { + var133 = 0.00356084551 + } else { + var133 = 0.0763231218 + } + } else { + if (input[0]) >= (0.00406015012) { + var133 = -0.381413251 + } else { + var133 = 0.151279971 + } + } + } else { + if (input[1]) >= (0.0424288623) { + if (input[5]) >= (0.00499999989) { + var133 = 0.0398071259 + } else { + var133 = -0.0499352403 + } + } else { + if (input[7]) >= (0.00367639307) { + var133 = -0.0317209661 + } else { + var133 = 0.0223799497 + } + } + } + var var134 float64 + if (input[5]) >= (0.795000017) { + if (input[9]) >= (0.0103369616) { + if (input[4]) >= (0.0252100844) { + var134 = -0.157192513 + } else { + var134 = 0.171405137 + } + } else { + var134 = -0.344318926 + } + } else { + if (input[4]) >= (0.00350140082) { + if (input[4]) >= (0.0119047621) { + var134 = 0.00114011369 + } else { + var134 = -0.0859108269 + } + } else { + if (input[9]) >= (0.014206104) { + var134 = 0.288605213 + } else { + var134 = 0.0407952741 + } + } + } + var var135 float64 + if (input[4]) >= (0.0259103645) { + if (input[0]) >= (0.00345864659) { + if (input[9]) >= (0.174876571) { + var135 = -0.0855526328 + } else { + var135 = 0.00598633382 + } + } else { + if (input[5]) >= (0.00499999989) { + var135 = -0.253168076 + } else { + var135 = 0.372637659 + } + } + } else { + if (input[5]) >= (0.00499999989) { + if (input[0]) >= (0.0751879662) { + var135 = -0.181993455 + } else { + var135 = 0.0943748727 + } + } else { + if (input[0]) >= (0.00766917318) { + var135 = -0.344649732 + } else { + var135 = -0.0217528567 + } + } + } + var var136 float64 + if (input[4]) >= (0.00350140082) { + if (input[3]) >= (0.31410405) { + var136 = -0.350905776 + } else { + if (input[7]) >= (0.438012332) { + var136 = -0.351206213 + } else { + var136 = -0.0032191975 + } + } + } else { + if (input[0]) >= (0.104511276) { + if (input[2]) >= (0.0910414234) { + var136 = 0.0526440367 + } else { + var136 = 0.30595091 + } + } else { + if (input[3]) >= (0.0119394055) { + var136 = -0.220118895 + } else { + var136 = 0.241823569 + } + } + } + var var137 float64 + if (input[8]) >= (0.148373991) { + if (input[5]) >= (0.185000002) { + if (input[0]) >= (0.12676692) { + var137 = 0.0314024948 + } else { + var137 = -0.224736229 + } + } else { + if (input[4]) >= (0.198879555) { + var137 = 0.212628871 + } else { + var137 = -0.0802598521 + } + } + } else { + if (input[5]) >= (0.0149999997) { + if (input[0]) >= (0.0395488739) { + var137 = -0.0791010857 + } else { + var137 = 0.0769828185 + } + } else { + if (input[0]) >= (0.0407518819) { + var137 = 0.0394352861 + } else { + var137 = -0.0208254158 + } + } + } + var var138 float64 + if (input[5]) >= (0.105000004) { + if (input[8]) >= (0.0228822455) { + if (input[1]) >= (0.0078760162) { + var138 = 0.0344673991 + } else { + var138 = -0.117652409 + } + } else { + if (input[1]) >= (0.124237806) { + var138 = 0.0738634095 + } else { + var138 = 0.328967512 + } + } + } else { + if (input[5]) >= (0.0149999997) { + if (input[8]) >= (0.0123918178) { + var138 = -0.0464873537 + } else { + var138 = 0.170960337 + } + } else { + if (input[8]) >= (0.0135719907) { + var138 = 0.014421423 + } else { + var138 = -0.0267122798 + } + } + } + var var139 float64 + if (input[0]) >= (0.00285714283) { + if (input[8]) >= (0.00937581994) { + if (input[8]) >= (0.0135719907) { + var139 = -0.000167242688 + } else { + var139 = -0.0456813723 + } + } else { + if (input[1]) >= (0.0368394293) { + var139 = 0.0508897342 + } else { + var139 = 0.348183692 + } + } + } else { + if (input[5]) >= (0.0149999997) { + if (input[5]) >= (0.0350000001) { + var139 = 0.168228582 + } else { + var139 = -0.695722103 + } + } else { + if (input[8]) >= (0.0110805137) { + var139 = 0.222613633 + } else { + var139 = -0.0430962667 + } + } + } + var var140 float64 + if (input[4]) >= (0.614145637) { + if (input[3]) >= (0.111825317) { + if (input[4]) >= (0.735994399) { + var140 = -0.213211253 + } else { + var140 = 0.271391213 + } + } else { + if (input[3]) >= (0.0217527039) { + var140 = -0.263317734 + } else { + var140 = 0.117851853 + } + } + } else { + if (input[4]) >= (0.0119047621) { + if (input[5]) >= (0.685000002) { + var140 = -0.214193448 + } else { + var140 = 0.00533947302 + } + } else { + if (input[1]) >= (0.102388211) { + var140 = 0.205199391 + } else { + var140 = -0.0978819653 + } + } + } + var var141 float64 + if (input[0]) >= (0.00766917318) { + if (input[8]) >= (0.0116050355) { + if (input[8]) >= (0.0119984262) { + var141 = -0.00543809682 + } else { + var141 = 0.417080313 + } + } else { + if (input[1]) >= (0.0744410604) { + var141 = 0.0707681403 + } else { + var141 = -0.290935963 + } + } + } else { + if (input[0]) >= (0.00706766918) { + if (input[6]) >= (0.00404913165) { + var141 = 0.206833869 + } else { + var141 = -0.0343035422 + } + } else { + if (input[6]) >= (0.00507270359) { + var141 = -0.0380622111 + } else { + var141 = 0.0490193404 + } + } + } + var var142 float64 + if (input[4]) >= (0.0665266141) { + if (input[8]) >= (0.0291765016) { + if (input[4]) >= (0.15196079) { + var142 = -0.0156580433 + } else { + var142 = 0.0820667669 + } + } else { + if (input[4]) >= (0.170168072) { + var142 = 0.0545320325 + } else { + var142 = -0.116160892 + } + } + } else { + if (input[4]) >= (0.0553221293) { + if (input[7]) >= (0.0271056257) { + var142 = -0.0785854906 + } else { + var142 = 0.169238329 + } + } else { + if (input[4]) >= (0.052521009) { + var142 = -0.215308845 + } else { + var142 = 0.0114129726 + } + } + } + var var143 float64 + if (input[7]) >= (0.192424655) { + if (input[2]) >= (0.226137191) { + if (input[0]) >= (0.134586468) { + var143 = -0.181136966 + } else { + var143 = 0.0966443792 + } + } else { + if (input[2]) >= (0.208639175) { + var143 = 0.417759866 + } else { + var143 = 0.0850551575 + } + } + } else { + if (input[3]) >= (0.00241563935) { + if (input[2]) >= (0.0170873962) { + var143 = -0.00749544473 + } else { + var143 = 0.00836081244 + } + } else { + if (input[1]) >= (0.0200711377) { + var143 = -0.14979291 + } else { + var143 = 0.0561823286 + } + } + } + var var144 float64 + if (input[0]) >= (0.174586475) { + if (input[4]) >= (0.0357142873) { + if (input[4]) >= (0.0567226894) { + var144 = -0.04269531 + } else { + var144 = -0.258859992 + } + } else { + if (input[5]) >= (0.0250000004) { + var144 = -0.249581754 + } else { + var144 = 0.512661815 + } + } + } else { + if (input[5]) >= (0.275000006) { + if (input[4]) >= (0.287815154) { + var144 = -0.269225121 + } else { + var144 = 0.166470662 + } + } else { + if (input[4]) >= (0.262605071) { + var144 = 0.0171948001 + } else { + var144 = -0.0089152772 + } + } + } + var var145 float64 + if (input[1]) >= (0.0165142268) { + if (input[4]) >= (0.12114846) { + if (input[3]) >= (0.0056836037) { + var145 = 0.00874270219 + } else { + var145 = 0.0979394019 + } + } else { + if (input[0]) >= (0.068721801) { + var145 = -0.105979823 + } else { + var145 = 0.00527297566 + } + } + } else { + if (input[0]) >= (0.12736842) { + if (input[1]) >= (0.00685975607) { + var145 = 0.132010326 + } else { + var145 = -0.134371415 + } + } else { + if (input[8]) >= (0.0488460511) { + var145 = -0.00926200766 + } else { + var145 = -0.136672184 + } + } + } + var var146 float64 + if (input[8]) >= (0.0108182533) { + if (input[3]) >= (0.00266322773) { + if (input[3]) >= (0.00267390418) { + var146 = -0.00135080365 + } else { + var146 = 0.202898055 + } + } else { + if (input[8]) >= (0.015670076) { + var146 = 0.00971958693 + } else { + var146 = -0.176438913 + } + } + } else { + if (input[5]) >= (0.00499999989) { + if (input[7]) >= (0.00759884063) { + var146 = -0.0875183716 + } else { + var146 = -0.398493946 + } + } else { + if (input[6]) >= (0.0100701451) { + var146 = -0.0929245055 + } else { + var146 = 0.0788901821 + } + } + } + var var147 float64 + if (input[0]) >= (0.158646613) { + if (input[8]) >= (0.0479281396) { + if (input[5]) >= (0.114999995) { + var147 = 0.0116372127 + } else { + var147 = -0.119947843 + } + } else { + if (input[8]) >= (0.0409782305) { + var147 = 0.29510662 + } else { + var147 = -0.0427953303 + } + } + } else { + if (input[0]) >= (0.144812018) { + if (input[8]) >= (0.0422895364) { + var147 = 0.144425467 + } else { + var147 = -0.25616923 + } + } else { + if (input[5]) >= (0.185000002) { + var147 = 0.0603768975 + } else { + var147 = -0.00253436295 + } + } + } + var var148 float64 + if (input[4]) >= (0.174369752) { + if (input[4]) >= (0.178571433) { + if (input[5]) >= (0.00499999989) { + var148 = -0.0757573321 + } else { + var148 = 0.0181486122 + } + } else { + if (input[7]) >= (0.0599030182) { + var148 = 0.0891463235 + } else { + var148 = -0.289231479 + } + } + } else { + if (input[8]) >= (0.0344217159) { + if (input[4]) >= (0.0903361365) { + var148 = 0.111774698 + } else { + var148 = -0.0176778622 + } + } else { + if (input[4]) >= (0.0931372568) { + var148 = -0.0842314661 + } else { + var148 = 0.0114371013 + } + } + } + var var149 float64 + if (input[5]) >= (0.0949999988) { + if (input[0]) >= (0.044661656) { + if (input[4]) >= (0.490896344) { + var149 = -0.212072328 + } else { + var149 = 0.0234853737 + } + } else { + if (input[0]) >= (0.0103759402) { + var149 = 0.286727399 + } else { + var149 = -0.0410271995 + } + } + } else { + if (input[5]) >= (0.075000003) { + if (input[0]) >= (0.0108270682) { + var149 = -0.0141440639 + } else { + var149 = -0.647706091 + } + } else { + if (input[7]) >= (0.0834314078) { + var149 = -0.0591427907 + } else { + var149 = 0.00273690186 + } + } + } + var var150 float64 + if (input[4]) >= (0.583333373) { + if (input[0]) >= (0.0551879704) { + if (input[3]) >= (0.0757643431) { + var150 = 0.129276305 + } else { + var150 = -0.233810782 + } + } else { + if (input[0]) >= (0.039849624) { + var150 = 0.375647277 + } else { + var150 = -0.0239509884 + } + } + } else { + if (input[4]) >= (0.528711498) { + if (input[1]) >= (0.0335365832) { + var150 = 0.323780805 + } else { + var150 = -0.189444795 + } + } else { + if (input[8]) >= (0.110739574) { + var150 = 0.0439732 + } else { + var150 = -0.00255786348 + } + } + } + var var151 float64 + if (input[0]) >= (0.00766917318) { + if (input[4]) >= (0.0203081239) { + if (input[9]) >= (0.210218579) { + var151 = -0.18726334 + } else { + var151 = -0.00214000954 + } + } else { + if (input[0]) >= (0.0127819553) { + var151 = -0.00993244816 + } else { + var151 = -0.385518759 + } + } + } else { + if (input[0]) >= (0.00706766918) { + if (input[4]) >= (0.010504202) { + var151 = 0.135531276 + } else { + var151 = -0.402445734 + } + } else { + if (input[4]) >= (0.0175070036) { + var151 = -0.0108175501 + } else { + var151 = 0.0792596713 + } + } + } + var var152 float64 + if (input[8]) >= (0.0135719907) { + if (input[2]) >= (0.0129746571) { + if (input[7]) >= (0.0112028997) { + var152 = 0.00889445283 + } else { + var152 = -0.0325963907 + } + } else { + if (input[8]) >= (0.0308811963) { + var152 = 0.062754184 + } else { + var152 = -0.00672111334 + } + } + } else { + if (input[8]) >= (0.0121295564) { + if (input[5]) >= (0.0149999997) { + var152 = 0.0844979137 + } else { + var152 = -0.205100074 + } + } else { + if (input[5]) >= (0.00499999989) { + var152 = 0.111980148 + } else { + var152 = -0.0122044692 + } + } + } + var var153 float64 + if (input[2]) >= (0.47107029) { + var153 = -0.323607534 + } else { + if (input[3]) >= (0.019142855) { + if (input[3]) >= (0.0197887719) { + var153 = 0.0163472816 + } else { + var153 = 0.207988441 + } + } else { + if (input[4]) >= (0.212184876) { + var153 = -0.0388285965 + } else { + var153 = 0.00701993704 + } + } + } + var var154 float64 + if (input[0]) >= (0.0230075195) { + if (input[4]) >= (0.0301120449) { + if (input[4]) >= (0.0553221293) { + var154 = -0.0028280546 + } else { + var154 = -0.105003953 + } + } else { + if (input[4]) >= (0.0273109246) { + var154 = 0.478357702 + } else { + var154 = 0.00307897967 + } + } + } else { + if (input[5]) >= (0.00499999989) { + if (input[0]) >= (0.0163909774) { + var154 = 0.378167897 + } else { + var154 = 0.037315011 + } + } else { + if (input[2]) >= (0.0472223237) { + var154 = -0.331712425 + } else { + var154 = -0.00217150222 + } + } + } + var var155 float64 + if (input[4]) >= (0.660364151) { + if (input[3]) >= (0.156331241) { + var155 = 0.0215973519 + } else { + if (input[8]) >= (0.0881851539) { + var155 = -0.25903067 + } else { + var155 = -0.0718326196 + } + } + } else { + if (input[8]) >= (0.121361136) { + if (input[5]) >= (0.145000011) { + var155 = -0.0583579727 + } else { + var155 = 0.115475424 + } + } else { + if (input[4]) >= (0.0889355764) { + var155 = -0.00992825162 + } else { + var155 = 0.00900680386 + } + } + } + var var156 float64 + if (input[0]) >= (0.121353388) { + if (input[7]) >= (0.0840557814) { + if (input[4]) >= (0.0987394974) { + var156 = 0.105499111 + } else { + var156 = -0.156945974 + } + } else { + if (input[4]) >= (0.109943978) { + var156 = -0.0594373159 + } else { + var156 = 0.0483802222 + } + } + } else { + if (input[0]) >= (0.12045113) { + if (input[1]) >= (0.0434451215) { + var156 = -0.0751423314 + } else { + var156 = 0.280899078 + } + } else { + if (input[0]) >= (0.1075188) { + var156 = -0.103808515 + } else { + var156 = 0.00496785017 + } + } + } + var var157 float64 + if (input[0]) >= (0.181804508) { + if (input[3]) >= (0.0103697358) { + if (input[3]) >= (0.0283671767) { + var157 = -0.104628295 + } else { + var157 = 0.0856563449 + } + } else { + if (input[3]) >= (0.00413909927) { + var157 = -0.225376964 + } else { + var157 = -0.0129370028 + } + } + } else { + if (input[7]) >= (0.0320443958) { + if (input[0]) >= (0.0136842104) { + var157 = 0.0289665628 + } else { + var157 = -0.215346456 + } + } else { + if (input[7]) >= (0.0313527584) { + var157 = -0.242290229 + } else { + var157 = -0.00289588119 + } + } + } + var var158 float64 + if (input[4]) >= (0.0245098043) { + if (input[5]) >= (0.675000012) { + if (input[4]) >= (0.15266107) { + var158 = -0.362932295 + } else { + var158 = -0.0518502705 + } + } else { + if (input[4]) >= (0.0385154076) { + var158 = -0.000363126688 + } else { + var158 = 0.032496538 + } + } + } else { + if (input[4]) >= (0.0231092442) { + if (input[1]) >= (0.0221036579) { + var158 = -0.22680293 + } else { + var158 = 0.250147015 + } + } else { + if (input[4]) >= (0.021708684) { + var158 = 0.103268616 + } else { + var158 = -0.0213804971 + } + } + } + var var159 float64 + if (input[0]) >= (0.00105263153) { + if (input[6]) >= (0.150043666) { + if (input[2]) >= (0.0194415655) { + var159 = -0.0609493032 + } else { + var159 = 0.33294341 + } + } else { + if (input[8]) >= (0.00976921059) { + var159 = 0.000698034011 + } else { + var159 = -0.044203192 + } + } + } else { + if (input[8]) >= (0.00937581994) { + if (input[9]) >= (0.0938411355) { + var159 = 0.28835246 + } else { + var159 = 0.0438954197 + } + } else { + if (input[0]) >= (0.000451127824) { + var159 = 0.173329294 + } else { + var159 = -0.215837315 + } + } + } + var var160 float64 + if (input[7]) >= (0.0420824476) { + if (input[4]) >= (0.297619045) { + if (input[4]) >= (0.468487382) { + var160 = -0.0924231559 + } else { + var160 = 0.0992535502 + } + } else { + if (input[8]) >= (0.0738919452) { + var160 = -0.118575223 + } else { + var160 = -0.0223002657 + } + } + } else { + if (input[7]) >= (0.0386348367) { + if (input[1]) >= (0.088160567) { + var160 = -0.0948769674 + } else { + var160 = 0.183833688 + } + } else { + if (input[4]) >= (0.370448172) { + var160 = -0.0387036875 + } else { + var160 = 0.00471006148 + } + } + } + var var161 float64 + if (input[0]) >= (0.0145864664) { + if (input[8]) >= (0.0185549445) { + if (input[4]) >= (0.0693277344) { + var161 = -0.00932896696 + } else { + var161 = 0.0596585386 + } + } else { + if (input[4]) >= (0.0455182083) { + var161 = -0.0446461365 + } else { + var161 = -0.260945737 + } + } + } else { + if (input[4]) >= (0.0903361365) { + if (input[8]) >= (0.0140965115) { + var161 = 0.216262355 + } else { + var161 = -0.182813779 + } + } else { + if (input[8]) >= (0.0327170193) { + var161 = -0.196973875 + } else { + var161 = -0.000896447455 + } + } + } + var var162 float64 + if (input[3]) >= (0.0549829304) { + if (input[6]) >= (0.0202155523) { + if (input[0]) >= (0.183759391) { + var162 = -0.197906226 + } else { + var162 = 0.176055863 + } + } else { + if (input[8]) >= (0.0786126405) { + var162 = -0.0179152321 + } else { + var162 = 0.101568311 + } + } + } else { + if (input[3]) >= (0.0498255193) { + if (input[6]) >= (0.0192371383) { + var162 = 0.0388819911 + } else { + var162 = -0.224959269 + } + } else { + if (input[3]) >= (0.039497979) { + var162 = 0.0668839961 + } else { + var162 = -0.00353730354 + } + } + } + var var163 float64 + if (input[4]) >= (0.0245098043) { + if (input[5]) >= (0.644999981) { + if (input[8]) >= (0.0683189109) { + var163 = -0.316471517 + } else { + var163 = 0.10305687 + } + } else { + if (input[1]) >= (0.158790648) { + var163 = -0.0807244778 + } else { + var163 = 0.00877166726 + } + } + } else { + if (input[4]) >= (0.0231092442) { + if (input[8]) >= (0.0105559928) { + var163 = 0.0191192254 + } else { + var163 = -0.312208533 + } + } else { + if (input[8]) >= (0.0108182533) { + var163 = -0.0375919603 + } else { + var163 = 0.0869660005 + } + } + } + var var164 float64 + if (input[3]) >= (0.0549829304) { + if (input[6]) >= (0.0023933528) { + if (input[9]) >= (0.0178442523) { + var164 = 0.208663955 + } else { + var164 = 0.0537416227 + } + } else { + if (input[1]) >= (0.11305894) { + var164 = 0.0843253285 + } else { + var164 = -0.271400005 + } + } + } else { + if (input[8]) >= (0.160437971) { + if (input[3]) >= (0.0235874988) { + var164 = -0.0770130008 + } else { + var164 = 0.224259838 + } + } else { + if (input[6]) >= (0.203450039) { + var164 = -0.25460431 + } else { + var164 = -0.00105158577 + } + } + } + var var165 float64 + if (input[4]) >= (0.240196079) { + if (input[0]) >= (0.0587969944) { + if (input[8]) >= (0.0689089969) { + var165 = 0.0134523362 + } else { + var165 = -0.0956699327 + } + } else { + if (input[7]) >= (0.0829356387) { + var165 = -0.764400363 + } else { + var165 = 0.109100163 + } + } + } else { + if (input[4]) >= (0.212184876) { + if (input[8]) >= (0.0253737215) { + var165 = -0.1552331 + } else { + var165 = 0.207323387 + } + } else { + if (input[4]) >= (0.209383756) { + var165 = 0.228579029 + } else { + var165 = -0.00227131089 + } + } + } + var var166 float64 + if (input[9]) >= (0.097551465) { + if (input[1]) >= (0.0205792673) { + if (input[0]) >= (0.0148872184) { + var166 = -0.0595923737 + } else { + var166 = 0.0310274344 + } + } else { + if (input[2]) >= (0.0202698) { + var166 = -0.0968745798 + } else { + var166 = 0.347511351 + } + } + } else { + if (input[9]) >= (0.0971472263) { + var166 = -0.39062947 + } else { + if (input[0]) >= (0.0485714301) { + var166 = 0.00704049598 + } else { + var166 = -0.018904034 + } + } + } + var var167 float64 + if (input[1]) >= (0.0261687003) { + if (input[8]) >= (0.0278651975) { + if (input[3]) >= (0.00983973313) { + var167 = 0.00581860915 + } else { + var167 = 0.109148152 + } + } else { + if (input[0]) >= (0.0272180438) { + var167 = -0.101350643 + } else { + var167 = 0.00748996111 + } + } + } else { + if (input[4]) >= (0.322829127) { + if (input[2]) >= (0.0526377745) { + var167 = 0.0994389877 + } else { + var167 = -0.203419656 + } + } else { + if (input[4]) >= (0.0273109246) { + var167 = 0.00339660491 + } else { + var167 = -0.10027951 + } + } + } + var var168 float64 + if (input[9]) >= (0.0426905006) { + if (input[0]) >= (0.0627067685) { + if (input[1]) >= (0.0154979676) { + var168 = 0.102544867 + } else { + var168 = -0.305981487 + } + } else { + if (input[8]) >= (0.0518620498) { + var168 = 0.163999468 + } else { + var168 = -0.0244274624 + } + } + } else { + if (input[0]) >= (0.0509774461) { + if (input[0]) >= (0.0524812043) { + var168 = -0.0018000456 + } else { + var168 = -0.181340441 + } + } else { + if (input[8]) >= (0.0416338854) { + var168 = 0.182958886 + } else { + var168 = 0.0238575358 + } + } + } + var var169 float64 + if (input[0]) >= (0.0485714301) { + if (input[8]) >= (0.0264227651) { + if (input[8]) >= (0.0315368474) { + var169 = 0.0102678631 + } else { + var169 = -0.171694681 + } + } else { + if (input[5]) >= (0.00999999978) { + var169 = -0.405710608 + } else { + var169 = 0.179058939 + } + } + } else { + if (input[4]) >= (0.327030838) { + if (input[8]) >= (0.0251114611) { + var169 = 0.394666046 + } else { + var169 = 0.0365819894 + } + } else { + if (input[0]) >= (0.0482706763) { + var169 = -0.323061109 + } else { + var169 = -0.0139405839 + } + } + } + var var170 float64 + if (input[9]) >= (0.0886293426) { + if (input[4]) >= (0.244397759) { + if (input[0]) >= (0.00676691718) { + var170 = -0.127423763 + } else { + var170 = 0.3102974 + } + } else { + if (input[0]) >= (0.0603007525) { + var170 = 0.412968755 + } else { + var170 = 0.0279724542 + } + } + } else { + if (input[3]) >= (0.00419095531) { + if (input[3]) >= (0.00420569861) { + var170 = 0.00146679231 + } else { + var170 = 0.544894338 + } + } else { + if (input[4]) >= (0.188375354) { + var170 = 0.0522939079 + } else { + var170 = -0.0477037281 + } + } + } + var var171 float64 + if (input[1]) >= (0.00330284564) { + if (input[3]) >= (0.00913713127) { + if (input[4]) >= (0.237394959) { + var171 = 0.0290249959 + } else { + var171 = -0.00479551405 + } + } else { + if (input[4]) >= (0.241596639) { + var171 = -0.0910276696 + } else { + var171 = -0.00118189212 + } + } + } else { + if (input[0]) >= (0.107969925) { + if (input[2]) >= (0.0933861881) { + var171 = -0.0370101742 + } else { + var171 = -0.407472908 + } + } else { + var171 = 0.265172571 + } + } + var var172 float64 + if (input[0]) >= (0.0539849624) { + if (input[7]) >= (0.000983608887) { + if (input[0]) >= (0.0584962405) { + var172 = -0.0145154251 + } else { + var172 = -0.114525028 + } + } else { + if (input[1]) >= (0.0434451215) { + var172 = -0.0513614453 + } else { + var172 = 0.134299487 + } + } + } else { + if (input[4]) >= (0.327030838) { + if (input[4]) >= (0.334033608) { + var172 = 0.132817522 + } else { + var172 = 0.372594297 + } + } else { + if (input[4]) >= (0.200980395) { + var172 = -0.0699927062 + } else { + var172 = 0.0159842949 + } + } + } + var var173 float64 + if (input[7]) >= (0.277997196) { + if (input[5]) >= (0.0250000004) { + if (input[0]) >= (0.10240601) { + var173 = -0.13254784 + } else { + var173 = -0.468685389 + } + } else { + if (input[7]) >= (0.356018037) { + var173 = 0.175009266 + } else { + var173 = -0.117722698 + } + } + } else { + if (input[7]) >= (0.182734251) { + if (input[0]) >= (0.137593985) { + var173 = -0.108324744 + } else { + var173 = 0.182718471 + } + } else { + if (input[2]) >= (0.159426838) { + var173 = -0.0744064674 + } else { + var173 = 0.00291546597 + } + } + } + var var174 float64 + if (input[1]) >= (0.0673272386) { + if (input[9]) >= (0.0993272364) { + if (input[2]) >= (0.00619503483) { + var174 = -0.0473425686 + } else { + var174 = -0.332697183 + } + } else { + if (input[9]) >= (0.00116940495) { + var174 = 0.0391502082 + } else { + var174 = -0.124707893 + } + } + } else { + if (input[0]) >= (0.084360905) { + if (input[4]) >= (0.258403361) { + var174 = -0.0497853942 + } else { + var174 = 0.00527690118 + } + } else { + if (input[4]) >= (0.262605071) { + var174 = 0.0922066718 + } else { + var174 = -0.00520593999 + } + } + } + var var175 float64 + if (input[4]) >= (0.370448172) { + if (input[2]) >= (0.079676792) { + if (input[0]) >= (0.161052644) { + var175 = 0.359470129 + } else { + var175 = 0.0493303947 + } + } else { + if (input[7]) >= (0.00402160082) { + var175 = -0.136931956 + } else { + var175 = 0.00837377924 + } + } + } else { + if (input[6]) >= (0.0315049514) { + if (input[2]) >= (0.0122657437) { + var175 = 0.00564258359 + } else { + var175 = -0.0902563259 + } + } else { + if (input[2]) >= (0.141827136) { + var175 = -0.07604862 + } else { + var175 = 0.00675144792 + } + } + } + var var176 float64 + if (input[8]) >= (0.0466168374) { + if (input[0]) >= (0.0578947365) { + if (input[6]) >= (0.0268988758) { + var176 = 0.0623778217 + } else { + var176 = -0.0115356436 + } + } else { + if (input[7]) >= (0.0982554257) { + var176 = -0.30299446 + } else { + var176 = 0.124773137 + } + } + } else { + if (input[1]) >= (0.0139735769) { + if (input[8]) >= (0.0395357981) { + var176 = -0.0544881262 + } else { + var176 = 0.00354567263 + } + } else { + if (input[0]) >= (0.0494736843) { + var176 = -0.215462968 + } else { + var176 = 0.00768874958 + } + } + } + var var177 float64 + if (input[3]) >= (0.00207781093) { + if (input[9]) >= (0.000187682264) { + if (input[6]) >= (0.00164072611) { + var177 = 0.00324161956 + } else { + var177 = -0.0305442791 + } + } else { + if (input[1]) >= (0.0594512187) { + var177 = 0.0566447936 + } else { + var177 = 0.304141849 + } + } + } else { + if (input[6]) >= (0.0390161648) { + if (input[4]) >= (0.172268912) { + var177 = -0.114801303 + } else { + var177 = 0.110861234 + } + } else { + var177 = 0.289621949 + } + } + var var178 float64 + if (input[6]) >= (0.00152030587) { + if (input[6]) >= (0.00185146159) { + if (input[9]) >= (0.0017180146) { + var178 = 0.00217583077 + } else { + var178 = -0.059153866 + } + } else { + if (input[8]) >= (0.018161552) { + var178 = -0.0116098551 + } else { + var178 = -0.128228977 + } + } + } else { + if (input[8]) >= (0.0143587729) { + if (input[9]) >= (0.147388339) { + var178 = 0.383228332 + } else { + var178 = 0.0684972256 + } + } else { + if (input[2]) >= (0.00162163202) { + var178 = -0.161133468 + } else { + var178 = 0.0630592257 + } + } + } + var var179 float64 + if (input[4]) >= (0.660364151) { + if (input[0]) >= (0.12556392) { + if (input[6]) >= (0.0153686367) { + var179 = -0.30191946 + } else { + var179 = -0.110212922 + } + } else { + var179 = -0.025946429 + } + } else { + if (input[4]) >= (0.460084021) { + if (input[5]) >= (0.0649999976) { + var179 = -0.103539117 + } else { + var179 = 0.115529485 + } + } else { + if (input[1]) >= (0.107469514) { + var179 = -0.0481113605 + } else { + var179 = -0.000602907268 + } + } + } + var var180 float64 + if (input[0]) >= (0.00827067718) { + if (input[0]) >= (0.0112781953) { + if (input[0]) >= (0.0118796993) { + var180 = -0.00278469268 + } else { + var180 = 0.158401221 + } + } else { + if (input[4]) >= (0.0343137272) { + var180 = 0.0449565686 + } else { + var180 = -0.315951109 + } + } + } else { + if (input[5]) >= (0.0850000009) { + if (input[5]) >= (0.0949999988) { + var180 = 0.0493172668 + } else { + var180 = -0.612598419 + } + } else { + if (input[5]) >= (0.0149999997) { + var180 = 0.105781384 + } else { + var180 = 0.00667789718 + } + } + } + var var181 float64 + if (input[0]) >= (0.0485714301) { + if (input[4]) >= (0.15196079) { + if (input[8]) >= (0.0929058492) { + var181 = 0.0533713624 + } else { + var181 = -0.0260045938 + } + } else { + if (input[0]) >= (0.0548872203) { + var181 = 0.00290083652 + } else { + var181 = 0.252074718 + } + } + } else { + if (input[0]) >= (0.0482706763) { + if (input[4]) >= (0.114145659) { + var181 = 0.0550516285 + } else { + var181 = -1.13329101 + } + } else { + if (input[4]) >= (0.338235319) { + var181 = 0.157803372 + } else { + var181 = -0.0106846411 + } + } + } + var var182 float64 + if (input[1]) >= (0.0038109757) { + if (input[1]) >= (0.0114329271) { + if (input[0]) >= (0.123759396) { + var182 = -0.0327697732 + } else { + var182 = 0.00219755759 + } + } else { + if (input[0]) >= (0.12676692) { + var182 = 0.137625381 + } else { + var182 = -0.0209834389 + } + } + } else { + if (input[9]) >= (0.0158808082) { + if (input[1]) >= (0.00279471534) { + var182 = 0.147861362 + } else { + var182 = -0.116522558 + } + } else { + if (input[0]) >= (0.11473684) { + var182 = -0.411130041 + } else { + var182 = 0.0284649506 + } + } + } + var var183 float64 + if (input[8]) >= (0.00976921059) { + if (input[0]) >= (0.00436090212) { + if (input[9]) >= (0.0452025533) { + var183 = -0.0134079736 + } else { + var183 = 0.0091663897 + } + } else { + if (input[2]) >= (0.00276658428) { + var183 = 0.104583926 + } else { + var183 = -0.0191450212 + } + } + } else { + if (input[0]) >= (0.00526315812) { + if (input[5]) >= (0.00499999989) { + var183 = -0.336510003 + } else { + var183 = 0.156051904 + } + } else { + if (input[3]) >= (0.0025526518) { + var183 = -0.154375583 + } else { + var183 = 0.174702004 + } + } + } + var var184 float64 + if (input[6]) >= (0.00185146159) { + if (input[8]) >= (0.113231048) { + if (input[4]) >= (0.179971993) { + var184 = 0.085824199 + } else { + var184 = -0.086115025 + } + } else { + if (input[5]) >= (0.305000007) { + var184 = 0.107777208 + } else { + var184 = -0.00131451408 + } + } + } else { + if (input[9]) >= (0.00974504091) { + if (input[8]) >= (0.0138342511) { + var184 = -0.0260708388 + } else { + var184 = -0.120765291 + } + } else { + if (input[3]) >= (0.0209865496) { + var184 = -0.0571344122 + } else { + var184 = 0.206351236 + } + } + } + var var185 float64 + if (input[9]) >= (0.253414392) { + if (input[9]) >= (0.361014068) { + if (input[0]) >= (0.00616541365) { + var185 = -0.228113666 + } else { + var185 = 0.0587360151 + } + } else { + if (input[0]) >= (0.00195488706) { + var185 = -0.142193809 + } else { + var185 = 0.0929445773 + } + } + } else { + if (input[9]) >= (0.195608228) { + if (input[0]) >= (0.0142857144) { + var185 = -0.118788898 + } else { + var185 = 0.0912216902 + } + } else { + if (input[9]) >= (0.189804524) { + var185 = -0.13010399 + } else { + var185 = 0.00447146269 + } + } + } + var var186 float64 + if (input[4]) >= (0.0511204489) { + if (input[4]) >= (0.0553221293) { + if (input[4]) >= (0.0581232496) { + var186 = -0.00519857369 + } else { + var186 = 0.212981641 + } + } else { + if (input[5]) >= (0.075000003) { + var186 = 0.0927199796 + } else { + var186 = -0.227245733 + } + } + } else { + if (input[2]) >= (0.0455388315) { + if (input[9]) >= (0.0156931244) { + var186 = -0.0203138869 + } else { + var186 = -0.196029767 + } + } else { + if (input[4]) >= (0.0483193286) { + var186 = 0.168478534 + } else { + var186 = 0.0119648697 + } + } + } + var var187 float64 + if (input[8]) >= (0.00806451589) { + if (input[8]) >= (0.00976921059) { + if (input[8]) >= (0.0108182533) { + var187 = -0.0012445288 + } else { + var187 = 0.0666366741 + } + } else { + if (input[4]) >= (0.0567226931) { + var187 = 0.42969498 + } else { + var187 = -0.0683143139 + } + } + } else { + if (input[7]) >= (0.0115326662) { + var187 = -0.287928164 + } else { + if (input[6]) >= (0.00254387828) { + var187 = 0.228047565 + } else { + var187 = -0.0654921085 + } + } + } + var var188 float64 + if (input[7]) >= (0.0124238264) { + if (input[8]) >= (0.030750066) { + if (input[9]) >= (0.0239511449) { + var188 = -0.0334276073 + } else { + var188 = 0.0252642687 + } + } else { + if (input[9]) >= (0.0656454861) { + var188 = -0.0112989638 + } else { + var188 = 0.107142963 + } + } + } else { + if (input[8]) >= (0.0337660648) { + if (input[9]) >= (0.0559726283) { + var188 = 0.141788483 + } else { + var188 = -0.00741121219 + } + } else { + if (input[5]) >= (0.0649999976) { + var188 = 0.117802702 + } else { + var188 = -0.0266430918 + } + } + } + var var189 float64 + if (input[0]) >= (0.250075191) { + if (input[8]) >= (0.0688434318) { + var189 = -0.285649151 + } else { + if (input[8]) >= (0.0645816922) { + var189 = 0.504985392 + } else { + var189 = -0.0666951612 + } + } + } else { + if (input[6]) >= (0.108122349) { + if (input[8]) >= (0.0159323364) { + var189 = -0.137425601 + } else { + var189 = 0.24144955 + } + } else { + if (input[6]) >= (0.100836918) { + var189 = 0.258245945 + } else { + var189 = 0.00307789538 + } + } + } + var var190 float64 + if (input[6]) >= (0.0212090202) { + if (input[1]) >= (0.0368394293) { + if (input[3]) >= (0.0145782307) { + var190 = -0.0257593822 + } else { + var190 = 0.0530977957 + } + } else { + if (input[8]) >= (0.0114739053) { + var190 = -0.0365210101 + } else { + var190 = -0.238515005 + } + } + } else { + if (input[6]) >= (0.0180479884) { + if (input[2]) >= (0.0384885333) { + var190 = -0.0288154837 + } else { + var190 = 0.0815552622 + } + } else { + if (input[7]) >= (2.29596772e-05) { + var190 = -0.0010277048 + } else { + var190 = 0.196033373 + } + } + } + var var191 float64 + if (input[2]) >= (0.475332975) { + var191 = -0.278271377 + } else { + if (input[4]) >= (0.174369752) { + if (input[5]) >= (0.00499999989) { + var191 = -0.0648306459 + } else { + var191 = 0.010275498 + } + } else { + if (input[8]) >= (0.0345528461) { + var191 = 0.0522509031 + } else { + var191 = -0.0130279353 + } + } + } + var var192 float64 + if (input[0]) >= (0.00105263153) { + if (input[0]) >= (0.00195488706) { + if (input[0]) >= (0.00255639106) { + var192 = -0.000365062559 + } else { + var192 = 0.0992441177 + } + } else { + if (input[5]) >= (0.0350000001) { + var192 = 0.262033641 + } else { + var192 = -0.119773671 + } + } + } else { + if (input[0]) >= (0.000150375941) { + if (input[8]) >= (0.00832677633) { + var192 = 0.0838213563 + } else { + var192 = 0.234563276 + } + } else { + var192 = -0.196246609 + } + } + var var193 float64 + if (input[9]) >= (0.135492161) { + if (input[6]) >= (0.00441039214) { + if (input[4]) >= (0.259803951) { + var193 = -0.213127568 + } else { + var193 = -0.00135368889 + } + } else { + if (input[4]) >= (0.0273109246) { + var193 = 0.00316015794 + } else { + var193 = 0.100458123 + } + } + } else { + if (input[9]) >= (0.134279445) { + if (input[4]) >= (0.0455182083) { + var193 = -0.457902461 + } else { + var193 = -0.137566179 + } + } else { + if (input[5]) >= (0.245000005) { + var193 = 0.0377120487 + } else { + var193 = -0.00583023904 + } + } + } + var var194 float64 + if (input[4]) >= (0.137955189) { + if (input[0]) >= (0.243157893) { + if (input[4]) >= (0.412464976) { + var194 = -0.0321416594 + } else { + var194 = -0.33506164 + } + } else { + if (input[4]) >= (0.14915967) { + var194 = 0.00609289063 + } else { + var194 = 0.110638291 + } + } + } else { + if (input[7]) >= (0.209942266) { + if (input[4]) >= (0.0567226894) { + var194 = -0.130173683 + } else { + var194 = -0.529955268 + } + } else { + if (input[4]) >= (0.135154068) { + var194 = -0.200807527 + } else { + var194 = -0.00354404445 + } + } + } + var var195 float64 + if (input[3]) >= (0.300652921) { + var195 = -0.303942442 + } else { + if (input[3]) >= (0.00246495381) { + if (input[3]) >= (0.00250410009) { + var195 = -0.00218215818 + } else { + var195 = -0.10245081 + } + } else { + if (input[3]) >= (0.00245783618) { + var195 = 0.389174134 + } else { + var195 = 0.0313964747 + } + } + } + var var196 float64 + if (input[3]) >= (0.0226037558) { + if (input[4]) >= (0.142156869) { + if (input[8]) >= (0.0677288249) { + var196 = 0.0589102246 + } else { + var196 = -0.0173635203 + } + } else { + if (input[5]) >= (0.38499999) { + var196 = 0.168818057 + } else { + var196 = -0.0573034808 + } + } + } else { + if (input[7]) >= (0.166712254) { + if (input[4]) >= (0.295518219) { + var196 = 0.41205591 + } else { + var196 = 0.0422935858 + } + } else { + if (input[4]) >= (0.370448172) { + var196 = -0.0675416663 + } else { + var196 = -0.00159848225 + } + } + } + var var197 float64 + if (input[0]) >= (0.0281203017) { + if (input[0]) >= (0.0299248137) { + if (input[5]) >= (0.00499999989) { + var197 = -0.0279122908 + } else { + var197 = 0.00762850745 + } + } else { + if (input[1]) >= (0.0266768299) { + var197 = -0.244289935 + } else { + var197 = 0.00571836019 + } + } + } else { + if (input[0]) >= (0.0269172937) { + if (input[0]) >= (0.0272180438) { + var197 = 0.0479135104 + } else { + var197 = 0.381954134 + } + } else { + if (input[5]) >= (0.00499999989) { + var197 = 0.0561496876 + } else { + var197 = -0.00997733418 + } + } + } + var var198 float64 + if (input[4]) >= (0.566526651) { + if (input[1]) >= (0.13694106) { + if (input[4]) >= (0.657563031) { + var198 = -0.0584273487 + } else { + var198 = 0.530563712 + } + } else { + if (input[3]) >= (0.0256747156) { + var198 = 0.00935841911 + } else { + var198 = -0.204902276 + } + } + } else { + if (input[4]) >= (0.528711498) { + if (input[7]) >= (0.0209924597) { + var198 = -0.128834456 + } else { + var198 = 0.279729158 + } + } else { + if (input[4]) >= (0.510504246) { + var198 = -0.199649736 + } else { + var198 = 0.00305816019 + } + } + } + var var199 float64 + if (input[0]) >= (0.0190977454) { + if (input[8]) >= (0.0184238125) { + if (input[0]) >= (0.0272180438) { + var199 = -0.00222766446 + } else { + var199 = 0.0547681227 + } + } else { + if (input[0]) >= (0.0272180438) { + var199 = -0.0247659013 + } else { + var199 = -0.273130089 + } + } + } else { + if (input[8]) >= (0.0336349346) { + if (input[0]) >= (0.00646616518) { + var199 = -0.00147006731 + } else { + var199 = -0.388142586 + } + } else { + if (input[7]) >= (0.0372592881) { + var199 = -0.192931071 + } else { + var199 = 0.0246852953 + } + } + } + var var200 float64 + if (input[7]) >= (0.0112039167) { + if (input[9]) >= (0.149221838) { + if (input[1]) >= (0.0266768299) { + var200 = 0.00552165601 + } else { + var200 = 0.317073166 + } + } else { + if (input[9]) >= (0.055019781) { + var200 = -0.049407687 + } else { + var200 = 0.0212643389 + } + } + } else { + if (input[7]) >= (0.0109042209) { + if (input[4]) >= (0.242997199) { + var200 = 0.10363277 + } else { + var200 = -0.25523591 + } + } else { + if (input[1]) >= (0.0210873988) { + var200 = -0.0111785065 + } else { + var200 = 0.0278273635 + } + } + } + var var201 float64 + if (input[2]) >= (0.20887281) { + if (input[0]) >= (0.0527819544) { + if (input[9]) >= (0.0127190836) { + var201 = 0.147554085 + } else { + var201 = 0.0112860007 + } + } else { + var201 = -0.196247816 + } + } else { + if (input[2]) >= (0.19894141) { + if (input[2]) >= (0.203298599) { + var201 = 0.00891063828 + } else { + var201 = -0.357353479 + } + } else { + if (input[3]) >= (0.022961922) { + var201 = 0.0154557424 + } else { + var201 = -0.00535945827 + } + } + } + var var202 float64 + if (input[4]) >= (0.0119047621) { + if (input[4]) >= (0.35084033) { + if (input[2]) >= (0.0895262957) { + var202 = 0.0712020919 + } else { + var202 = -0.0425037071 + } + } else { + if (input[3]) >= (0.0920945108) { + var202 = -0.113698728 + } else { + var202 = 0.00602909597 + } + } + } else { + if (input[8]) >= (0.0131786) { + if (input[8]) >= (0.0160634667) { + var202 = -0.00886877067 + } else { + var202 = -0.385864973 + } + } else { + if (input[4]) >= (0.00910364185) { + var202 = 0.314993978 + } else { + var202 = -0.136518776 + } + } + } + var var203 float64 + if (input[4]) >= (0.702380955) { + var203 = -0.238368914 + } else { + if (input[7]) >= (0.0419924371) { + if (input[2]) >= (0.0489872992) { + var203 = -0.0129685067 + } else { + var203 = -0.234340519 + } + } else { + if (input[7]) >= (0.0396771654) { + var203 = 0.138702795 + } else { + var203 = 0.00180098426 + } + } + } + var var204 float64 + if (input[8]) >= (0.0135719907) { + if (input[0]) >= (0.00496240612) { + if (input[0]) >= (0.00616541365) { + var204 = 0.00529295346 + } else { + var204 = -0.163227856 + } + } else { + if (input[0]) >= (0.00315789459) { + var204 = 0.230013713 + } else { + var204 = -0.12042065 + } + } + } else { + if (input[6]) >= (0.0100701451) { + if (input[0]) >= (0.00315789459) { + var204 = -0.137822837 + } else { + var204 = 0.0378690995 + } + } else { + if (input[8]) >= (0.011867296) { + var204 = -0.0936183706 + } else { + var204 = 0.0317978188 + } + } + } + var var205 float64 + if (input[8]) >= (0.0392735377) { + if (input[4]) >= (0.182773113) { + if (input[3]) >= (0.0115746316) { + var205 = -0.0111127701 + } else { + var205 = -0.100864835 + } + } else { + if (input[4]) >= (0.179971993) { + var205 = 0.409006715 + } else { + var205 = 0.008808529 + } + } + } else { + if (input[4]) >= (0.188375354) { + if (input[1]) >= (0.0266768299) { + var205 = 0.0242794733 + } else { + var205 = 0.154981926 + } + } else { + if (input[4]) >= (0.186974794) { + var205 = -0.478534937 + } else { + var205 = 0.0011758426 + } + } + } + var var206 float64 + if (input[8]) >= (0.248557568) { + if (input[4]) >= (0.198179275) { + if (input[8]) >= (0.281733543) { + var206 = 0.119960025 + } else { + var206 = 0.357732207 + } + } else { + var206 = -0.17715326 + } + } else { + if (input[4]) >= (0.642156839) { + if (input[1]) >= (0.150660574) { + var206 = 0.142246932 + } else { + var206 = -0.20432061 + } + } else { + if (input[9]) >= (0.210622817) { + var206 = -0.0381634645 + } else { + var206 = 0.00107039337 + } + } + } + var var207 float64 + if (input[6]) >= (0.220910966) { + var207 = -0.280890942 + } else { + if (input[4]) >= (0.614145637) { + if (input[8]) >= (0.235444531) { + var207 = 0.200451985 + } else { + var207 = -0.155569017 + } + } else { + if (input[4]) >= (0.528711498) { + var207 = 0.0679695681 + } else { + var207 = 0.00110054039 + } + } + } + var var208 float64 + if (input[0]) >= (0.0100751882) { + if (input[0]) >= (0.0112781953) { + if (input[0]) >= (0.0121804513) { + var208 = -0.00639099488 + } else { + var208 = 0.0972129852 + } + } else { + if (input[4]) >= (0.0273109246) { + var208 = -0.0520212054 + } else { + var208 = -0.510729373 + } + } + } else { + if (input[8]) >= (0.0133097302) { + if (input[4]) >= (0.0315126069) { + var208 = 0.16733487 + } else { + var208 = -0.0293383282 + } + } else { + if (input[4]) >= (0.0385154076) { + var208 = -0.241884977 + } else { + var208 = 0.00746219559 + } + } + } + var var209 float64 + if (input[7]) >= (0.00127212866) { + if (input[7]) >= (0.00129122788) { + if (input[0]) >= (0.0669172928) { + var209 = -0.0091521712 + } else { + var209 = 0.013065598 + } + } else { + if (input[6]) >= (0.00901646726) { + var209 = 0.363039285 + } else { + var209 = -0.0134338113 + } + } + } else { + if (input[0]) >= (0.0485714301) { + if (input[3]) >= (0.0110512394) { + var209 = 0.0403508022 + } else { + var209 = -0.0386326574 + } + } else { + if (input[3]) >= (0.00632214779) { + var209 = -0.095186688 + } else { + var209 = 0.00220255787 + } + } + } + var var210 float64 + if (input[0]) >= (0.158646613) { + if (input[1]) >= (0.066310972) { + if (input[7]) >= (0.0295870993) { + var210 = -0.0553067885 + } else { + var210 = 0.210596666 + } + } else { + if (input[1]) >= (0.0134654474) { + var210 = -0.10559237 + } else { + var210 = 0.0234191939 + } + } + } else { + if (input[0]) >= (0.157443613) { + if (input[1]) >= (0.0124491872) { + var210 = 0.0832600296 + } else { + var210 = 0.458295017 + } + } else { + if (input[3]) >= (0.00419400539) { + var210 = 0.0104370276 + } else { + var210 = -0.00830824766 + } + } + } + var var211 float64 + if (input[9]) >= (0.0924118608) { + if (input[1]) >= (0.0200711377) { + if (input[7]) >= (0.000381374441) { + var211 = 0.0206242073 + } else { + var211 = -0.065682292 + } + } else { + if (input[7]) >= (0.0158438031) { + var211 = -0.00159534137 + } else { + var211 = 0.224502742 + } + } + } else { + if (input[3]) >= (0.00410224032) { + if (input[3]) >= (0.0043973634) { + var211 = -0.00219609309 + } else { + var211 = 0.0909863412 + } + } else { + if (input[7]) >= (0.139953658) { + var211 = 0.243309408 + } else { + var211 = -0.0311313793 + } + } + } + var var212 float64 + if (input[5]) >= (0.834999979) { + if (input[7]) >= (0.0426123515) { + var212 = -0.279085457 + } else { + var212 = -0.0819299445 + } + } else { + if (input[4]) >= (0.00350140082) { + if (input[1]) >= (0.327489853) { + var212 = -0.209255055 + } else { + var212 = 0.00130006135 + } + } else { + if (input[9]) >= (0.0152744493) { + var212 = 0.285093665 + } else { + var212 = 0.0511078238 + } + } + } + var var213 float64 + if (input[3]) >= (0.00321178627) { + if (input[3]) >= (0.0032255128) { + if (input[7]) >= (0.000123738428) { + var213 = -0.00475285714 + } else { + var213 = 0.0522759929 + } + } else { + if (input[8]) >= (0.0189483352) { + var213 = -0.40901342 + } else { + var213 = -0.174668223 + } + } + } else { + if (input[5]) >= (0.0249999985) { + if (input[4]) >= (0.0280112047) { + var213 = -0.150717109 + } else { + var213 = 0.0775812268 + } + } else { + if (input[4]) >= (0.228991598) { + var213 = -0.123227403 + } else { + var213 = 0.0511451475 + } + } + } + var var214 float64 + if (input[9]) >= (0.210622817) { + if (input[6]) >= (0.00389860617) { + if (input[0]) >= (0.00345864659) { + var214 = -0.143381834 + } else { + var214 = -0.0149892597 + } + } else { + if (input[0]) >= (0.00616541365) { + var214 = -0.127015114 + } else { + var214 = 0.0689806044 + } + } + } else { + if (input[9]) >= (0.206811428) { + if (input[1]) >= (0.03125) { + var214 = 0.292450637 + } else { + var214 = -0.0420863628 + } + } else { + if (input[6]) >= (0.00197188184) { + var214 = 0.00295363832 + } else { + var214 = -0.0258751847 + } + } + } + var var215 float64 + if (input[7]) >= (0.226886511) { + if (input[4]) >= (0.0630252138) { + if (input[6]) >= (0.0102056172) { + var215 = 0.124682672 + } else { + var215 = -0.139518037 + } + } else { + var215 = -0.445228249 + } + } else { + if (input[2]) >= (0.179716259) { + if (input[2]) >= (0.187716514) { + var215 = 0.0407549664 + } else { + var215 = 0.242993847 + } + } else { + if (input[2]) >= (0.168211699) { + var215 = -0.121108927 + } else { + var215 = -0.00294817681 + } + } + } + var var216 float64 + if (input[0]) >= (0.119849622) { + if (input[0]) >= (0.12105263) { + if (input[4]) >= (0.0581232496) { + var216 = 0.0122937979 + } else { + var216 = -0.0992761329 + } + } else { + if (input[3]) >= (0.0218508225) { + var216 = 0.181386024 + } else { + var216 = -0.218245015 + } + } + } else { + if (input[0]) >= (0.11383459) { + if (input[2]) >= (0.0401446) { + var216 = -0.0394501388 + } else { + var216 = -0.287133157 + } + } else { + if (input[4]) >= (0.371848762) { + var216 = -0.090510875 + } else { + var216 = 0.000486368896 + } + } + } + var var217 float64 + if (input[3]) >= (0.0284897014) { + if (input[2]) >= (0.0238484014) { + if (input[2]) >= (0.0261411089) { + var217 = -0.0293140113 + } else { + var217 = 0.26677072 + } + } else { + if (input[8]) >= (0.0390112773) { + var217 = -0.0691014379 + } else { + var217 = -0.599956632 + } + } + } else { + if (input[3]) >= (0.0250071939) { + if (input[6]) >= (0.0263118297) { + var217 = 0.185334474 + } else { + var217 = 0.0282347724 + } + } else { + if (input[4]) >= (0.566526651) { + var217 = -0.139888003 + } else { + var217 = -0.000951568247 + } + } + } + var var218 float64 + if (input[2]) >= (0.475332975) { + var218 = -0.235361472 + } else { + if (input[5]) >= (0.245000005) { + if (input[2]) >= (0.0211659018) { + var218 = 0.0181279797 + } else { + var218 = 0.207036719 + } + } else { + if (input[5]) >= (0.215000004) { + var218 = -0.148954988 + } else { + var218 = 0.00515237777 + } + } + } + var var219 float64 + if (input[1]) >= (0.0114329271) { + if (input[4]) >= (0.262605071) { + if (input[2]) >= (0.0155662652) { + var219 = -0.0088064475 + } else { + var219 = 0.128366411 + } + } else { + if (input[4]) >= (0.259803951) { + var219 = -0.268847346 + } else { + var219 = -0.00556295551 + } + } + } else { + if (input[4]) >= (0.226190478) { + if (input[4]) >= (0.539915979) { + var219 = 0.298265725 + } else { + var219 = -0.127958491 + } + } else { + if (input[3]) >= (0.0065905801) { + var219 = 0.236847311 + } else { + var219 = 0.0295897629 + } + } + } + var var220 float64 + if (input[5]) >= (0.0450000018) { + if (input[0]) >= (0.044661656) { + if (input[2]) >= (0.0559533089) { + var220 = 0.0415058546 + } else { + var220 = -0.0634036362 + } + } else { + if (input[0]) >= (0.0103759402) { + var220 = 0.194350839 + } else { + var220 = -0.0459684283 + } + } + } else { + if (input[0]) >= (0.0452631563) { + if (input[4]) >= (0.0441176482) { + var220 = -0.00184265338 + } else { + var220 = 0.350384533 + } + } else { + if (input[0]) >= (0.00766917318) { + var220 = -0.0427453034 + } else { + var220 = 0.0140413437 + } + } + } + var var221 float64 + if (input[8]) >= (0.209021762) { + if (input[4]) >= (0.198179275) { + if (input[0]) >= (0.128571421) { + var221 = 0.132159114 + } else { + var221 = -0.262558788 + } + } else { + if (input[4]) >= (0.0532212891) { + var221 = -0.382075191 + } else { + var221 = 0.174856991 + } + } + } else { + if (input[4]) >= (0.636554599) { + if (input[8]) >= (0.0859559402) { + var221 = -0.210411549 + } else { + var221 = 0.0433335565 + } + } else { + if (input[4]) >= (0.458683491) { + var221 = 0.0509749539 + } else { + var221 = 0.00149767473 + } + } + } + var var222 float64 + if (input[4]) >= (0.233193278) { + if (input[6]) >= (0.079507485) { + if (input[2]) >= (0.0164329372) { + var222 = 0.117771707 + } else { + var222 = 0.375779837 + } + } else { + if (input[9]) >= (0.0398030803) { + var222 = 0.0541968569 + } else { + var222 = -0.00382577907 + } + } + } else { + if (input[6]) >= (0.102884069) { + if (input[3]) >= (0.00306994398) { + var222 = -0.217194602 + } else { + var222 = 0.116553523 + } + } else { + if (input[4]) >= (0.212184876) { + var222 = -0.0680336431 + } else { + var222 = 0.00140078354 + } + } + } + var var223 float64 + if (input[6]) >= (0.0149471648) { + if (input[6]) >= (0.0151579008) { + if (input[2]) >= (0.00736821536) { + var223 = 0.0221154727 + } else { + var223 = -0.0394442603 + } + } else { + if (input[9]) >= (0.012921202) { + var223 = 0.262764931 + } else { + var223 = 0.036550615 + } + } + } else { + if (input[1]) >= (0.0373475626) { + if (input[2]) >= (0.0188840032) { + var223 = 0.00787440315 + } else { + var223 = -0.0390984192 + } + } else { + if (input[5]) >= (0.0149999997) { + var223 = -0.03186813 + } else { + var223 = 0.0228690002 + } + } + } + var var224 float64 + if (input[5]) >= (0.105000004) { + if (input[0]) >= (0.0539849624) { + if (input[3]) >= (0.00310603995) { + var224 = 0.00990169588 + } else { + var224 = -0.236220509 + } + } else { + if (input[0]) >= (0.00616541365) { + var224 = 0.178399682 + } else { + var224 = -0.150705785 + } + } + } else { + if (input[0]) >= (0.158646613) { + if (input[6]) >= (0.0135623328) { + var224 = 0.0477009304 + } else { + var224 = -0.112649091 + } + } else { + if (input[0]) >= (0.126466155) { + var224 = 0.0571194924 + } else { + var224 = -0.00439347979 + } + } + } + var var225 float64 + if (input[3]) >= (0.255182326) { + if (input[3]) >= (0.31410405) { + var225 = 0.00465196744 + } else { + var225 = 0.322344273 + } + } else { + if (input[3]) >= (0.183460474) { + if (input[4]) >= (0.364145666) { + var225 = 0.101658694 + } else { + var225 = -0.426100135 + } + } else { + if (input[1]) >= (0.0327743888) { + var225 = 0.00772967236 + } else { + var225 = -0.00698190974 + } + } + } + var var226 float64 + if (input[3]) >= (0.0280733258) { + if (input[7]) >= (0.0172270723) { + if (input[4]) >= (0.0931372568) { + var226 = -0.0294360835 + } else { + var226 = -0.18584457 + } + } else { + if (input[4]) >= (0.285014033) { + var226 = -0.0731543973 + } else { + var226 = 0.0509466566 + } + } + } else { + if (input[3]) >= (0.0277436301) { + if (input[0]) >= (0.125263155) { + var226 = 0.38695547 + } else { + var226 = 0.118447565 + } + } else { + if (input[0]) >= (0.273834586) { + var226 = 0.15725559 + } else { + var226 = -0.00155599241 + } + } + } + var var227 float64 + if (input[7]) >= (8.91973323e-05) { + if (input[7]) >= (0.000181036041) { + if (input[7]) >= (0.000219640817) { + var227 = -0.00240835128 + } else { + var227 = -0.080885537 + } + } else { + if (input[8]) >= (0.0112116449) { + var227 = 0.0702946857 + } else { + var227 = -0.0841986313 + } + } + } else { + if (input[7]) >= (8.14763771e-05) { + if (input[8]) >= (0.0358641483) { + var227 = -0.467444897 + } else { + var227 = -0.126377478 + } + } else { + if (input[4]) >= (0.0231092442) { + var227 = -0.0667589456 + } else { + var227 = 0.0666752383 + } + } + } + var var228 float64 + if (input[5]) >= (0.0549999997) { + if (input[4]) >= (0.430672288) { + if (input[0]) >= (0.166466177) { + var228 = 0.257760853 + } else { + var228 = -0.160095051 + } + } else { + if (input[8]) >= (0.0118017308) { + var228 = 0.0358390957 + } else { + var228 = -0.348446846 + } + } + } else { + if (input[4]) >= (0.462885141) { + if (input[2]) >= (0.0430034772) { + var228 = -0.0134460898 + } else { + var228 = 0.170203656 + } + } else { + if (input[0]) >= (0.121954888) { + var228 = -0.054898221 + } else { + var228 = 0.00216833176 + } + } + } + var var229 float64 + if (input[1]) >= (0.0114329271) { + if (input[8]) >= (0.110608444) { + if (input[3]) >= (0.0238755047) { + var229 = -0.0236482695 + } else { + var229 = 0.176673606 + } + } else { + if (input[4]) >= (0.591736674) { + var229 = -0.179439917 + } else { + var229 = -0.00280085695 + } + } + } else { + if (input[4]) >= (0.0973389372) { + if (input[4]) >= (0.226190478) { + var229 = -0.0386571698 + } else { + var229 = 0.140804917 + } + } else { + if (input[8]) >= (0.0693023875) { + var229 = -0.0896000266 + } else { + var229 = 0.0452003069 + } + } + } + var var230 float64 + if (input[1]) >= (0.39354676) { + var230 = 0.299798697 + } else { + if (input[1]) >= (0.324441046) { + var230 = -0.280205816 + } else { + if (input[9]) >= (0.0911414027) { + var230 = 0.01569351 + } else { + var230 = -0.00112286315 + } + } + } + var var231 float64 + if (input[5]) >= (0.894999981) { + var231 = -0.214956224 + } else { + if (input[8]) >= (0.0108182533) { + if (input[4]) >= (0.0273109246) { + var231 = 0.00129516528 + } else { + var231 = -0.0427048877 + } + } else { + if (input[4]) >= (0.0273109246) { + var231 = -0.126573563 + } else { + var231 = 0.0750750154 + } + } + } + var var232 float64 + if (input[1]) >= (0.0673272386) { + if (input[9]) >= (0.110458232) { + if (input[3]) >= (0.0223091394) { + var232 = 0.214120269 + } else { + var232 = -0.119201139 + } + } else { + if (input[3]) >= (0.00941522419) { + var232 = 0.0174476858 + } else { + var232 = 0.185358614 + } + } + } else { + if (input[0]) >= (0.123759396) { + if (input[1]) >= (0.014989838) { + var232 = -0.0593243018 + } else { + var232 = 0.0368650518 + } + } else { + if (input[1]) >= (0.00584349595) { + var232 = -0.00041603623 + } else { + var232 = 0.13495703 + } + } + } + var var233 float64 + if (input[0]) >= (0.000150375941) { + if (input[6]) >= (0.00320618972) { + if (input[7]) >= (0.00160778698) { + var233 = 0.0053213872 + } else { + var233 = -0.0225954615 + } + } else { + if (input[7]) >= (0.000402099104) { + var233 = 0.00221417588 + } else { + var233 = 0.0724927709 + } + } + } else { + var233 = -0.238085702 + } + var var234 float64 + if (input[0]) >= (0.0221052617) { + if (input[8]) >= (0.0261605028) { + if (input[0]) >= (0.0356390998) { + var234 = -0.0069078966 + } else { + var234 = 0.0890662074 + } + } else { + if (input[0]) >= (0.0503759384) { + var234 = 0.0722678378 + } else { + var234 = -0.128722638 + } + } + } else { + if (input[5]) >= (0.00499999989) { + if (input[0]) >= (0.0163909774) { + var234 = 0.342902809 + } else { + var234 = 0.0505513623 + } + } else { + if (input[4]) >= (0.132352948) { + var234 = 0.0936841443 + } else { + var234 = -0.0194273517 + } + } + } + var var235 float64 + if (input[1]) >= (0.0246443078) { + if (input[1]) >= (0.0292174798) { + if (input[1]) >= (0.0317581296) { + var235 = 0.00536218937 + } else { + var235 = -0.0469127372 + } + } else { + if (input[3]) >= (0.00280964561) { + var235 = 0.0609514154 + } else { + var235 = -0.0946736038 + } + } + } else { + if (input[3]) >= (0.0207714997) { + if (input[3]) >= (0.0238727108) { + var235 = -0.0906902105 + } else { + var235 = 0.244733348 + } + } else { + if (input[4]) >= (0.0273109246) { + var235 = -0.0134286517 + } else { + var235 = -0.0999878421 + } + } + } + var var236 float64 + if (input[7]) >= (0.0324190632) { + if (input[9]) >= (0.0257990938) { + if (input[4]) >= (0.12394958) { + var236 = -0.0574490912 + } else { + var236 = 0.0399600975 + } + } else { + if (input[1]) >= (0.00889227632) { + var236 = 0.0602571853 + } else { + var236 = -0.0751295015 + } + } + } else { + if (input[7]) >= (0.0296722334) { + if (input[4]) >= (0.198179275) { + var236 = 0.0157234874 + } else { + var236 = -0.147390947 + } + } else { + if (input[4]) >= (0.465686262) { + var236 = 0.0691184178 + } else { + var236 = -0.00602223305 + } + } + } + var var237 float64 + if (input[4]) >= (0.0889355764) { + if (input[4]) >= (0.0903361365) { + if (input[0]) >= (0.0142857144) { + var237 = -0.00915796962 + } else { + var237 = 0.100283712 + } + } else { + if (input[0]) >= (0.0803007483) { + var237 = -0.14591302 + } else { + var237 = -0.564186394 + } + } + } else { + if (input[8]) >= (0.0192105956) { + if (input[0]) >= (0.0705263168) { + var237 = -0.0332467742 + } else { + var237 = 0.0717729628 + } + } else { + if (input[0]) >= (0.00857142825) { + var237 = -0.0916135907 + } else { + var237 = 0.016762672 + } + } + } + var var238 float64 + if (input[3]) >= (0.00183251023) { + if (input[9]) >= (0.000187682264) { + if (input[9]) >= (0.000274304854) { + var238 = 0.00281594414 + } else { + var238 = -0.209217817 + } + } else { + var238 = 0.209967867 + } + } else { + if (input[6]) >= (0.0564771071) { + var238 = 0.0608562008 + } else { + var238 = 0.242457107 + } + } + var var239 float64 + if (input[6]) >= (0.280383527) { + var239 = 0.271743715 + } else { + if (input[3]) >= (0.0047791684) { + if (input[8]) >= (0.0160634667) { + var239 = -0.00190170179 + } else { + var239 = 0.0649167225 + } + } else { + if (input[4]) >= (0.191176474) { + var239 = 0.0521304496 + } else { + var239 = -0.0204869341 + } + } + } + var var240 float64 + if (input[8]) >= (0.00150799891) { + if (input[1]) >= (0.09375) { + if (input[0]) >= (0.0157894753) { + var240 = 0.00385458139 + } else { + var240 = -0.0897715464 + } + } else { + if (input[1]) >= (0.0927337408) { + var240 = 0.171283886 + } else { + var240 = -0.0026086946 + } + } + } else { + var240 = 0.203963682 + } + var var241 float64 + if (input[4]) >= (0.308823526) { + if (input[5]) >= (0.375) { + if (input[7]) >= (0.108913392) { + var241 = -0.0524964668 + } else { + var241 = -0.489675999 + } + } else { + if (input[3]) >= (0.00740172435) { + var241 = -0.000351506518 + } else { + var241 = -0.12265376 + } + } + } else { + if (input[5]) >= (0.164999992) { + if (input[4]) >= (0.216386557) { + var241 = 0.230440095 + } else { + var241 = 0.00628867233 + } + } else { + if (input[5]) >= (0.145000011) { + var241 = -0.174367964 + } else { + var241 = 0.00406001927 + } + } + } + var var242 float64 + if (input[4]) >= (0.0665266141) { + if (input[0]) >= (0.00225563906) { + if (input[0]) >= (0.0127819553) { + var242 = -0.00953990594 + } else { + var242 = 0.105081923 + } + } else { + if (input[5]) >= (0.0149999997) { + var242 = -0.773412585 + } else { + var242 = 0.234310865 + } + } + } else { + if (input[0]) >= (0.0672180429) { + if (input[0]) >= (0.155639097) { + var242 = 0.0983541608 + } else { + var242 = -0.152873814 + } + } else { + if (input[0]) >= (0.0506766923) { + var242 = 0.32709977 + } else { + var242 = 0.0131211402 + } + } + } + var var243 float64 + if (input[9]) >= (0.0368867815) { + if (input[4]) >= (0.472689092) { + if (input[4]) >= (0.586134434) { + var243 = -0.187396243 + } else { + var243 = 0.353635848 + } + } else { + if (input[0]) >= (0.123458646) { + var243 = -0.335874498 + } else { + var243 = -0.0119012417 + } + } + } else { + if (input[4]) >= (0.413865566) { + if (input[0]) >= (0.0675188005) { + var243 = -0.064878121 + } else { + var243 = 0.21952033 + } + } else { + if (input[0]) >= (0.154736847) { + var243 = -0.0377906561 + } else { + var243 = 0.0190374255 + } + } + } + var var244 float64 + if (input[4]) >= (0.0665266141) { + if (input[4]) >= (0.0819327757) { + if (input[4]) >= (0.0833333358) { + var244 = -0.00426406786 + } else { + var244 = 0.374140441 + } + } else { + if (input[5]) >= (0.0450000018) { + var244 = 0.18265833 + } else { + var244 = -0.171396866 + } + } + } else { + if (input[4]) >= (0.0609243698) { + if (input[8]) >= (0.0173747707) { + var244 = 0.0820538625 + } else { + var244 = 0.390400559 + } + } else { + if (input[4]) >= (0.0595238097) { + var244 = -0.234628782 + } else { + var244 = 0.00615867134 + } + } + } + var var245 float64 + if (input[8]) >= (0.0742853433) { + if (input[0]) >= (0.123759396) { + if (input[8]) >= (0.110608444) { + var245 = 0.0342023373 + } else { + var245 = -0.06158337 + } + } else { + if (input[4]) >= (0.332633078) { + var245 = 0.173557237 + } else { + var245 = 0.00331587228 + } + } + } else { + if (input[0]) >= (0.127669185) { + if (input[0]) >= (0.128571421) { + var245 = 0.0363332368 + } else { + var245 = 0.682807446 + } + } else { + if (input[0]) >= (0.12075188) { + var245 = -0.152882412 + } else { + var245 = -0.00133195613 + } + } + } + var var246 float64 + if (input[8]) >= (0.0323236287) { + if (input[4]) >= (0.202380955) { + if (input[4]) >= (0.235994399) { + var246 = 0.00307385391 + } else { + var246 = -0.12530522 + } + } else { + if (input[0]) >= (0.0542857125) { + var246 = 0.0086228624 + } else { + var246 = 0.0853046998 + } + } + } else { + if (input[4]) >= (0.203781515) { + if (input[8]) >= (0.0148832938) { + var246 = 0.10189072 + } else { + var246 = -0.152004674 + } + } else { + if (input[4]) >= (0.0931372568) { + var246 = -0.0853395239 + } else { + var246 = 0.00877923425 + } + } + } + var var247 float64 + if (input[3]) >= (0.20521751) { + if (input[0]) >= (0.132180452) { + var247 = -0.0697622597 + } else { + if (input[0]) >= (0.113233089) { + var247 = 0.346638203 + } else { + var247 = 0.00882616919 + } + } + } else { + if (input[3]) >= (0.189342365) { + var247 = -0.374962389 + } else { + if (input[7]) >= (5.01861941e-05) { + var247 = 0.00280989544 + } else { + var247 = -0.0576611944 + } + } + } + var var248 float64 + if (input[0]) >= (0.261202991) { + if (input[8]) >= (0.0543535277) { + if (input[8]) >= (0.0688434318) { + var248 = -0.279919565 + } else { + var248 = 0.221490324 + } + } else { + if (input[8]) >= (0.0447154455) { + var248 = -0.370932758 + } else { + var248 = -0.111537665 + } + } + } else { + if (input[0]) >= (0.219699249) { + if (input[8]) >= (0.0570417009) { + var248 = -0.0797234699 + } else { + var248 = 0.242276222 + } + } else { + if (input[0]) >= (0.19894737) { + var248 = -0.0726150796 + } else { + var248 = 0.000999845332 + } + } + } + var var249 float64 + if (input[0]) >= (0.0476691723) { + if (input[0]) >= (0.0482706763) { + if (input[8]) >= (0.0163257271) { + var249 = 0.00929463562 + } else { + var249 = -0.200569123 + } + } else { + if (input[6]) >= (0.011485083) { + var249 = 0.544389248 + } else { + var249 = 0.0321287476 + } + } + } else { + if (input[5]) >= (0.00499999989) { + if (input[8]) >= (0.0104248626) { + var249 = 0.0361058339 + } else { + var249 = -0.340008497 + } + } else { + if (input[6]) >= (0.0384291187) { + var249 = -0.104009911 + } else { + var249 = -0.00895885378 + } + } + } + var var250 float64 + if (input[5]) >= (0.0149999997) { + if (input[0]) >= (0.00977443624) { + if (input[5]) >= (0.0249999985) { + var250 = -0.0154771637 + } else { + var250 = -0.221778646 + } + } else { + if (input[5]) >= (0.0249999985) { + var250 = 0.0156910699 + } else { + var250 = 0.171167031 + } + } + } else { + if (input[5]) >= (0.00499999989) { + if (input[0]) >= (0.0163909774) { + var250 = 0.756802976 + } else { + var250 = -0.0190736298 + } + } else { + if (input[4]) >= (0.0245098043) { + var250 = 0.0079392409 + } else { + var250 = -0.0380130485 + } + } + } + var var251 float64 + if (input[1]) >= (0.0205792673) { + if (input[0]) >= (0.220300764) { + if (input[3]) >= (0.0243167933) { + var251 = 0.0151184248 + } else { + var251 = 0.342957228 + } + } else { + if (input[0]) >= (0.128270686) { + var251 = -0.0376565494 + } else { + var251 = 0.00407224661 + } + } + } else { + if (input[3]) >= (0.00772480946) { + if (input[8]) >= (0.137359038) { + var251 = 0.0993890911 + } else { + var251 = -0.138713375 + } + } else { + if (input[8]) >= (0.0488460511) { + var251 = 0.0474494137 + } else { + var251 = -0.043052379 + } + } + } + var var252 float64 + if (input[4]) >= (0.116946779) { + if (input[8]) >= (0.0194728561) { + if (input[3]) >= (0.00566682639) { + var252 = -0.00342453364 + } else { + var252 = 0.0466203913 + } + } else { + if (input[4]) >= (0.379551828) { + var252 = -0.206396177 + } else { + var252 = 0.105046339 + } + } + } else { + if (input[4]) >= (0.109943978) { + if (input[2]) >= (0.0394292846) { + var252 = 0.0908965692 + } else { + var252 = -0.178953931 + } + } else { + if (input[8]) >= (0.105625495) { + var252 = -0.134739757 + } else { + var252 = -0.00177191012 + } + } + } + var var253 float64 + if (input[3]) >= (0.0235247128) { + if (input[6]) >= (0.00793268532) { + if (input[6]) >= (0.0103410911) { + var253 = 0.000166699872 + } else { + var253 = -0.0967069492 + } + } else { + if (input[3]) >= (0.0256838687) { + var253 = 0.0339413621 + } else { + var253 = 0.147459179 + } + } + } else { + if (input[3]) >= (0.0231418908) { + if (input[0]) >= (0.123458646) { + var253 = -0.198278829 + } else { + var253 = -0.042867329 + } + } else { + if (input[5]) >= (0.284999996) { + var253 = 0.106369637 + } else { + var253 = -0.0045132814 + } + } + } + var var254 float64 + if (input[8]) >= (0.0829399452) { + if (input[9]) >= (0.00472093094) { + if (input[8]) >= (0.0842512473) { + var254 = 0.00163792761 + } else { + var254 = 0.152822107 + } + } else { + if (input[3]) >= (0.00986617059) { + var254 = 0.111612104 + } else { + var254 = -0.148812205 + } + } + } else { + if (input[8]) >= (0.0793994218) { + if (input[9]) >= (0.0210348517) { + var254 = -0.0073503023 + } else { + var254 = -0.168260425 + } + } else { + if (input[5]) >= (0.114999995) { + var254 = 0.0540928766 + } else { + var254 = -0.00581327034 + } + } + } + var var255 float64 + if (input[8]) >= (0.00150799891) { + if (input[8]) >= (0.00295043271) { + if (input[9]) >= (0.00275748549) { + var255 = -0.00172710884 + } else { + var255 = -0.0363852456 + } + } else { + var255 = -0.288574725 + } + } else { + var255 = 0.284804523 + } + var var256 float64 + if (input[2]) >= (0.22617662) { + if (input[4]) >= (0.12394958) { + if (input[3]) >= (0.0233826172) { + var256 = -0.0718105286 + } else { + var256 = 0.159010708 + } + } else { + if (input[1]) >= (0.0655487776) { + var256 = -0.0408397764 + } else { + var256 = -0.445561618 + } + } + } else { + if (input[1]) >= (0.0271849595) { + if (input[1]) >= (0.0292174798) { + var256 = 0.00261979084 + } else { + var256 = 0.0767731965 + } + } else { + if (input[8]) >= (0.0839889869) { + var256 = 0.0384193771 + } else { + var256 = -0.021203164 + } + } + } + var var257 float64 + if (input[7]) >= (0.0601832047) { + if (input[7]) >= (0.0704758465) { + if (input[0]) >= (0.0765413493) { + var257 = 0.0361436456 + } else { + var257 = -0.0663998052 + } + } else { + if (input[0]) >= (0.143157899) { + var257 = -0.0769900307 + } else { + var257 = 0.150409564 + } + } + } else { + if (input[7]) >= (0.0419327021) { + if (input[1]) >= (0.0109247966) { + var257 = -0.0292297434 + } else { + var257 = -0.25629285 + } + } else { + if (input[4]) >= (0.34803921) { + var257 = -0.031437695 + } else { + var257 = 0.00384040433 + } + } + } + var var258 float64 + if (input[7]) >= (0.0111886775) { + if (input[8]) >= (0.030750066) { + if (input[3]) >= (0.00271203392) { + var258 = 0.00190350832 + } else { + var258 = -0.237898961 + } + } else { + if (input[4]) >= (0.15336135) { + var258 = 0.145659551 + } else { + var258 = 0.0199363157 + } + } + } else { + if (input[7]) >= (0.0109042209) { + if (input[8]) >= (0.0329137146) { + var258 = -0.286786586 + } else { + var258 = -0.0684095398 + } + } else { + if (input[9]) >= (0.0587445498) { + var258 = 0.0118660675 + } else { + var258 = -0.0139375618 + } + } + } + var var259 float64 + if (input[8]) >= (0.0416338854) { + if (input[0]) >= (0.0524812043) { + if (input[4]) >= (0.109943978) { + var259 = -0.00463826535 + } else { + var259 = 0.0458820313 + } + } else { + if (input[2]) >= (0.122194976) { + var259 = -0.172373846 + } else { + var259 = 0.117303081 + } + } + } else { + if (input[0]) >= (0.0618045107) { + if (input[4]) >= (0.115546219) { + var259 = 0.117271833 + } else { + var259 = -0.0834857672 + } + } else { + if (input[0]) >= (0.0548872203) { + var259 = -0.14605853 + } else { + var259 = -0.00718476577 + } + } + } + var var260 float64 + if (input[7]) >= (0.0704758465) { + if (input[8]) >= (0.0240624174) { + if (input[0]) >= (0.0536842123) { + var260 = -0.0190244913 + } else { + var260 = -0.223167762 + } + } else { + if (input[7]) >= (0.0742373765) { + var260 = 0.363763273 + } else { + var260 = -0.308575809 + } + } + } else { + if (input[7]) >= (0.0658495724) { + if (input[5]) >= (0.0649999976) { + var260 = -0.0374680981 + } else { + var260 = 0.184995472 + } + } else { + if (input[6]) >= (0.281166255) { + var260 = -0.297506034 + } else { + var260 = 0.00131972204 + } + } + } + var var261 float64 + if (input[3]) >= (0.00314111914) { + if (input[9]) >= (0.157855228) { + if (input[4]) >= (0.0203081239) { + var261 = -0.093103081 + } else { + var261 = 0.0475355536 + } + } else { + if (input[3]) >= (0.0031828077) { + var261 = 0.00279899244 + } else { + var261 = -0.139239758 + } + } + } else { + if (input[4]) >= (0.132352948) { + if (input[0]) >= (0.0732330829) { + var261 = 0.102060974 + } else { + var261 = -0.133000165 + } + } else { + if (input[5]) >= (0.0350000001) { + var261 = -0.0980298296 + } else { + var261 = 0.0559302792 + } + } + } + var var262 float64 + if (input[0]) >= (0.00526315812) { + if (input[4]) >= (0.0189075638) { + if (input[4]) >= (0.0259103645) { + var262 = 1.07284122e-05 + } else { + var262 = 0.0983347297 + } + } else { + if (input[0]) >= (0.0193984956) { + var262 = 0.0953608304 + } else { + var262 = -0.130515456 + } + } + } else { + if (input[4]) >= (0.0175070036) { + if (input[4]) >= (0.0259103645) { + var262 = 0.0353986621 + } else { + var262 = -0.111879386 + } + } else { + if (input[4]) >= (0.0147058824) { + var262 = 0.239195898 + } else { + var262 = 0.0145871853 + } + } + } + var var263 float64 + if (input[5]) >= (0.675000012) { + if (input[4]) >= (0.15266107) { + var263 = -0.401232302 + } else { + if (input[8]) >= (0.0960529745) { + var263 = -0.165644199 + } else { + var263 = 0.166692704 + } + } + } else { + if (input[8]) >= (0.0922501981) { + if (input[0]) >= (0.12556392) { + var263 = -0.0243069809 + } else { + var263 = 0.0973171815 + } + } else { + if (input[9]) >= (0.00451881159) { + var263 = -0.000383731531 + } else { + var263 = -0.0636479408 + } + } + } + var var264 float64 + if (input[1]) >= (0.108485773) { + if (input[0]) >= (0.135939851) { + if (input[7]) >= (0.0158726554) { + var264 = -0.0804398879 + } else { + var264 = 0.266873747 + } + } else { + if (input[8]) >= (0.0109493835) { + var264 = -0.0697308332 + } else { + var264 = 0.0556845069 + } + } + } else { + if (input[1]) >= (0.0322662592) { + if (input[8]) >= (0.0295698922) { + var264 = 0.0264760796 + } else { + var264 = -0.00973944552 + } + } else { + if (input[2]) >= (0.00666450709) { + var264 = -0.0177061893 + } else { + var264 = 0.0308959596 + } + } + } + var var265 float64 + if (input[0]) >= (0.0353383459) { + if (input[0]) >= (0.0407518819) { + if (input[2]) >= (0.0129556386) { + var265 = -0.014039523 + } else { + var265 = 0.0433842614 + } + } else { + if (input[4]) >= (0.230392158) { + var265 = 0.131405309 + } else { + var265 = -0.114126369 + } + } + } else { + if (input[4]) >= (0.0343137272) { + if (input[8]) >= (0.0138342511) { + var265 = 0.0355721712 + } else { + var265 = -0.0940047875 + } + } else { + if (input[0]) >= (0.00766917318) { + var265 = -0.120418921 + } else { + var265 = 0.0113616241 + } + } + } + var var266 float64 + if (input[3]) >= (0.0400170535) { + if (input[7]) >= (0.000137961237) { + if (input[7]) >= (0.00442857668) { + var266 = 0.00733893597 + } else { + var266 = 0.118046284 + } + } else { + if (input[6]) >= (0.0184694584) { + var266 = 0.0750108138 + } else { + var266 = -0.217994139 + } + } + } else { + if (input[0]) >= (0.0663157851) { + if (input[7]) >= (0.000239146379) { + var266 = -0.0222562999 + } else { + var266 = 0.104651369 + } + } else { + if (input[5]) >= (0.164999992) { + var266 = 0.213286817 + } else { + var266 = 0.00143811968 + } + } + } + var var267 float64 + if (input[9]) >= (0.716412067) { + if (input[9]) >= (0.776499271) { + var267 = -0.0197270028 + } else { + var267 = 0.367026061 + } + } else { + if (input[6]) >= (0.000556943705) { + if (input[4]) >= (0.430672288) { + var267 = -0.0288247764 + } else { + var267 = 0.00134350278 + } + } else { + var267 = -0.241354153 + } + } + var var268 float64 + if (input[3]) >= (0.111227959) { + if (input[4]) >= (0.459383756) { + if (input[4]) >= (0.702380955) { + var268 = -0.0652024522 + } else { + var268 = 0.257718742 + } + } else { + if (input[8]) >= (0.172239706) { + var268 = -0.144785672 + } else { + var268 = 0.0905320123 + } + } + } else { + if (input[4]) >= (0.642156839) { + if (input[8]) >= (0.102019407) { + var268 = -0.264144093 + } else { + var268 = -0.0758956075 + } + } else { + if (input[8]) >= (0.0458300561) { + var268 = 0.0086911479 + } else { + var268 = -0.00503181992 + } + } + } + var var269 float64 + if (input[3]) >= (0.0261724368) { + if (input[3]) >= (0.0262329355) { + if (input[1]) >= (0.0998475626) { + var269 = 0.0211898964 + } else { + var269 = -0.0455540419 + } + } else { + var269 = -0.466660827 + } + } else { + if (input[3]) >= (0.0250071939) { + if (input[2]) >= (0.0462601557) { + var269 = 0.301929533 + } else { + var269 = 0.0178715251 + } + } else { + if (input[8]) >= (0.155586153) { + var269 = 0.09360376 + } else { + var269 = 0.000614101067 + } + } + } + var var270 float64 + if (input[9]) >= (0.0169635899) { + if (input[6]) >= (0.0891260505) { + if (input[9]) >= (0.105838366) { + var270 = 0.40682134 + } else { + var270 = 0.0589930043 + } + } else { + if (input[3]) >= (0.00207781093) { + var270 = 0.00353533495 + } else { + var270 = 0.173592523 + } + } + } else { + if (input[9]) >= (0.0147980247) { + if (input[6]) >= (0.00206219708) { + var270 = -0.0557879917 + } else { + var270 = -0.267925382 + } + } else { + if (input[1]) >= (0.0043191053) { + var270 = -0.00647799391 + } else { + var270 = -0.269044667 + } + } + } + var var271 float64 + if (input[9]) >= (0.0452025533) { + if (input[4]) >= (0.472689092) { + if (input[8]) >= (0.0847102031) { + var271 = -0.0944264457 + } else { + var271 = 0.361354113 + } + } else { + if (input[6]) >= (0.124860764) { + var271 = 0.268893301 + } else { + var271 = -0.0154774208 + } + } + } else { + if (input[6]) >= (0.125071496) { + if (input[8]) >= (0.0631392598) { + var271 = 0.165061504 + } else { + var271 = -0.319522083 + } + } else { + if (input[5]) >= (0.145000011) { + var271 = -0.022164315 + } else { + var271 = 0.0143812271 + } + } + } + var var272 float64 + if (input[0]) >= (0.241353393) { + if (input[4]) >= (0.130952388) { + if (input[4]) >= (0.383753508) { + var272 = -0.0317161158 + } else { + var272 = -0.333876282 + } + } else { + if (input[4]) >= (0.0581232496) { + var272 = 0.195767567 + } else { + var272 = -0.213211983 + } + } + } else { + if (input[0]) >= (0.240150362) { + var272 = 0.363843769 + } else { + if (input[0]) >= (0.119849622) { + var272 = 0.0144968787 + } else { + var272 = -0.00320908171 + } + } + } + var var273 float64 + if (input[5]) >= (0.834999979) { + if (input[6]) >= (0.00701448042) { + var273 = -0.29334566 + } else { + var273 = -0.00610779645 + } + } else { + if (input[4]) >= (0.304621875) { + if (input[3]) >= (0.00740172435) { + var273 = 0.00171353039 + } else { + var273 = -0.123401321 + } + } else { + if (input[5]) >= (0.335000008) { + var273 = 0.147082999 + } else { + var273 = 0.00511494605 + } + } + } + var var274 float64 + if (input[0]) >= (0.0858646631) { + if (input[1]) >= (0.00685975607) { + if (input[3]) >= (0.00771413371) { + var274 = -0.0281877406 + } else { + var274 = 0.0508813336 + } + } else { + if (input[0]) >= (0.10781955) { + var274 = -0.206402183 + } else { + var274 = 0.038966015 + } + } + } else { + if (input[1]) >= (0.0073678866) { + if (input[4]) >= (0.262605071) { + var274 = 0.0447799861 + } else { + var274 = -0.00188021339 + } + } else { + if (input[0]) >= (0.0500751883) { + var274 = 0.255242974 + } else { + var274 = -0.0545441248 + } + } + } + var var275 float64 + if (input[9]) >= (0.0893223211) { + if (input[4]) >= (0.264005601) { + if (input[4]) >= (0.324229717) { + var275 = -0.00119861343 + } else { + var275 = -0.237305164 + } + } else { + if (input[4]) >= (0.119747899) { + var275 = 0.0799287111 + } else { + var275 = 0.00802524295 + } + } + } else { + if (input[9]) >= (0.0842693374) { + if (input[0]) >= (0.0206015036) { + var275 = -0.163760647 + } else { + var275 = -0.0120863421 + } + } else { + if (input[9]) >= (0.0839517266) { + var275 = 0.260037988 + } else { + var275 = -0.00282553094 + } + } + } + var var276 float64 + if (input[0]) >= (0.119849622) { + if (input[4]) >= (0.0581232496) { + if (input[4]) >= (0.0819327757) { + var276 = 0.0171305519 + } else { + var276 = 0.245078757 + } + } else { + if (input[3]) >= (0.00347208465) { + var276 = -0.13043505 + } else { + var276 = 0.206136584 + } + } + } else { + if (input[4]) >= (0.0581232496) { + if (input[4]) >= (0.0609243698) { + var276 = -0.0137817329 + } else { + var276 = -0.208883673 + } + } else { + if (input[4]) >= (0.0553221293) { + var276 = 0.324459016 + } else { + var276 = 0.00518289907 + } + } + } + var var277 float64 + if (input[1]) >= (0.210619926) { + if (input[4]) >= (0.0231092442) { + if (input[1]) >= (0.216717482) { + var277 = -0.115007833 + } else { + var277 = -0.404532522 + } + } else { + if (input[4]) >= (0.0147058824) { + var277 = 0.349731445 + } else { + var277 = 0.0117068496 + } + } + } else { + if (input[3]) >= (0.120433465) { + if (input[4]) >= (0.556722701) { + var277 = -0.0233467836 + } else { + var277 = 0.148738354 + } + } else { + if (input[3]) >= (0.115856387) { + var277 = -0.43056953 + } else { + var277 = 0.00190753571 + } + } + } + var var278 float64 + if (input[4]) >= (0.0511204489) { + if (input[4]) >= (0.0553221293) { + if (input[0]) >= (0.00225563906) { + var278 = -0.00110744836 + } else { + var278 = -0.277417451 + } + } else { + if (input[3]) >= (0.0077548055) { + var278 = 0.0284809731 + } else { + var278 = -0.188785464 + } + } + } else { + if (input[4]) >= (0.0483193286) { + if (input[5]) >= (0.00999999978) { + var278 = -0.48639968 + } else { + var278 = 0.189354524 + } + } else { + if (input[0]) >= (0.151127815) { + var278 = 0.162849143 + } else { + var278 = -0.000806786004 + } + } + } + var var279 float64 + if (input[0]) >= (0.19894737) { + if (input[4]) >= (0.223389357) { + if (input[8]) >= (0.0464857072) { + var279 = 0.0240415912 + } else { + var279 = 0.648341417 + } + } else { + if (input[8]) >= (0.0670731738) { + var279 = -0.278861433 + } else { + var279 = -0.0260252263 + } + } + } else { + if (input[7]) >= (0.0147518972) { + if (input[0]) >= (0.00556390965) { + var279 = 0.0185839478 + } else { + var279 = -0.298320442 + } + } else { + if (input[2]) >= (0.0171652753) { + var279 = -0.0328306034 + } else { + var279 = 0.00351690105 + } + } + } + var var280 float64 + if (input[4]) >= (0.397058845) { + if (input[1]) >= (0.0368394293) { + if (input[5]) >= (0.114999995) { + var280 = -0.243702769 + } else { + var280 = 0.139060497 + } + } else { + if (input[1]) >= (0.0205792673) { + var280 = -0.112578385 + } else { + var280 = 0.0817926079 + } + } + } else { + if (input[3]) >= (0.0921138227) { + if (input[4]) >= (0.032913167) { + var280 = -0.139802918 + } else { + var280 = 0.215990528 + } + } else { + if (input[0]) >= (0.16195488) { + var280 = -0.0478454418 + } else { + var280 = 0.00110611599 + } + } + } + var var281 float64 + if (input[6]) >= (0.280383527) { + var281 = 0.315250814 + } else { + if (input[7]) >= (0.302076995) { + if (input[6]) >= (0.0086853113) { + var281 = 0.00741528301 + } else { + var281 = -0.328243971 + } + } else { + if (input[7]) >= (0.19326055) { + var281 = 0.0983370841 + } else { + var281 = -0.000251510413 + } + } + } + var var282 float64 + if (input[8]) >= (0.124114871) { + if (input[4]) >= (0.0539215691) { + if (input[5]) >= (0.13499999) { + var282 = -0.00138184812 + } else { + var282 = 0.105560064 + } + } else { + if (input[4]) >= (0.0315126069) { + var282 = -0.273881167 + } else { + var282 = 0.0925220624 + } + } + } else { + if (input[4]) >= (0.210784316) { + if (input[5]) >= (0.00499999989) { + var282 = -0.0698221922 + } else { + var282 = 0.00428122655 + } + } else { + if (input[4]) >= (0.209383756) { + var282 = 0.267006308 + } else { + var282 = 0.00486279093 + } + } + } + var var283 float64 + if (input[4]) >= (0.542717099) { + if (input[0]) >= (0.0524812043) { + if (input[0]) >= (0.107518792) { + var283 = -0.0392902195 + } else { + var283 = -0.359901667 + } + } else { + if (input[0]) >= (0.0413533822) { + var283 = 0.375542104 + } else { + var283 = -0.100878187 + } + } + } else { + if (input[8]) >= (0.0685156062) { + if (input[4]) >= (0.0707282946) { + var283 = 0.0410153531 + } else { + var283 = -0.084355846 + } + } else { + if (input[4]) >= (0.314425766) { + var283 = -0.0653963834 + } else { + var283 = 0.00369753735 + } + } + } + var var284 float64 + if (input[8]) >= (0.00990034081) { + if (input[8]) >= (0.0102937315) { + if (input[4]) >= (0.0259103645) { + var284 = 0.00614601607 + } else { + var284 = -0.0229474008 + } + } else { + if (input[4]) >= (0.0273109246) { + var284 = -0.185654506 + } else { + var284 = 0.186602741 + } + } + } else { + if (input[1]) >= (0.0368394293) { + if (input[4]) >= (0.0301120449) { + var284 = 0.0901013836 + } else { + var284 = -0.108508043 + } + } else { + if (input[4]) >= (0.0259103645) { + var284 = -0.383383781 + } else { + var284 = 0.298784524 + } + } + } + var var285 float64 + if (input[5]) >= (0.114999995) { + if (input[4]) >= (0.488095224) { + if (input[2]) >= (0.138704598) { + var285 = 0.000357595476 + } else { + var285 = -0.27626887 + } + } else { + if (input[4]) >= (0.217787117) { + var285 = 0.105908342 + } else { + var285 = -0.00720146252 + } + } + } else { + if (input[4]) >= (0.0077030817) { + if (input[7]) >= (0.205514908) { + var285 = 0.15989548 + } else { + var285 = -0.00796319637 + } + } else { + if (input[3]) >= (0.00307960343) { + var285 = 0.314555317 + } else { + var285 = 0.0617510714 + } + } + } + var var286 float64 + if (input[8]) >= (0.0182926822) { + if (input[4]) >= (0.0259103645) { + if (input[4]) >= (0.0287114847) { + var286 = -0.00737537397 + } else { + var286 = 0.191063866 + } + } else { + if (input[4]) >= (0.021708684) { + var286 = -0.276225835 + } else { + var286 = -0.00879602693 + } + } + } else { + if (input[4]) >= (0.0819327757) { + if (input[4]) >= (0.0833333358) { + var286 = 0.0671397597 + } else { + var286 = 1.05702651 + } + } else { + if (input[4]) >= (0.042717088) { + var286 = -0.157391191 + } else { + var286 = 0.0110585457 + } + } + } + var var287 float64 + if (input[0]) >= (0.00105263153) { + if (input[7]) >= (0.223716855) { + if (input[5]) >= (0.0649999976) { + var287 = -0.232259572 + } else { + var287 = 0.0764968619 + } + } else { + if (input[7]) >= (0.205501288) { + var287 = 0.239033788 + } else { + var287 = -0.00222767936 + } + } + } else { + if (input[6]) >= (0.00311587448) { + if (input[6]) >= (0.0096637262) { + var287 = 0.0219274089 + } else { + var287 = 0.205697134 + } + } else { + if (input[0]) >= (0.000751879707) { + var287 = -0.130113542 + } else { + var287 = 0.0364647619 + } + } + } + var var288 float64 + if (input[1]) >= (0.0205792673) { + if (input[8]) >= (0.0295698922) { + if (input[0]) >= (0.0861654133) { + var288 = -0.00655728159 + } else { + var288 = 0.0351217128 + } + } else { + if (input[0]) >= (0.0272180438) { + var288 = -0.0741885602 + } else { + var288 = 0.00714864954 + } + } + } else { + if (input[8]) >= (0.0277340673) { + if (input[5]) >= (0.0350000001) { + var288 = 0.0232206266 + } else { + var288 = -0.066541709 + } + } else { + if (input[0]) >= (0.0500751883) { + var288 = 0.160642028 + } else { + var288 = -0.00486443425 + } + } + } + var var289 float64 + if (input[0]) >= (0.12676692) { + if (input[0]) >= (0.128270686) { + if (input[3]) >= (0.00389328972) { + var289 = -0.00172032707 + } else { + var289 = 0.096991621 + } + } else { + if (input[4]) >= (0.291316539) { + var289 = 0.24938488 + } else { + var289 = 0.0143633112 + } + } + } else { + if (input[4]) >= (0.415266097) { + if (input[0]) >= (0.0610526316) { + var289 = -0.0875769258 + } else { + var289 = 0.0972131938 + } + } else { + if (input[5]) >= (0.185000002) { + var289 = 0.0851869136 + } else { + var289 = -0.00313443271 + } + } + } + var var290 float64 + if (input[6]) >= (0.220910966) { + var290 = -0.236054644 + } else { + if (input[9]) >= (0.0271561816) { + if (input[0]) >= (0.121954888) { + var290 = -0.0664036199 + } else { + var290 = -0.00422644615 + } + } else { + if (input[0]) >= (0.261202991) { + var290 = -0.156563699 + } else { + var290 = 0.00901314151 + } + } + } + var var291 float64 + if (input[8]) >= (0.0670731738) { + if (input[8]) >= (0.067204304) { + if (input[0]) >= (0.121353388) { + var291 = -0.00349583244 + } else { + var291 = 0.0537141524 + } + } else { + var291 = 0.429644585 + } + } else { + if (input[4]) >= (0.457983196) { + if (input[0]) >= (0.121654138) { + var291 = 0.50777626 + } else { + var291 = 0.0497585908 + } + } else { + if (input[4]) >= (0.321428597) { + var291 = -0.0603806973 + } else { + var291 = 0.00396019779 + } + } + } + var var292 float64 + if (input[4]) >= (0.0637254938) { + if (input[4]) >= (0.0987394974) { + if (input[0]) >= (0.00255639106) { + var292 = 0.000783656084 + } else { + var292 = -0.277013123 + } + } else { + if (input[4]) >= (0.0945378169) { + var292 = -0.265633702 + } else { + var292 = -0.0137670999 + } + } + } else { + if (input[0]) >= (0.0660150349) { + if (input[0]) >= (0.155939847) { + var292 = 0.0909797177 + } else { + var292 = -0.124006718 + } + } else { + if (input[0]) >= (0.0160902254) { + var292 = 0.111930095 + } else { + var292 = -2.20861839e-05 + } + } + } + var var293 float64 + if (input[0]) >= (0.180300742) { + if (input[8]) >= (0.0557959601) { + if (input[4]) >= (0.335434198) { + var293 = 0.0990245491 + } else { + var293 = -0.15261814 + } + } else { + if (input[3]) >= (0.0128555335) { + var293 = 0.293129385 + } else { + var293 = -0.0233459212 + } + } + } else { + if (input[0]) >= (0.179398507) { + var293 = 0.295414746 + } else { + if (input[4]) >= (0.174369752) { + var293 = -0.00793942437 + } else { + var293 = 0.0102052158 + } + } + } + var var294 float64 + if (input[4]) >= (0.0987394974) { + if (input[4]) >= (0.109943978) { + if (input[4]) >= (0.115546219) { + var294 = 0.00179638306 + } else { + var294 = -0.0838018507 + } + } else { + if (input[5]) >= (0.00499999989) { + var294 = -0.113575064 + } else { + var294 = 0.105564333 + } + } + } else { + if (input[4]) >= (0.0945378169) { + if (input[4]) >= (0.0973389372) { + var294 = -0.040219903 + } else { + var294 = -0.249156326 + } + } else { + if (input[4]) >= (0.0903361365) { + var294 = 0.0972724035 + } else { + var294 = -0.0127365664 + } + } + } + var var295 float64 + if (input[0]) >= (0.00285714283) { + if (input[4]) >= (0.021708684) { + if (input[2]) >= (0.001489499) { + var295 = 0.00244264281 + } else { + var295 = 0.0796177238 + } + } else { + if (input[5]) >= (0.00499999989) { + var295 = 0.0404901877 + } else { + var295 = -0.123894282 + } + } + } else { + if (input[4]) >= (0.0161064435) { + if (input[4]) >= (0.0231092442) { + var295 = -0.0788872316 + } else { + var295 = 0.176595107 + } + } else { + if (input[0]) >= (0.00255639106) { + var295 = 0.119972676 + } else { + var295 = -0.300634563 + } + } + } + var var296 float64 + if (input[6]) >= (0.280383527) { + var296 = 0.275115877 + } else { + if (input[2]) >= (0.00455958862) { + if (input[2]) >= (0.00547791272) { + var296 = 1.76011042e-06 + } else { + var296 = 0.0744212195 + } + } else { + if (input[4]) >= (0.357843161) { + var296 = 0.190605119 + } else { + var296 = -0.018577667 + } + } + } + var var297 float64 + if (input[4]) >= (0.273809552) { + if (input[5]) >= (0.375) { + if (input[4]) >= (0.322829127) { + var297 = -0.428333312 + } else { + var297 = -0.00437406916 + } + } else { + if (input[7]) >= (0.00015584135) { + var297 = 0.0112625612 + } else { + var297 = 0.148052529 + } + } + } else { + if (input[5]) >= (0.114999995) { + if (input[4]) >= (0.217787117) { + var297 = 0.219511583 + } else { + var297 = -0.00656802673 + } + } else { + if (input[4]) >= (0.210784316) { + var297 = -0.0562036373 + } else { + var297 = -0.00174245262 + } + } + } + var var298 float64 + if (input[3]) >= (0.0026850889) { + if (input[8]) >= (0.00976921059) { + if (input[8]) >= (0.0160634667) { + var298 = -0.00133843452 + } else { + var298 = 0.0378922895 + } + } else { + if (input[0]) >= (0.00526315812) { + var298 = 0.0529606342 + } else { + var298 = -0.115417369 + } + } + } else { + if (input[0]) >= (0.0230075195) { + if (input[0]) >= (0.0272180438) { + var298 = -0.0736679211 + } else { + var298 = -0.299362361 + } + } else { + if (input[6]) >= (0.00215251232) { + var298 = 0.0237008631 + } else { + var298 = -0.124940313 + } + } + } + var var299 float64 + if (input[1]) >= (0.0134654474) { + if (input[5]) >= (0.175000012) { + if (input[0]) >= (0.0720300749) { + var299 = 0.012999312 + } else { + var299 = 0.228289902 + } + } else { + if (input[5]) >= (0.145000011) { + var299 = -0.0918691307 + } else { + var299 = -0.00351997488 + } + } + } else { + if (input[9]) >= (0.0318049267) { + if (input[5]) >= (0.00499999989) { + var299 = 0.03014745 + } else { + var299 = -0.178247482 + } + } else { + if (input[9]) >= (0.0192157775) { + var299 = 0.0809756666 + } else { + var299 = 0.00406664331 + } + } + } + var var300 float64 + if (input[8]) >= (0.0108182533) { + if (input[0]) >= (0.00285714283) { + if (input[8]) >= (0.0131786) { + var300 = 0.000734207686 + } else { + var300 = -0.0853739753 + } + } else { + if (input[4]) >= (0.0147058824) { + var300 = 0.132203296 + } else { + var300 = -0.205360964 + } + } + } else { + if (input[4]) >= (0.0273109246) { + if (input[4]) >= (0.0301120449) { + var300 = 0.00826729182 + } else { + var300 = -0.405049235 + } + } else { + if (input[0]) >= (0.00375939859) { + var300 = 0.178201303 + } else { + var300 = -0.0850277692 + } + } + } + var var301 float64 + if (input[0]) >= (0.00135338353) { + if (input[8]) >= (0.0116050355) { + if (input[0]) >= (0.00466165412) { + var301 = -0.0022700252 + } else { + var301 = 0.108916767 + } + } else { + if (input[4]) >= (0.021708684) { + var301 = 0.0140152695 + } else { + var301 = -0.131548747 + } + } + } else { + if (input[8]) >= (0.00911355857) { + if (input[4]) >= (0.105042025) { + var301 = -0.217132181 + } else { + var301 = 0.254907668 + } + } else { + if (input[8]) >= (0.00845790748) { + var301 = -0.337023497 + } else { + var301 = 0.0984557196 + } + } + } + var var302 float64 + if (input[5]) >= (0.754999995) { + if (input[2]) >= (0.100029469) { + var302 = -0.329162031 + } else { + if (input[2]) >= (0.0375732146) { + var302 = 0.112829573 + } else { + var302 = -0.178680271 + } + } + } else { + if (input[4]) >= (0.667366982) { + if (input[3]) >= (0.16188395) { + var302 = -0.0388491377 + } else { + var302 = -0.232922778 + } + } else { + if (input[4]) >= (0.0147058824) { + var302 = -0.00368232257 + } else { + var302 = 0.0303132683 + } + } + } + var var303 float64 + if (input[6]) >= (0.108122349) { + if (input[2]) >= (0.0758124962) { + var303 = 0.287597597 + } else { + if (input[2]) >= (0.0194421671) { + var303 = -0.269043088 + } else { + var303 = 0.000512624334 + } + } + } else { + if (input[6]) >= (0.102312073) { + if (input[1]) >= (0.0370934978) { + var303 = 0.430314153 + } else { + var303 = -0.0107942456 + } + } else { + if (input[6]) >= (0.0938073844) { + var303 = -0.199522749 + } else { + var303 = -0.000882540538 + } + } + } + var var304 float64 + if (input[2]) >= (0.000881086686) { + if (input[2]) >= (0.000891897595) { + if (input[0]) >= (0.00105263153) { + var304 = 0.0022803715 + } else { + var304 = 0.119134672 + } + } else { + var304 = 0.431203514 + } + } else { + if (input[4]) >= (0.0259103645) { + if (input[2]) >= (0.000742146862) { + var304 = 0.00315292622 + } else { + var304 = 0.255445659 + } + } else { + if (input[7]) >= (0.000133897585) { + var304 = -0.421744078 + } else { + var304 = -0.0681169182 + } + } + } + var var305 float64 + if (input[6]) >= (0.152587533) { + if (input[0]) >= (0.0299248137) { + if (input[8]) >= (0.0379622355) { + var305 = 0.0903427824 + } else { + var305 = 0.550862551 + } + } else { + var305 = -0.152316093 + } + } else { + if (input[6]) >= (0.126019806) { + if (input[5]) >= (0.00499999989) { + var305 = 0.100360774 + } else { + var305 = -0.330292165 + } + } else { + if (input[6]) >= (0.11927627) { + var305 = 0.256729245 + } else { + var305 = -0.00105778396 + } + } + } + var var306 float64 + if (input[1]) >= (0.0439532511) { + if (input[7]) >= (0.001334709) { + if (input[7]) >= (0.00134385226) { + var306 = 0.00492482539 + } else { + var306 = 0.371945381 + } + } else { + if (input[7]) >= (0.000708499108) { + var306 = -0.122599408 + } else { + var306 = -0.0302312654 + } + } + } else { + if (input[3]) >= (0.0227870308) { + if (input[9]) >= (0.0430369861) { + var306 = 0.258989573 + } else { + var306 = 0.0332327597 + } + } else { + if (input[9]) >= (0.135780901) { + var306 = 0.0378570706 + } else { + var306 = -0.0013929758 + } + } + } + var var307 float64 + if (input[0]) >= (0.084360905) { + if (input[0]) >= (0.119849622) { + if (input[0]) >= (0.12105263) { + var307 = -0.0116397366 + } else { + var307 = 0.0986655876 + } + } else { + if (input[3]) >= (0.00847342145) { + var307 = -0.0998042598 + } else { + var307 = -0.00379005331 + } + } + } else { + if (input[1]) >= (0.0073678866) { + if (input[7]) >= (0.0664757788) { + var307 = -0.0880032554 + } else { + var307 = 0.00207109633 + } + } else { + if (input[3]) >= (0.00428958377) { + var307 = -0.0312897228 + } else { + var307 = 0.233685642 + } + } + } + var var308 float64 + if (input[8]) >= (0.154405981) { + if (input[5]) >= (0.375) { + if (input[3]) >= (0.0235890262) { + var308 = -0.154792935 + } else { + var308 = 0.140004575 + } + } else { + if (input[0]) >= (0.125263155) { + var308 = 0.0532684103 + } else { + var308 = 0.237360284 + } + } + } else { + if (input[8]) >= (0.151914507) { + var308 = -0.296536416 + } else { + if (input[8]) >= (0.150734335) { + var308 = 0.272759289 + } else { + var308 = -0.00213638204 + } + } + } + var var309 float64 + if (input[4]) >= (0.0273109246) { + if (input[0]) >= (0.00345864659) { + if (input[8]) >= (0.0109493835) { + var309 = 0.00757080689 + } else { + var309 = -0.14336656 + } + } else { + if (input[8]) >= (0.0129163386) { + var309 = -0.0702465698 + } else { + var309 = 0.376838267 + } + } + } else { + if (input[8]) >= (0.0108182533) { + if (input[4]) >= (0.021708684) { + var309 = -0.146462843 + } else { + var309 = 0.00117639243 + } + } else { + if (input[0]) >= (0.00375939859) { + var309 = 0.113502629 + } else { + var309 = -0.0748205706 + } + } + } + var var310 float64 + if (input[3]) >= (0.0692812949) { + if (input[4]) >= (0.157563031) { + if (input[2]) >= (0.119559325) { + var310 = 0.01659289 + } else { + var310 = 0.156964093 + } + } else { + if (input[4]) >= (0.12114846) { + var310 = -0.290744036 + } else { + var310 = 0.0214160979 + } + } + } else { + if (input[3]) >= (0.0687797666) { + var310 = -0.386910588 + } else { + if (input[4]) >= (0.574929953) { + var310 = -0.0977590233 + } else { + var310 = 0.00275972066 + } + } + } + var var311 float64 + if (input[8]) >= (0.00845790748) { + if (input[8]) >= (0.00990034081) { + if (input[8]) >= (0.010031471) { + var311 = 0.000534939638 + } else { + var311 = 0.155808866 + } + } else { + if (input[5]) >= (0.00499999989) { + var311 = -0.342671961 + } else { + var311 = -0.0174334738 + } + } + } else { + if (input[0]) >= (0.0514285713) { + var311 = -0.469604254 + } else { + if (input[0]) >= (0.000451127824) { + var311 = 0.12268471 + } else { + var311 = -0.256605357 + } + } + } + var var312 float64 + if (input[3]) >= (0.121799268) { + if (input[5]) >= (0.0350000001) { + if (input[3]) >= (0.136228293) { + var312 = 0.124041378 + } else { + var312 = 0.375345379 + } + } else { + if (input[7]) >= (0.00109800091) { + var312 = 0.147618979 + } else { + var312 = -0.166997448 + } + } + } else { + if (input[3]) >= (0.116484001) { + var312 = -0.271234095 + } else { + if (input[6]) >= (0.0952674896) { + var312 = -0.0821127146 + } else { + var312 = -0.00174526277 + } + } + } + var var313 float64 + if (input[6]) >= (0.0175964125) { + if (input[7]) >= (0.00246196822) { + if (input[7]) >= (0.0025513689) { + var313 = 0.0258625131 + } else { + var313 = 0.326643854 + } + } else { + if (input[9]) >= (0.00552940834) { + var313 = -0.00833026413 + } else { + var313 = -0.0979755446 + } + } + } else { + if (input[6]) >= (0.0167233646) { + if (input[3]) >= (0.0231126584) { + var313 = -0.254882157 + } else { + var313 = -0.0369429514 + } + } else { + if (input[8]) >= (0.0289142411) { + var313 = 0.0071671647 + } else { + var313 = -0.0133674694 + } + } + } + var var314 float64 + if (input[6]) >= (0.147183672) { + if (input[2]) >= (0.0194415655) { + if (input[2]) >= (0.0517240539) { + var314 = 0.230417356 + } else { + var314 = -0.231224641 + } + } else { + if (input[2]) >= (0.00997363776) { + var314 = 0.383196801 + } else { + var314 = 0.0273840316 + } + } + } else { + if (input[3]) >= (0.0024339417) { + if (input[4]) >= (0.042717088) { + var314 = -0.00221866998 + } else { + var314 = 0.0152277462 + } + } else { + if (input[2]) >= (0.00104345009) { + var314 = -0.0807774737 + } else { + var314 = 0.171384931 + } + } + } + var var315 float64 + if (input[6]) >= (0.00152030587) { + if (input[6]) >= (0.00155041087) { + if (input[0]) >= (0.00105263153) { + var315 = -0.00207328727 + } else { + var315 = 0.0962062925 + } + } else { + if (input[3]) >= (0.0114391446) { + var315 = -0.289932787 + } else { + var315 = -0.0306339636 + } + } + } else { + if (input[9]) >= (0.166243181) { + if (input[8]) >= (0.0148177287) { + var315 = 0.0575389415 + } else { + var315 = -0.218524292 + } + } else { + if (input[3]) >= (0.00271762628) { + var315 = 0.0834022164 + } else { + var315 = -0.112467945 + } + } + } + var var316 float64 + if (input[4]) >= (0.0119047621) { + if (input[4]) >= (0.0147058824) { + if (input[4]) >= (0.0161064435) { + var316 = -0.000123649748 + } else { + var316 = -0.182855487 + } + } else { + if (input[8]) >= (0.0108182533) { + var316 = 0.182439417 + } else { + var316 = -0.178036273 + } + } + } else { + if (input[8]) >= (0.0137031209) { + if (input[5]) >= (0.00999999978) { + var316 = -0.0231398046 + } else { + var316 = -0.822692752 + } + } else { + if (input[4]) >= (0.00910364185) { + var316 = 0.232032955 + } else { + var316 = -0.140776977 + } + } + } + var var317 float64 + if (input[7]) >= (0.209909767) { + if (input[4]) >= (0.117647059) { + if (input[3]) >= (0.0122312242) { + var317 = -0.114009991 + } else { + var317 = 0.274085671 + } + } else { + if (input[3]) >= (0.00567140151) { + var317 = -0.445832938 + } else { + var317 = -0.0413070843 + } + } + } else { + if (input[7]) >= (0.205834329) { + var317 = 0.328243375 + } else { + if (input[4]) >= (0.0665266141) { + var317 = -0.00430549029 + } else { + var317 = 0.0111220134 + } + } + } + var var318 float64 + if (input[9]) >= (0.0526520982) { + if (input[0]) >= (0.0524812043) { + if (input[9]) >= (0.131420895) { + var318 = -0.296413094 + } else { + var318 = 0.0586084202 + } + } else { + if (input[0]) >= (0.0311278198) { + var318 = -0.0738035738 + } else { + var318 = -0.00510699302 + } + } + } else { + if (input[9]) >= (0.0521901101) { + if (input[3]) >= (0.00305825099) { + var318 = 0.130673692 + } else { + var318 = 0.379126787 + } + } else { + if (input[0]) >= (0.0509774461) { + var318 = -0.00904626399 + } else { + var318 = 0.0227523725 + } + } + } + var var319 float64 + if (input[4]) >= (0.510504246) { + if (input[1]) >= (0.0383638218) { + if (input[1]) >= (0.0429369919) { + var319 = -0.0233829785 + } else { + var319 = 0.214847252 + } + } else { + if (input[3]) >= (0.0251818262) { + var319 = 0.126049891 + } else { + var319 = -0.157557815 + } + } + } else { + if (input[7]) >= (0.0324190632) { + if (input[9]) >= (0.0324112847) { + var319 = -0.0276937559 + } else { + var319 = 0.0383203551 + } + } else { + if (input[9]) >= (0.0303900912) { + var319 = 0.00526065566 + } else { + var319 = -0.0151233803 + } + } + } + var var320 float64 + if (input[3]) >= (0.00386202359) { + if (input[8]) >= (0.0155389458) { + if (input[8]) >= (0.0278651975) { + var320 = 0.0123636993 + } else { + var320 = -0.0202348623 + } + } else { + if (input[4]) >= (0.0623249337) { + var320 = 0.237750843 + } else { + var320 = 0.00274135731 + } + } + } else { + if (input[3]) >= (0.00336379651) { + if (input[6]) >= (0.0175663065) { + var320 = 0.0361665711 + } else { + var320 = -0.078740567 + } + } else { + if (input[6]) >= (0.0135021228) { + var320 = -0.0402578078 + } else { + var320 = 0.0149596985 + } + } + } + var var321 float64 + if (input[3]) >= (0.300652921) { + var321 = -0.234236732 + } else { + if (input[7]) >= (0.106107637) { + if (input[4]) >= (0.12114846) { + var321 = -0.0730502829 + } else { + var321 = 0.0636460632 + } + } else { + if (input[7]) >= (0.0974752083) { + var321 = 0.0991552472 + } else { + var321 = 0.000620873005 + } + } + } + var var322 float64 + if (input[6]) >= (0.283710152) { + var322 = -0.285064638 + } else { + if (input[6]) >= (0.0891411006) { + if (input[6]) >= (0.0928891897) { + var322 = 0.0203629229 + } else { + var322 = 0.269062132 + } + } else { + if (input[6]) >= (0.0853629112) { + var322 = -0.185597047 + } else { + var322 = -0.0065480792 + } + } + } + var var323 float64 + if (input[8]) >= (0.0135719907) { + if (input[8]) >= (0.0142276427) { + if (input[0]) >= (0.00466165412) { + var323 = 0.00317906775 + } else { + var323 = 0.0785248652 + } + } else { + if (input[2]) >= (0.0188317522) { + var323 = 0.493960142 + } else { + var323 = 0.0676818714 + } + } + } else { + if (input[0]) >= (0.0166917294) { + if (input[0]) >= (0.0178947374) { + var323 = 0.0673472509 + } else { + var323 = 0.639036536 + } + } else { + if (input[0]) >= (0.00766917318) { + var323 = -0.170730203 + } else { + var323 = -0.0135729183 + } + } + } + var var324 float64 + if (input[7]) >= (0.0578122661) { + if (input[6]) >= (0.0245506819) { + if (input[4]) >= (0.272408962) { + var324 = 0.222112909 + } else { + var324 = 0.0396600738 + } + } else { + if (input[6]) >= (0.0214498602) { + var324 = -0.196001694 + } else { + var324 = 0.012227443 + } + } + } else { + if (input[7]) >= (0.0572140925) { + if (input[2]) >= (0.0645189285) { + var324 = -0.475988448 + } else { + var324 = -0.0710307807 + } + } else { + if (input[6]) >= (0.0281331837) { + var324 = -0.0221564099 + } else { + var324 = 0.00102217065 + } + } + } + var var325 float64 + if (input[2]) >= (0.148706853) { + if (input[4]) >= (0.336834729) { + if (input[8]) >= (0.0859559402) { + var325 = 0.0162247699 + } else { + var325 = 0.395905286 + } + } else { + if (input[5]) >= (0.215000004) { + var325 = 0.0797636136 + } else { + var325 = -0.16091232 + } + } + } else { + if (input[7]) >= (0.140486002) { + var325 = 0.291054696 + } else { + if (input[5]) >= (0.215000004) { + var325 = -0.0436242707 + } else { + var325 = 0.00334614841 + } + } + } + var var326 float64 + if (input[3]) >= (0.00490474189) { + if (input[3]) >= (0.0049510058) { + if (input[4]) >= (0.200980395) { + var326 = -0.0128034484 + } else { + var326 = 0.0162679162 + } + } else { + if (input[8]) >= (0.017571466) { + var326 = 0.358248651 + } else { + var326 = -0.0610035919 + } + } + } else { + if (input[8]) >= (0.0224888548) { + if (input[4]) >= (0.052521009) { + var326 = -0.0725589767 + } else { + var326 = 0.010818583 + } + } else { + if (input[5]) >= (0.0949999988) { + var326 = 0.30049485 + } else { + var326 = 0.00246530049 + } + } + } + var var327 float64 + if (input[0]) >= (0.207669169) { + if (input[4]) >= (0.179971993) { + if (input[0]) >= (0.241052628) { + var327 = -0.165422112 + } else { + var327 = 0.223827943 + } + } else { + if (input[4]) >= (0.135154068) { + var327 = -0.316963583 + } else { + var327 = 0.0466178283 + } + } + } else { + if (input[0]) >= (0.180300742) { + if (input[5]) >= (0.0549999997) { + var327 = -0.014636687 + } else { + var327 = -0.186242878 + } + } else { + if (input[0]) >= (0.179398507) { + var327 = 0.258977711 + } else { + var327 = -0.00275184656 + } + } + } + var var328 float64 + if (input[1]) >= (0.083079271) { + if (input[0]) >= (0.0136842104) { + if (input[0]) >= (0.03924812) { + var328 = -0.0526077934 + } else { + var328 = 0.0941067636 + } + } else { + if (input[4]) >= (0.0371148475) { + var328 = -0.231615767 + } else { + var328 = 0.00467879837 + } + } + } else { + if (input[1]) >= (0.0769817084) { + if (input[2]) >= (0.0233092587) { + var328 = 0.168643355 + } else { + var328 = -0.0271485895 + } + } else { + if (input[1]) >= (0.0713922754) { + var328 = -0.0551071838 + } else { + var328 = 0.00544936862 + } + } + } + var var329 float64 + if (input[4]) >= (0.0553221293) { + if (input[4]) >= (0.0637254938) { + if (input[9]) >= (0.220656604) { + var329 = -0.149859786 + } else { + var329 = -0.000207438352 + } + } else { + if (input[0]) >= (0.0251127817) { + var329 = 0.2102997 + } else { + var329 = -0.0563225113 + } + } + } else { + if (input[4]) >= (0.052521009) { + if (input[1]) >= (0.044969514) { + var329 = 0.0503511392 + } else { + var329 = -0.263940424 + } + } else { + if (input[5]) >= (0.0350000001) { + var329 = -0.0535254814 + } else { + var329 = 0.00085063529 + } + } + } + var var330 float64 + if (input[0]) >= (0.19894737) { + if (input[8]) >= (0.0670731738) { + if (input[8]) >= (0.18364805) { + var330 = 0.102626979 + } else { + var330 = -0.184893698 + } + } else { + if (input[7]) >= (0.0231181607) { + var330 = -0.0724921003 + } else { + var330 = 0.0896771699 + } + } + } else { + if (input[0]) >= (0.19834587) { + var330 = 0.456023514 + } else { + if (input[1]) >= (0.0144817075) { + var330 = -0.00396970008 + } else { + var330 = 0.0276505072 + } + } + } + var var331 float64 + if (input[7]) >= (0.0104277572) { + if (input[0]) >= (0.00676691718) { + if (input[0]) >= (0.0717293248) { + var331 = -0.00187411997 + } else { + var331 = 0.0378329456 + } + } else { + if (input[0]) >= (0.00406015012) { + var331 = -0.216612741 + } else { + var331 = 0.159773543 + } + } + } else { + if (input[5]) >= (0.125) { + if (input[0]) >= (0.00556390965) { + var331 = 0.0993390158 + } else { + var331 = -0.439337164 + } + } else { + if (input[7]) >= (0.010017734) { + var331 = -0.143345103 + } else { + var331 = -0.00548424665 + } + } + } + var var332 float64 + if (input[2]) >= (0.0151520493) { + if (input[9]) >= (0.00402795058) { + if (input[2]) >= (0.0153550534) { + var332 = -0.00830756128 + } else { + var332 = -0.148486242 + } + } else { + if (input[9]) >= (0.00362371141) { + var332 = 0.212815896 + } else { + var332 = 0.0243317522 + } + } + } else { + if (input[4]) >= (0.269607842) { + if (input[3]) >= (0.00739435293) { + var332 = 0.190716013 + } else { + var332 = -0.0619829744 + } + } else { + if (input[0]) >= (0.0738345832) { + var332 = 0.0800450072 + } else { + var332 = -0.000963165017 + } + } + } + var var333 float64 + if (input[1]) >= (0.151676834) { + if (input[4]) >= (0.0273109246) { + if (input[4]) >= (0.157563031) { + var333 = 0.102568574 + } else { + var333 = -0.0752707124 + } + } else { + if (input[1]) >= (0.187754065) { + var333 = 0.297112525 + } else { + var333 = 0.0485113598 + } + } + } else { + if (input[1]) >= (0.144054875) { + if (input[1]) >= (0.146595523) { + var333 = -0.00665780529 + } else { + var333 = -0.313791037 + } + } else { + if (input[1]) >= (0.133892283) { + var333 = 0.0920097828 + } else { + var333 = -0.000245233008 + } + } + } + var var334 float64 + if (input[8]) >= (0.00753999501) { + if (input[8]) >= (0.00806451589) { + if (input[4]) >= (0.174369752) { + var334 = -0.00665227557 + } else { + var334 = 0.00461732922 + } + } else { + if (input[4]) >= (0.0259103645) { + var334 = 0.294704676 + } else { + var334 = -0.0381972678 + } + } + } else { + if (input[7]) >= (0.000374466239) { + if (input[1]) >= (0.152693093) { + var334 = -0.04692946 + } else { + var334 = -0.275813609 + } + } else { + if (input[2]) >= (0.00777062029) { + var334 = 0.446210444 + } else { + var334 = -0.141434297 + } + } + } + var var335 float64 + if (input[2]) >= (0.000963569735) { + if (input[6]) >= (0.00118915015) { + if (input[6]) >= (0.00149020087) { + var335 = -0.00233240426 + } else { + var335 = 0.0454745479 + } + } else { + if (input[0]) >= (0.00315789459) { + var335 = -0.119568557 + } else { + var335 = 0.0802512243 + } + } + } else { + if (input[9]) >= (0.0697311834) { + if (input[0]) >= (0.00315789459) { + var335 = -0.329945296 + } else { + var335 = 0.00327738537 + } + } else { + if (input[6]) >= (0.00218261732) { + var335 = 0.071402818 + } else { + var335 = -0.202553555 + } + } + } + var var336 float64 + if (input[4]) >= (0.00910364185) { + if (input[4]) >= (0.0119047621) { + if (input[8]) >= (0.00740886433) { + var336 = 0.00493809395 + } else { + var336 = -0.129449144 + } + } else { + if (input[8]) >= (0.0272095464) { + var336 = 0.277629554 + } else { + var336 = -0.170581639 + } + } + } else { + if (input[8]) >= (0.0152766854) { + if (input[5]) >= (0.145000011) { + var336 = -0.056375768 + } else { + var336 = 0.277535498 + } + } else { + if (input[8]) >= (0.00740886433) { + var336 = -0.306932211 + } else { + var336 = 0.260632843 + } + } + } + var var337 float64 + if (input[6]) >= (0.00633711647) { + if (input[7]) >= (5.01861941e-05) { + if (input[6]) >= (0.00669837743) { + var337 = 0.00292044878 + } else { + var337 = 0.0682330281 + } + } else { + if (input[7]) >= (4.16525145e-05) { + var337 = -0.228818059 + } else { + var337 = -0.0386682451 + } + } + } else { + if (input[7]) >= (0.0157444458) { + if (input[4]) >= (0.0777310953) { + var337 = 0.0370208323 + } else { + var337 = -0.0553130358 + } + } else { + if (input[9]) >= (0.0670314431) { + var337 = 0.00779267587 + } else { + var337 = -0.0409367457 + } + } + } + var var338 float64 + if (input[8]) >= (0.261605024) { + if (input[1]) >= (0.0287093502) { + if (input[5]) >= (0.340000004) { + var338 = 0.437235624 + } else { + var338 = 0.0977231488 + } + } else { + var338 = 0.0279979389 + } + } else { + if (input[3]) >= (0.0397511609) { + if (input[3]) >= (0.0460356846) { + var338 = 0.0101555362 + } else { + var338 = 0.131362483 + } + } else { + if (input[3]) >= (0.0346926302) { + var338 = -0.0722377673 + } else { + var338 = 2.45762603e-05 + } + } + } + var var339 float64 + if (input[9]) >= (0.405263782) { + if (input[8]) >= (0.00976921059) { + if (input[7]) >= (0.00422295509) { + var339 = 0.0709616169 + } else { + var339 = 0.250192702 + } + } else { + if (input[0]) >= (0.00105263153) { + var339 = -0.19661434 + } else { + var339 = 0.0729795322 + } + } + } else { + if (input[9]) >= (0.389700592) { + var339 = -0.255369782 + } else { + if (input[2]) >= (0.0738000721) { + var339 = -0.0208027977 + } else { + var339 = 0.00486319559 + } + } + } + var var340 float64 + if (input[8]) >= (0.00806451589) { + if (input[9]) >= (0.556954324) { + if (input[9]) >= (0.715733528) { + var340 = 0.0431087986 + } else { + var340 = -0.179263473 + } + } else { + if (input[9]) >= (0.531429529) { + var340 = 0.342517018 + } else { + var340 = 0.00146163662 + } + } + } else { + if (input[7]) >= (0.0115326662) { + var340 = -0.287440032 + } else { + if (input[4]) >= (0.0294117648) { + var340 = 0.234791487 + } else { + var340 = 0.0580950007 + } + } + } + var var341 float64 + if (input[0]) >= (0.273834586) { + if (input[4]) >= (0.101540618) { + var341 = -0.250225365 + } else { + if (input[4]) >= (0.065126054) { + var341 = 0.362618387 + } else { + var341 = 0.0516042672 + } + } + } else { + if (input[0]) >= (0.259097755) { + if (input[4]) >= (0.0616246536) { + var341 = -0.0120407734 + } else { + var341 = -0.309830874 + } + } else { + if (input[5]) >= (0.234999999) { + var341 = 0.0427041501 + } else { + var341 = -0.000212861472 + } + } + } + var var342 float64 + if (input[6]) >= (0.0206370242) { + if (input[6]) >= (0.0225637481) { + if (input[7]) >= (0.00415204419) { + var342 = 0.0120116184 + } else { + var342 = -0.0383394063 + } + } else { + if (input[6]) >= (0.0223530121) { + var342 = -0.298264861 + } else { + var342 = -0.059204381 + } + } + } else { + if (input[6]) >= (0.0204864983) { + if (input[8]) >= (0.0207185932) { + var342 = 0.30904603 + } else { + var342 = 0.0132600693 + } + } else { + if (input[5]) >= (0.0649999976) { + var342 = -0.021893939 + } else { + var342 = 0.00636848435 + } + } + } + var var343 float64 + if (input[9]) >= (0.686700583) { + if (input[2]) >= (0.00415578252) { + var343 = 0.338708818 + } else { + var343 = 0.00430314057 + } + } else { + if (input[9]) >= (0.556954324) { + if (input[6]) >= (0.00428997213) { + var343 = -0.273895711 + } else { + var343 = -0.0362647176 + } + } else { + if (input[9]) >= (0.535038829) { + var343 = 0.241655722 + } else { + var343 = 0.00084551709 + } + } + } + var var344 float64 + if (input[4]) >= (0.139355749) { + if (input[4]) >= (0.14915967) { + if (input[0]) >= (0.0206015036) { + var344 = -0.00627159374 + } else { + var344 = 0.0725496113 + } + } else { + if (input[0]) >= (0.00390977459) { + var344 = 0.165156752 + } else { + var344 = -0.293561369 + } + } + } else { + if (input[4]) >= (0.133753508) { + if (input[0]) >= (0.0133834584) { + var344 = -0.180421501 + } else { + var344 = 0.362727284 + } + } else { + if (input[1]) >= (0.0073678866) { + var344 = -0.00125408464 + } else { + var344 = -0.0907725021 + } + } + } + var var345 float64 + if (input[4]) >= (0.052521009) { + if (input[4]) >= (0.0553221293) { + if (input[8]) >= (0.0215709414) { + var345 = -0.00999655854 + } else { + var345 = 0.0249625649 + } + } else { + if (input[5]) >= (0.00499999989) { + var345 = 0.0601425059 + } else { + var345 = -0.248763487 + } + } + } else { + if (input[8]) >= (0.0217020717) { + if (input[5]) >= (0.0649999976) { + var345 = -0.0648417026 + } else { + var345 = 0.0915710926 + } + } else { + if (input[5]) >= (0.00499999989) { + var345 = 0.0767970458 + } else { + var345 = -0.0240055062 + } + } + } + var var346 float64 + if (input[9]) >= (0.0452025533) { + if (input[3]) >= (0.0147749791) { + if (input[8]) >= (0.0685156062) { + var346 = 0.0169994589 + } else { + var346 = -0.121243596 + } + } else { + if (input[5]) >= (0.175000012) { + var346 = 0.318196774 + } else { + var346 = -0.00395076536 + } + } + } else { + if (input[5]) >= (0.685000002) { + if (input[8]) >= (0.0960529745) { + var346 = -0.235690475 + } else { + var346 = 0.0157146584 + } + } else { + if (input[9]) >= (0.0450581834) { + var346 = 0.198414057 + } else { + var346 = 0.00707878359 + } + } + } + var var347 float64 + if (input[1]) >= (0.0195630081) { + if (input[4]) >= (0.238795519) { + if (input[5]) >= (0.00499999989) { + var347 = -0.0458472632 + } else { + var347 = 0.0439547002 + } + } else { + if (input[4]) >= (0.199579835) { + var347 = -0.054550197 + } else { + var347 = 0.00307067554 + } + } + } else { + if (input[0]) >= (0.0236090235) { + if (input[8]) >= (0.0506818779) { + var347 = 0.00619618315 + } else { + var347 = -0.070866175 + } + } else { + if (input[5]) >= (0.00499999989) { + var347 = 0.169598728 + } else { + var347 = -0.0177909713 + } + } + } + var var348 float64 + if (input[0]) >= (0.00285714283) { + if (input[4]) >= (0.021708684) { + if (input[8]) >= (0.0113427751) { + var348 = -0.00385626429 + } else { + var348 = 0.0433700904 + } + } else { + if (input[8]) >= (0.0116050355) { + var348 = 0.00227908115 + } else { + var348 = -0.15142186 + } + } + } else { + if (input[4]) >= (0.0231092442) { + if (input[4]) >= (0.0259103645) { + var348 = 0.0996284708 + } else { + var348 = -0.333995104 + } + } else { + if (input[4]) >= (0.0161064435) { + var348 = 0.152937457 + } else { + var348 = -0.0633552298 + } + } + } + var var349 float64 + if (input[5]) >= (0.0549999997) { + if (input[0]) >= (0.00796992518) { + if (input[0]) >= (0.0347368419) { + var349 = 0.0102174552 + } else { + var349 = 0.137461096 + } + } else { + if (input[0]) >= (0.00195488706) { + var349 = -0.139117658 + } else { + var349 = 0.253046453 + } + } + } else { + if (input[0]) >= (0.122255638) { + if (input[1]) >= (0.0134654474) { + var349 = -0.0665988699 + } else { + var349 = 0.0672549158 + } + } else { + if (input[0]) >= (0.12045113) { + var349 = 0.0638346747 + } else { + var349 = -0.00340554724 + } + } + } + var var350 float64 + if (input[3]) >= (0.0234692991) { + if (input[3]) >= (0.0235923305) { + if (input[7]) >= (0.0171358436) { + var350 = -0.0138600487 + } else { + var350 = 0.0390772261 + } + } else { + if (input[5]) >= (0.00499999989) { + var350 = 0.404042274 + } else { + var350 = 0.075095728 + } + } + } else { + if (input[3]) >= (0.0231624823) { + if (input[0]) >= (0.0500751883) { + var350 = -0.0710452646 + } else { + var350 = -0.416528314 + } + } else { + if (input[3]) >= (0.0231525674) { + var350 = 0.343028963 + } else { + var350 = -0.00426955195 + } + } + } + var var351 float64 + if (input[2]) >= (0.475332975) { + var351 = -0.237791553 + } else { + if (input[3]) >= (0.111307517) { + if (input[5]) >= (0.0350000001) { + var351 = 0.127263561 + } else { + var351 = -0.0185106732 + } + } else { + if (input[4]) >= (0.35084033) { + var351 = -0.0221571289 + } else { + var351 = 0.000205447359 + } + } + } + var var352 float64 + if (input[1]) >= (0.0581808947) { + if (input[0]) >= (0.119548872) { + if (input[0]) >= (0.12105263) { + var352 = 0.0148318009 + } else { + var352 = 0.207496092 + } + } else { + if (input[0]) >= (0.0612030067) { + var352 = -0.0993124321 + } else { + var352 = -0.0159126185 + } + } + } else { + if (input[0]) >= (0.0121804513) { + if (input[8]) >= (0.0165879875) { + var352 = 0.000590711308 + } else { + var352 = -0.0870961845 + } + } else { + if (input[4]) >= (0.0357142873) { + var352 = 0.0842488781 + } else { + var352 = -0.000499365909 + } + } + } + var var353 float64 + if (input[7]) >= (0.362487584) { + var353 = 0.200774282 + } else { + if (input[2]) >= (0.333641768) { + var353 = -0.2732701 + } else { + if (input[6]) >= (0.0149471648) { + var353 = 0.00720896339 + } else { + var353 = -0.00538807362 + } + } + } + var var354 float64 + if (input[6]) >= (0.00130957039) { + if (input[9]) >= (0.361995786) { + if (input[2]) >= (0.00261302991) { + var354 = 0.0327775553 + } else { + var354 = 0.361897022 + } + } else { + if (input[9]) >= (0.285031617) { + var354 = -0.122448936 + } else { + var354 = 0.00175567006 + } + } + } else { + if (input[7]) >= (0.000147714018) { + if (input[4]) >= (0.0301120449) { + var354 = -0.0534958653 + } else { + var354 = -0.228099585 + } + } else { + var354 = 0.149858594 + } + } + var var355 float64 + if (input[0]) >= (0.0485714301) { + if (input[0]) >= (0.0509774461) { + if (input[0]) >= (0.0524812043) { + var355 = 0.00721961958 + } else { + var355 = -0.120354481 + } + } else { + if (input[4]) >= (0.262605071) { + var355 = -0.851768255 + } else { + var355 = 0.126444444 + } + } + } else { + if (input[4]) >= (0.327030838) { + if (input[8]) >= (0.0245869402) { + var355 = 0.290691018 + } else { + var355 = 0.00268158969 + } + } else { + if (input[8]) >= (0.0416338854) { + var355 = 0.079033874 + } else { + var355 = -0.0149792815 + } + } + } + var var356 float64 + if (input[4]) >= (0.00350140082) { + if (input[1]) >= (0.010416666) { + if (input[4]) >= (0.0063025211) { + var356 = 0.00260222889 + } else { + var356 = -0.159914255 + } + } else { + if (input[4]) >= (0.437675059) { + var356 = 0.13099274 + } else { + var356 = -0.0401971824 + } + } + } else { + if (input[8]) >= (0.0554681346) { + var356 = 0.234395728 + } else { + var356 = 0.0209439378 + } + } + var var357 float64 + if (input[7]) >= (0.109669231) { + if (input[8]) >= (0.0335038044) { + if (input[7]) >= (0.111621827) { + var357 = 0.0142685613 + } else { + var357 = 0.297769785 + } + } else { + var357 = 0.62544775 + } + } else { + if (input[7]) >= (0.103159457) { + if (input[1]) >= (0.023119919) { + var357 = -0.260620058 + } else { + var357 = 0.0687360987 + } + } else { + if (input[7]) >= (0.102549091) { + var357 = 0.297759026 + } else { + var357 = 0.00145329605 + } + } + } + var var358 float64 + if (input[5]) >= (0.145000011) { + if (input[4]) >= (0.55252099) { + var358 = -0.357375175 + } else { + if (input[0]) >= (0.172781944) { + var358 = -0.107276797 + } else { + var358 = -0.00897039101 + } + } + } else { + if (input[4]) >= (0.0077030817) { + if (input[5]) >= (0.125) { + var358 = 0.0851260498 + } else { + var358 = -0.000605561654 + } + } else { + if (input[0]) >= (0.00631578919) { + var358 = 0.333426714 + } else { + var358 = 0.100194514 + } + } + } + var var359 float64 + if (input[8]) >= (0.0439942293) { + if (input[0]) >= (0.0858646631) { + if (input[4]) >= (0.109943978) { + var359 = -0.0227243043 + } else { + var359 = 0.0477193482 + } + } else { + if (input[6]) >= (0.11902038) { + var359 = -0.373027742 + } else { + var359 = 0.0625631288 + } + } + } else { + if (input[0]) >= (0.194586471) { + if (input[0]) >= (0.224812031) { + var359 = -0.137703136 + } else { + var359 = 0.341481239 + } + } else { + if (input[8]) >= (0.0394046679) { + var359 = -0.0634013265 + } else { + var359 = -0.000297934923 + } + } + } + var var360 float64 + if (input[4]) >= (0.395658255) { + if (input[8]) >= (0.0790060312) { + if (input[0]) >= (0.160751879) { + var360 = 0.171707958 + } else { + var360 = -0.0467407443 + } + } else { + if (input[7]) >= (0.000359430705) { + var360 = 0.0536948368 + } else { + var360 = 0.308334112 + } + } + } else { + if (input[8]) >= (0.0835955963) { + if (input[4]) >= (0.0721288547) { + var360 = 0.0625491142 + } else { + var360 = -0.113844141 + } + } else { + if (input[4]) >= (0.370448172) { + var360 = -0.0905230194 + } else { + var360 = -0.000279840227 + } + } + } + var var361 float64 + if (input[9]) >= (0.0281379037) { + if (input[4]) >= (0.558123231) { + if (input[4]) >= (0.586134434) { + var361 = -0.124454103 + } else { + var361 = 0.347777128 + } + } else { + if (input[0]) >= (0.121954888) { + var361 = -0.0784919262 + } else { + var361 = -0.0059832586 + } + } + } else { + if (input[7]) >= (0.0114560667) { + if (input[0]) >= (0.041052632) { + var361 = 0.00390737737 + } else { + var361 = 0.167634696 + } + } else { + if (input[7]) >= (0.000389095396) { + var361 = -0.025253566 + } else { + var361 = 0.0233056955 + } + } + } + var var362 float64 + if (input[4]) >= (0.182773113) { + if (input[4]) >= (0.184173673) { + if (input[8]) >= (0.0335038044) { + var362 = -0.00454044435 + } else { + var362 = 0.0544599257 + } + } else { + if (input[1]) >= (0.0335365832) { + var362 = 0.439274102 + } else { + var362 = -0.212054521 + } + } + } else { + if (input[4]) >= (0.174369752) { + if (input[5]) >= (0.00499999989) { + var362 = 0.0957624242 + } else { + var362 = -0.161029801 + } + } else { + if (input[4]) >= (0.164565831) { + var362 = 0.0810947418 + } else { + var362 = -0.000839515298 + } + } + } + var var363 float64 + if (input[8]) >= (0.0113427751) { + if (input[8]) >= (0.0114739053) { + if (input[9]) >= (0.143461436) { + var363 = -0.0401195213 + } else { + var363 = 0.000398501201 + } + } else { + if (input[1]) >= (0.0434451215) { + var363 = 0.0838890597 + } else { + var363 = -0.331377804 + } + } + } else { + if (input[6]) >= (0.00338681997) { + if (input[8]) >= (0.00898242835) { + var363 = -0.0203330554 + } else { + var363 = 0.0973686799 + } + } else { + if (input[6]) >= (0.00218261732) { + var363 = 0.141876206 + } else { + var363 = -0.0487607867 + } + } + } + var var364 float64 + if (input[0]) >= (0.00766917318) { + if (input[4]) >= (0.0203081239) { + if (input[8]) >= (0.0116050355) { + var364 = 0.00118055823 + } else { + var364 = -0.18069385 + } + } else { + if (input[8]) >= (0.0289142411) { + var364 = -0.0235658083 + } else { + var364 = -0.186606646 + } + } + } else { + if (input[4]) >= (0.0203081239) { + if (input[0]) >= (0.00706766918) { + var364 = 0.0773718506 + } else { + var364 = -0.0175629538 + } + } else { + if (input[8]) >= (0.0133097302) { + var364 = 0.141518921 + } else { + var364 = 0.0109437685 + } + } + } + var var365 float64 + if (input[8]) >= (0.0113427751) { + if (input[8]) >= (0.0116050355) { + if (input[8]) >= (0.011867296) { + var365 = -0.00343311741 + } else { + var365 = 0.0795543417 + } + } else { + if (input[4]) >= (0.0189075638) { + var365 = -0.205264255 + } else { + var365 = 0.126471967 + } + } + } else { + if (input[4]) >= (0.0315126069) { + if (input[1]) >= (0.0403963402) { + var365 = 0.0432360433 + } else { + var365 = -0.270766705 + } + } else { + if (input[8]) >= (0.0112116449) { + var365 = 0.21591951 + } else { + var365 = 0.0327033773 + } + } + } + var var366 float64 + if (input[8]) >= (0.0922501981) { + if (input[4]) >= (0.0959383771) { + if (input[0]) >= (0.0690225586) { + var366 = 0.0471365266 + } else { + var366 = -0.248978615 + } + } else { + if (input[0]) >= (0.128571421) { + var366 = -0.209224775 + } else { + var366 = 0.0531880446 + } + } + } else { + if (input[0]) >= (0.0169924796) { + if (input[4]) >= (0.0287114847) { + var366 = -0.014346444 + } else { + var366 = 0.0964797214 + } + } else { + if (input[7]) >= (0.0377461165) { + var366 = -0.22629492 + } else { + var366 = 0.0124570262 + } + } + } + var var367 float64 + if (input[7]) >= (0.000219640817) { + if (input[7]) >= (0.000228174496) { + if (input[2]) >= (0.289008677) { + var367 = -0.115063578 + } else { + var367 = 0.000659263169 + } + } else { + if (input[2]) >= (0.0045257546) { + var367 = 0.222791821 + } else { + var367 = -0.0687061697 + } + } + } else { + if (input[6]) >= (0.00335671497) { + if (input[2]) >= (0.0713600218) { + var367 = -0.264460325 + } else { + var367 = -0.041916348 + } + } else { + if (input[6]) >= (0.00311587448) { + var367 = 0.25740397 + } else { + var367 = 0.00450923759 + } + } + } + var var368 float64 + if (input[8]) >= (0.00976921059) { + if (input[8]) >= (0.0113427751) { + if (input[4]) >= (0.0273109246) { + var368 = 0.00241965381 + } else { + var368 = -0.035104651 + } + } else { + if (input[4]) >= (0.0133053223) { + var368 = 0.0126722408 + } else { + var368 = 0.343450665 + } + } + } else { + if (input[5]) >= (0.00499999989) { + if (input[3]) >= (0.00403818255) { + var368 = -0.102595046 + } else { + var368 = -0.31252715 + } + } else { + if (input[7]) >= (0.00108885765) { + var368 = 0.045343291 + } else { + var368 = -0.0733816475 + } + } + } + var var369 float64 + if (input[4]) >= (0.378851533) { + if (input[5]) >= (0.114999995) { + if (input[1]) >= (0.0818089396) { + var369 = 0.0891378298 + } else { + var369 = -0.1466133 + } + } else { + if (input[6]) >= (0.0915495083) { + var369 = 0.459486097 + } else { + var369 = 0.0385961719 + } + } + } else { + if (input[4]) >= (0.370448172) { + if (input[2]) >= (0.059919104) { + var369 = 0.157053441 + } else { + var369 = -0.167116597 + } + } else { + if (input[2]) >= (0.0837274641) { + var369 = -0.0301948767 + } else { + var369 = 0.00116103783 + } + } + } + var var370 float64 + if (input[8]) >= (0.261605024) { + if (input[7]) >= (0.0182700101) { + if (input[3]) >= (0.0845829695) { + var370 = -0.0887198672 + } else { + var370 = 0.228913859 + } + } else { + var370 = 0.316832513 + } + } else { + if (input[9]) >= (0.0282533988) { + if (input[0]) >= (0.0206015036) { + var370 = -0.0176599976 + } else { + var370 = 0.00713887485 + } + } else { + if (input[7]) >= (0.0323702991) { + var370 = 0.036912404 + } else { + var370 = 0.00276314584 + } + } + } + var var371 float64 + if (input[2]) >= (0.000943549559) { + if (input[2]) >= (0.00108008704) { + if (input[6]) >= (0.00534364954) { + var371 = 0.00450270716 + } else { + var371 = -0.0105378684 + } + } else { + if (input[9]) >= (0.0733115822) { + var371 = 0.241019174 + } else { + var371 = -0.0950988159 + } + } + } else { + if (input[4]) >= (0.0259103645) { + if (input[1]) >= (0.03125) { + var371 = 0.167915657 + } else { + var371 = -0.112989381 + } + } else { + if (input[0]) >= (0.00496240612) { + var371 = 0.0935288444 + } else { + var371 = -0.189650357 + } + } + } + var var372 float64 + if (input[7]) >= (0.0602864251) { + if (input[3]) >= (0.0029153917) { + if (input[5]) >= (0.0249999985) { + var372 = 0.0596894659 + } else { + var372 = -0.00495819049 + } + } else { + if (input[6]) >= (0.00973898917) { + var372 = 0.14815563 + } else { + var372 = 0.350634903 + } + } + } else { + if (input[7]) >= (0.0593838841) { + if (input[5]) >= (0.0450000018) { + var372 = 0.0358560309 + } else { + var372 = -0.394914657 + } + } else { + if (input[7]) >= (0.0581948571) { + var372 = 0.159882337 + } else { + var372 = -0.00114652212 + } + } + } + var var373 float64 + if (input[2]) >= (0.00204565888) { + if (input[2]) >= (0.00220401818) { + if (input[0]) >= (0.195037603) { + var373 = -0.0449707657 + } else { + var373 = -0.00204380741 + } + } else { + if (input[8]) >= (0.0175059009) { + var373 = 0.00671124132 + } else { + var373 = -0.227475435 + } + } + } else { + if (input[7]) >= (0.000696104893) { + if (input[3]) >= (0.00257527549) { + var373 = 0.241141379 + } else { + var373 = 0.0034582282 + } + } else { + if (input[3]) >= (0.00345403655) { + var373 = 0.125218794 + } else { + var373 = -0.0299157668 + } + } + } + var var374 float64 + if (input[3]) >= (0.00183251023) { + if (input[9]) >= (0.158216149) { + if (input[6]) >= (0.0312942155) { + var374 = -0.186792642 + } else { + var374 = -0.00780218095 + } + } else { + if (input[9]) >= (0.153076544) { + var374 = 0.152375877 + } else { + var374 = 0.000777820242 + } + } + } else { + if (input[0]) >= (0.00676691718) { + var374 = 0.0232269727 + } else { + var374 = 0.246220991 + } + } + var var375 float64 + if (input[0]) >= (0.00526315812) { + if (input[8]) >= (0.0119984262) { + if (input[8]) >= (0.0133097302) { + var375 = 0.000507705496 + } else { + var375 = -0.137016475 + } + } else { + if (input[0]) >= (0.00616541365) { + var375 = -0.00705092587 + } else { + var375 = 0.245335996 + } + } + } else { + if (input[8]) >= (0.0119984262) { + if (input[7]) >= (0.0121257566) { + var375 = -0.241480067 + } else { + var375 = 0.0538871475 + } + } else { + if (input[0]) >= (0.00436090212) { + var375 = -0.164288908 + } else { + var375 = -0.0254081208 + } + } + } + var var376 float64 + if (input[6]) >= (0.00278471876) { + if (input[6]) >= (0.00284492876) { + if (input[7]) >= (0.0202087834) { + var376 = -0.0139367515 + } else { + var376 = 0.00337252207 + } + } else { + if (input[8]) >= (0.0117361657) { + var376 = -0.161143795 + } else { + var376 = 0.122937188 + } + } + } else { + if (input[8]) >= (0.00885129813) { + if (input[8]) >= (0.0622213483) { + var376 = -0.0307949707 + } else { + var376 = 0.0314185359 + } + } else { + if (input[0]) >= (0.00375939859) { + var376 = -0.0196830072 + } else { + var376 = -0.225987479 + } + } + } + var var377 float64 + if (input[8]) >= (0.190597951) { + if (input[7]) >= (0.128878772) { + if (input[8]) >= (0.252098083) { + var377 = -0.040143013 + } else { + var377 = 0.179379702 + } + } else { + if (input[3]) >= (0.0231759548) { + var377 = -0.16989781 + } else { + var377 = 0.0472523943 + } + } + } else { + if (input[8]) >= (0.163453966) { + if (input[1]) >= (0.0711382106) { + var377 = -0.105880164 + } else { + var377 = 0.175420105 + } + } else { + if (input[5]) >= (0.0149999997) { + var377 = -0.0112480614 + } else { + var377 = 0.00508819055 + } + } + } + var var378 float64 + if (input[8]) >= (0.0416338854) { + if (input[8]) >= (0.0421584062) { + if (input[9]) >= (0.0530563369) { + var378 = 0.0694859475 + } else { + var378 = 0.00595745677 + } + } else { + if (input[2]) >= (0.0113840569) { + var378 = 0.217752889 + } else { + var378 = -0.131873772 + } + } + } else { + if (input[4]) >= (0.223389357) { + if (input[5]) >= (0.00499999989) { + var378 = -0.219911322 + } else { + var378 = 0.0686080605 + } + } else { + if (input[4]) >= (0.212184876) { + var378 = -0.116209276 + } else { + var378 = -0.00899004284 + } + } + } + var var379 float64 + if (input[4]) >= (0.343837559) { + if (input[0]) >= (0.0572932325) { + if (input[0]) >= (0.119097739) { + var379 = 3.795066e-05 + } else { + var379 = -0.142422289 + } + } else { + if (input[8]) >= (0.0240624174) { + var379 = 0.171135634 + } else { + var379 = -0.0260310993 + } + } + } else { + if (input[0]) >= (0.0584962405) { + if (input[4]) >= (0.0581232496) { + var379 = 0.0336130746 + } else { + var379 = -0.0640132129 + } + } else { + if (input[0]) >= (0.0554887205) { + var379 = -0.0967705548 + } else { + var379 = -0.00222649192 + } + } + } + var var380 float64 + if (input[4]) >= (0.0693277344) { + if (input[0]) >= (0.00195488706) { + if (input[0]) >= (0.0127819553) { + var380 = -0.0117792049 + } else { + var380 = 0.0715114623 + } + } else { + if (input[5]) >= (0.0149999997) { + var380 = -0.55547899 + } else { + var380 = 0.251182109 + } + } + } else { + if (input[8]) >= (0.018817205) { + if (input[0]) >= (0.00676691718) { + var380 = 0.0462006852 + } else { + var380 = -0.140044883 + } + } else { + if (input[0]) >= (0.0190977454) { + var380 = -0.188134044 + } else { + var380 = 0.00305217854 + } + } + } + var var381 float64 + if (input[1]) >= (0.0078760162) { + if (input[7]) >= (0.00750862714) { + if (input[7]) >= (0.00776788872) { + var381 = 0.0106730275 + } else { + var381 = 0.143622488 + } + } else { + if (input[7]) >= (0.00633118208) { + var381 = -0.0583225414 + } else { + var381 = 0.00171308103 + } + } + } else { + if (input[0]) >= (0.0981954932) { + if (input[0]) >= (0.13909775) { + var381 = -0.0512938909 + } else { + var381 = -0.258512884 + } + } else { + if (input[6]) >= (0.0428696126) { + var381 = -0.224829867 + } else { + var381 = 0.155539855 + } + } + } + var var382 float64 + if (input[3]) >= (0.0657375231) { + if (input[3]) >= (0.0664856285) { + if (input[1]) >= (0.0947662592) { + var382 = 0.0527851619 + } else { + var382 = -0.042252399 + } + } else { + if (input[6]) >= (0.0209079683) { + var382 = 0.343732774 + } else { + var382 = 0.0853003189 + } + } + } else { + if (input[3]) >= (0.0620315783) { + if (input[8]) >= (0.0525177009) { + var382 = -0.288604587 + } else { + var382 = 0.152235508 + } + } else { + if (input[3]) >= (0.0549747981) { + var382 = 0.107932642 + } else { + var382 = -0.00181106979 + } + } + } + var var383 float64 + if (input[3]) >= (0.00207933597) { + if (input[6]) >= (0.000737574184) { + if (input[4]) >= (0.0203081239) { + var383 = -0.00446364703 + } else { + var383 = 0.016253788 + } + } else { + if (input[6]) >= (0.000587048824) { + var383 = 0.237651348 + } else { + var383 = -0.00987365004 + } + } + } else { + if (input[6]) >= (0.0564771071) { + if (input[9]) >= (0.0316749923) { + var383 = -0.135149971 + } else { + var383 = 0.136942387 + } + } else { + if (input[1]) >= (0.0185467489) { + var383 = 0.0582024045 + } else { + var383 = 0.241506249 + } + } + } + var var384 float64 + if (input[9]) >= (0.0169635899) { + if (input[9]) >= (0.0171079598) { + if (input[1]) >= (0.00533536542) { + var384 = 0.00251786015 + } else { + var384 = 0.136503458 + } + } else { + if (input[3]) >= (0.0169173554) { + var384 = -0.0530295707 + } else { + var384 = 0.390390366 + } + } + } else { + if (input[6]) >= (0.00338681997) { + if (input[6]) >= (0.0655838847) { + var384 = -0.125228494 + } else { + var384 = -0.0153479651 + } + } else { + if (input[9]) >= (0.000534172636) { + var384 = 0.0272525754 + } else { + var384 = 0.418567508 + } + } + } + var var385 float64 + if (input[3]) >= (0.00321381981) { + if (input[3]) >= (0.00322500453) { + if (input[2]) >= (0.00147168105) { + var385 = 0.00105496007 + } else { + var385 = 0.173852414 + } + } else { + var385 = -0.280907452 + } + } else { + if (input[2]) >= (0.0100367013) { + if (input[9]) >= (0.0719978064) { + var385 = -0.0353418142 + } else { + var385 = 0.0989455581 + } + } else { + if (input[9]) >= (0.0785233751) { + var385 = 0.0399525948 + } else { + var385 = -0.0425276048 + } + } + } + var var386 float64 + if (input[8]) >= (0.0135719907) { + if (input[2]) >= (0.00553416926) { + if (input[9]) >= (0.149438396) { + var386 = 0.0530991368 + } else { + var386 = -0.000525882002 + } + } else { + if (input[0]) >= (0.0281203017) { + var386 = -0.0309329368 + } else { + var386 = 0.0606322587 + } + } + } else { + if (input[0]) >= (0.0172932334) { + if (input[9]) >= (0.0954292119) { + var386 = -0.203959614 + } else { + var386 = 0.286654383 + } + } else { + if (input[0]) >= (0.00616541365) { + var386 = -0.0914710164 + } else { + var386 = -0.00254739542 + } + } + } + var var387 float64 + if (input[7]) >= (2.98678988e-05) { + if (input[9]) >= (0.0239222702) { + if (input[7]) >= (0.0258749463) { + var387 = -0.0368935838 + } else { + var387 = -0.00198683422 + } + } else { + if (input[8]) >= (0.00976921059) { + var387 = 0.00790642574 + } else { + var387 = -0.174867645 + } + } + } else { + if (input[8]) >= (0.0243246779) { + var387 = -0.214325771 + } else { + if (input[9]) >= (0.0376519486) { + var387 = 0.041372817 + } else { + var387 = 0.273587435 + } + } + } + var var388 float64 + if (input[7]) >= (0.293373287) { + if (input[9]) >= (0.0153466351) { + var388 = 0.00602999236 + } else { + if (input[8]) >= (0.125819564) { + var388 = -0.315832376 + } else { + var388 = -0.0371238329 + } + } + } else { + if (input[3]) >= (0.00246495381) { + if (input[8]) >= (0.03311041) { + var388 = 0.00275210198 + } else { + var388 = -0.0119292159 + } + } else { + if (input[9]) >= (0.0643028319) { + var388 = -0.0200583674 + } else { + var388 = 0.138075292 + } + } + } + var var389 float64 + if (input[1]) >= (0.108485773) { + if (input[5]) >= (0.0149999997) { + if (input[5]) >= (0.0949999988) { + var389 = 0.000182629999 + } else { + var389 = -0.169213936 + } + } else { + if (input[7]) >= (0.0476691648) { + var389 = 0.214481756 + } else { + var389 = -0.0195852835 + } + } + } else { + if (input[1]) >= (0.0673272386) { + if (input[1]) >= (0.0713922754) { + var389 = 0.0142043158 + } else { + var389 = 0.110468626 + } + } else { + if (input[1]) >= (0.0627540648) { + var389 = -0.0726757273 + } else { + var389 = -0.000587915303 + } + } + } + var var390 float64 + if (input[1]) >= (0.0525914654) { + if (input[3]) >= (0.0107492525) { + if (input[1]) >= (0.061229676) { + var390 = 0.00954389479 + } else { + var390 = -0.0666927621 + } + } else { + if (input[1]) >= (0.061229676) { + var390 = 0.011410322 + } else { + var390 = 0.141680419 + } + } + } else { + if (input[1]) >= (0.0505589433) { + if (input[5]) >= (0.00499999989) { + var390 = 0.0583063141 + } else { + var390 = -0.131954119 + } + } else { + if (input[6]) >= (0.120450377) { + var390 = 0.116027258 + } else { + var390 = -0.00344907562 + } + } + } + var var391 float64 + if (input[9]) >= (0.0266075712) { + if (input[7]) >= (0.173347592) { + if (input[4]) >= (0.112745099) { + var391 = 0.0683095157 + } else { + var391 = 0.32496655 + } + } else { + if (input[9]) >= (0.0266941935) { + var391 = 0.00470174151 + } else { + var391 = 0.187384352 + } + } + } else { + if (input[7]) >= (0.000124957529) { + if (input[8]) >= (0.00911355857) { + var391 = -0.0097337449 + } else { + var391 = -0.235695422 + } + } else { + if (input[7]) >= (0.000105451967) { + var391 = 0.194194183 + } else { + var391 = 0.00837586261 + } + } + } + var var392 float64 + if (input[1]) >= (0.0205792673) { + if (input[4]) >= (0.233193278) { + if (input[2]) >= (0.00714879483) { + var392 = 0.0319337472 + } else { + var392 = -0.135953531 + } + } else { + if (input[4]) >= (0.199579835) { + var392 = -0.0522379056 + } else { + var392 = 0.00771449739 + } + } + } else { + if (input[7]) >= (0.00474879285) { + if (input[9]) >= (0.00417232141) { + var392 = -0.0286123566 + } else { + var392 = 0.133791775 + } + } else { + if (input[7]) >= (0.00452447869) { + var392 = 0.318739235 + } else { + var392 = 0.0167138707 + } + } + } + var var393 float64 + if (input[3]) >= (0.0119765177) { + if (input[3]) >= (0.0120512526) { + if (input[7]) >= (4.49034414e-05) { + var393 = -0.00361608132 + } else { + var393 = -0.240335554 + } + } else { + if (input[1]) >= (0.0490345508) { + var393 = 0.106574021 + } else { + var393 = -0.310080439 + } + } + } else { + if (input[3]) >= (0.0117790066) { + if (input[0]) >= (0.0478195474) { + var393 = 0.196387634 + } else { + var393 = -0.109476805 + } + } else { + if (input[5]) >= (0.00499999989) { + var393 = 0.0333147757 + } else { + var393 = -0.00325993425 + } + } + } + var var394 float64 + if (input[8]) >= (0.0522554405) { + if (input[2]) >= (0.018089205) { + if (input[0]) >= (0.0858646631) { + var394 = -0.0132809207 + } else { + var394 = 0.0535592474 + } + } else { + if (input[1]) >= (0.0429369919) { + var394 = -0.292654604 + } else { + var394 = -0.0370716043 + } + } + } else { + if (input[8]) >= (0.0436008386) { + if (input[7]) >= (0.00600486994) { + var394 = 0.0226851497 + } else { + var394 = 0.134628743 + } + } else { + if (input[8]) >= (0.0434697084) { + var394 = -0.304034293 + } else { + var394 = 0.00283504114 + } + } + } + var var395 float64 + if (input[4]) >= (0.126750708) { + if (input[5]) >= (0.524999976) { + if (input[7]) >= (0.0513835549) { + var395 = -0.327600986 + } else { + var395 = 0.000642183237 + } + } else { + if (input[0]) >= (0.250075191) { + var395 = -0.259777993 + } else { + var395 = 0.0101173911 + } + } + } else { + if (input[2]) >= (0.252100915) { + if (input[1]) >= (0.0660569072) { + var395 = -0.13608624 + } else { + var395 = -0.422872812 + } + } else { + if (input[9]) >= (0.0365691707) { + var395 = -0.0219368767 + } else { + var395 = 0.0143457698 + } + } + } + var var396 float64 + if (input[0]) >= (0.00345864659) { + if (input[0]) >= (0.00646616518) { + if (input[4]) >= (0.0175070036) { + var396 = 0.00122059672 + } else { + var396 = -0.0693136603 + } + } else { + if (input[8]) >= (0.0378311053) { + var396 = -0.366828501 + } else { + var396 = -0.0152960354 + } + } + } else { + if (input[4]) >= (0.0259103645) { + if (input[4]) >= (0.0882352963) { + var396 = -0.0518234223 + } else { + var396 = 0.32437861 + } + } else { + if (input[4]) >= (0.0231092442) { + var396 = -0.198393688 + } else { + var396 = 0.0563943237 + } + } + } + var var397 float64 + if (input[7]) >= (0.129189223) { + if (input[8]) >= (0.0392079726) { + if (input[8]) >= (0.0569761358) { + var397 = 0.0584353954 + } else { + var397 = -0.113235123 + } + } else { + if (input[7]) >= (0.162795082) { + var397 = 0.0402061716 + } else { + var397 = 0.408717424 + } + } + } else { + if (input[2]) >= (0.167903185) { + if (input[4]) >= (0.30392158) { + var397 = 0.0676442683 + } else { + var397 = -0.290525764 + } + } else { + if (input[2]) >= (0.139028907) { + var397 = 0.092793107 + } else { + var397 = -0.00295657828 + } + } + } + var var398 float64 + if (input[3]) >= (0.00321229454) { + if (input[6]) >= (0.17236656) { + if (input[4]) >= (0.230392158) { + var398 = 0.0579715036 + } else { + var398 = -0.377036393 + } + } else { + if (input[3]) >= (0.00322500453) { + var398 = -0.00461096736 + } else { + var398 = -0.197151721 + } + } + } else { + if (input[5]) >= (0.0149999997) { + if (input[4]) >= (0.0315126069) { + var398 = -0.101015195 + } else { + var398 = 0.0594433062 + } + } else { + if (input[4]) >= (0.0245098043) { + var398 = 0.0526369102 + } else { + var398 = -0.0399624929 + } + } + } + var var399 float64 + if (input[0]) >= (0.273834586) { + if (input[6]) >= (0.0181081966) { + var399 = -0.0779463649 + } else { + if (input[6]) >= (0.00356745045) { + var399 = 0.12178003 + } else { + var399 = 0.299270689 + } + } + } else { + if (input[6]) >= (0.00197188184) { + if (input[8]) >= (0.0123918178) { + var399 = -5.07961022e-06 + } else { + var399 = 0.0202378258 + } + } else { + if (input[0]) >= (0.220751882) { + var399 = 0.340895325 + } else { + var399 = -0.0208084285 + } + } + } + var var400 float64 + if (input[2]) >= (0.273227781) { + if (input[8]) >= (0.0691712573) { + if (input[7]) >= (0.227387369) { + var400 = -0.0333318524 + } else { + var400 = 0.179649979 + } + } else { + var400 = 0.328843534 + } + } else { + if (input[7]) >= (1.84896508e-05) { + if (input[2]) >= (0.00104244915) { + var400 = -0.00212030648 + } else { + var400 = -0.0561211258 + } + } else { + if (input[7]) >= (1.60514555e-05) { + var400 = 0.251688004 + } else { + var400 = -0.0353204682 + } + } + } + var var401 float64 + if (input[3]) >= (0.20521751) { + if (input[5]) >= (0.210000008) { + var401 = 0.279753149 + } else { + var401 = 0.0599051528 + } + } else { + if (input[3]) >= (0.0275758598) { + if (input[0]) >= (0.0260150358) { + var401 = -0.0136689916 + } else { + var401 = -0.186359107 + } + } else { + if (input[3]) >= (0.0272733644) { + var401 = 0.16065231 + } else { + var401 = 0.00487277983 + } + } + } + var var402 float64 + if (input[9]) >= (0.144356534) { + if (input[8]) >= (0.0348151065) { + if (input[2]) >= (0.0202744044) { + var402 = -0.323902905 + } else { + var402 = -0.0167714581 + } + } else { + if (input[4]) >= (0.171568632) { + var402 = 0.133033857 + } else { + var402 = -0.0258398447 + } + } + } else { + if (input[9]) >= (0.141440243) { + if (input[1]) >= (0.0459857732) { + var402 = 0.384210557 + } else { + var402 = 0.152407646 + } + } else { + if (input[3]) >= (0.00370594626) { + var402 = 0.00592891313 + } else { + var402 = -0.011945297 + } + } + } + var var403 float64 + if (input[2]) >= (0.0943437442) { + if (input[4]) >= (0.191176474) { + if (input[4]) >= (0.317226887) { + var403 = 0.0119016413 + } else { + var403 = -0.180498123 + } + } else { + if (input[9]) >= (0.00961510651) { + var403 = 0.0610132441 + } else { + var403 = -0.0906068832 + } + } + } else { + if (input[2]) >= (0.0928392336) { + if (input[5]) >= (0.0149999997) { + var403 = 0.396662116 + } else { + var403 = -0.0201099273 + } + } else { + if (input[4]) >= (0.574929953) { + var403 = -0.0904034004 + } else { + var403 = 0.000878079853 + } + } + } + var var404 float64 + if (input[4]) >= (0.0693277344) { + if (input[4]) >= (0.0805322155) { + if (input[0]) >= (0.154736847) { + var404 = -0.0592742749 + } else { + var404 = 0.000843432907 + } + } else { + if (input[5]) >= (0.00999999978) { + var404 = 0.124525718 + } else { + var404 = -0.212948546 + } + } + } else { + if (input[0]) >= (0.0681203008) { + if (input[0]) >= (0.0822556391) { + var404 = -0.023126781 + } else { + var404 = -0.295816243 + } + } else { + if (input[4]) >= (0.0679271743) { + var404 = 0.460309714 + } else { + var404 = 0.0142134875 + } + } + } + var var405 float64 + if (input[2]) >= (0.167666137) { + if (input[1]) >= (0.0160060972) { + if (input[2]) >= (0.170700192) { + var405 = -0.0608127303 + } else { + var405 = -0.285786301 + } + } else { + if (input[4]) >= (0.0497198887) { + var405 = 0.156904176 + } else { + var405 = -0.16906032 + } + } + } else { + if (input[7]) >= (0.159184724) { + var405 = 0.280112118 + } else { + if (input[7]) >= (0.142895952) { + var405 = -0.120487802 + } else { + var405 = 0.00206477987 + } + } + } + var var406 float64 + if (input[3]) >= (0.0656716824) { + if (input[4]) >= (0.157563031) { + if (input[5]) >= (0.405000001) { + var406 = -0.161617219 + } else { + var406 = 0.0967502594 + } + } else { + if (input[5]) >= (0.465000004) { + var406 = 0.245796934 + } else { + var406 = -0.119531386 + } + } + } else { + if (input[5]) >= (0.234999999) { + if (input[4]) >= (0.101540618) { + var406 = 0.126362473 + } else { + var406 = -0.0376993157 + } + } else { + if (input[9]) >= (0.00483642798) { + var406 = -0.0010997951 + } else { + var406 = -0.0412035249 + } + } + } + var var407 float64 + if (input[3]) >= (0.016347954) { + if (input[3]) >= (0.0167877153) { + if (input[7]) >= (0.000686758489) { + var407 = 0.00401364034 + } else { + var407 = 0.0466557033 + } + } else { + if (input[0]) >= (0.13203007) { + var407 = 0.619295776 + } else { + var407 = 0.0936494991 + } + } + } else { + if (input[3]) >= (0.014527645) { + if (input[3]) >= (0.0146016162) { + var407 = -0.0447811969 + } else { + var407 = -0.350080818 + } + } else { + if (input[0]) >= (0.136390984) { + var407 = 0.0332939923 + } else { + var407 = -0.00566680543 + } + } + } + var var408 float64 + if (input[6]) >= (0.0175964125) { + if (input[1]) >= (0.0302337408) { + if (input[9]) >= (0.0237490255) { + var408 = 0.0551197268 + } else { + var408 = -0.007971121 + } + } else { + if (input[3]) >= (0.0242090151) { + var408 = 0.153075933 + } else { + var408 = -0.0248793308 + } + } + } else { + if (input[1]) >= (0.014989838) { + if (input[3]) >= (0.0457431078) { + var408 = -0.0553948395 + } else { + var408 = -0.00777787995 + } + } else { + if (input[9]) >= (0.0315450579) { + var408 = -0.0499479771 + } else { + var408 = 0.0595041253 + } + } + } + var var409 float64 + if (input[7]) >= (0.00790544413) { + if (input[2]) >= (0.0111818537) { + if (input[7]) >= (0.00814540312) { + var409 = 0.00168789551 + } else { + var409 = 0.164706916 + } + } else { + if (input[2]) >= (0.0101025673) { + var409 = 0.236226112 + } else { + var409 = 0.0075898678 + } + } + } else { + if (input[8]) >= (0.0685156062) { + if (input[9]) >= (0.0180896837) { + var409 = 0.121917062 + } else { + var409 = -0.0101374174 + } + } else { + if (input[8]) >= (0.0623524785) { + var409 = -0.12535505 + } else { + var409 = -0.0115151964 + } + } + } + var var410 float64 + if (input[9]) >= (0.00402795058) { + if (input[9]) >= (0.00446106307) { + if (input[9]) >= (0.00512516964) { + var410 = -0.00194008346 + } else { + var410 = 0.0816422999 + } + } else { + if (input[8]) >= (0.171256229) { + var410 = 0.201432705 + } else { + var410 = -0.164862335 + } + } + } else { + if (input[0]) >= (0.206466168) { + if (input[7]) >= (0.00165106496) { + var410 = -0.267043561 + } else { + var410 = 0.0122480756 + } + } else { + if (input[8]) >= (0.0169813801) { + var410 = 0.0439045727 + } else { + var410 = -0.112719052 + } + } + } + var var411 float64 + if (input[8]) >= (0.191909254) { + if (input[2]) >= (0.148467213) { + if (input[1]) >= (0.113821141) { + var411 = -0.140394449 + } else { + var411 = 0.102789991 + } + } else { + if (input[0]) >= (0.180300742) { + var411 = 0.0214459449 + } else { + var411 = -0.181980222 + } + } + } else { + if (input[5]) >= (0.275000006) { + if (input[8]) >= (0.0742853433) { + var411 = 0.101861015 + } else { + var411 = -0.0420491248 + } + } else { + if (input[5]) >= (0.145000011) { + var411 = -0.0368860662 + } else { + var411 = 0.00124553265 + } + } + } + var var412 float64 + if (input[0]) >= (0.00135338353) { + if (input[0]) >= (0.00526315812) { + if (input[8]) >= (0.0119984262) { + var412 = -0.00250296853 + } else { + var412 = 0.0464082472 + } + } else { + if (input[6]) >= (0.00278471876) { + var412 = -0.0464743823 + } else { + var412 = 0.0484088585 + } + } + } else { + if (input[8]) >= (0.00832677633) { + if (input[8]) >= (0.00911355857) { + var412 = 0.136754066 + } else { + var412 = -0.205474183 + } + } else { + if (input[0]) >= (0.000751879707) { + var412 = 0.274985403 + } else { + var412 = 0.0509285852 + } + } + } + var var413 float64 + if (input[6]) >= (0.002935244) { + if (input[7]) >= (0.00127355102) { + if (input[7]) >= (0.00129122788) { + var413 = 0.00193174963 + } else { + var413 = 0.192074195 + } + } else { + if (input[8]) >= (0.0670731738) { + var413 = 0.0472343899 + } else { + var413 = -0.0305471681 + } + } + } else { + if (input[3]) >= (0.00274609635) { + if (input[3]) >= (0.00301910448) { + var413 = 0.0136935115 + } else { + var413 = 0.113360442 + } + } else { + if (input[0]) >= (0.00616541365) { + var413 = -0.125561789 + } else { + var413 = 0.0688862205 + } + } + } + var var414 float64 + if (input[2]) >= (0.0315803811) { + if (input[9]) >= (0.149972558) { + if (input[2]) >= (0.0333519652) { + var414 = 0.0557805188 + } else { + var414 = 0.506626248 + } + } else { + if (input[4]) >= (0.0301120449) { + var414 = 0.0113321673 + } else { + var414 = 0.107743874 + } + } + } else { + if (input[2]) >= (0.0314556584) { + if (input[3]) >= (0.0124516133) { + var414 = -0.0386910364 + } else { + var414 = -0.356502056 + } + } else { + if (input[6]) >= (0.00799289532) { + var414 = 0.00980739854 + } else { + var414 = -0.0106120082 + } + } + } + var var415 float64 + if (input[8]) >= (0.183385789) { + if (input[1]) >= (0.122459352) { + var415 = -0.168610051 + } else { + if (input[3]) >= (0.00853264984) { + var415 = 0.0977729857 + } else { + var415 = -0.136858776 + } + } + } else { + if (input[8]) >= (0.179845273) { + var415 = -0.239372015 + } else { + if (input[1]) >= (0.17454268) { + var415 = 0.0621304773 + } else { + var415 = -0.00110592425 + } + } + } + var var416 float64 + if (input[0]) >= (0.0512781963) { + if (input[8]) >= (0.0298321526) { + if (input[0]) >= (0.0530827045) { + var416 = -0.0119904112 + } else { + var416 = -0.115730427 + } + } else { + if (input[5]) >= (0.00999999978) { + var416 = -0.22598508 + } else { + var416 = 0.0896761119 + } + } + } else { + if (input[8]) >= (0.0297010224) { + if (input[6]) >= (0.0514947176) { + var416 = -0.15410389 + } else { + var416 = 0.0596315935 + } + } else { + if (input[0]) >= (0.041052632) { + var416 = -0.147164002 + } else { + var416 = 0.00316898478 + } + } + } + var var417 float64 + if (input[0]) >= (0.00315789459) { + if (input[4]) >= (0.0147058824) { + if (input[4]) >= (0.0189075638) { + var417 = -0.00414172746 + } else { + var417 = -0.115214571 + } + } else { + if (input[0]) >= (0.00947368424) { + var417 = -0.0529317074 + } else { + var417 = 0.0943100676 + } + } + } else { + if (input[4]) >= (0.0231092442) { + if (input[4]) >= (0.0259103645) { + var417 = 0.0917572752 + } else { + var417 = -0.303095996 + } + } else { + if (input[4]) >= (0.0147058824) { + var417 = 0.134773836 + } else { + var417 = -0.037174467 + } + } + } + var var418 float64 + if (input[9]) >= (0.0427193716) { + if (input[0]) >= (0.123458646) { + if (input[7]) >= (0.00426013768) { + var418 = -0.307036281 + } else { + var418 = 0.23737517 + } + } else { + if (input[8]) >= (0.0719249919) { + var418 = 0.165833026 + } else { + var418 = -0.00563522894 + } + } + } else { + if (input[9]) >= (0.0421130136) { + if (input[7]) >= (0.00456836633) { + var418 = -0.00188457337 + } else { + var418 = 0.341264218 + } + } else { + if (input[8]) >= (0.0175059009) { + var418 = 0.0054735709 + } else { + var418 = 0.0510887578 + } + } + } + var var419 float64 + if (input[1]) >= (0.0292174798) { + if (input[1]) >= (0.0327743888) { + if (input[7]) >= (0.0148419077) { + var419 = 0.025207229 + } else { + var419 = -0.0126484605 + } + } else { + if (input[5]) >= (0.0350000001) { + var419 = -0.128328413 + } else { + var419 = -0.0199847575 + } + } + } else { + if (input[7]) >= (0.0119617889) { + if (input[7]) >= (0.0124498345) { + var419 = -0.00751158688 + } else { + var419 = -0.208496705 + } + } else { + if (input[7]) >= (0.0118295159) { + var419 = 0.50629586 + } else { + var419 = 0.0197989922 + } + } + } + var var420 float64 + if (input[4]) >= (0.55532217) { + if (input[4]) >= (0.558123231) { + if (input[2]) >= (0.0402637199) { + var420 = -0.0882651061 + } else { + var420 = 0.0644690543 + } + } else { + if (input[3]) >= (0.0062601231) { + var420 = -0.360522836 + } else { + var420 = 0.0276708435 + } + } + } else { + if (input[4]) >= (0.479691863) { + if (input[5]) >= (0.0549999997) { + var420 = -0.106024794 + } else { + var420 = 0.199260637 + } + } else { + if (input[4]) >= (0.402661085) { + var420 = -0.0369264632 + } else { + var420 = 0.00517499167 + } + } + } + var var421 float64 + if (input[5]) >= (0.00499999989) { + if (input[0]) >= (0.0233082697) { + if (input[3]) >= (0.00342200743) { + var421 = 0.0124670956 + } else { + var421 = -0.145472005 + } + } else { + if (input[0]) >= (0.0169924796) { + var421 = 0.22890909 + } else { + var421 = 0.0315005332 + } + } + } else { + if (input[0]) >= (0.044661656) { + if (input[0]) >= (0.0491729304) { + var421 = -0.0041286191 + } else { + var421 = 0.160058975 + } + } else { + if (input[1]) >= (0.00940040685) { + var421 = -0.0124826981 + } else { + var421 = -0.458736658 + } + } + } + var var422 float64 + if (input[4]) >= (0.160364151) { + if (input[4]) >= (0.164565831) { + if (input[8]) >= (0.0515997894) { + var422 = -0.0293002259 + } else { + var422 = 0.0114424461 + } + } else { + if (input[0]) >= (0.0512781963) { + var422 = 0.108559296 + } else { + var422 = -0.29985711 + } + } + } else { + if (input[0]) >= (0.0485714301) { + if (input[0]) >= (0.0548872203) { + var422 = 0.00925870147 + } else { + var422 = 0.131680846 + } + } else { + if (input[0]) >= (0.039849624) { + var422 = -0.14427191 + } else { + var422 = 0.000974033843 + } + } + } + var var423 float64 + if (input[6]) >= (0.0556793213) { + if (input[8]) >= (0.0161945969) { + if (input[0]) >= (0.0187969916) { + var423 = 0.0498813055 + } else { + var423 = -0.148272395 + } + } else { + if (input[4]) >= (0.0119047621) { + var423 = 0.201886609 + } else { + var423 = -0.0987117589 + } + } + } else { + if (input[6]) >= (0.0548062734) { + if (input[9]) >= (0.0270118099) { + var423 = -0.374316126 + } else { + var423 = -0.0591321886 + } + } else { + if (input[4]) >= (0.418067217) { + var423 = -0.0309742521 + } else { + var423 = 0.00146370055 + } + } + } + var var424 float64 + if (input[1]) >= (0.0439532511) { + if (input[0]) >= (0.123458646) { + if (input[1]) >= (0.0536077246) { + var424 = 0.00136506686 + } else { + var424 = 0.248087496 + } + } else { + if (input[0]) >= (0.104210526) { + var424 = -0.0964851677 + } else { + var424 = -0.00856979378 + } + } + } else { + if (input[0]) >= (0.123759396) { + if (input[7]) >= (0.0177632719) { + var424 = 0.0167516824 + } else { + var424 = -0.0617834516 + } + } else { + if (input[4]) >= (0.376050413) { + var424 = 0.110599428 + } else { + var424 = 0.00720992824 + } + } + } + var var425 float64 + if (input[9]) >= (0.161940932) { + if (input[2]) >= (0.00256037666) { + if (input[7]) >= (0.00327591924) { + var425 = -0.010956673 + } else { + var425 = -0.117065154 + } + } else { + if (input[0]) >= (0.00676691718) { + var425 = -0.305903941 + } else { + var425 = 0.0682530031 + } + } + } else { + if (input[8]) >= (0.00924468972) { + if (input[8]) >= (0.00976921059) { + var425 = 0.00151305564 + } else { + var425 = -0.0686812848 + } + } else { + if (input[3]) >= (0.00905400887) { + var425 = -0.153720409 + } else { + var425 = 0.126880303 + } + } + } + var var426 float64 + if (input[7]) >= (0.00519152824) { + if (input[0]) >= (0.0163909774) { + if (input[0]) >= (0.0172932334) { + var426 = -0.00730140693 + } else { + var426 = 0.164195508 + } + } else { + if (input[8]) >= (0.0161945969) { + var426 = -0.0871939808 + } else { + var426 = 0.0202718899 + } + } + } else { + if (input[7]) >= (0.00499931723) { + if (input[8]) >= (0.0185549445) { + var426 = 0.2350768 + } else { + var426 = -0.134573191 + } + } else { + if (input[1]) >= (0.063770324) { + var426 = 0.0360491201 + } else { + var426 = -0.00156288443 + } + } + } + var var427 float64 + if (input[4]) >= (0.0889355764) { + if (input[4]) >= (0.0903361365) { + if (input[8]) >= (0.0295698922) { + var427 = 0.00436464883 + } else { + var427 = -0.0307932142 + } + } else { + if (input[1]) >= (0.014989838) { + var427 = -0.402985305 + } else { + var427 = -0.0437235683 + } + } + } else { + if (input[4]) >= (0.0861344561) { + if (input[9]) >= (0.0464008301) { + var427 = 0.372864246 + } else { + var427 = 0.0678508952 + } + } else { + if (input[0]) >= (0.151127815) { + var427 = 0.0780657083 + } else { + var427 = -0.00160973414 + } + } + } + var var428 float64 + if (input[4]) >= (0.0693277344) { + if (input[4]) >= (0.0805322155) { + if (input[4]) >= (0.0833333358) { + var428 = -0.0100670066 + } else { + var428 = 0.0993472934 + } + } else { + if (input[1]) >= (0.0124491863) { + var428 = -0.0263861138 + } else { + var428 = -0.316342205 + } + } + } else { + if (input[6]) >= (0.00796278939) { + if (input[6]) >= (0.00850468129) { + var428 = 0.0176494904 + } else { + var428 = 0.178722695 + } + } else { + if (input[7]) >= (0.00151513552) { + var428 = -0.0334065482 + } else { + var428 = 0.0218246505 + } + } + } + var var429 float64 + if (input[6]) >= (0.275927991) { + var429 = 0.247589931 + } else { + if (input[6]) >= (0.172968656) { + if (input[1]) >= (0.0335365832) { + var429 = -0.281820655 + } else { + var429 = 0.0134199327 + } + } else { + if (input[6]) >= (0.0142848548) { + var429 = 0.0110962335 + } else { + var429 = -0.00308751245 + } + } + } + var var430 float64 + if (input[4]) >= (0.0343137272) { + if (input[4]) >= (0.0385154076) { + if (input[4]) >= (0.0399159677) { + var430 = 0.00272857421 + } else { + var430 = -0.200659484 + } + } else { + if (input[1]) >= (0.0353150405) { + var430 = 0.170455903 + } else { + var430 = -0.00654704077 + } + } + } else { + if (input[6]) >= (0.0702050179) { + if (input[7]) >= (0.00936917402) { + var430 = -0.0650578961 + } else { + var430 = 0.20506376 + } + } else { + if (input[1]) >= (0.0160060972) { + var430 = -0.0251032878 + } else { + var430 = 0.0655686855 + } + } + } + var var431 float64 + if (input[4]) >= (0.0119047621) { + if (input[6]) >= (0.0216304902) { + if (input[5]) >= (0.0249999985) { + var431 = 0.025064623 + } else { + var431 = -0.0210079737 + } + } else { + if (input[6]) >= (0.0175964125) { + var431 = 0.0397852175 + } else { + var431 = 0.00600932958 + } + } + } else { + if (input[7]) >= (0.0017103944) { + if (input[5]) >= (0.0350000001) { + var431 = -0.068045266 + } else { + var431 = -0.352834195 + } + } else { + if (input[0]) >= (0.0127819553) { + var431 = 0.394647837 + } else { + var431 = 0.0300207641 + } + } + } + var var432 float64 + if (input[9]) >= (0.2289868) { + if (input[8]) >= (0.0257671122) { + if (input[3]) >= (0.00485186931) { + var432 = -0.504715562 + } else { + var432 = 0.0933317393 + } + } else { + if (input[2]) >= (0.0103892554) { + var432 = 0.15271461 + } else { + var432 = 0.0177345928 + } + } + } else { + if (input[9]) >= (0.225868389) { + var432 = -0.290398747 + } else { + if (input[5]) >= (0.125) { + var432 = 0.02047248 + } else { + var432 = -0.0048086429 + } + } + } + var var433 float64 + if (input[8]) >= (0.00753999501) { + if (input[3]) >= (0.183460474) { + if (input[3]) >= (0.228100881) { + var433 = 0.0327125192 + } else { + var433 = -0.267993271 + } + } else { + if (input[3]) >= (0.161752015) { + var433 = 0.134741142 + } else { + var433 = 0.000104188926 + } + } + } else { + if (input[7]) >= (0.0105634835) { + var433 = -0.372614086 + } else { + if (input[2]) >= (0.00426329067) { + var433 = 0.0293813627 + } else { + var433 = -0.258490294 + } + } + } + var var434 float64 + if (input[8]) >= (0.00753999501) { + if (input[8]) >= (0.00806451589) { + if (input[4]) >= (0.0119047621) { + var434 = -9.6098549e-05 + } else { + var434 = -0.0371252485 + } + } else { + if (input[4]) >= (0.0259103645) { + var434 = 0.225327268 + } else { + var434 = 0.0469428711 + } + } + } else { + if (input[7]) >= (0.000343988766) { + if (input[0]) >= (0.00616541365) { + var434 = -0.273736447 + } else { + var434 = 0.10790582 + } + } else { + var434 = 0.166883066 + } + } + var var435 float64 + if (input[9]) >= (0.00243986957) { + if (input[9]) >= (0.00252649211) { + if (input[9]) >= (0.0026997372) { + var435 = 0.00020764675 + } else { + var435 = -0.162243411 + } + } else { + if (input[3]) >= (0.0203497857) { + var435 = 0.330074042 + } else { + var435 = 0.0558387712 + } + } + } else { + if (input[0]) >= (0.206766903) { + var435 = -0.273840189 + } else { + if (input[0]) >= (0.174736843) { + var435 = 0.151861653 + } else { + var435 = -0.0407631733 + } + } + } + var var436 float64 + if (input[1]) >= (0.0358231701) { + if (input[0]) >= (0.0524812043) { + if (input[9]) >= (0.125674933) { + var436 = -0.243252516 + } else { + var436 = 0.0147840539 + } + } else { + if (input[0]) >= (0.0512781963) { + var436 = -0.21037215 + } else { + var436 = -0.0135984747 + } + } + } else { + if (input[6]) >= (0.011936659) { + if (input[1]) >= (0.0353150405) { + var436 = 0.157645792 + } else { + var436 = -0.0149474023 + } + } else { + if (input[6]) >= (0.00913688727) { + var436 = 0.0795305073 + } else { + var436 = 0.0127385771 + } + } + } + var var437 float64 + if (input[4]) >= (0.0287114847) { + if (input[0]) >= (0.00375939859) { + if (input[0]) >= (0.00586466165) { + var437 = 0.00157997385 + } else { + var437 = -0.127578139 + } + } else { + if (input[4]) >= (0.0882352963) { + var437 = -0.0978552252 + } else { + var437 = 0.38709861 + } + } + } else { + if (input[4]) >= (0.0273109246) { + if (input[0]) >= (0.00451127812) { + var437 = 0.326018304 + } else { + var437 = -0.334716201 + } + } else { + if (input[1]) >= (0.0241361782) { + var437 = 0.023557866 + } else { + var437 = -0.0612297095 + } + } + } + var var438 float64 + if (input[2]) >= (0.00225827284) { + if (input[4]) >= (0.021708684) { + if (input[5]) >= (0.314999998) { + var438 = -0.0761498809 + } else { + var438 = 0.00236380403 + } + } else { + if (input[1]) >= (0.00889227632) { + var438 = 0.0363603905 + } else { + var438 = -0.250767231 + } + } + } else { + if (input[2]) >= (0.00205506827) { + if (input[8]) >= (0.0119984262) { + var438 = -0.217709675 + } else { + var438 = -0.0334072374 + } + } else { + if (input[9]) >= (0.00571709033) { + var438 = -0.0240999404 + } else { + var438 = 0.157744467 + } + } + } + var var439 float64 + if (input[0]) >= (0.16195488) { + if (input[8]) >= (0.0477970093) { + if (input[9]) >= (0.00781046972) { + var439 = -0.0932577923 + } else { + var439 = 0.0487766936 + } + } else { + if (input[8]) >= (0.0458300561) { + var439 = 0.333604336 + } else { + var439 = 0.00318130595 + } + } + } else { + if (input[0]) >= (0.127969921) { + if (input[0]) >= (0.128270686) { + var439 = 0.0220403224 + } else { + var439 = 0.290054977 + } + } else { + if (input[0]) >= (0.125864655) { + var439 = -0.0768578202 + } else { + var439 = 0.00406166632 + } + } + } + var var440 float64 + if (input[9]) >= (0.118283138) { + if (input[1]) >= (0.0226117894) { + if (input[4]) >= (0.25420171) { + var440 = -0.197089627 + } else { + var440 = 0.017771665 + } + } else { + if (input[4]) >= (0.042717088) { + var440 = 0.296258479 + } else { + var440 = -0.0524784289 + } + } + } else { + if (input[9]) >= (0.116781682) { + if (input[9]) >= (0.117619038) { + var440 = -0.0717417747 + } else { + var440 = -0.363453001 + } + } else { + if (input[7]) >= (1.93023843e-05) { + var440 = -0.00359910214 + } else { + var440 = -0.228088677 + } + } + } + var var441 float64 + if (input[0]) >= (0.0545864664) { + if (input[8]) >= (0.0344217159) { + if (input[3]) >= (0.00312002096) { + var441 = 0.00419211807 + } else { + var441 = -0.120948732 + } + } else { + if (input[0]) >= (0.0587969944) { + var441 = -0.0102117332 + } else { + var441 = -0.246526197 + } + } + } else { + if (input[5]) >= (0.105000004) { + if (input[8]) >= (0.0247180704) { + var441 = 0.0346780978 + } else { + var441 = 0.317534089 + } + } else { + if (input[8]) >= (0.0209152903) { + var441 = 0.0194221828 + } else { + var441 = -0.0131451506 + } + } + } + var var442 float64 + if (input[6]) >= (0.241909266) { + var442 = 0.227395013 + } else { + if (input[6]) >= (0.00152030587) { + if (input[6]) >= (0.00161062111) { + var442 = -0.00554118212 + } else { + var442 = -0.0542112365 + } + } else { + if (input[9]) >= (0.072517544) { + var442 = -0.0702069774 + } else { + var442 = 0.080707714 + } + } + } + var var443 float64 + if (input[0]) >= (0.0100751882) { + if (input[0]) >= (0.0112781953) { + if (input[7]) >= (0.00790849142) { + var443 = 0.00834517088 + } else { + var443 = -0.0135246096 + } + } else { + if (input[2]) >= (0.00520884246) { + var443 = -0.208380058 + } else { + var443 = 0.0684268177 + } + } + } else { + if (input[8]) >= (0.0429451875) { + var443 = 0.271143168 + } else { + if (input[8]) >= (0.0401914492) { + var443 = -0.356711149 + } else { + var443 = 0.019864222 + } + } + } + var var444 float64 + if (input[2]) >= (0.0171488579) { + if (input[8]) >= (0.0144899031) { + if (input[2]) >= (0.017772086) { + var444 = -0.0068546664 + } else { + var444 = -0.0928524584 + } + } else { + if (input[0]) >= (0.0245112777) { + var444 = 0.48992312 + } else { + var444 = 0.0116071049 + } + } + } else { + if (input[6]) >= (0.183791429) { + var444 = 0.405122399 + } else { + if (input[2]) >= (0.0162097141) { + var444 = 0.0613664724 + } else { + var444 = 0.00370050361 + } + } + } + var var445 float64 + if (input[6]) >= (0.281166255) { + var445 = -0.226430088 + } else { + if (input[6]) >= (0.00320618972) { + if (input[6]) >= (0.00329650473) { + var445 = -0.00102043897 + } else { + var445 = -0.149221435 + } + } else { + if (input[9]) >= (0.0018912598) { + var445 = 0.00867262017 + } else { + var445 = 0.202580944 + } + } + } + var var446 float64 + if (input[7]) >= (0.0236685835) { + if (input[8]) >= (0.030750066) { + if (input[2]) >= (0.0385730192) { + var446 = 0.00751217548 + } else { + var446 = -0.0483153537 + } + } else { + if (input[8]) >= (0.0255048517) { + var446 = 0.222317517 + } else { + var446 = 0.0336886533 + } + } + } else { + if (input[2]) >= (0.0386052504) { + if (input[8]) >= (0.0344217159) { + var446 = -0.0431125201 + } else { + var446 = -0.307366401 + } + } else { + if (input[2]) >= (0.0364530869) { + var446 = 0.125611603 + } else { + var446 = -0.00196419773 + } + } + } + var var447 float64 + if (input[7]) >= (0.000281814777) { + if (input[9]) >= (0.000880662934) { + if (input[9]) >= (0.000996159739) { + var447 = 0.00166917895 + } else { + var447 = -0.241016448 + } + } else { + if (input[7]) >= (0.000507957477) { + var447 = 0.0768407211 + } else { + var447 = 0.298983246 + } + } + } else { + if (input[9]) >= (0.0932203382) { + if (input[7]) >= (0.000103013772) { + var447 = -0.140020221 + } else { + var447 = 0.00311265513 + } + } else { + if (input[9]) >= (0.0909970254) { + var447 = 0.432653636 + } else { + var447 = -0.00968709309 + } + } + } + var var448 float64 + if (input[2]) >= (0.0204413719) { + if (input[3]) >= (0.00256942911) { + if (input[3]) >= (0.00412079692) { + var448 = -0.00569260772 + } else { + var448 = -0.0568276234 + } + } else { + if (input[1]) >= (0.0190548785) { + var448 = -0.116745241 + } else { + var448 = 0.276661366 + } + } + } else { + if (input[2]) >= (0.0203192495) { + if (input[9]) >= (0.04621315) { + var448 = -0.0684825182 + } else { + var448 = 0.375986665 + } + } else { + if (input[2]) >= (0.0201640949) { + var448 = -0.185443774 + } else { + var448 = 0.00436164718 + } + } + } + var var449 float64 + if (input[4]) >= (0.430672288) { + if (input[6]) >= (0.00736068888) { + if (input[8]) >= (0.147324935) { + var449 = 0.104897767 + } else { + var449 = -0.10912618 + } + } else { + if (input[6]) >= (0.00504259858) { + var449 = 0.166976511 + } else { + var449 = -0.0210390761 + } + } + } else { + if (input[4]) >= (0.429271698) { + if (input[6]) >= (0.0102808811) { + var449 = 0.262316912 + } else { + var449 = 0.0734885484 + } + } else { + if (input[6]) >= (0.206219703) { + var449 = -0.25067085 + } else { + var449 = 0.00148534204 + } + } + } + var var450 float64 + if (input[1]) >= (0.0114329271) { + if (input[6]) >= (0.0281331837) { + if (input[3]) >= (0.00914526545) { + var450 = 0.0113619203 + } else { + var450 = -0.0512499399 + } + } else { + if (input[6]) >= (0.0267182477) { + var450 = 0.0806003362 + } else { + var450 = 0.00265205884 + } + } + } else { + if (input[5]) >= (0.175000012) { + if (input[5]) >= (0.215000004) { + var450 = 0.0239382256 + } else { + var450 = -0.369645 + } + } else { + if (input[0]) >= (0.143308282) { + var450 = 0.127770543 + } else { + var450 = 0.00618122984 + } + } + } + var var451 float64 + if (input[6]) >= (0.0305114854) { + if (input[6]) >= (0.0310232714) { + if (input[4]) >= (0.0721288547) { + var451 = -0.00637228973 + } else { + var451 = 0.0565072559 + } + } else { + if (input[3]) >= (0.00593246287) { + var451 = 0.100131668 + } else { + var451 = 0.599393249 + } + } + } else { + if (input[6]) >= (0.0302405395) { + if (input[0]) >= (0.0377443582) { + var451 = -0.436773986 + } else { + var451 = -0.0386145785 + } + } else { + if (input[6]) >= (0.0300298035) { + var451 = 0.220320538 + } else { + var451 = -0.00299347029 + } + } + } + var var452 float64 + if (input[9]) >= (0.12326394) { + if (input[9]) >= (0.124404475) { + if (input[8]) >= (0.0167191196) { + var452 = 0.0607315935 + } else { + var452 = -0.00968139339 + } + } else { + if (input[1]) >= (0.0419207327) { + var452 = 0.560121119 + } else { + var452 = -0.0127385352 + } + } + } else { + if (input[9]) >= (0.118918374) { + if (input[3]) >= (0.00326898089) { + var452 = -0.20992811 + } else { + var452 = 0.130762294 + } + } else { + if (input[9]) >= (0.118254267) { + var452 = 0.280099571 + } else { + var452 = 0.000291149336 + } + } + } + var var453 float64 + if (input[6]) >= (0.0506216697) { + if (input[4]) >= (0.0245098043) { + if (input[0]) >= (0.039849624) { + var453 = 0.0534924045 + } else { + var453 = -0.0495258756 + } + } else { + if (input[1]) >= (0.0434451215) { + var453 = 0.312670469 + } else { + var453 = 0.0577085465 + } + } + } else { + if (input[6]) >= (0.0452930704) { + if (input[1]) >= (0.0165142268) { + var453 = -0.114393562 + } else { + var453 = 0.164953575 + } + } else { + if (input[6]) >= (0.0446909741) { + var453 = 0.17468226 + } else { + var453 = -0.00570970355 + } + } + } + var var454 float64 + if (input[9]) >= (0.0169635899) { + if (input[8]) >= (0.127261996) { + if (input[7]) >= (0.0246412195) { + var454 = 0.0173132271 + } else { + var454 = 0.26751402 + } + } else { + if (input[9]) >= (0.0170502122) { + var454 = 0.000714324124 + } else { + var454 = 0.233119145 + } + } + } else { + if (input[8]) >= (0.0255048517) { + if (input[2]) >= (0.0058588963) { + var454 = -0.0115113901 + } else { + var454 = 0.149955913 + } + } else { + if (input[7]) >= (0.000339518767) { + var454 = -0.11513558 + } else { + var454 = 0.0304798558 + } + } + } + var var455 float64 + if (input[6]) >= (0.00967877917) { + if (input[7]) >= (0.305889964) { + var455 = 0.224451512 + } else { + if (input[8]) >= (0.0648439527) { + var455 = -0.0292856414 + } else { + var455 = -0.00217652204 + } + } + } else { + if (input[7]) >= (0.000293193036) { + if (input[7]) >= (0.000314730452) { + var455 = 0.0126407184 + } else { + var455 = 0.178566426 + } + } else { + if (input[5]) >= (0.0249999985) { + var455 = -0.121024691 + } else { + var455 = -0.0152886184 + } + } + } + var var456 float64 + if (input[1]) >= (0.0266768299) { + if (input[1]) >= (0.0292174798) { + if (input[0]) >= (0.0485714301) { + var456 = 0.0155858276 + } else { + var456 = -0.00803255104 + } + } else { + if (input[6]) >= (0.00272450852) { + var456 = 0.0225911327 + } else { + var456 = 0.172292203 + } + } + } else { + if (input[0]) >= (0.00526315812) { + if (input[8]) >= (0.0155389458) { + var456 = -0.00825168565 + } else { + var456 = -0.139609292 + } + } else { + if (input[6]) >= (0.00212240731) { + var456 = 0.189618617 + } else { + var456 = -0.129950717 + } + } + } + var var457 float64 + if (input[7]) >= (0.0373119116) { + if (input[7]) >= (0.0375569537) { + if (input[0]) >= (0.17488721) { + var457 = -0.104299583 + } else { + var457 = -0.00133823464 + } + } else { + if (input[2]) >= (0.0520391725) { + var457 = -0.138837144 + } else { + var457 = -0.488717318 + } + } + } else { + if (input[7]) >= (0.0324190632) { + if (input[1]) >= (0.0505589433) { + var457 = -0.0948911235 + } else { + var457 = 0.105591632 + } + } else { + if (input[7]) >= (0.0289562158) { + var457 = -0.0534072779 + } else { + var457 = 0.00414584251 + } + } + } + var var458 float64 + if (input[0]) >= (0.0145864664) { + if (input[8]) >= (0.0185549445) { + if (input[4]) >= (0.032913167) { + var458 = -0.00403854437 + } else { + var458 = 0.0662125275 + } + } else { + if (input[7]) >= (0.00813117996) { + var458 = 0.0394047946 + } else { + var458 = -0.118966401 + } + } + } else { + if (input[4]) >= (0.0357142873) { + if (input[1]) >= (0.0922256112) { + var458 = -0.124854438 + } else { + var458 = 0.0843159482 + } + } else { + if (input[0]) >= (0.00977443624) { + var458 = -0.225659668 + } else { + var458 = 0.00616453588 + } + } + } + var var459 float64 + if (input[4]) >= (0.188375354) { + if (input[0]) >= (0.0317293257) { + if (input[5]) >= (0.00999999978) { + var459 = -0.0361337811 + } else { + var459 = 0.0220705159 + } + } else { + if (input[1]) >= (0.023119919) { + var459 = 0.0203009974 + } else { + var459 = 0.309823543 + } + } + } else { + if (input[4]) >= (0.186974794) { + if (input[0]) >= (0.0285714287) { + var459 = -0.159044936 + } else { + var459 = -0.779089928 + } + } else { + if (input[5]) >= (0.00499999989) { + var459 = 0.0221779849 + } else { + var459 = -0.0116271162 + } + } + } + var var460 float64 + if (input[3]) >= (0.0421983227) { + if (input[2]) >= (0.0735386088) { + if (input[2]) >= (0.0853018463) { + var460 = 0.0301501472 + } else { + var460 = -0.15825361 + } + } else { + if (input[9]) >= (0.000591921038) { + var460 = 0.0990440622 + } else { + var460 = -0.273701251 + } + } + } else { + if (input[3]) >= (0.04151351) { + var460 = -0.251160383 + } else { + if (input[5]) >= (0.435000002) { + var460 = -0.0932336897 + } else { + var460 = 0.00417929096 + } + } + } + var var461 float64 + if (input[1]) >= (0.187245935) { + if (input[1]) >= (0.19385162) { + if (input[1]) >= (0.202489838) { + var461 = 0.0845308378 + } else { + var461 = -0.126945153 + } + } else { + if (input[9]) >= (0.00983166322) { + var461 = 0.33401075 + } else { + var461 = 0.0425357409 + } + } + } else { + if (input[9]) >= (0.000187682264) { + if (input[1]) >= (0.158282518) { + var461 = -0.0888675228 + } else { + var461 = -0.00481701503 + } + } else { + var461 = 0.236847982 + } + } + var var462 float64 + if (input[9]) >= (0.00893656351) { + if (input[9]) >= (0.010351399) { + if (input[9]) >= (0.010466896) { + var462 = -0.000321168103 + } else { + var462 = 0.165368989 + } + } else { + if (input[9]) >= (0.0100049088) { + var462 = -0.197088018 + } else { + var462 = -0.00759536587 + } + } + } else { + if (input[1]) >= (0.0973069072) { + if (input[1]) >= (0.108993903) { + var462 = 0.0413332619 + } else { + var462 = 0.171830878 + } + } else { + if (input[1]) >= (0.0276930891) { + var462 = -0.0100546936 + } else { + var462 = 0.0593817011 + } + } + } + var var463 float64 + if (input[6]) >= (0.103817321) { + if (input[0]) >= (0.0264661647) { + if (input[0]) >= (0.0542857125) { + var463 = -0.0905853286 + } else { + var463 = 0.212569788 + } + } else { + if (input[8]) >= (0.0186860748) { + var463 = -0.427489311 + } else { + var463 = 0.000320627762 + } + } + } else { + if (input[6]) >= (0.100836918) { + if (input[0]) >= (0.0303759389) { + var463 = 0.425610334 + } else { + var463 = 0.154946104 + } + } else { + if (input[6]) >= (0.0952674896) { + var463 = -0.15282619 + } else { + var463 = -0.00197628932 + } + } + } + var var464 float64 + if (input[6]) >= (0.103576481) { + if (input[3]) >= (0.00252875732) { + if (input[3]) >= (0.010206541) { + var464 = 0.00737449294 + } else { + var464 = -0.210378304 + } + } else { + if (input[3]) >= (0.00210806029) { + var464 = 0.20995748 + } else { + var464 = -0.0379850268 + } + } + } else { + if (input[6]) >= (0.100761652) { + var464 = 0.265030205 + } else { + if (input[6]) >= (0.0953126401) { + var464 = -0.192762926 + } else { + var464 = -0.0006739542 + } + } + } + var var465 float64 + if (input[3]) >= (0.022961922) { + if (input[8]) >= (0.0660241246) { + if (input[8]) >= (0.077694729) { + var465 = 0.016990982 + } else { + var465 = 0.10983979 + } + } else { + if (input[4]) >= (0.324229717) { + var465 = -0.164873958 + } else { + var465 = -0.00152604922 + } + } + } else { + if (input[8]) >= (0.12922895) { + if (input[3]) >= (0.022030795) { + var465 = 0.278090626 + } else { + var465 = 0.00754145905 + } + } else { + if (input[8]) >= (0.119000785) { + var465 = -0.208571732 + } else { + var465 = -0.00314086187 + } + } + } + var var466 float64 + if (input[2]) >= (0.187716514) { + if (input[4]) >= (0.278011203) { + if (input[3]) >= (0.0160602015) { + var466 = -0.00573164178 + } else { + var466 = 0.345350415 + } + } else { + if (input[1]) >= (0.123729676) { + var466 = -0.322551519 + } else { + var466 = -0.0994874388 + } + } + } else { + if (input[2]) >= (0.184880257) { + var466 = 0.276318043 + } else { + if (input[0]) >= (0.0284210518) { + var466 = -0.00528382137 + } else { + var466 = 0.00847751368 + } + } + } + var var467 float64 + if (input[9]) >= (0.144356534) { + if (input[1]) >= (0.0439532511) { + if (input[9]) >= (0.211315796) { + var467 = -0.0336404182 + } else { + var467 = -0.141785771 + } + } else { + if (input[6]) >= (0.00438028714) { + var467 = -0.0431789495 + } else { + var467 = 0.0485368669 + } + } + } else { + if (input[9]) >= (0.141440243) { + if (input[7]) >= (0.00214642496) { + var467 = 0.0286062378 + } else { + var467 = 0.273606569 + } + } else { + if (input[6]) >= (0.00678869244) { + var467 = 0.00600273767 + } else { + var467 = -0.0102653466 + } + } + } + var var468 float64 + if (input[8]) >= (0.00675321277) { + if (input[8]) >= (0.0731051639) { + if (input[8]) >= (0.0749409944) { + var468 = -0.00466977106 + } else { + var468 = -0.146147266 + } + } else { + if (input[0]) >= (0.124060154) { + var468 = 0.0491609238 + } else { + var468 = 0.00065317651 + } + } + } else { + if (input[0]) >= (0.0293233097) { + var468 = -0.410158098 + } else { + if (input[8]) >= (0.00150799891) { + var468 = -0.0724337325 + } else { + var468 = 0.182266802 + } + } + } + var var469 float64 + if (input[9]) >= (0.000476424233) { + if (input[4]) >= (0.660364151) { + if (input[2]) >= (0.1565938) { + var469 = -0.0358539224 + } else { + var469 = -0.207148507 + } + } else { + if (input[1]) >= (0.0988313034) { + var469 = 0.0295992773 + } else { + var469 = 0.00274781347 + } + } + } else { + if (input[2]) >= (0.0330486596) { + if (input[1]) >= (0.0983231738) { + var469 = -0.161217719 + } else { + var469 = 0.16462563 + } + } else { + if (input[4]) >= (0.158963591) { + var469 = -0.306572855 + } else { + var469 = -0.0228669606 + } + } + } + var var470 float64 + if (input[8]) >= (0.0993312374) { + if (input[0]) >= (0.0600000024) { + if (input[0]) >= (0.113233082) { + var470 = 0.0178466011 + } else { + var470 = 0.172625929 + } + } else { + if (input[7]) >= (0.0210731234) { + var470 = -0.480774254 + } else { + var470 = 0.0451867357 + } + } + } else { + if (input[5]) >= (0.555000007) { + if (input[7]) >= (0.12187545) { + var470 = -0.0686971471 + } else { + var470 = 0.242208228 + } + } else { + if (input[5]) >= (0.204999998) { + var470 = -0.0977838039 + } else { + var470 = 0.00205273926 + } + } + } + var var471 float64 + if (input[5]) >= (0.164999992) { + if (input[6]) >= (0.00344703021) { + if (input[1]) >= (0.0129573178) { + var471 = 0.0275645331 + } else { + var471 = -0.0830044374 + } + } else { + if (input[3]) >= (0.0226312093) { + var471 = 0.0320866182 + } else { + var471 = 0.242563263 + } + } + } else { + if (input[1]) >= (0.210619926) { + if (input[9]) >= (0.0358906239) { + var471 = 0.0854021385 + } else { + var471 = -0.17387113 + } + } else { + if (input[5]) >= (0.155000001) { + var471 = -0.140285254 + } else { + var471 = -0.00181985449 + } + } + } + var var472 float64 + if (input[6]) >= (0.00155041087) { + if (input[1]) >= (0.0205792673) { + if (input[1]) >= (0.023119919) { + var472 = 0.00478623388 + } else { + var472 = 0.0489381403 + } + } else { + if (input[4]) >= (0.223389357) { + var472 = -0.0637496263 + } else { + var472 = 0.000535166997 + } + } + } else { + if (input[7]) >= (0.038976796) { + if (input[7]) >= (0.0514213443) { + var472 = -0.0606999137 + } else { + var472 = -0.399416 + } + } else { + if (input[1]) >= (0.0119410567) { + var472 = -0.014554752 + } else { + var472 = -0.25328508 + } + } + } + var var473 float64 + if (input[0]) >= (0.0368421078) { + if (input[8]) >= (0.0329792798) { + if (input[4]) >= (0.0917366967) { + var473 = 0.00526069989 + } else { + var473 = -0.0473421812 + } + } else { + if (input[4]) >= (0.182773113) { + var473 = 0.0436187424 + } else { + var473 = -0.0922588706 + } + } + } else { + if (input[9]) >= (0.0413911566) { + if (input[9]) >= (0.0421130136) { + var473 = -0.006300434 + } else { + var473 = -0.229396001 + } + } else { + if (input[8]) >= (0.0261605028) { + var473 = 0.0692826211 + } else { + var473 = 0.00752965128 + } + } + } + var var474 float64 + if (input[2]) >= (0.0380082503) { + if (input[0]) >= (0.0148872184) { + if (input[2]) >= (0.0389548056) { + var474 = -0.00463340105 + } else { + var474 = -0.134036988 + } + } else { + if (input[5]) >= (0.0249999985) { + var474 = 0.143035114 + } else { + var474 = -0.267157763 + } + } + } else { + if (input[2]) >= (0.0378727168) { + var474 = 0.471262902 + } else { + if (input[3]) >= (0.041359216) { + var474 = 0.206892118 + } else { + var474 = -0.000387900072 + } + } + } + var var475 float64 + if (input[7]) >= (0.0345973894) { + if (input[4]) >= (0.464285731) { + if (input[9]) >= (0.00492305029) { + var475 = -0.1234833 + } else { + var475 = 0.137865752 + } + } else { + if (input[4]) >= (0.376050413) { + var475 = 0.129444465 + } else { + var475 = 0.0135915317 + } + } + } else { + if (input[7]) >= (0.0344795436) { + var475 = -0.29821682 + } else { + if (input[1]) >= (0.0114329271) { + var475 = -0.00353855384 + } else { + var475 = 0.0333926529 + } + } + } + var var476 float64 + if (input[8]) >= (0.0102937315) { + if (input[9]) >= (0.407602549) { + if (input[6]) >= (0.011575399) { + var476 = -0.0868224353 + } else { + var476 = 0.178752124 + } + } else { + if (input[0]) >= (0.00406015012) { + var476 = 0.000436461647 + } else { + var476 = -0.0537494831 + } + } + } else { + if (input[5]) >= (0.00499999989) { + if (input[8]) >= (0.00950695015) { + var476 = -0.348682612 + } else { + var476 = -0.144532382 + } + } else { + if (input[0]) >= (0.00255639106) { + var476 = 0.0670757666 + } else { + var476 = -0.0520166568 + } + } + } + var var477 float64 + if (input[8]) >= (0.0824154243) { + if (input[4]) >= (0.0693277344) { + if (input[4]) >= (0.402661085) { + var477 = -0.0268900972 + } else { + var477 = 0.0528296083 + } + } else { + if (input[7]) >= (0.0431778058) { + var477 = -0.234595641 + } else { + var477 = 0.0509880483 + } + } + } else { + if (input[8]) >= (0.0793994218) { + if (input[4]) >= (0.278711498) { + var477 = 5.54362887e-05 + } else { + var477 = -0.224362731 + } + } else { + if (input[5]) >= (0.105000004) { + var477 = 0.0389812961 + } else { + var477 = -0.00448713964 + } + } + } + var var478 float64 + if (input[0]) >= (0.121654138) { + if (input[5]) >= (0.0450000018) { + if (input[5]) >= (0.075000003) { + var478 = -0.00628152769 + } else { + var478 = 0.117324613 + } + } else { + if (input[1]) >= (0.0134654474) { + var478 = -0.0660713911 + } else { + var478 = 0.0329159684 + } + } + } else { + if (input[0]) >= (0.12045113) { + if (input[1]) >= (0.0409044698) { + var478 = -0.0180103686 + } else { + var478 = 0.158599913 + } + } else { + if (input[0]) >= (0.11383459) { + var478 = -0.10409902 + } else { + var478 = 0.00160641596 + } + } + } + var var479 float64 + if (input[0]) >= (0.12105263) { + if (input[4]) >= (0.408263326) { + if (input[0]) >= (0.124661654) { + var479 = -0.0103037329 + } else { + var479 = 0.187138572 + } + } else { + if (input[0]) >= (0.123157896) { + var479 = -0.0140926261 + } else { + var479 = -0.112712115 + } + } + } else { + if (input[0]) >= (0.12045113) { + if (input[1]) >= (0.0429369919) { + var479 = -0.0356319696 + } else { + var479 = 0.252851188 + } + } else { + if (input[4]) >= (0.380252123) { + var479 = -0.0788752437 + } else { + var479 = 0.00321473135 + } + } + } + var var480 float64 + if (input[7]) >= (0.0581948571) { + if (input[5]) >= (0.0249999985) { + if (input[4]) >= (0.587535024) { + var480 = 0.45017314 + } else { + var480 = 0.0537344441 + } + } else { + if (input[4]) >= (0.181372553) { + var480 = -0.0650059804 + } else { + var480 = 0.0744697228 + } + } + } else { + if (input[7]) >= (0.0552235097) { + if (input[4]) >= (0.30112046) { + var480 = 0.0471591763 + } else { + var480 = -0.274711579 + } + } else { + if (input[7]) >= (0.0547080338) { + var480 = 0.259785205 + } else { + var480 = -0.00314824679 + } + } + } + var var481 float64 + if (input[3]) >= (0.00250460859) { + if (input[0]) >= (0.084360905) { + if (input[4]) >= (0.0287114847) { + var481 = -0.00310158404 + } else { + var481 = -0.125213638 + } + } else { + if (input[8]) >= (0.0602543913) { + var481 = 0.0663705021 + } else { + var481 = 0.00429317215 + } + } + } else { + if (input[0]) >= (0.00586466165) { + if (input[7]) >= (0.00214662822) { + var481 = -0.0396725014 + } else { + var481 = -0.186569348 + } + } else { + if (input[9]) >= (0.0830999315) { + var481 = 0.134739384 + } else { + var481 = -0.0920131207 + } + } + } + var var482 float64 + if (input[4]) >= (0.441876769) { + if (input[5]) >= (0.0949999988) { + if (input[8]) >= (0.158471018) { + var482 = 0.0762743056 + } else { + var482 = -0.169294029 + } + } else { + if (input[4]) >= (0.572128892) { + var482 = -0.0155747896 + } else { + var482 = 0.116017126 + } + } + } else { + if (input[4]) >= (0.436274529) { + if (input[2]) >= (0.0678152442) { + var482 = 0.186370522 + } else { + var482 = -0.242678329 + } + } else { + if (input[8]) >= (0.16869919) { + var482 = -0.0740737095 + } else { + var482 = -0.000659798039 + } + } + } + var var483 float64 + if (input[4]) >= (0.14915967) { + if (input[4]) >= (0.15056023) { + if (input[5]) >= (0.185000002) { + var483 = 0.0539085194 + } else { + var483 = -0.00971093401 + } + } else { + if (input[1]) >= (0.0307418704) { + var483 = 0.0327795558 + } else { + var483 = -0.584495127 + } + } + } else { + if (input[4]) >= (0.143557429) { + if (input[2]) >= (0.101363212) { + var483 = -0.246674657 + } else { + var483 = 0.167479128 + } + } else { + if (input[7]) >= (0.246649504) { + var483 = -0.241754234 + } else { + var483 = 0.00335645932 + } + } + } + var var484 float64 + if (input[1]) >= (0.127794713) { + if (input[1]) >= (0.129827231) { + if (input[9]) >= (0.0538503751) { + var484 = -0.120428175 + } else { + var484 = 0.0423765294 + } + } else { + if (input[4]) >= (0.103641458) { + var484 = 0.0672732368 + } else { + var484 = 0.394706458 + } + } + } else { + if (input[1]) >= (0.125254065) { + if (input[9]) >= (0.0460399054) { + var484 = 0.166500866 + } else { + var484 = -0.311539114 + } + } else { + if (input[1]) >= (0.121697158) { + var484 = 0.108770475 + } else { + var484 = -0.000733454013 + } + } + } + var var485 float64 + if (input[4]) >= (0.465686262) { + if (input[5]) >= (0.0149999997) { + if (input[8]) >= (0.0567138717) { + var485 = -0.0628554225 + } else { + var485 = 0.325379014 + } + } else { + if (input[4]) >= (0.572829127) { + var485 = -0.0342799537 + } else { + var485 = 0.159740359 + } + } + } else { + if (input[4]) >= (0.45028013) { + if (input[9]) >= (0.0222620033) { + var485 = 0.0535941087 + } else { + var485 = -0.212369516 + } + } else { + if (input[5]) >= (0.894999981) { + var485 = -0.170840085 + } else { + var485 = -0.00201578694 + } + } + } + var var486 float64 + if (input[6]) >= (0.0926784426) { + if (input[8]) >= (0.0329137146) { + if (input[7]) >= (0.00248188013) { + var486 = 0.0872122347 + } else { + var486 = -0.213173613 + } + } else { + if (input[4]) >= (0.0483193286) { + var486 = 0.24719879 + } else { + var486 = -0.017270254 + } + } + } else { + if (input[9]) >= (0.475817859) { + if (input[2]) >= (0.00473516528) { + var486 = -0.186792731 + } else { + var486 = 0.019966023 + } + } else { + if (input[9]) >= (0.405263782) { + var486 = 0.111017331 + } else { + var486 = 0.00243958505 + } + } + } + var var487 float64 + if (input[1]) >= (0.0759654492) { + if (input[3]) >= (0.00667319447) { + if (input[3]) >= (0.00803111773) { + var487 = 0.0150724286 + } else { + var487 = -0.257510126 + } + } else { + if (input[7]) >= (0.000569928263) { + var487 = 0.00983070396 + } else { + var487 = 0.388957232 + } + } + } else { + if (input[0]) >= (0.0485714301) { + if (input[3]) >= (0.0030018189) { + var487 = -0.000795692438 + } else { + var487 = 0.0929303169 + } + } else { + if (input[3]) >= (0.0096104471) { + var487 = -0.0697733015 + } else { + var487 = -0.00412932551 + } + } + } + var var488 float64 + if (input[7]) >= (0.00038421902) { + if (input[7]) >= (0.000443954836) { + if (input[7]) >= (0.000452488486) { + var488 = -0.00197839993 + } else { + var488 = 0.297818631 + } + } else { + if (input[7]) >= (0.000417541014) { + var488 = -0.207232907 + } else { + var488 = -0.0321596153 + } + } + } else { + if (input[7]) >= (0.00037568534) { + if (input[3]) >= (0.0110240402) { + var488 = 0.420200437 + } else { + var488 = 0.104380876 + } + } else { + if (input[3]) >= (0.002779142) { + var488 = 0.0230998714 + } else { + var488 = -0.0820677876 + } + } + } + var var489 float64 + if (input[1]) >= (0.15675813) { + if (input[4]) >= (0.15476191) { + if (input[7]) >= (0.000272874749) { + var489 = 0.079492569 + } else { + var489 = -0.1500974 + } + } else { + if (input[7]) >= (9.59023746e-05) { + var489 = -0.149437338 + } else { + var489 = 0.26772359 + } + } + } else { + if (input[1]) >= (0.151676834) { + if (input[6]) >= (0.00581027754) { + var489 = 0.198325813 + } else { + var489 = -0.102935612 + } + } else { + if (input[6]) >= (0.133651435) { + var489 = 0.101128705 + } else { + var489 = 0.00096241862 + } + } + } + var var490 float64 + if (input[8]) >= (0.100249149) { + if (input[0]) >= (0.130977452) { + if (input[5]) >= (0.234999999) { + var490 = 0.106701642 + } else { + var490 = -0.0526291355 + } + } else { + if (input[2]) >= (0.0323165245) { + var490 = 0.10182143 + } else { + var490 = -0.0252851713 + } + } + } else { + if (input[9]) >= (0.00749285333) { + if (input[9]) >= (0.00859007239) { + var490 = 0.000166409707 + } else { + var490 = 0.0774247646 + } + } else { + if (input[7]) >= (0.00717825163) { + var490 = 0.0308562927 + } else { + var490 = -0.0584115423 + } + } + } + var var491 float64 + if (input[0]) >= (0.0813533813) { + if (input[8]) >= (0.0169813801) { + if (input[6]) >= (0.00185146159) { + var491 = -0.00633856049 + } else { + var491 = -0.0995935798 + } + } else { + var491 = -0.319200367 + } + } else { + if (input[0]) >= (0.0786466151) { + if (input[5]) >= (0.0149999997) { + var491 = -0.12226069 + } else { + var491 = 0.197382256 + } + } else { + if (input[4]) >= (0.268207312) { + var491 = 0.0514911972 + } else { + var491 = 0.000866933784 + } + } + } + var var492 float64 + if (input[1]) >= (0.00685975607) { + if (input[4]) >= (0.107142858) { + if (input[4]) >= (0.108543418) { + var492 = -0.00423673447 + } else { + var492 = -0.267282575 + } + } else { + if (input[1]) >= (0.0160060972) { + var492 = 0.000266687595 + } else { + var492 = 0.0529088415 + } + } + } else { + if (input[4]) >= (0.14635855) { + if (input[3]) >= (0.00383482454) { + var492 = -0.142914876 + } else { + var492 = 0.13865152 + } + } else { + if (input[4]) >= (0.0441176482) { + var492 = -0.182959408 + } else { + var492 = 0.0497040674 + } + } + } + var var493 float64 + if (input[4]) >= (0.00490196096) { + if (input[4]) >= (0.0119047621) { + if (input[9]) >= (0.294906616) { + var493 = -0.0492320731 + } else { + var493 = 0.000822217145 + } + } else { + if (input[7]) >= (0.000344395172) { + var493 = -0.083902806 + } else { + var493 = 0.0968329161 + } + } + } else { + if (input[9]) >= (0.0128490161) { + if (input[7]) >= (0.0172156952) { + var493 = 0.104243062 + } else { + var493 = 0.257907242 + } + } else { + if (input[7]) >= (0.0371341258) { + var493 = 0.179313838 + } else { + var493 = -0.152418166 + } + } + } + var var494 float64 + if (input[2]) >= (0.00465848856) { + if (input[2]) >= (0.00468011014) { + if (input[2]) >= (0.00547791272) { + var494 = -0.000445411308 + } else { + var494 = 0.0564623922 + } + } else { + var494 = 0.453841954 + } + } else { + if (input[2]) >= (0.0046112407) { + if (input[9]) >= (0.125747114) { + var494 = -0.0772032663 + } else { + var494 = -0.299265951 + } + } else { + if (input[9]) >= (0.0323390998) { + var494 = -0.00411211979 + } else { + var494 = -0.0631354675 + } + } + } + var var495 float64 + if (input[2]) >= (0.470134735) { + var495 = -0.223825037 + } else { + if (input[9]) >= (0.246383518) { + if (input[4]) >= (0.0175070036) { + var495 = -0.0671552271 + } else { + var495 = 0.102772444 + } + } else { + if (input[9]) >= (0.238573045) { + var495 = 0.156644702 + } else { + var495 = 0.00248850253 + } + } + } + var var496 float64 + if (input[4]) >= (0.304621875) { + if (input[5]) >= (0.254999995) { + if (input[2]) >= (0.182350919) { + var496 = -0.0197010636 + } else { + var496 = -0.330768526 + } + } else { + if (input[1]) >= (0.0139735769) { + var496 = 0.00660737185 + } else { + var496 = -0.127055123 + } + } + } else { + if (input[5]) >= (0.284999996) { + if (input[5]) >= (0.675000012) { + var496 = -0.07162413 + } else { + var496 = 0.144766897 + } + } else { + if (input[4]) >= (0.299019635) { + var496 = 0.131504044 + } else { + var496 = 0.00431525521 + } + } + } + var var497 float64 + if (input[1]) >= (0.170477644) { + if (input[6]) >= (0.00525333406) { + if (input[1]) >= (0.18064025) { + var497 = -0.062293373 + } else { + var497 = 0.174499243 + } + } else { + if (input[7]) >= (0.000270842924) { + var497 = 0.232616261 + } else { + var497 = -0.0776687711 + } + } + } else { + if (input[1]) >= (0.165396348) { + if (input[4]) >= (0.085434176) { + var497 = -0.066631265 + } else { + var497 = -0.333392918 + } + } else { + if (input[1]) >= (0.0358231701) { + var497 = -0.0073480811 + } else { + var497 = 0.0037356175 + } + } + } + var var498 float64 + if (input[8]) >= (0.148373991) { + if (input[0]) >= (0.221503764) { + var498 = -0.212517485 + } else { + if (input[0]) >= (0.208270669) { + var498 = 0.247572884 + } else { + var498 = 0.0408139564 + } + } + } else { + if (input[8]) >= (0.143391028) { + if (input[0]) >= (0.12556392) { + var498 = -0.298463106 + } else { + var498 = -0.0203433987 + } + } else { + if (input[2]) >= (0.220409825) { + var498 = 0.0892436579 + } else { + var498 = -0.00381614012 + } + } + } + var var499 float64 + if (input[8]) >= (0.00570417009) { + if (input[5]) >= (0.215000004) { + if (input[0]) >= (0.0768421069) { + var499 = -0.0564594343 + } else { + var499 = 0.148705289 + } + } else { + if (input[2]) >= (0.000740545336) { + var499 = 0.00202492182 + } else { + var499 = 0.0936344117 + } + } + } else { + if (input[9]) >= (0.0425750017) { + var499 = -0.317553043 + } else { + if (input[1]) >= (0.152693093) { + var499 = -0.0285214316 + } else { + var499 = 0.175136536 + } + } + } + var var500 float64 + var500 = 1 / (1 + math.Exp((0)-(var0+var1+var2+var3+var4+var5+var6+var7+var8+var9+var10+var11+var12+var13+var14+var15+var16+var17+var18+var19+var20+var21+var22+var23+var24+var25+var26+var27+var28+var29+var30+var31+var32+var33+var34+var35+var36+var37+var38+var39+var40+var41+var42+var43+var44+var45+var46+var47+var48+var49+var50+var51+var52+var53+var54+var55+var56+var57+var58+var59+var60+var61+var62+var63+var64+var65+var66+var67+var68+var69+var70+var71+var72+var73+var74+var75+var76+var77+var78+var79+var80+var81+var82+var83+var84+var85+var86+var87+var88+var89+var90+var91+var92+var93+var94+var95+var96+var97+var98+var99+var100+var101+var102+var103+var104+var105+var106+var107+var108+var109+var110+var111+var112+var113+var114+var115+var116+var117+var118+var119+var120+var121+var122+var123+var124+var125+var126+var127+var128+var129+var130+var131+var132+var133+var134+var135+var136+var137+var138+var139+var140+var141+var142+var143+var144+var145+var146+var147+var148+var149+var150+var151+var152+var153+var154+var155+var156+var157+var158+var159+var160+var161+var162+var163+var164+var165+var166+var167+var168+var169+var170+var171+var172+var173+var174+var175+var176+var177+var178+var179+var180+var181+var182+var183+var184+var185+var186+var187+var188+var189+var190+var191+var192+var193+var194+var195+var196+var197+var198+var199+var200+var201+var202+var203+var204+var205+var206+var207+var208+var209+var210+var211+var212+var213+var214+var215+var216+var217+var218+var219+var220+var221+var222+var223+var224+var225+var226+var227+var228+var229+var230+var231+var232+var233+var234+var235+var236+var237+var238+var239+var240+var241+var242+var243+var244+var245+var246+var247+var248+var249+var250+var251+var252+var253+var254+var255+var256+var257+var258+var259+var260+var261+var262+var263+var264+var265+var266+var267+var268+var269+var270+var271+var272+var273+var274+var275+var276+var277+var278+var279+var280+var281+var282+var283+var284+var285+var286+var287+var288+var289+var290+var291+var292+var293+var294+var295+var296+var297+var298+var299+var300+var301+var302+var303+var304+var305+var306+var307+var308+var309+var310+var311+var312+var313+var314+var315+var316+var317+var318+var319+var320+var321+var322+var323+var324+var325+var326+var327+var328+var329+var330+var331+var332+var333+var334+var335+var336+var337+var338+var339+var340+var341+var342+var343+var344+var345+var346+var347+var348+var349+var350+var351+var352+var353+var354+var355+var356+var357+var358+var359+var360+var361+var362+var363+var364+var365+var366+var367+var368+var369+var370+var371+var372+var373+var374+var375+var376+var377+var378+var379+var380+var381+var382+var383+var384+var385+var386+var387+var388+var389+var390+var391+var392+var393+var394+var395+var396+var397+var398+var399+var400+var401+var402+var403+var404+var405+var406+var407+var408+var409+var410+var411+var412+var413+var414+var415+var416+var417+var418+var419+var420+var421+var422+var423+var424+var425+var426+var427+var428+var429+var430+var431+var432+var433+var434+var435+var436+var437+var438+var439+var440+var441+var442+var443+var444+var445+var446+var447+var448+var449+var450+var451+var452+var453+var454+var455+var456+var457+var458+var459+var460+var461+var462+var463+var464+var465+var466+var467+var468+var469+var470+var471+var472+var473+var474+var475+var476+var477+var478+var479+var480+var481+var482+var483+var484+var485+var486+var487+var488+var489+var490+var491+var492+var493+var494+var495+var496+var497+var498+var499))) + output = append(output, 1-var500) + output = append(output, var500) + return +} From c0431cc4aebac696848f4650ea4bbe87257c9463 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 27 Sep 2023 22:38:26 +0800 Subject: [PATCH 27/55] Try quic bbr for GT. --- client/client.go | 6 +++--- conn/quicConn.go | 18 +++++++++++++----- go.mod | 7 ++++--- go.sum | 27 +++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/client/client.go b/client/client.go index 6b67e15a..e8794eb8 100644 --- a/client/client.go +++ b/client/client.go @@ -254,7 +254,7 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { d.host = u.Host d.tlsConfig = tlsConfig - fmt.Println("GT is waiting for probes to get network conditions !") + fmt.Println("GT is waiting for probes to get network conditions!") pureAddr, _, _ := net.SplitHostPort(d.host) pinger, err := probing.NewPinger(pureAddr) if err != nil { @@ -273,10 +273,10 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { result := connection.PredictWithRttAndLoss(networkCondition) if result[1] > result[0] { - fmt.Println("According to network conditions, GT has choose to establish TCP+TLS connection for penetration !") + fmt.Println("According to network conditions, GT has chosen to establish QUIC connection for penetration!") d.dialFn = d.quicDial } else { - fmt.Println("According to network conditions, GT has choose to establish QUIC connection for penetration !") + fmt.Println("According to network conditions, GT has chosen to establish TCP+TLS connection for penetration!") d.dialFn = d.tlsDial } diff --git a/conn/quicConn.go b/conn/quicConn.go index 71162724..6120ff7d 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -8,6 +8,7 @@ import ( "crypto/tls" "crypto/x509" "encoding/pem" + quicbbr "github.com/For-ACGN/quic-bbr" "github.com/quic-go/quic-go" "math/big" "net" @@ -22,22 +23,29 @@ type QuicListener struct { quic.Listener } +type QuicBbrConnection struct { + quicbbr.Session + quicbbr.Stream +} + var _ net.Conn = &QuicConnection{} var _ net.Listener = &QuicListener{} +var _ net.Conn = &QuicBbrConnection{} func QuicDial(addr string, config *tls.Config) (net.Conn, error) { config.NextProtos = []string{"gt-quic"} - conn, err := quic.DialAddr(context.Background(), addr, config, &quic.Config{}) + //conn, err := quic.DialAddr(context.Background(), addr, config, &quic.Config{}) + conn, err := quicbbr.DialAddr(addr, config, &quicbbr.Config{}) if err != nil { panic(err) } - stream, err := conn.OpenStreamSync(context.Background()) + stream, err := conn.OpenStreamSync() if err != nil { panic(err) } - nc := &QuicConnection{ - Connection: conn, - Stream: stream, + nc := &QuicBbrConnection{ + Session: conn, + Stream: stream, } return nc, err } diff --git a/go.mod b/go.mod index 73022cfc..25a2563b 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/isrc-cas/gt go 1.19 require ( + github.com/For-ACGN/quic-bbr v0.0.0-20220524123157-ffe55c2d8bc0 github.com/archdx/zerolog-sentry v1.5.0 github.com/buger/jsonparser v1.1.1 github.com/davecgh/go-spew v1.1.1 @@ -10,7 +11,6 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/hashicorp/golang-lru/v2 v2.0.3 github.com/jonboulle/clockwork v0.2.2 - github.com/kr/pretty v0.3.1 github.com/lestrrat-go/strftime v1.0.5 github.com/mattn/go-pointer v0.0.1 github.com/pion/logging v0.2.2 @@ -25,13 +25,15 @@ require ( ) require ( + github.com/cheekybits/genny v1.0.0 // indirect github.com/getsentry/sentry-go v0.24.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang/mock v1.6.0 // indirect github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/kr/text v0.2.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/marten-seemann/qtls v0.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/onsi/ginkgo/v2 v2.9.5 // indirect @@ -43,7 +45,6 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/quic-go/qtls-go1-19 v0.3.2 // indirect github.com/quic-go/qtls-go1-20 v0.3.3 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect diff --git a/go.sum b/go.sum index 8f118c60..dad460f5 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,11 @@ +github.com/For-ACGN/quic-bbr v0.0.0-20220524123157-ffe55c2d8bc0 h1:JtXJnfc74qRSYd8u52TdwBLesT+XJi30NseW2DXEcbQ= +github.com/For-ACGN/quic-bbr v0.0.0-20220524123157-ffe55c2d8bc0/go.mod h1:j7n2ZQ8HqJZOoKp56+cOkAuDjFWe+T7fhCX4+pvHiP4= github.com/archdx/zerolog-sentry v1.5.0 h1:wc3arq95hz749M2iPwfSb7jzdYhTch4AK/opofXHcNs= github.com/archdx/zerolog-sentry v1.5.0/go.mod h1:shfLC+5jaXkS1iBcAD/k07g5QH1M/jbPcVr5DkZyxk4= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= +github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -12,6 +16,7 @@ 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/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/getsentry/sentry-go v0.24.1 h1:W6/0GyTy8J6ge6lVCc94WB6Gx2ZuLrgopnn9w8Hiwuk= github.com/getsentry/sentry-go v0.24.1/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -21,8 +26,10 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= @@ -33,6 +40,8 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= @@ -44,6 +53,9 @@ github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2t github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/strftime v1.0.5 h1:A7H3tT8DhTz8u65w+JRpiBxM4dINQhUXAZnhBa2xeOE= github.com/lestrrat-go/strftime v1.0.5/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= +github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= +github.com/marten-seemann/qtls v0.2.4 h1:mCJ6i1jAqcsm9XODrSGvXECodoAb1STta+TkxJCwCnE= +github.com/marten-seemann/qtls v0.2.4/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -53,8 +65,12 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -111,6 +127,7 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -125,6 +142,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -136,13 +155,16 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -191,6 +213,11 @@ google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62Uo gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 9476917ba66d950b24ecb29707d5cbb9f862460c Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 27 Sep 2023 22:44:49 +0800 Subject: [PATCH 28/55] Try quic bbr for GT. --- conn/quicConn.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conn/quicConn.go b/conn/quicConn.go index 6120ff7d..1462c44d 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -32,6 +32,8 @@ var _ net.Conn = &QuicConnection{} var _ net.Listener = &QuicListener{} var _ net.Conn = &QuicBbrConnection{} +func (c *QuicBbrConnection) Close() error { return nil } + func QuicDial(addr string, config *tls.Config) (net.Conn, error) { config.NextProtos = []string{"gt-quic"} //conn, err := quic.DialAddr(context.Background(), addr, config, &quic.Config{}) From 9c2bf1ea8a5df106a65673f05f520f96a7da00a3 Mon Sep 17 00:00:00 2001 From: Shadow Date: Wed, 27 Sep 2023 22:49:21 +0800 Subject: [PATCH 29/55] Try quic bbr for GT. --- conn/quicConn.go | 20 +++++--------------- go.mod | 3 --- go.sum | 27 --------------------------- 3 files changed, 5 insertions(+), 45 deletions(-) diff --git a/conn/quicConn.go b/conn/quicConn.go index 1462c44d..71162724 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -8,7 +8,6 @@ import ( "crypto/tls" "crypto/x509" "encoding/pem" - quicbbr "github.com/For-ACGN/quic-bbr" "github.com/quic-go/quic-go" "math/big" "net" @@ -23,31 +22,22 @@ type QuicListener struct { quic.Listener } -type QuicBbrConnection struct { - quicbbr.Session - quicbbr.Stream -} - var _ net.Conn = &QuicConnection{} var _ net.Listener = &QuicListener{} -var _ net.Conn = &QuicBbrConnection{} - -func (c *QuicBbrConnection) Close() error { return nil } func QuicDial(addr string, config *tls.Config) (net.Conn, error) { config.NextProtos = []string{"gt-quic"} - //conn, err := quic.DialAddr(context.Background(), addr, config, &quic.Config{}) - conn, err := quicbbr.DialAddr(addr, config, &quicbbr.Config{}) + conn, err := quic.DialAddr(context.Background(), addr, config, &quic.Config{}) if err != nil { panic(err) } - stream, err := conn.OpenStreamSync() + stream, err := conn.OpenStreamSync(context.Background()) if err != nil { panic(err) } - nc := &QuicBbrConnection{ - Session: conn, - Stream: stream, + nc := &QuicConnection{ + Connection: conn, + Stream: stream, } return nc, err } diff --git a/go.mod b/go.mod index 25a2563b..bf75e7ec 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/isrc-cas/gt go 1.19 require ( - github.com/For-ACGN/quic-bbr v0.0.0-20220524123157-ffe55c2d8bc0 github.com/archdx/zerolog-sentry v1.5.0 github.com/buger/jsonparser v1.1.1 github.com/davecgh/go-spew v1.1.1 @@ -25,7 +24,6 @@ require ( ) require ( - github.com/cheekybits/genny v1.0.0 // indirect github.com/getsentry/sentry-go v0.24.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect @@ -33,7 +31,6 @@ require ( github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/google/uuid v1.3.0 // indirect github.com/kr/pretty v0.3.1 // indirect - github.com/marten-seemann/qtls v0.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/onsi/ginkgo/v2 v2.9.5 // indirect diff --git a/go.sum b/go.sum index dad460f5..8f118c60 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,7 @@ -github.com/For-ACGN/quic-bbr v0.0.0-20220524123157-ffe55c2d8bc0 h1:JtXJnfc74qRSYd8u52TdwBLesT+XJi30NseW2DXEcbQ= -github.com/For-ACGN/quic-bbr v0.0.0-20220524123157-ffe55c2d8bc0/go.mod h1:j7n2ZQ8HqJZOoKp56+cOkAuDjFWe+T7fhCX4+pvHiP4= github.com/archdx/zerolog-sentry v1.5.0 h1:wc3arq95hz749M2iPwfSb7jzdYhTch4AK/opofXHcNs= github.com/archdx/zerolog-sentry v1.5.0/go.mod h1:shfLC+5jaXkS1iBcAD/k07g5QH1M/jbPcVr5DkZyxk4= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -16,7 +12,6 @@ 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/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/getsentry/sentry-go v0.24.1 h1:W6/0GyTy8J6ge6lVCc94WB6Gx2ZuLrgopnn9w8Hiwuk= github.com/getsentry/sentry-go v0.24.1/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -26,10 +21,8 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= @@ -40,8 +33,6 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= @@ -53,9 +44,6 @@ github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2t github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/strftime v1.0.5 h1:A7H3tT8DhTz8u65w+JRpiBxM4dINQhUXAZnhBa2xeOE= github.com/lestrrat-go/strftime v1.0.5/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= -github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= -github.com/marten-seemann/qtls v0.2.4 h1:mCJ6i1jAqcsm9XODrSGvXECodoAb1STta+TkxJCwCnE= -github.com/marten-seemann/qtls v0.2.4/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -65,12 +53,8 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -127,7 +111,6 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -142,8 +125,6 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -155,16 +136,13 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -213,11 +191,6 @@ google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62Uo gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From be2499a2b67b3a021cbc53693c97b46de4bbc1b6 Mon Sep 17 00:00:00 2001 From: Shadow Date: Thu, 28 Sep 2023 16:25:16 +0800 Subject: [PATCH 30/55] Try quic bbr for GT. --- conn/quicConn.go | 22 ++++++++++++++++++++++ go.mod | 3 +++ go.sum | 27 +++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/conn/quicConn.go b/conn/quicConn.go index 71162724..d9d0a64e 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -8,6 +8,7 @@ import ( "crypto/tls" "crypto/x509" "encoding/pem" + quicbbr "github.com/DrakenLibra/gt-bbr" "github.com/quic-go/quic-go" "math/big" "net" @@ -18,12 +19,23 @@ type QuicConnection struct { quic.Stream } +type QuicBbrConnection struct { + quicbbr.Session + quicbbr.Stream +} + type QuicListener struct { quic.Listener } +type QuicBbrListener struct { + quicbbr.Listener +} + var _ net.Conn = &QuicConnection{} var _ net.Listener = &QuicListener{} +var _ net.Conn = &QuicBbrConnection{} +var _ net.Listener = &QuicBbrListener{} func QuicDial(addr string, config *tls.Config) (net.Conn, error) { config.NextProtos = []string{"gt-quic"} @@ -64,6 +76,16 @@ func (ln *QuicListener) Accept() (net.Conn, error) { return nc, err } +func (ln *QuicBbrListener) Accept() (net.Conn, error) { + conn, _ := ln.Listener.Accept() + stream, err := conn.AcceptStream() + nc := &QuicBbrConnection{ + Session: conn, + Stream: stream, + } + return nc, err +} + func GenerateTLSConfig() *tls.Config { ecdsaKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { diff --git a/go.mod b/go.mod index bf75e7ec..01362dae 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/isrc-cas/gt go 1.19 require ( + github.com/DrakenLibra/gt-bbr v0.0.0-20230928081539-5c3f8cfb9590 github.com/archdx/zerolog-sentry v1.5.0 github.com/buger/jsonparser v1.1.1 github.com/davecgh/go-spew v1.1.1 @@ -24,6 +25,7 @@ require ( ) require ( + github.com/cheekybits/genny v1.0.0 // indirect github.com/getsentry/sentry-go v0.24.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect @@ -31,6 +33,7 @@ require ( github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/google/uuid v1.3.0 // indirect github.com/kr/pretty v0.3.1 // indirect + github.com/marten-seemann/qtls v0.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/onsi/ginkgo/v2 v2.9.5 // indirect diff --git a/go.sum b/go.sum index 8f118c60..163aecd5 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,11 @@ +github.com/DrakenLibra/gt-bbr v0.0.0-20230928081539-5c3f8cfb9590 h1:xrwkQrRETUM5fxDEtroBS/23PFuhX2tufkI1rAhE36s= +github.com/DrakenLibra/gt-bbr v0.0.0-20230928081539-5c3f8cfb9590/go.mod h1:gpyj8Qozj/mJGV0qdY8JWwKzJtVdjkFNy+l2gvyAtAE= github.com/archdx/zerolog-sentry v1.5.0 h1:wc3arq95hz749M2iPwfSb7jzdYhTch4AK/opofXHcNs= github.com/archdx/zerolog-sentry v1.5.0/go.mod h1:shfLC+5jaXkS1iBcAD/k07g5QH1M/jbPcVr5DkZyxk4= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= +github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -12,6 +16,7 @@ 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/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/getsentry/sentry-go v0.24.1 h1:W6/0GyTy8J6ge6lVCc94WB6Gx2ZuLrgopnn9w8Hiwuk= github.com/getsentry/sentry-go v0.24.1/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -21,8 +26,10 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= @@ -33,6 +40,8 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= @@ -44,6 +53,9 @@ github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2t github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/strftime v1.0.5 h1:A7H3tT8DhTz8u65w+JRpiBxM4dINQhUXAZnhBa2xeOE= github.com/lestrrat-go/strftime v1.0.5/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= +github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= +github.com/marten-seemann/qtls v0.2.4 h1:mCJ6i1jAqcsm9XODrSGvXECodoAb1STta+TkxJCwCnE= +github.com/marten-seemann/qtls v0.2.4/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -53,8 +65,12 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -111,6 +127,7 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -125,6 +142,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -136,13 +155,16 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -191,6 +213,11 @@ google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62Uo gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 4ebf571ba4ac01e183912423266727822109e999 Mon Sep 17 00:00:00 2001 From: Shadow Date: Thu, 28 Sep 2023 16:31:07 +0800 Subject: [PATCH 31/55] Try quic bbr for GT. --- conn/quicConn.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conn/quicConn.go b/conn/quicConn.go index d9d0a64e..ac10f829 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -37,6 +37,12 @@ var _ net.Listener = &QuicListener{} var _ net.Conn = &QuicBbrConnection{} var _ net.Listener = &QuicBbrListener{} +func (c *QuicBbrConnection) Close() error { + err := c.Stream.Close() + err = c.Session.Close() + return err +} + func QuicDial(addr string, config *tls.Config) (net.Conn, error) { config.NextProtos = []string{"gt-quic"} conn, err := quic.DialAddr(context.Background(), addr, config, &quic.Config{}) From b9e06099a2f2663c82c4ce2b3168bbf1e5ed9474 Mon Sep 17 00:00:00 2001 From: Shadow Date: Thu, 28 Sep 2023 17:03:18 +0800 Subject: [PATCH 32/55] Try quic bbr for GT. --- client/client.go | 30 ++++++++++++++++++++++++++++++ conn/quicConn.go | 29 +++++++++++++++++++++++++++++ server/config.go | 5 +++-- server/server.go | 30 ++++++++++++++++++++++++++---- 4 files changed, 88 insertions(+), 6 deletions(-) diff --git a/client/client.go b/client/client.go index e8794eb8..5f23bf92 100644 --- a/client/client.go +++ b/client/client.go @@ -306,6 +306,32 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { d.host = u.Host d.tlsConfig = tlsConfig d.dialFn = d.quicDial + case "quicbbr": + if len(u.Port()) < 1 { + u.Host = net.JoinHostPort(u.Host, "443") + } + tlsConfig := &tls.Config{} + if len(c.Config().RemoteCert) > 0 { + var cf []byte + cf, err = os.ReadFile(c.Config().RemoteCert) + if err != nil { + err = fmt.Errorf("failed to read remote cert file (-remoteCert option) '%s', cause %s", c.Config().RemoteCert, err.Error()) + return + } + roots := x509.NewCertPool() + ok := roots.AppendCertsFromPEM(cf) + if !ok { + err = fmt.Errorf("failed to parse remote cert file (-remoteCert option) '%s'", c.Config().RemoteCert) + return + } + tlsConfig.RootCAs = roots + } + if c.Config().RemoteCertInsecure { + tlsConfig.InsecureSkipVerify = true + } + d.host = u.Host + d.tlsConfig = tlsConfig + d.dialFn = d.quicBbrDial default: err = fmt.Errorf("remote url (-remote option) '%s' is invalid", remote) } @@ -367,6 +393,10 @@ func (d *dialer) quicDial() (conn net.Conn, err error) { return connection.QuicDial(d.host, d.tlsConfig) } +func (d *dialer) quicBbrDial() (conn net.Conn, err error) { + return connection.QuicBbrDial(d.host, d.tlsConfig) +} + // Start runs the client agent. func (c *Client) Start() (err error) { c.Logger.Info().Msg(predef.Version) diff --git a/conn/quicConn.go b/conn/quicConn.go index ac10f829..779191cf 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -60,6 +60,23 @@ func QuicDial(addr string, config *tls.Config) (net.Conn, error) { return nc, err } +func QuicBbrDial(addr string, config *tls.Config) (net.Conn, error) { + config.NextProtos = []string{"gt-quic"} + conn, err := quicbbr.DialAddr(addr, config, &quicbbr.Config{}) + if err != nil { + panic(err) + } + stream, err := conn.OpenStreamSync() + if err != nil { + panic(err) + } + nc := &QuicBbrConnection{ + Session: conn, + Stream: stream, + } + return nc, err +} + func QuicListen(addr string, config *tls.Config) (net.Listener, error) { config.NextProtos = []string{"gt-quic"} listener, err := quic.ListenAddr(addr, config, &quic.Config{}) @@ -72,6 +89,18 @@ func QuicListen(addr string, config *tls.Config) (net.Listener, error) { return ln, err } +func QuicBbrListen(addr string, config *tls.Config) (net.Listener, error) { + config.NextProtos = []string{"gt-quic"} + listener, err := quicbbr.ListenAddr(addr, config, &quicbbr.Config{}) + if err != nil { + panic(err) + } + ln := &QuicBbrListener{ + Listener: listener, + } + return ln, err +} + func (ln *QuicListener) Accept() (net.Conn, error) { conn, _ := ln.Listener.Accept(context.Background()) stream, err := conn.AcceptStream(context.Background()) diff --git a/server/config.go b/server/config.go index bf910103..4829cb8a 100644 --- a/server/config.go +++ b/server/config.go @@ -90,8 +90,9 @@ type Options struct { LogLevel string `yaml:"logLevel" usage:"Log level: trace, debug, info, warn, error, fatal, panic, disable"` Version bool `arg:"version" yaml:"-" usage:"Show the version of this program"` - QuicAddr string `yaml:"quicAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` - AutoAddr string `yaml:"autoAddr" usage:"The address for intelligent Internal penetration to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` + QuicAddr string `yaml:"quicAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` + QuicBbrAddr string `yaml:"quicbbrAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` + AutoAddr string `yaml:"autoAddr" usage:"The address for intelligent Internal penetration to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` } func defaultConfig() Config { diff --git a/server/server.go b/server/server.go index 73e5f051..ac830a51 100644 --- a/server/server.go +++ b/server/server.go @@ -169,6 +169,28 @@ func (s *Server) quicListen() (err error) { return } +func (s *Server) quicBbrListen() (err error) { + var tlsConfig *tls.Config + if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { + tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) + } else { + tlsConfig = connection.GenerateTLSConfig() + } + if err != nil { + return + } + s.quicListener, err = connection.QuicBbrListen(s.config.QuicBbrAddr, tlsConfig) + if err != nil { + err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicBbrAddr, err.Error()) + return + } + s.Logger.Info().Str("QuicAddr", s.quicListener.Addr().String()).Msg("Listening") + go s.acceptLoop(s.quicListener, func(c *conn) { + c.handle(c.handleHTTP) + }) + return +} + func (s *Server) sniListen() (err error) { s.sniListener, err = net.Listen("tcp", s.config.SNIAddr) if err != nil { @@ -305,11 +327,11 @@ func (s *Server) Start() (err error) { } listening = true } - if len(s.config.QuicAddr) > 0 { - if strings.IndexByte(s.config.QuicAddr, ':') == -1 { - s.config.QuicAddr = ":" + s.config.QuicAddr + if len(s.config.QuicBbrAddr) > 0 { + if strings.IndexByte(s.config.QuicBbrAddr, ':') == -1 { + s.config.QuicBbrAddr = ":" + s.config.QuicBbrAddr } - err = s.quicListen() + err = s.quicBbrListen() if err != nil { return } From 3a3e40b861ef576a66594ce6c3ac9090e92d9829 Mon Sep 17 00:00:00 2001 From: Shadow Date: Thu, 28 Sep 2023 21:33:16 +0800 Subject: [PATCH 33/55] Try quic bbr for GT. --- server/server.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/server/server.go b/server/server.go index ac830a51..7c37d9b0 100644 --- a/server/server.go +++ b/server/server.go @@ -327,6 +327,16 @@ func (s *Server) Start() (err error) { } listening = true } + if len(s.config.QuicAddr) > 0 { + if strings.IndexByte(s.config.QuicAddr, ':') == -1 { + s.config.QuicAddr = ":" + s.config.QuicAddr + } + err = s.quicListen() + if err != nil { + return + } + listening = true + } if len(s.config.QuicBbrAddr) > 0 { if strings.IndexByte(s.config.QuicBbrAddr, ':') == -1 { s.config.QuicBbrAddr = ":" + s.config.QuicBbrAddr From 2ec1641aaef3c6a94f42db053b73ed3475971ba0 Mon Sep 17 00:00:00 2001 From: Shadow Date: Thu, 28 Sep 2023 23:37:05 +0800 Subject: [PATCH 34/55] Add quic bbr for GT. --- README.md | 52 +++++++++++++++++++++++++- README_CN.md | 51 +++++++++++++++++++++++++- client/client.go | 56 +++++++++++++++------------- client/config.go | 4 ++ server/config.go | 9 +++-- server/server.go | 95 +++++++++++++++++++++++++++++++----------------- 6 files changed, 200 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index f22bb24e..344d386c 100644 --- a/README.md +++ b/README.md @@ -437,6 +437,8 @@ and apiKeyFile options are not empty, otherwise HTTP is used. ## Performance Test +### GT and frp + Load testing was performed on this project and frp for comparison using wrk. The internal service points to a test page running nginx locally, and the test results are as follows: @@ -448,7 +450,7 @@ Total Number of Cores: 8 (4 performance and 4 efficiency) Memory: 16 GB ``` -### GT benchmark +#### GT benchmark ```shell $ wrk -c 100 -d 30s -t 10 http://pi.example.com:7001 @@ -467,7 +469,7 @@ $ ps aux 2767 0.0 0.1 408703664 17584 s007 S+ 4:55PM 0:52.16 ./server -port 7001 ``` -### frp dev branch 42745a3 +#### frp dev branch 42745a3 ```shell $ wrk -c 100 -d 30s -t 10 http://pi.example.com:7000 @@ -487,6 +489,52 @@ $ ps aux 2976 0.0 0.4 408712832 66112 s005 S+ 5:01PM 1:06.51 ./frpc -c ./frpc.ini ``` +### GT-TCP and GT-QUIC +Conduct stress testing through wrk, and test GT using TPC and QUIC for intranet penetration. The intranet service points +to the HTTP test page running locally. The test results are as follows: + + +```text +System: Ubuntu 22.04 +Chip: Intel i9-12900 +Total Number of Cores: 16 (8 performance and efficiency) +Memory: 32 GB +``` + +#### GT-TCP benchmark + +```shell +$ ./release/linux-amd64-server -addr 12080 -id id1 -secret secret1 +$ ./release/linux-amd64-client -local http://127.0.0.1:80 -remote tcp://id1.example.com:12080 -id id1 -secret secret1 + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080 +Running 30s test @ http://id1.example.com:12080 + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 2.25ms 3.38ms 131.60ms 93.76% + Req/Sec 5.46k 0.97k 24.64k 78.30% + 1631213 requests in 30.10s, 200.68MB read +Requests/sec: 54193.67 +Transfer/sec: 6.67MB +``` + +#### GT-QUIC benchmark + +```shell +$ ./release/linux-amd64-server -addr 12080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 +$ ./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080 +Running 30s test @ http://id1.example.com:12080 + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 1.57ms 3.09ms 89.69ms 95.66% + Req/Sec 9.47k 2.38k 24.98k 82.97% + 2834686 requests in 30.10s, 348.73MB read +Requests/sec: 94176.60 +Transfer/sec: 11.59MB +``` + ## Run ### Docker Container Run diff --git a/README_CN.md b/README_CN.md index 91b5c462..f1533fb7 100644 --- a/README_CN.md +++ b/README_CN.md @@ -414,6 +414,8 @@ apiCertFile 和 apiKeyFile 选项不为空时使用 HTTPS,其他情况使用 H ## 性能测试 +### GT 和 frp + 通过 wrk 进行压力测试本项目与 frp 进行对比,内网服务指向在本地运行 nginx 的测试页面,测试结果如下: ```text @@ -424,7 +426,7 @@ Total Number of Cores: 8 (4 performance and 4 efficiency) Memory: 16 GB ``` -### GT benchmark +#### GT benchmark ```shell $ wrk -c 100 -d 30s -t 10 http://pi.example.com:7001 @@ -443,7 +445,7 @@ $ ps aux 2767 0.0 0.1 408703664 17584 s007 S+ 4:55PM 0:52.16 ./server -port 7001 ``` -### frp dev branch 42745a3 +#### frp dev branch 42745a3 ```shell $ wrk -c 100 -d 30s -t 10 http://pi.example.com:7000 @@ -463,6 +465,51 @@ $ ps aux 2976 0.0 0.4 408712832 66112 s005 S+ 5:01PM 1:06.51 ./frpc -c ./frpc.ini ``` +### GT-TCP 和 GT-QUIC + +通过 wrk 进行压力测试,分别测试以 TPC he QUIC 进行内网穿透的 GT ,内网服务指向在本地运行 HTTP 测试页面,测试结果如下: + +```text +System: Ubuntu 22.04 +Chip: Intel i9-12900 +Total Number of Cores: 16 (8 performance and efficiency) +Memory: 32 GB +``` + +#### GT-TCP benchmark + +```shell +$ ./release/linux-amd64-server -addr 12080 -id id1 -secret secret1 +$ ./release/linux-amd64-client -local http://127.0.0.1:80 -remote tcp://id1.example.com:12080 -id id1 -secret secret1 + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080 +Running 30s test @ http://id1.example.com:12080 + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 2.25ms 3.38ms 131.60ms 93.76% + Req/Sec 5.46k 0.97k 24.64k 78.30% + 1631213 requests in 30.10s, 200.68MB read +Requests/sec: 54193.67 +Transfer/sec: 6.67MB +``` + +#### GT-QUIC benchmark + +```shell +$ ./release/linux-amd64-server -addr 12080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 +$ ./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080 +Running 30s test @ http://id1.example.com:12080 + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 1.57ms 3.09ms 89.69ms 95.66% + Req/Sec 9.47k 2.38k 24.98k 82.97% + 2834686 requests in 30.10s, 348.73MB read +Requests/sec: 94176.60 +Transfer/sec: 11.59MB +``` + ## 运行 ### Docker 容器运行 diff --git a/client/client.go b/client/client.go index 5f23bf92..b88206ee 100644 --- a/client/client.go +++ b/client/client.go @@ -305,33 +305,37 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { } d.host = u.Host d.tlsConfig = tlsConfig - d.dialFn = d.quicDial - case "quicbbr": - if len(u.Port()) < 1 { - u.Host = net.JoinHostPort(u.Host, "443") - } - tlsConfig := &tls.Config{} - if len(c.Config().RemoteCert) > 0 { - var cf []byte - cf, err = os.ReadFile(c.Config().RemoteCert) - if err != nil { - err = fmt.Errorf("failed to read remote cert file (-remoteCert option) '%s', cause %s", c.Config().RemoteCert, err.Error()) - return - } - roots := x509.NewCertPool() - ok := roots.AppendCertsFromPEM(cf) - if !ok { - err = fmt.Errorf("failed to parse remote cert file (-remoteCert option) '%s'", c.Config().RemoteCert) - return - } - tlsConfig.RootCAs = roots - } - if c.Config().RemoteCertInsecure { - tlsConfig.InsecureSkipVerify = true + if c.Config().OpenBBR { + d.dialFn = d.quicBbrDial + } else { + d.dialFn = d.quicDial } - d.host = u.Host - d.tlsConfig = tlsConfig - d.dialFn = d.quicBbrDial + //case "quicbbr": + // if len(u.Port()) < 1 { + // u.Host = net.JoinHostPort(u.Host, "443") + // } + // tlsConfig := &tls.Config{} + // if len(c.Config().RemoteCert) > 0 { + // var cf []byte + // cf, err = os.ReadFile(c.Config().RemoteCert) + // if err != nil { + // err = fmt.Errorf("failed to read remote cert file (-remoteCert option) '%s', cause %s", c.Config().RemoteCert, err.Error()) + // return + // } + // roots := x509.NewCertPool() + // ok := roots.AppendCertsFromPEM(cf) + // if !ok { + // err = fmt.Errorf("failed to parse remote cert file (-remoteCert option) '%s'", c.Config().RemoteCert) + // return + // } + // tlsConfig.RootCAs = roots + // } + // if c.Config().RemoteCertInsecure { + // tlsConfig.InsecureSkipVerify = true + // } + // d.host = u.Host + // d.tlsConfig = tlsConfig + // d.dialFn = d.quicBbrDial default: err = fmt.Errorf("remote url (-remote option) '%s' is invalid", remote) } diff --git a/client/config.go b/client/config.go index c1f81f4c..8f48a640 100644 --- a/client/config.go +++ b/client/config.go @@ -80,6 +80,8 @@ type Options struct { Version bool `arg:"version" yaml:"-" usage:"Show the version of this program"` Signal string `arg:"s" yaml:"-" usage:"Send signal to client processes. Supports values: reload, restart, stop, kill"` + + OpenBBR bool `yaml:"bbr" usage:"Use bbr as congestion control algorithm when GT use QUIC connection. Default algorithm is Cubic."` } func defaultConfig() Config { @@ -101,6 +103,8 @@ func defaultConfig() Config { LogFileMaxCount: 7, LogFileMaxSize: 512 * 1024 * 1024, LogLevel: zerolog.InfoLevel.String(), + + OpenBBR: false, }, } } diff --git a/server/config.go b/server/config.go index 4829cb8a..da2f5a85 100644 --- a/server/config.go +++ b/server/config.go @@ -90,9 +90,10 @@ type Options struct { LogLevel string `yaml:"logLevel" usage:"Log level: trace, debug, info, warn, error, fatal, panic, disable"` Version bool `arg:"version" yaml:"-" usage:"Show the version of this program"` - QuicAddr string `yaml:"quicAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` - QuicBbrAddr string `yaml:"quicbbrAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` - AutoAddr string `yaml:"autoAddr" usage:"The address for intelligent Internal penetration to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` + QuicAddr string `yaml:"quicAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` + //QuicBbrAddr string `yaml:"quicbbrAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` + AutoAddr string `yaml:"autoAddr" usage:"The address for intelligent Internal penetration to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` + OpenBBR bool `yaml:"bbr" usage:"Use bbr as congestion control algorithm when GT use QUIC connection. Default algorithm is Cubic."` } func defaultConfig() Config { @@ -119,6 +120,8 @@ func defaultConfig() Config { HostNumber: 0, MaxHandShakeOptions: 30, + + OpenBBR: false, }, } } diff --git a/server/server.go b/server/server.go index 7c37d9b0..9c558e15 100644 --- a/server/server.go +++ b/server/server.go @@ -147,7 +147,29 @@ func (s *Server) listen() (err error) { return } -func (s *Server) quicListen() (err error) { +//func (s *Server) quicListen() (err error) { +// var tlsConfig *tls.Config +// if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { +// tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) +// } else { +// tlsConfig = connection.GenerateTLSConfig() +// } +// if err != nil { +// return +// } +// s.quicListener, err = connection.QuicListen(s.config.QuicAddr, tlsConfig) +// if err != nil { +// err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicAddr, err.Error()) +// return +// } +// s.Logger.Info().Str("QuicAddr", s.quicListener.Addr().String()).Msg("Listening") +// go s.acceptLoop(s.quicListener, func(c *conn) { +// c.handle(c.handleHTTP) +// }) +// return +//} + +func (s *Server) quicListen(openBBR bool) (err error) { var tlsConfig *tls.Config if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) @@ -157,31 +179,14 @@ func (s *Server) quicListen() (err error) { if err != nil { return } - s.quicListener, err = connection.QuicListen(s.config.QuicAddr, tlsConfig) - if err != nil { - err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicAddr, err.Error()) - return - } - s.Logger.Info().Str("QuicAddr", s.quicListener.Addr().String()).Msg("Listening") - go s.acceptLoop(s.quicListener, func(c *conn) { - c.handle(c.handleHTTP) - }) - return -} - -func (s *Server) quicBbrListen() (err error) { - var tlsConfig *tls.Config - if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { - tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) + if openBBR { + s.quicListener, err = connection.QuicBbrListen(s.config.QuicAddr, tlsConfig) } else { - tlsConfig = connection.GenerateTLSConfig() + fmt.Printf("default is not open bbr") + s.quicListener, err = connection.QuicListen(s.config.QuicAddr, tlsConfig) } if err != nil { - return - } - s.quicListener, err = connection.QuicBbrListen(s.config.QuicBbrAddr, tlsConfig) - if err != nil { - err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicBbrAddr, err.Error()) + err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicAddr, err.Error()) return } s.Logger.Info().Str("QuicAddr", s.quicListener.Addr().String()).Msg("Listening") @@ -191,6 +196,28 @@ func (s *Server) quicBbrListen() (err error) { return } +//func (s *Server) quicBbrListen() (err error) { +// var tlsConfig *tls.Config +// if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { +// tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) +// } else { +// tlsConfig = connection.GenerateTLSConfig() +// } +// if err != nil { +// return +// } +// s.quicListener, err = connection.QuicBbrListen(s.config.QuicBbrAddr, tlsConfig) +// if err != nil { +// err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicBbrAddr, err.Error()) +// return +// } +// s.Logger.Info().Str("QuicBBRAddr", s.quicListener.Addr().String()).Msg("Listening") +// go s.acceptLoop(s.quicListener, func(c *conn) { +// c.handle(c.handleHTTP) +// }) +// return +//} + func (s *Server) sniListen() (err error) { s.sniListener, err = net.Listen("tcp", s.config.SNIAddr) if err != nil { @@ -331,22 +358,22 @@ func (s *Server) Start() (err error) { if strings.IndexByte(s.config.QuicAddr, ':') == -1 { s.config.QuicAddr = ":" + s.config.QuicAddr } - err = s.quicListen() - if err != nil { - return - } - listening = true - } - if len(s.config.QuicBbrAddr) > 0 { - if strings.IndexByte(s.config.QuicBbrAddr, ':') == -1 { - s.config.QuicBbrAddr = ":" + s.config.QuicBbrAddr - } - err = s.quicBbrListen() + err = s.quicListen(s.config.OpenBBR) if err != nil { return } listening = true } + //if len(s.config.QuicBbrAddr) > 0 { + // if strings.IndexByte(s.config.QuicBbrAddr, ':') == -1 { + // s.config.QuicBbrAddr = ":" + s.config.QuicBbrAddr + // } + // err = s.quicBbrListen() + // if err != nil { + // return + // } + // listening = true + //} if len(s.config.Addr) > 0 { if strings.IndexByte(s.config.Addr, ':') == -1 { s.config.Addr = ":" + s.config.Addr From 28a5129256a7bc9bab98f7be4e2760b0dfe1a759 Mon Sep 17 00:00:00 2001 From: Shadow Date: Thu, 28 Sep 2023 23:57:35 +0800 Subject: [PATCH 35/55] Complete quic bbr for GT. --- README_CN.md | 3 ++- client/client.go | 26 ----------------------- server/server.go | 55 ------------------------------------------------ 3 files changed, 2 insertions(+), 82 deletions(-) diff --git a/README_CN.md b/README_CN.md index f1533fb7..f7242ae7 100644 --- a/README_CN.md +++ b/README_CN.md @@ -312,7 +312,8 @@ options: - 需求:有一台内网服务器和一台公网服务器,id1.example.com 解析到公网服务器的地址。希望通过访问 id1.example.com:8080 来访问内网服务器上 80 端口服务的网页。使用 QUIC 为客户端与服务端之间构建传输连接,QUIC 使用 TLS 1.3 进行传输加密。当用户同时给出certFile - 和keyFile时,使用他们进行加密通信。否则,会使用 ECDSA 加密算法自动生成密钥和证书。 + 和keyFile时,使用他们进行加密通信。否则,会使用 ECDSA 加密算法自动生成密钥和证书。默认的拥塞控制算法为 Cubic 算法, 当客户端和用户端同时 + 使用 `-bbr` 选项时,使用 bbr 作为拥塞控制算法。 - 服务端(公网服务器) diff --git a/client/client.go b/client/client.go index b88206ee..dbb640f7 100644 --- a/client/client.go +++ b/client/client.go @@ -310,32 +310,6 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { } else { d.dialFn = d.quicDial } - //case "quicbbr": - // if len(u.Port()) < 1 { - // u.Host = net.JoinHostPort(u.Host, "443") - // } - // tlsConfig := &tls.Config{} - // if len(c.Config().RemoteCert) > 0 { - // var cf []byte - // cf, err = os.ReadFile(c.Config().RemoteCert) - // if err != nil { - // err = fmt.Errorf("failed to read remote cert file (-remoteCert option) '%s', cause %s", c.Config().RemoteCert, err.Error()) - // return - // } - // roots := x509.NewCertPool() - // ok := roots.AppendCertsFromPEM(cf) - // if !ok { - // err = fmt.Errorf("failed to parse remote cert file (-remoteCert option) '%s'", c.Config().RemoteCert) - // return - // } - // tlsConfig.RootCAs = roots - // } - // if c.Config().RemoteCertInsecure { - // tlsConfig.InsecureSkipVerify = true - // } - // d.host = u.Host - // d.tlsConfig = tlsConfig - // d.dialFn = d.quicBbrDial default: err = fmt.Errorf("remote url (-remote option) '%s' is invalid", remote) } diff --git a/server/server.go b/server/server.go index 9c558e15..26087443 100644 --- a/server/server.go +++ b/server/server.go @@ -147,28 +147,6 @@ func (s *Server) listen() (err error) { return } -//func (s *Server) quicListen() (err error) { -// var tlsConfig *tls.Config -// if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { -// tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) -// } else { -// tlsConfig = connection.GenerateTLSConfig() -// } -// if err != nil { -// return -// } -// s.quicListener, err = connection.QuicListen(s.config.QuicAddr, tlsConfig) -// if err != nil { -// err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicAddr, err.Error()) -// return -// } -// s.Logger.Info().Str("QuicAddr", s.quicListener.Addr().String()).Msg("Listening") -// go s.acceptLoop(s.quicListener, func(c *conn) { -// c.handle(c.handleHTTP) -// }) -// return -//} - func (s *Server) quicListen(openBBR bool) (err error) { var tlsConfig *tls.Config if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { @@ -182,7 +160,6 @@ func (s *Server) quicListen(openBBR bool) (err error) { if openBBR { s.quicListener, err = connection.QuicBbrListen(s.config.QuicAddr, tlsConfig) } else { - fmt.Printf("default is not open bbr") s.quicListener, err = connection.QuicListen(s.config.QuicAddr, tlsConfig) } if err != nil { @@ -196,28 +173,6 @@ func (s *Server) quicListen(openBBR bool) (err error) { return } -//func (s *Server) quicBbrListen() (err error) { -// var tlsConfig *tls.Config -// if len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { -// tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) -// } else { -// tlsConfig = connection.GenerateTLSConfig() -// } -// if err != nil { -// return -// } -// s.quicListener, err = connection.QuicBbrListen(s.config.QuicBbrAddr, tlsConfig) -// if err != nil { -// err = fmt.Errorf("can not listen on addr '%s', cause %s, please check option 'addr'", s.config.QuicBbrAddr, err.Error()) -// return -// } -// s.Logger.Info().Str("QuicBBRAddr", s.quicListener.Addr().String()).Msg("Listening") -// go s.acceptLoop(s.quicListener, func(c *conn) { -// c.handle(c.handleHTTP) -// }) -// return -//} - func (s *Server) sniListen() (err error) { s.sniListener, err = net.Listen("tcp", s.config.SNIAddr) if err != nil { @@ -364,16 +319,6 @@ func (s *Server) Start() (err error) { } listening = true } - //if len(s.config.QuicBbrAddr) > 0 { - // if strings.IndexByte(s.config.QuicBbrAddr, ':') == -1 { - // s.config.QuicBbrAddr = ":" + s.config.QuicBbrAddr - // } - // err = s.quicBbrListen() - // if err != nil { - // return - // } - // listening = true - //} if len(s.config.Addr) > 0 { if strings.IndexByte(s.config.Addr, ':') == -1 { s.config.Addr = ":" + s.config.Addr From ef2a894a3ae20005ce4c8a10758e85a9f87d3297 Mon Sep 17 00:00:00 2001 From: Shadow Date: Fri, 29 Sep 2023 00:45:17 +0800 Subject: [PATCH 36/55] Complete intelligent switch for GT. --- client/client.go | 16 ++-------------- conn/quicConn.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/client/client.go b/client/client.go index dbb640f7..cf5cda90 100644 --- a/client/client.go +++ b/client/client.go @@ -46,7 +46,6 @@ import ( "github.com/isrc-cas/gt/pool" "github.com/isrc-cas/gt/predef" "github.com/isrc-cas/gt/util" - probing "github.com/prometheus-community/pro-bing" "github.com/shirou/gopsutil/process" ) @@ -255,19 +254,8 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { d.tlsConfig = tlsConfig fmt.Println("GT is waiting for probes to get network conditions!") - pureAddr, _, _ := net.SplitHostPort(d.host) - pinger, err := probing.NewPinger(pureAddr) - if err != nil { - panic(err) - } - pinger.Count = 10 - err = pinger.Run() - if err != nil { - panic(err) - } - stats := pinger.Statistics() - avgRtt := float64(stats.AvgRtt.Microseconds()) / 1000 - pktLoss := stats.PacketLoss + + avgRtt, pktLoss := connection.GetAutoProbesResults(d.host) var networkCondition = []float64{0, 0, 0, 0, avgRtt, pktLoss, 0, 0, 0, 0} result := connection.PredictWithRttAndLoss(networkCondition) diff --git a/conn/quicConn.go b/conn/quicConn.go index 779191cf..b53c5ef9 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -8,10 +8,14 @@ import ( "crypto/tls" "crypto/x509" "encoding/pem" + "fmt" quicbbr "github.com/DrakenLibra/gt-bbr" + probing "github.com/prometheus-community/pro-bing" "github.com/quic-go/quic-go" "math/big" "net" + "sync" + "sync/atomic" ) type QuicConnection struct { @@ -147,3 +151,40 @@ func GenerateTLSConfig() *tls.Config { NextProtos: []string{"gt-quic"}, } } + +func GetAutoProbesResults(addr string) (avgRtt, pktLoss float64) { + pureAddr, _, _ := net.SplitHostPort(addr) + totalNum := 100 + + var wg sync.WaitGroup + wg.Add(totalNum) + + var totalLossRate int64 = 0 + var totalDelay int64 = 0 + for i := 0; i < totalNum; i++ { + go func() { + pinger, err := probing.NewPinger(pureAddr) + if err != nil { + panic(err) + } + pinger.Count = 3 + err = pinger.Run() + if err != nil { + panic(err) + } + stats := pinger.Statistics() + avgRtt := stats.AvgRtt.Microseconds() + pktLoss := int64(stats.PacketLoss * 100) + fmt.Println(avgRtt, pktLoss) + atomic.AddInt64(&totalLossRate, pktLoss) + atomic.AddInt64(&totalDelay, avgRtt) + wg.Done() + }() + } + wg.Wait() + + avgRtt = float64(atomic.LoadInt64(&totalDelay)) / (float64(1000 * totalNum)) + pktLoss = float64(atomic.LoadInt64(&totalLossRate)) / float64(totalNum*100) + + return +} From 60aae8ecb1fa30c8e631cd0b73d6eabfd54e1c21 Mon Sep 17 00:00:00 2001 From: Shadow Date: Fri, 29 Sep 2023 00:54:59 +0800 Subject: [PATCH 37/55] Complete guideline for GT. --- README.md | 3 +- README_CN.md | 3 +- conn/quicConn.go | 2 - test/quic_test.go | 96 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 344d386c..c541f53d 100644 --- a/README.md +++ b/README.md @@ -347,7 +347,8 @@ options: #### Intelligent Internal Penetration (Adaptive Selection of TCP/QUIC) - Requirements: There is an intranet server and a public network server, and id1.example.com resolves to the address of the public network server. Hopefully by accessing id1.example.com:8080 - To access the web page served by port 80 on the intranet server. GT adaptively selects whether to use TCP+TLS or QUIC for intranet penetration based on the network delay and packet loss rate between the intranet server and the public network server. + To access the web page served by port 80 on the intranet server. GT client sends multiple sets of network status detection probes concurrently to obtain the network delay and packet loss rate between the intranet server and the public network server. + Input the trained XGBoost model to obtain the results, and adaptively select whether to use TCP+TLS or QUIC for intranet penetration. - Server (public network server) diff --git a/README_CN.md b/README_CN.md index f7242ae7..f424b1fd 100644 --- a/README_CN.md +++ b/README_CN.md @@ -330,7 +330,8 @@ options: #### 智能内网穿透(自适应选择 TCP/QUIC ) - 需求:有一台内网服务器和一台公网服务器,id1.example.com 解析到公网服务器的地址。希望通过访问 id1.example.com:8080 - 来访问内网服务器上 80 端口服务的网页。GT根据内网服务器和公网服务器之间网络的时延和丢包率,自适应选择使用 TCP+TLS 还是 QUIC 进行内网穿透。 + 来访问内网服务器上 80 端口服务的网页。GT client 并发发送多组网络状况探测探针,获取内网服务器和公网服务器之间网络的时延和丢包率, + 输入训练好的XGBoost模型获取结果,自适应选择使用 TCP+TLS 还是 QUIC 进行内网穿透。 - 服务端(公网服务器) diff --git a/conn/quicConn.go b/conn/quicConn.go index b53c5ef9..6a7e6cbd 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -8,7 +8,6 @@ import ( "crypto/tls" "crypto/x509" "encoding/pem" - "fmt" quicbbr "github.com/DrakenLibra/gt-bbr" probing "github.com/prometheus-community/pro-bing" "github.com/quic-go/quic-go" @@ -175,7 +174,6 @@ func GetAutoProbesResults(addr string) (avgRtt, pktLoss float64) { stats := pinger.Statistics() avgRtt := stats.AvgRtt.Microseconds() pktLoss := int64(stats.PacketLoss * 100) - fmt.Println(avgRtt, pktLoss) atomic.AddInt64(&totalLossRate, pktLoss) atomic.AddInt64(&totalDelay, avgRtt) wg.Done() diff --git a/test/quic_test.go b/test/quic_test.go index 611c3487..71e06578 100644 --- a/test/quic_test.go +++ b/test/quic_test.go @@ -103,3 +103,99 @@ func TestQuic(t *testing.T) { t.Logf("%s", all) s.Shutdown() } + +func TestQuicBbr(t *testing.T) { + t.Parallel() + mux := http.NewServeMux() + mux.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) { + err := request.ParseForm() + if err != nil { + panic(err) + } + if request.FormValue("hello") != "world" { + writer.WriteHeader(http.StatusBadRequest) + return + } + _, err = writer.Write([]byte("ok")) + if err != nil { + panic(err) + } + }) + hs := &http.Server{Handler: mux} + l, err := net.Listen("tcp", "127.0.0.1:12080") + if err != nil { + t.Fatal(err) + } + defer func() { + err := hs.Close() + if err != nil { + t.Fatal(err) + } + }() + go func() { + err := hs.Serve(l) + if err != nil && !errors.Is(err, http.ErrServerClosed) { + panic(err) + } + }() + + s, err := setupServer([]string{ + "server", + "-addr", "127.0.0.1:8080", + "-quicAddr", "127.0.0.1:10080", + "-id", "05797ac9-86ae-40b0-b767-7a41e03a5486", + "-secret", "eec1eabf-2c59-4e19-bf10-34707c17ed89", + "-timeout", "10s", + "-bbr", + }, nil) + if err != nil { + t.Fatal(err) + } + defer s.Close() + c, err := setupClient([]string{ + "client", + "-id", "05797ac9-86ae-40b0-b767-7a41e03a5486", + "-secret", "eec1eabf-2c59-4e19-bf10-34707c17ed89", + "-local", "http://" + l.Addr().String(), + "-remote", fmt.Sprintf("quic://%v", s.GetQuicListenerAddrPort()), + "-remoteTimeout", "5s", + "-bbr", + }, nil) + if err != nil { + t.Fatal(err) + } + defer c.Close() + c.OnTunnelClose.Store(func() { + panic("tunnel should not be closed") + }) + + conn, err := net.Dial("tcp", s.GetListenerAddrPort().String()) + if err != nil { + t.Fatal(err) + } + _, err = conn.Write([]byte("GET ")) + if err != nil { + t.Fatal(err) + } + time.Sleep(12 * time.Second) + + httpClient := setupHTTPClient(s.GetListenerAddrPort().String(), nil) + resp, err := httpClient.Get("http://05797ac9-86ae-40b0-b767-7a41e03a5486.example.com/test?hello=world") + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + t.Fatal("invalid status code") + } + all, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + if string(all) != "ok" { + t.Fatal("invalid resp") + } + c.OnTunnelClose.Store(func() {}) + t.Logf("%s", all) + s.Shutdown() +} From bf24b8650680c5f48e0e5f17146aaab4d3c564df Mon Sep 17 00:00:00 2001 From: Shadow Date: Fri, 29 Sep 2023 01:03:05 +0800 Subject: [PATCH 38/55] fix container.yaml --- .DS_Store | Bin 0 -> 6148 bytes .github/.DS_Store | Bin 0 -> 6148 bytes .github/workflows/.DS_Store | Bin 0 -> 6148 bytes .github/workflows/container.yml | 468 ++++++++++++++++---------------- 4 files changed, 234 insertions(+), 234 deletions(-) create mode 100644 .DS_Store create mode 100644 .github/.DS_Store create mode 100644 .github/workflows/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e3126b618df3d3221a5011ad21ddd8c0b28a21e6 GIT binary patch literal 6148 zcmeHK%}T>S5T3QwG!&r+MUM+!i`G(+;w9Aj0!H+pQX5j*V9b^_HHT8jRbR+A@p+ut z-GJ4CHxWAnyWi~m>}Ed5{s4gJ%)(=U8UR$V5eiaP2$@&9Hf%7V&~uDn20@Tb$3eVe zqQ7XOZ+GAjh7dstpT1uO=y?mqaWqXEjd!t8DsOH%j_XvNdw--dKkcWpX{SHArO}mA zaZu>};5r&)z1q&XO45Fm3?@1u3I`Z+cM~O{$~tP6gj1dC8;9#w++J;OK0i6F%Vw*! zsLOe~*{I7_ySZ4nmED7*v&-IN{FJB{!=ymcwQO4~;1!iGMLqkIBv#1~Jw;X#&BzQe z1Iz$3ux1R{gP>Afv%0xlW`G&^nE~1#BsN0NVs21x9oW(Jnfzr!64dD}K`1SH7ITB> zK@lbu(WDCd#1JMO?b6117IT9p9fV#P=dmjnj~Ag=N4wPFAUuQIGXu=PG6N+utkL;@ zfxpbkNB(jOkC*{w;GZ!d%3Z(P!J_Qh`mH=VYbCY^Y$OzylY)Z!(j@=~w2$m-r}0bD aG0wA?8>CstuG10uBA^N3jv4p`20j3_9!ux| literal 0 HcmV?d00001 diff --git a/.github/.DS_Store b/.github/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..418a5dfd165c409a8028b8f33395121a14b96993 GIT binary patch literal 6148 zcmeHK%}N6?5T3Nvb}2#+iXH=A3)WJR;$^Az1zgdCO5J6vE?qaJ+q#ER*sH#fZ{qVf zlcZv41y3S&1}0xJKO6F8$s_5>$zg;3~k+(QfsGDw4L zDVhy`kpbE}2X{=t2nO(F|I%R)s{p-k!7z@}aij4r3dPdKX1VN?tL0noQDxrPA5YSb zKf0#Tg;H@a@B6`J)X#dg?NgPE{V3^=bV3yNG34edNm%8{ezS9-XMNT)Qe$L;E$(e%ie{TB7s?DU13zVe&IgG~=vvGT>Z1c2x;~P>L`Z^tdP@*W zi>}4oAbL=QNkufN!agyCNk_Z1ajwPOph*XzXU6Z?nT36!2t7O6r49$-8swH4Ui^mI@BhUl9x(&Vz`tTZl)7HGgG;itb!l-_YbEL(Dhb8q20v4H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0> $GITHUB_ENV + shell: bash - - run: echo "GITHUB_REPOSITORY_NAME=${GITHUB_REPOSITORY#*/}" >> $GITHUB_ENV - shell: bash + - name: Inspect builder + run: | + echo "Name: ${{ steps.buildx.outputs.name }}" + echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" + echo "Status: ${{ steps.buildx.outputs.status }}" + echo "Flags: ${{ steps.buildx.outputs.flags }}" + echo "Platforms: ${{ steps.buildx.outputs.platforms }}" - - name: Inspect builder - run: | - echo "Name: ${{ steps.buildx.outputs.name }}" - echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" - echo "Status: ${{ steps.buildx.outputs.status }}" - echo "Flags: ${{ steps.buildx.outputs.flags }}" - echo "Platforms: ${{ steps.buildx.outputs.platforms }}" + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} -# - name: Log into registry ${{ env.REGISTRY }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.REGISTRY }} -# username: ${{ github.actor }} -# password: ${{ secrets.GITHUB_TOKEN }} -# -# - name: Log into registry ${{ env.EULIX_REGISTRY }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.EULIX_REGISTRY }} -# username: ${{ secrets.EULIX_REGISTRY_USERNAME }} -# password: ${{ secrets.EULIX_REGISTRY_PASSWORD }} -# -# - name: Log into registry Docker Hub -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# username: ${{ secrets.DOCKER_HUB_REGISTRY_USERNAME }} -# password: ${{ secrets.DOCKER_HUB_REGISTRY_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SH }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_SH }} -# username: cn-east-3@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_BJ }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_BJ }} -# username: cn-north-4@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_GZ }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_GZ }} -# username: cn-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SG }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_SG }} -# username: ap-southeast-3@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_HK }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_HK }} -# username: ap-southeast-1@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_AF }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_AF }} -# username: af-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_LA }} -# if: github.event_name != 'pull_request' -# uses: docker/login-action@v2 -# with: -# registry: ${{ env.HUAWEICLOUD_REGISTRY_LA }} -# username: la-north-2@${{ secrets.HUAWEICLOUD_USERNAME }} -# password: ${{ secrets.HUAWEICLOUD_PASSWORD }} -# -# - name: Extract Docker metadata for Server -# id: meta-server -# uses: docker/metadata-action@v2 -# with: -# images: | -# ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} -# ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} -# aospace/${{ env.GITHUB_REPOSITORY_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} -# flavor: | -# prefix=server- -# -# - name: Build and push Docker image for Server -# id: build-and-push-server -# uses: docker/build-push-action@v4.2.1 -# with: -# context: . -# push: ${{ github.event_name != 'pull_request' }} -# tags: ${{ steps.meta-server.outputs.tags }} -# labels: ${{ steps.meta-server.outputs.labels }} -# builder: ${{ steps.buildx.outputs.name }} -# platforms: linux/amd64,linux/arm64 -# cache-from: type=gha -# cache-to: type=gha,mode=max -# file: Dockerfile-server -# provenance: false -# -# - name: Extract Docker metadata for Client -# id: meta-client -# uses: docker/metadata-action@v2 -# with: -# images: | -# ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} -# ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} -# aospace/${{ env.GITHUB_REPOSITORY_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} -# ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} -# flavor: | -# prefix=client- -# -# - name: Build and push Docker image for Client -# id: build-and-push-client -# uses: docker/build-push-action@v4.2.1 -# with: -# context: . -# push: ${{ github.event_name != 'pull_request' }} -# tags: ${{ steps.meta-client.outputs.tags }} -# labels: ${{ steps.meta-client.outputs.labels }} -# builder: ${{ steps.buildx.outputs.name }} -# platforms: linux/amd64,linux/arm64 -# cache-from: type=gha -# cache-to: type=gha,mode=max -# file: Dockerfile-client -# provenance: false -# -# - name: Extract Docker metadata for Server -# id: meta-opensource-server -# uses: docker/metadata-action@v2 -# with: -# images: | -# ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-server -# flavor: | -# prefix=opensource-server- -# -# - name: Build and push Docker image for Server -# id: build-and-push-opensource-server -# uses: docker/build-push-action@v2 -# with: -# context: . -# push: ${{ github.event_name != 'pull_request' }} -# tags: ${{ steps.meta-opensource-server.outputs.tags }} -# labels: ${{ steps.meta-opensource-server.outputs.labels }} -# builder: ${{ steps.buildx.outputs.name }} -# platforms: linux/amd64,linux/arm64 -# cache-from: type=gha -# cache-to: type=gha,mode=max -# file: Dockerfile-server -# -# - name: Extract Docker metadata for Client -# id: meta-opensource-client -# uses: docker/metadata-action@v2 -# with: -# images: | -# ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-client -# flavor: | -# prefix=opensource-client- -# -# - name: Build and push Docker image for Client -# id: build-and-push-opensource-client -# uses: docker/build-push-action@v2 -# with: -# context: . -# push: ${{ github.event_name != 'pull_request' }} -# tags: ${{ steps.meta-opensource-client.outputs.tags }} -# labels: ${{ steps.meta-opensource-client.outputs.labels }} -# builder: ${{ steps.buildx.outputs.name }} -# platforms: linux/amd64,linux/arm64 -# cache-from: type=gha -# cache-to: type=gha,mode=max -# file: Dockerfile-client \ No newline at end of file + - name: Log into registry ${{ env.EULIX_REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.EULIX_REGISTRY }} + username: ${{ secrets.EULIX_REGISTRY_USERNAME }} + password: ${{ secrets.EULIX_REGISTRY_PASSWORD }} + + - name: Log into registry Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_REGISTRY_USERNAME }} + password: ${{ secrets.DOCKER_HUB_REGISTRY_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SH }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_SH }} + username: cn-east-3@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_BJ }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_BJ }} + username: cn-north-4@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_GZ }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_GZ }} + username: cn-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_SG }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_SG }} + username: ap-southeast-3@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_HK }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_HK }} + username: ap-southeast-1@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_AF }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_AF }} + username: af-south-1@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Log into registry ${{ env.HUAWEICLOUD_REGISTRY_LA }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ${{ env.HUAWEICLOUD_REGISTRY_LA }} + username: la-north-2@${{ secrets.HUAWEICLOUD_USERNAME }} + password: ${{ secrets.HUAWEICLOUD_PASSWORD }} + + - name: Extract Docker metadata for Server + id: meta-server + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} + aospace/${{ env.GITHUB_REPOSITORY_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} + flavor: | + prefix=server- + + - name: Build and push Docker image for Server + id: build-and-push-server + uses: docker/build-push-action@v4.2.1 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-server.outputs.tags }} + labels: ${{ steps.meta-server.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-server + provenance: false + + - name: Extract Docker metadata for Client + id: meta-client + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + ${{ env.EULIX_REGISTRY }}/${{ env.IMAGE_NAME }} + aospace/${{ env.GITHUB_REPOSITORY_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SH }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_BJ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_GZ }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_HK }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_SG }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_AF }}/${{ env.IMAGE_NAME }} + ${{ env.HUAWEICLOUD_REGISTRY_LA }}/${{ env.IMAGE_NAME }} + flavor: | + prefix=client- + + - name: Build and push Docker image for Client + id: build-and-push-client + uses: docker/build-push-action@v4.2.1 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-client.outputs.tags }} + labels: ${{ steps.meta-client.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-client + provenance: false + + - name: Extract Docker metadata for Server + id: meta-opensource-server + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-server + flavor: | + prefix=opensource-server- + + - name: Build and push Docker image for Server + id: build-and-push-opensource-server + uses: docker/build-push-action@v2 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-opensource-server.outputs.tags }} + labels: ${{ steps.meta-opensource-server.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-server + + - name: Extract Docker metadata for Client + id: meta-opensource-client + uses: docker/metadata-action@v2 + with: + images: | + ${{ env.EULIX_REGISTRY }}/cicada-private/aonetwork-client + flavor: | + prefix=opensource-client- + + - name: Build and push Docker image for Client + id: build-and-push-opensource-client + uses: docker/build-push-action@v2 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta-opensource-client.outputs.tags }} + labels: ${{ steps.meta-opensource-client.outputs.labels }} + builder: ${{ steps.buildx.outputs.name }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + file: Dockerfile-client From 339624a60263e5c5c403bd151ac8c2e8c5fd0e37 Mon Sep 17 00:00:00 2001 From: Shadow Date: Fri, 29 Sep 2023 01:05:17 +0800 Subject: [PATCH 39/55] fix .DS_Store caused by macbook finder --- .github/workflows/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/workflows/.DS_Store diff --git a/.github/workflows/.DS_Store b/.github/workflows/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Fri, 29 Sep 2023 01:06:48 +0800 Subject: [PATCH 40/55] fix .DS_Store caused by macbook finder --- .DS_Store => .github/workflows/.DS_Store | Bin 6148 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) rename .DS_Store => .github/workflows/.DS_Store (90%) diff --git a/.DS_Store b/.github/workflows/.DS_Store similarity index 90% rename from .DS_Store rename to .github/workflows/.DS_Store index e3126b618df3d3221a5011ad21ddd8c0b28a21e6..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 100644 GIT binary patch delta 70 zcmZoMXfc=|#>AjHu~2NHo+1YW5HK<@2yA9#Vq@DZz_f~SGdl-A2T%b}B`mF;Q%yo}wrd0|Nsi1A_nqLk2@BLsC+CaY0hf#Kh(GAPIH`J%)6K zOokF<$^0as%=V;$oXp}91A}XfOw25-Z0ziu?A+|J!5R7G!6k_$rNvH(MbRK$NPd1! z5{#Xg6qcD<9xou`oS#>cn3+04zs%>fLqjfvlxC-aLavVy`zVX~o!@MaH@ GJ Date: Fri, 29 Sep 2023 01:09:50 +0800 Subject: [PATCH 41/55] .DS_Store banished! --- .github/.DS_Store => .DS_Store | Bin 6148 -> 6148 bytes .github/workflows/.DS_Store | Bin 6148 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/.DS_Store => .DS_Store (90%) delete mode 100644 .github/workflows/.DS_Store diff --git a/.github/.DS_Store b/.DS_Store similarity index 90% rename from .github/.DS_Store rename to .DS_Store index 418a5dfd165c409a8028b8f33395121a14b96993..e3126b618df3d3221a5011ad21ddd8c0b28a21e6 100644 GIT binary patch delta 110 zcmZoMXfc=|#>B`mu~2NHo;G&|Ln%X2Qh9MfQqIJ}<&zCWSoql)^cd0^G8sx3z><@d vn2w=~ZT`)~!@9A7gK;xE2R{eUw9SId-B)qu~2NHo;G(HLk>eeLpeinQu$^^rsa&24MbRkIe`NC3`Gpt3~=em za*W61v51!i7v<&T=cO|+FfcA=WMbXS&cV+CG#+T!cjn3bB9H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Fri, 29 Sep 2023 01:11:06 +0800 Subject: [PATCH 42/55] Delete .DS_Store --- .DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index e3126b618df3d3221a5011ad21ddd8c0b28a21e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5T3QwG!&r+MUM+!i`G(+;w9Aj0!H+pQX5j*V9b^_HHT8jRbR+A@p+ut z-GJ4CHxWAnyWi~m>}Ed5{s4gJ%)(=U8UR$V5eiaP2$@&9Hf%7V&~uDn20@Tb$3eVe zqQ7XOZ+GAjh7dstpT1uO=y?mqaWqXEjd!t8DsOH%j_XvNdw--dKkcWpX{SHArO}mA zaZu>};5r&)z1q&XO45Fm3?@1u3I`Z+cM~O{$~tP6gj1dC8;9#w++J;OK0i6F%Vw*! zsLOe~*{I7_ySZ4nmED7*v&-IN{FJB{!=ymcwQO4~;1!iGMLqkIBv#1~Jw;X#&BzQe z1Iz$3ux1R{gP>Afv%0xlW`G&^nE~1#BsN0NVs21x9oW(Jnfzr!64dD}K`1SH7ITB> zK@lbu(WDCd#1JMO?b6117IT9p9fV#P=dmjnj~Ag=N4wPFAUuQIGXu=PG6N+utkL;@ zfxpbkNB(jOkC*{w;GZ!d%3Z(P!J_Qh`mH=VYbCY^Y$OzylY)Z!(j@=~w2$m-r}0bD aG0wA?8>CstuG10uBA^N3jv4p`20j3_9!ux| From dc4fd7ac6b231bc954358cdfdad8a6fe95fda53b Mon Sep 17 00:00:00 2001 From: Shadow Date: Sun, 1 Oct 2023 00:08:31 +0800 Subject: [PATCH 43/55] Add explanations for xgboost model. --- conn/quicXgboost.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/conn/quicXgboost.go b/conn/quicXgboost.go index c3a5ece2..4ac2c535 100644 --- a/conn/quicXgboost.go +++ b/conn/quicXgboost.go @@ -1,6 +1,17 @@ // 基于网络数据训练的XGBOOST模型,通过输入10种网络参数来判断在TCP和QUIC之间进行切换 // 其中,第5个参数是Average RTT,第6个参数是Retransmission Rate(也就是Loss Rate) -// 我目前只用了这两个参数,并且将其他参数设置为中间值(归一化后为0.5) +// input的是个参数分别为以下内容: +// (1)Conn_num:建立的连接connection的数量; +// (2)Ttfb_rate:Ttfb/Ttfb_avg; +// (3)Duration:统计网络情况的时间窗口长度; +// (4)Ttfb:单向延迟,从cline发包到server接受; +// (5)Rtt:平均往返时延; +// (6)Retran:重传率,约等于丢包率; +// (7)Sends:每秒接受的HTTP请求数; +// (8)Body_recv:每秒接受的THHP请求的字节数; +// (9)Ttfb_avg:平均单项延迟; +// (10)Performance:每秒接受的字节数; + package conn import "math" From fa272508dbd2b3be582e96aa80550205b855d794 Mon Sep 17 00:00:00 2001 From: Shadow Date: Fri, 13 Oct 2023 23:27:06 +0800 Subject: [PATCH 44/55] Finish intelligent switch strategy with multiple -remote support and QUIC probe connection. --- .gitignore | 1 + README.md | 225 +++++++++++++++++++++++++++++++--------------- README_CN.md | 216 ++++++++++++++++++++++++++++++-------------- client/client.go | 92 ++++++++++--------- client/config.go | 24 ++--- client/debug.go | 3 + client/release.go | 3 + conn/quicConn.go | 78 ++++++++++------ go.mod | 2 + go.sum | 2 + server/config.go | 2 - server/conn.go | 29 ++++++ server/server.go | 7 -- 13 files changed, 458 insertions(+), 226 deletions(-) diff --git a/.gitignore b/.gitignore index a2458277..ccad0441 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ release .vscode .dockerignore .idea +.DS_Store \ No newline at end of file diff --git a/README.md b/README.md index c541f53d..77992aa9 100644 --- a/README.md +++ b/README.md @@ -33,52 +33,63 @@ Currently implemented main functions: ## Index - -* [Working Principle](#working-principle) -* [Usage](#usage) - * [Configuration File](#configuration-file) - * [Server User Configuration](#server-user-configuration) - * [Configure Users via Command Line](#configure-users-via-command-line) - * [Configure Users via Users Configuration File](#configure-users-via-users-configuration-file) - * [Configure Users via Config Configuration File](#configure-users-via-config-configuration-file) - * [Allow All Clients](#allow-all-clients) - * [Server TCP Configuration](#server-tcp-configuration) - * [Configure TCP via Users Configuration File](#configure-tcp-via-users-configuration-file) - * [Configure TCP via Config Configuration File](#configure-tcp-via-config-configuration-file) - * [Command Line Parameters](#command-line-parameters) - * [Internal HTTP Penetration](#internal-http-penetration) - * [Internal HTTPS Penetration](#internal-https-penetration) - * [Internal HTTPS SNI Penetration](#internal-https-sni-penetration) - * [Encrypt Client-Server Communication with TLS](#encrypt-client-server-communication-with-tls) - * [Internal TCP Penetration](#internal-tcp-penetration) - * [Client Start Multiple Services Simultaneously](#client-start-multiple-services-simultaneously) - * [Server API](#server-api) -* [Performance Test](#performance-test) - * [GT benchmark](#gt-benchmark) - * [frp dev branch 42745a3](#frp-dev-branch-42745a3) -* [Run](#run) - * [Docker Container Run](#docker-container-run) -* [Compilation](#compilation) - * [Compilation on Ubuntu/Debian](#compilation-on-ubuntudebian) - * [Install Dependencies](#install-dependencies) - * [Get Code and Compile](#get-code-and-compile) - * [Obtain WebRTC from ISCAS Mirror and Compile GT](#obtain-webrtc-from-iscas-mirror-and-compile-gt) - * [Obtain WebRTC from Official and Compile GT](#obtain-webrtc-from-official-and-compile-gt) - * [Compile on Ubuntu/Debian via Docker](#compile-on-ubuntudebian-via-docker) - * [Install Dependencies](#install-dependencies-1) - * [Get Code and Compile](#get-code-and-compile-1) - * [Obtain WebRTC from ISCAS Mirror and Compile GT](#obtain-webrtc-from-iscas-mirror-and-compile-gt-1) - * [Obtain WebRTC from Official and Compile GT](#obtain-webrtc-from-official-and-compile-gt-1) -* [Roadmap](#roadmap) -* [Contribution Guide](#contribution-guide) - * [Contribute Code](#contribute-code) - * [Code Quality](#code-quality) - * [Commit Messages](#commit-messages) - * [Issue Reporting](#issue-reporting) - * [Feature Requests](#feature-requests) - * [Thank You for Your Contribution](#thank-you-for-your-contribution) - * [Contributors](#contributors) - +* [GT](#gt) + * [Index](#index) + * [Working Principle](#working-principle) + * [Usage](#usage) + * [Configuration File](#configuration-file) + * [Server User Configuration](#server-user-configuration) + * [Configure Users via Command Line](#configure-users-via-command-line) + * [Configure Users via Users Configuration File](#configure-users-via-users-configuration-file) + * [Configure Users via Config Configuration File](#configure-users-via-config-configuration-file) + * [Allow All Clients](#allow-all-clients) + * [Server TCP Configuration](#server-tcp-configuration) + * [Configure TCP via Users Configuration File](#configure-tcp-via-users-configuration-file) + * [Configure TCP via Config Configuration File](#configure-tcp-via-config-configuration-file) + * [Command Line Parameters](#command-line-parameters) + * [Internal HTTP Penetration](#internal-http-penetration) + * [Internal HTTPS Penetration](#internal-https-penetration) + * [Internal HTTPS SNI Penetration](#internal-https-sni-penetration) + * [Encrypt Client-Server Communication with TLS](#encrypt-client-server-communication-with-tls) + * [Internal TCP Penetration](#internal-tcp-penetration) + * [Internal QUIC Penetration](#internal-quic-penetration) + * [Intelligent Internal Penetration (Adaptive Selection of TCP/QUIC)](#intelligent-internal-penetration-adaptive-selection-of-tcpquic) + * [Client Start Multiple Services Simultaneously](#client-start-multiple-services-simultaneously) + * [Server API](#server-api) + * [Performance Test](#performance-test) + * [Group 1 (MacOS environment+nginx testing)](#group-1-macos-environmentnginx-testing) + * [GT benchmark](#gt-benchmark) + * [frp dev branch 42745a3](#frp-dev-branch-42745a3) + * [Group 2 (Ubuntu environment+nginx testing)](#group-2-ubuntu-environmentnginx-testing) + * [GT-TCP](#gt-tcp) + * [GT-QUIC](#gt-quic) + * [frp v0.52.1](#frp-v0521) + * [Group 3 (Ubuntu environment+short request testing)](#group-3-ubuntu-environmentshort-request-testing) + * [GT-TCP](#gt-tcp-1) + * [GT-QUIC](#gt-quic-1) + * [frp v0.52.1](#frp-v0521-1) + * [Run](#run) + * [Docker Container Run](#docker-container-run) + * [Compilation](#compilation) + * [Compilation on Ubuntu/Debian](#compilation-on-ubuntudebian) + * [Install Dependencies](#install-dependencies) + * [Get Code and Compile](#get-code-and-compile) + * [Obtain WebRTC from ISCAS Mirror and Compile GT](#obtain-webrtc-from-iscas-mirror-and-compile-gt) + * [Obtain WebRTC from Official and Compile GT](#obtain-webrtc-from-official-and-compile-gt) + * [Compile on Ubuntu/Debian via Docker](#compile-on-ubuntudebian-via-docker) + * [Install Dependencies](#install-dependencies-1) + * [Get Code and Compile](#get-code-and-compile-1) + * [Obtain WebRTC from ISCAS Mirror and Compile GT](#obtain-webrtc-from-iscas-mirror-and-compile-gt-1) + * [Obtain WebRTC from Official and Compile GT](#obtain-webrtc-from-official-and-compile-gt-1) + * [Roadmap](#roadmap) + * [Contribution Guide](#contribution-guide) + * [Contribute Code](#contribute-code) + * [Code Quality](#code-quality) + * [Commit Messages](#commit-messages) + * [Issue Reporting](#issue-reporting) + * [Feature Requests](#feature-requests) + * [Thank You for Your Contribution](#thank-you-for-your-contribution) + * [Contributors](#contributors) ## Working Principle @@ -346,20 +357,21 @@ options: #### Intelligent Internal Penetration (Adaptive Selection of TCP/QUIC) -- Requirements: There is an intranet server and a public network server, and id1.example.com resolves to the address of the public network server. Hopefully by accessing id1.example.com:8080 - To access the web page served by port 80 on the intranet server. GT client sends multiple sets of network status detection probes concurrently to obtain the network delay and packet loss rate between the intranet server and the public network server. - Input the trained XGBoost model to obtain the results, and adaptively select whether to use TCP+TLS or QUIC for intranet penetration. +- - Requirements: There is an intranet server and a public network server, and id1.example.com resolves to the address of the public network server. Hopefully by accessing id1.example.com:8080 + To access the web page served by port 80 on the intranet server. GT server listens to multiple addresses. GT client provides multiple `-remote` options and currently supports intelligent switching between QUIC and TCP/TLS. + GT client concurrently sends multiple sets of network status detection probes through QUIC connections to obtain the network delay and packet loss rate between the intranet server and the public network server. + Input the trained XGBoost model to obtain the results, and adaptively select whether to use TCP+TLS or QUIC for intranet penetration. - Server (public network server) ```shell -./release/linux-amd64-server -addr 8080 -autoAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 +./release/linux-amd64-server -addr 8080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 ``` -- Client (intranet server). If QUIC is selected, a self-signed certificate is required, so the `-remoteCertInsecure` option is used. +- Client (intranet server). `-remote` requires at least one QUIC address to be given. ```shell -./release/linux-amd64-client -local http://127.0.0.1:80 -remote auto://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 +./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:443 -remote tcp://id1.example.com:8080 -remoteCertInsecure -id id1 -secret secret1 ``` #### Client Start Multiple Services Simultaneously @@ -438,13 +450,13 @@ and apiKeyFile options are not empty, otherwise HTTP is used. ## Performance Test -### GT and frp +### Group 1 (MacOS environment+nginx testing) Load testing was performed on this project and frp for comparison using wrk. The internal service points to a test page running nginx locally, and the test results are as follows: ```text -Model Name: MacBook Pro +Model Name: MacBook Pro Model Identifier: MacBookPro17,1 Chip: Apple M1 Total Number of Cores: 8 (4 performance and 4 efficiency) @@ -490,19 +502,19 @@ $ ps aux 2976 0.0 0.4 408712832 66112 s005 S+ 5:01PM 1:06.51 ./frpc -c ./frpc.ini ``` -### GT-TCP and GT-QUIC -Conduct stress testing through wrk, and test GT using TPC and QUIC for intranet penetration. The intranet service points -to the HTTP test page running locally. The test results are as follows: +### Group 2 (Ubuntu environment+nginx testing) +Load testing was performed on this project and frp for comparison using wrk. The internal service points to a test page +running nginx locally, and the test results are as follows: ```text System: Ubuntu 22.04 Chip: Intel i9-12900 -Total Number of Cores: 16 (8 performance and efficiency) +Total Number of Cores: 16 (8 performance and 8 efficiency) Memory: 32 GB ``` -#### GT-TCP benchmark +#### GT-TCP ```shell $ ./release/linux-amd64-server -addr 12080 -id id1 -secret secret1 @@ -512,14 +524,14 @@ $ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080 Running 30s test @ http://id1.example.com:12080 10 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev - Latency 2.25ms 3.38ms 131.60ms 93.76% - Req/Sec 5.46k 0.97k 24.64k 78.30% - 1631213 requests in 30.10s, 200.68MB read -Requests/sec: 54193.67 -Transfer/sec: 6.67MB + Latency 558.51us 2.05ms 71.54ms 99.03% + Req/Sec 24.29k 2.28k 49.07k 95.74% + 7264421 requests in 30.10s, 5.81GB read +Requests/sec: 241344.46 +Transfer/sec: 197.70MB ``` -#### GT-QUIC benchmark +#### GT-QUIC ```shell $ ./release/linux-amd64-server -addr 12080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 @@ -529,11 +541,84 @@ $ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080 Running 30s test @ http://id1.example.com:12080 10 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev - Latency 1.57ms 3.09ms 89.69ms 95.66% - Req/Sec 9.47k 2.38k 24.98k 82.97% - 2834686 requests in 30.10s, 348.73MB read -Requests/sec: 94176.60 -Transfer/sec: 11.59MB + Latency 826.65us 1.14ms 66.29ms 98.68% + Req/Sec 12.91k 1.36k 23.53k 79.43% + 3864241 requests in 30.10s, 3.09GB read +Requests/sec: 128380.49 +Transfer/sec: 105.16MB +``` + +#### frp v0.52.1 + +```shell +$ ./frps -c ./frps.toml +$ ./frpc -c ./frpc.toml + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080/ +Running 30s test @ http://id1.example.com:12080/ + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 4.49ms 8.27ms 154.62ms 92.43% + Req/Sec 4.02k 2.08k 7.51k 53.21% + 1203236 requests in 30.08s, 0.93GB read +Requests/sec: 40003.03 +Transfer/sec: 31.82MB +``` + +### Group 3 (Ubuntu environment+short request testing) + +By using wrk for stress testing, this project is compared with frp. Each request only returns a field response of less +than 10 bytes, which is used to simulate HTTP short requests. The test results are as follows: + +#### GT-TCP + +```shell +$ ./release/linux-amd64-server -addr 12080 -id id1 -secret secret1 +$ ./release/linux-amd64-client -local http://127.0.0.1:80 -remote tcp://id1.example.com:12080 -id id1 -secret secret1 + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080/ +Running 30s test @ http://id1.example.com:12080/ + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 4.55ms 13.48ms 220.23ms 95.31% + Req/Sec 5.23k 2.11k 12.40k 76.10% + 1557980 requests in 30.06s, 191.67MB read +Requests/sec: 51822.69 +Transfer/sec: 6.38MB +``` + +#### GT-QUIC + +```shell +$ ./release/linux-amd64-server -addr 12080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 +$ ./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080/ +Running 30s test @ http://id1.example.com:12080/ + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 1.84ms 6.75ms 168.93ms 98.47% + Req/Sec 9.33k 2.13k 22.86k 78.54% + 2787908 requests in 30.10s, 342.98MB read +Requests/sec: 92622.63 +Transfer/sec: 11.39MB +``` + +#### frp v0.52.1 + +```shell +$ ./frps -c ./frps.toml +$ ./frpc -c ./frpc.toml + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080/ +Running 30s test @ http://id1.example.com:12080/ + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 2.95ms 3.74ms 136.09ms 91.10% + Req/Sec 4.16k 1.22k 12.86k 87.85% + 1243103 requests in 30.07s, 152.93MB read +Requests/sec: 41334.52 +Transfer/sec: 5.09MB ``` ## Run diff --git a/README_CN.md b/README_CN.md index f424b1fd..8a314396 100644 --- a/README_CN.md +++ b/README_CN.md @@ -28,52 +28,63 @@ GT 是一个支持点对点直连(P2P)和互联网中转的反向代理开 ## 目录 - -* [工作原理](#工作原理) -* [用法](#用法) - * [配置文件](#配置文件) - * [服务端配置 users](#服务端配置-users) - * [通过命令行配置 users](#通过命令行配置-users) - * [通过 users 配置文件配置 users](#通过-users-配置文件配置-users) - * [通过 config 配置文件配置 users](#通过-config-配置文件配置-users) - * [允许所有的客户端](#允许所有的客户端) - * [服务端配置 TCP](#服务端配置-tcp) - * [通过 users 配置文件配置 TCP](#通过-users-配置文件配置-tcp) - * [通过 config 配置文件配置 TCP](#通过-config-配置文件配置-tcp) - * [命令行参数](#命令行参数) - * [HTTP 内网穿透](#http-内网穿透) - * [HTTPS 内网穿透](#https-内网穿透) - * [HTTPS SNI 内网穿透](#https-sni-内网穿透) - * [TLS 加密客户端服务端之间的通信](#tls-加密客户端服务端之间的通信) - * [TCP 内网穿透](#tcp-内网穿透) - * [客户端同时开启多个服务](#客户端同时开启多个服务) - * [服务端 API](#服务端-api) -* [性能测试](#性能测试) - * [GT benchmark](#gt-benchmark) - * [frp dev branch 42745a3](#frp-dev-branch-42745a3) -* [运行](#运行) - * [Docker 容器运行](#docker-容器运行) -* [编译](#编译) - * [在 Ubuntu/Debian 上编译](#在-ubuntudebian-上编译) - * [安装依赖](#安装依赖) - * [获取代码并编译](#获取代码并编译) - * [从 ISCAS 镜像获取 WebRTC 并编译 GT](#从-iscas-镜像获取-webrtc-并编译-gt) - * [从官方获取 WebRTC 并编译 GT](#从官方获取-webrtc-并编译-gt) - * [在 Ubuntu/Debian 上通过 Docker 编译](#在-ubuntudebian-上通过-docker-编译) - * [安装依赖](#安装依赖-1) - * [获取代码并编译](#获取代码并编译-1) - * [从 ISCAS 镜像获取 WebRTC 并编译 GT](#从-iscas-镜像获取-webrtc-并编译-gt-1) - * [从官方获取 WebRTC 并编译 GT](#从官方获取-webrtc-并编译-gt-1) -* [演进计划](#演进计划) -* [贡献指南](#贡献指南) - * [贡献代码](#贡献代码) - * [代码质量](#代码质量) - * [提交信息](#提交信息) - * [问题报告](#问题报告) - * [功能请求](#功能请求) - * [感谢您的贡献](#感谢您的贡献) - * [贡献者](#贡献者) - +* [GT](#gt) + * [目录](#目录) + * [工作原理](#工作原理) + * [用法](#用法) + * [配置文件](#配置文件) + * [服务端配置 users](#服务端配置-users) + * [通过命令行配置 users](#通过命令行配置-users) + * [通过 users 配置文件配置 users](#通过-users-配置文件配置-users) + * [通过 config 配置文件配置 users](#通过-config-配置文件配置-users) + * [允许所有的客户端](#允许所有的客户端) + * [服务端配置 TCP](#服务端配置-tcp) + * [通过 users 配置文件配置 TCP](#通过-users-配置文件配置-tcp) + * [通过 config 配置文件配置 TCP](#通过-config-配置文件配置-tcp) + * [命令行参数](#命令行参数) + * [HTTP 内网穿透](#http-内网穿透) + * [HTTPS 内网穿透](#https-内网穿透) + * [HTTPS SNI 内网穿透](#https-sni-内网穿透) + * [TLS 加密客户端服务端之间的通信](#tls-加密客户端服务端之间的通信) + * [TCP 内网穿透](#tcp-内网穿透) + * [QUIC 内网穿透](#quic-内网穿透) + * [智能内网穿透(自适应选择 TCP/QUIC )](#智能内网穿透自适应选择-tcpquic-) + * [客户端同时开启多个服务](#客户端同时开启多个服务) + * [服务端 API](#服务端-api) + * [性能测试](#性能测试) + * [第一组(MacOS环境+nginx测试)](#第一组macos环境nginx测试) + * [GT benchmark](#gt-benchmark) + * [frp dev branch 42745a3](#frp-dev-branch-42745a3) + * [第二组(Ubuntu环境+nginx测试)](#第二组ubuntu环境nginx测试) + * [GT-TCP](#gt-tcp) + * [GT-QUIC](#gt-quic) + * [frp v0.52.1](#frp-v0521) + * [第三组(Ubuntu环境+short request测试)](#第三组ubuntu环境short-request测试) + * [GT-TCP](#gt-tcp-1) + * [GT-QUIC](#gt-quic-1) + * [frp v0.52.1](#frp-v0521-1) + * [运行](#运行) + * [Docker 容器运行](#docker-容器运行) + * [编译](#编译) + * [在 Ubuntu/Debian 上编译](#在-ubuntudebian-上编译) + * [安装依赖](#安装依赖) + * [获取代码并编译](#获取代码并编译) + * [从 ISCAS 镜像获取 WebRTC 并编译 GT](#从-iscas-镜像获取-webrtc-并编译-gt) + * [从官方获取 WebRTC 并编译 GT](#从官方获取-webrtc-并编译-gt) + * [在 Ubuntu/Debian 上通过 Docker 编译](#在-ubuntudebian-上通过-docker-编译) + * [安装依赖](#安装依赖-1) + * [获取代码并编译](#获取代码并编译-1) + * [从 ISCAS 镜像获取 WebRTC 并编译 GT](#从-iscas-镜像获取-webrtc-并编译-gt-1) + * [从官方获取 WebRTC 并编译 GT](#从官方获取-webrtc-并编译-gt-1) + * [演进计划](#演进计划) + * [贡献指南](#贡献指南) + * [贡献代码](#贡献代码) + * [代码质量](#代码质量) + * [提交信息](#提交信息) + * [问题报告](#问题报告) + * [功能请求](#功能请求) + * [感谢您的贡献](#感谢您的贡献) + * [贡献者](#贡献者) ## 工作原理 @@ -330,19 +341,20 @@ options: #### 智能内网穿透(自适应选择 TCP/QUIC ) - 需求:有一台内网服务器和一台公网服务器,id1.example.com 解析到公网服务器的地址。希望通过访问 id1.example.com:8080 - 来访问内网服务器上 80 端口服务的网页。GT client 并发发送多组网络状况探测探针,获取内网服务器和公网服务器之间网络的时延和丢包率, + 来访问内网服务器上 80 端口服务的网页。GT server监听多个地址,GT client给出了多个 `-remote` 选项,目前支持在 QUIC 和 TCP/TLS 之间进行智能切换。 + GT client 通过 QUIC 连接并发发送多组网络状况探测探针,获取内网服务器和公网服务器之间网络的时延和丢包率, 输入训练好的XGBoost模型获取结果,自适应选择使用 TCP+TLS 还是 QUIC 进行内网穿透。 - 服务端(公网服务器) ```shell -./release/linux-amd64-server -addr 8080 -autoAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 +./release/linux-amd64-server -addr 8080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 ``` -- 客户端(内网服务器)。如果选择了QUIC则需要使用自签名证书,所以使用了 `-remoteCertInsecure` 选项。 +- 客户端(内网服务器)。`-remote` 需要给出至少一个 QUIC 的地址。 ```shell -./release/linux-amd64-client -local http://127.0.0.1:80 -remote auto://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 +./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:443 -remote tcp://id1.example.com:8080 -remoteCertInsecure -id id1 -secret secret1 ``` #### 客户端同时开启多个服务 @@ -416,7 +428,7 @@ apiCertFile 和 apiKeyFile 选项不为空时使用 HTTPS,其他情况使用 H ## 性能测试 -### GT 和 frp +### 第一组(MacOS环境+nginx测试) 通过 wrk 进行压力测试本项目与 frp 进行对比,内网服务指向在本地运行 nginx 的测试页面,测试结果如下: @@ -467,18 +479,18 @@ $ ps aux 2976 0.0 0.4 408712832 66112 s005 S+ 5:01PM 1:06.51 ./frpc -c ./frpc.ini ``` -### GT-TCP 和 GT-QUIC +### 第二组(Ubuntu环境+nginx测试) -通过 wrk 进行压力测试,分别测试以 TPC he QUIC 进行内网穿透的 GT ,内网服务指向在本地运行 HTTP 测试页面,测试结果如下: +通过 wrk 进行压力测试本项目与 frp 进行对比,内网服务指向在本地运行 nginx 的测试页面,测试结果如下: ```text System: Ubuntu 22.04 Chip: Intel i9-12900 -Total Number of Cores: 16 (8 performance and efficiency) +Total Number of Cores: 16 (8 performance and 8 efficiency) Memory: 32 GB ``` -#### GT-TCP benchmark +#### GT-TCP ```shell $ ./release/linux-amd64-server -addr 12080 -id id1 -secret secret1 @@ -488,14 +500,14 @@ $ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080 Running 30s test @ http://id1.example.com:12080 10 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev - Latency 2.25ms 3.38ms 131.60ms 93.76% - Req/Sec 5.46k 0.97k 24.64k 78.30% - 1631213 requests in 30.10s, 200.68MB read -Requests/sec: 54193.67 -Transfer/sec: 6.67MB + Latency 558.51us 2.05ms 71.54ms 99.03% + Req/Sec 24.29k 2.28k 49.07k 95.74% + 7264421 requests in 30.10s, 5.81GB read +Requests/sec: 241344.46 +Transfer/sec: 197.70MB ``` -#### GT-QUIC benchmark +#### GT-QUIC ```shell $ ./release/linux-amd64-server -addr 12080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 @@ -505,11 +517,83 @@ $ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080 Running 30s test @ http://id1.example.com:12080 10 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev - Latency 1.57ms 3.09ms 89.69ms 95.66% - Req/Sec 9.47k 2.38k 24.98k 82.97% - 2834686 requests in 30.10s, 348.73MB read -Requests/sec: 94176.60 -Transfer/sec: 11.59MB + Latency 826.65us 1.14ms 66.29ms 98.68% + Req/Sec 12.91k 1.36k 23.53k 79.43% + 3864241 requests in 30.10s, 3.09GB read +Requests/sec: 128380.49 +Transfer/sec: 105.16MB +``` + +#### frp v0.52.1 + +```shell +$ ./frps -c ./frps.toml +$ ./frpc -c ./frpc.toml + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080/ +Running 30s test @ http://id1.example.com:12080/ + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 4.49ms 8.27ms 154.62ms 92.43% + Req/Sec 4.02k 2.08k 7.51k 53.21% + 1203236 requests in 30.08s, 0.93GB read +Requests/sec: 40003.03 +Transfer/sec: 31.82MB +``` + +### 第三组(Ubuntu环境+short request测试) + +通过 wrk 进行压力测试本项目与 frp 进行对比,每次请求只会返回小于10字节的字段回复,用于模拟HTTP short request,测试结果如下: + +#### GT-TCP + +```shell +$ ./release/linux-amd64-server -addr 12080 -id id1 -secret secret1 +$ ./release/linux-amd64-client -local http://127.0.0.1:80 -remote tcp://id1.example.com:12080 -id id1 -secret secret1 + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080/ +Running 30s test @ http://id1.example.com:12080/ + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 4.55ms 13.48ms 220.23ms 95.31% + Req/Sec 5.23k 2.11k 12.40k 76.10% + 1557980 requests in 30.06s, 191.67MB read +Requests/sec: 51822.69 +Transfer/sec: 6.38MB +``` + +#### GT-QUIC + +```shell +$ ./release/linux-amd64-server -addr 12080 -quicAddr 443 -certFile /root/openssl_crt/tls.crt -keyFile /root/openssl_crt/tls.key -id id1 -secret secret1 +$ ./release/linux-amd64-client -local http://127.0.0.1:80 -remote quic://id1.example.com:443 -remoteCertInsecure -id id1 -secret secret1 + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080/ +Running 30s test @ http://id1.example.com:12080/ + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 1.84ms 6.75ms 168.93ms 98.47% + Req/Sec 9.33k 2.13k 22.86k 78.54% + 2787908 requests in 30.10s, 342.98MB read +Requests/sec: 92622.63 +Transfer/sec: 11.39MB +``` + +#### frp v0.52.1 + +```shell +$ ./frps -c ./frps.toml +$ ./frpc -c ./frpc.toml + +$ wrk -c 100 -d 30s -t 10 http://id1.example.com:12080/ +Running 30s test @ http://id1.example.com:12080/ + 10 threads and 100 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 2.95ms 3.74ms 136.09ms 91.10% + Req/Sec 4.16k 1.22k 12.86k 87.85% + 1243103 requests in 30.07s, 152.93MB read +Requests/sec: 41334.52 +Transfer/sec: 5.09MB ``` ## 运行 diff --git a/client/client.go b/client/client.go index cf5cda90..5dc3b29d 100644 --- a/client/client.go +++ b/client/client.go @@ -227,47 +227,6 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { } d.host = u.Host d.dialFn = d.dial - case "auto": - if len(u.Port()) < 1 { - u.Host = net.JoinHostPort(u.Host, "443") - } - tlsConfig := &tls.Config{} - if len(c.Config().RemoteCert) > 0 { - var cf []byte - cf, err = os.ReadFile(c.Config().RemoteCert) - if err != nil { - err = fmt.Errorf("failed to read remote cert file (-remoteCert option) '%s', cause %s", c.Config().RemoteCert, err.Error()) - return - } - roots := x509.NewCertPool() - ok := roots.AppendCertsFromPEM(cf) - if !ok { - err = fmt.Errorf("failed to parse remote cert file (-remoteCert option) '%s'", c.Config().RemoteCert) - return - } - tlsConfig.RootCAs = roots - } - if c.Config().RemoteCertInsecure { - tlsConfig.InsecureSkipVerify = true - } - d.host = u.Host - d.tlsConfig = tlsConfig - - fmt.Println("GT is waiting for probes to get network conditions!") - - avgRtt, pktLoss := connection.GetAutoProbesResults(d.host) - - var networkCondition = []float64{0, 0, 0, 0, avgRtt, pktLoss, 0, 0, 0, 0} - result := connection.PredictWithRttAndLoss(networkCondition) - - if result[1] > result[0] { - fmt.Println("According to network conditions, GT has chosen to establish QUIC connection for penetration!") - d.dialFn = d.quicDial - } else { - fmt.Println("According to network conditions, GT has chosen to establish TCP+TLS connection for penetration!") - d.dialFn = d.tlsDial - } - case "quic": if len(u.Port()) < 1 { u.Host = net.JoinHostPort(u.Host, "443") @@ -305,7 +264,7 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { } func (d *dialer) initWithRemote(c *Client) (err error) { - return d.init(c, c.Config().Remote, c.Config().RemoteSTUN) + return d.init(c, c.Config().Remote[c.chosenRemoteLabel], c.Config().RemoteSTUN) } func (d *dialer) initWithRemoteAPI(c *Client) (err error) { @@ -411,9 +370,54 @@ func (c *Client) Start() (err error) { var dialer dialer if len(c.Config().Remote) > 0 { - if !strings.Contains(c.Config().Remote, "://") { - c.Config().Remote = "tcp://" + c.Config().Remote + var hasQuic bool + for index, _ := range c.Config().Remote { + if !strings.Contains(c.Config().Remote[index], "://") { + c.Config().Remote[index] = "tcp://" + c.Config().Remote[index] + } + } + if len(c.Config().Remote) >= 2 { + for index, remote := range c.Config().Remote { + var u *url.URL + u, err = url.Parse(remote) + if err != nil { + err = fmt.Errorf("remote url (-remote option) '%s' is invalid, cause %s", remote, err.Error()) + return + } + if u.Scheme == "quic" { + c.Logger.Info().Str("remote", remote).Msg("waiting...intelligent switch are sending probes to get network conditions...") + hasQuic = true + if len(u.Port()) < 1 { + u.Host = net.JoinHostPort(u.Host, "443") + } + var avgRtt, pktLoss float64 + avgRtt, pktLoss, err = connection.GetQuicProbesResults(u.Host) + if err != nil { + c.Logger.Error().Err(err).Msg("can not use QUIC connection to detect network conditions") + return err + } + + c.Logger.Info().Float64("averageRTT", avgRtt).Float64("lossRate", pktLoss).Msg("QUIC probes get network conditions with") + var networkCondition = []float64{0, 0, 0, 0, avgRtt, pktLoss, 0, 0, 0, 0} + result := connection.PredictWithRttAndLoss(networkCondition) + if result[1] > result[0] { + c.chosenRemoteLabel = index + } else { + if index == 0 { + c.chosenRemoteLabel = 1 + } else { + c.chosenRemoteLabel = 0 + } + } + } + } + if !hasQuic { + c.chosenRemoteLabel = 0 + } + } else { + c.chosenRemoteLabel = 0 } + c.Logger.Info().Str("remote", c.Config().Remote[c.chosenRemoteLabel]).Msg("intelligent switch strategy finally choose to establish with") err = dialer.initWithRemote(c) if err != nil { return diff --git a/client/config.go b/client/config.go index 8f48a640..4a563162 100644 --- a/client/config.go +++ b/client/config.go @@ -36,18 +36,18 @@ type Config struct { // Options is the config options for a client. type Options struct { - Config string `arg:"config" yaml:"-" usage:"The config file path to load"` - ID string `yaml:"id" usage:"The unique id used to connect to server. Now it's the prefix of the domain."` - Secret string `yaml:"secret" usage:"The secret used to verify the id"` - ReconnectDelay time.Duration `yaml:"reconnectDelay" usage:"The delay before reconnect. Supports values like '30s', '5m'"` - Remote string `yaml:"remote" usage:"The remote server url. Supports tcp:// and tls://, default tcp://"` - RemoteSTUN string `yaml:"remoteSTUN" usage:"The remote STUN server address"` - RemoteAPI string `yaml:"remoteAPI" usage:"The API to get remote server url"` - RemoteCert string `yaml:"remoteCert" usage:"The path to remote cert"` - RemoteCertInsecure bool `yaml:"remoteCertInsecure" usage:"Accept self-signed SSL certs from remote"` - RemoteConnections uint `yaml:"remoteConnections" usage:"The max number of server connections in the pool. Valid value is 1 to 10"` - RemoteIdleConnections uint `yaml:"remoteIdleConnections" usage:"The number of idle server connections kept in the pool"` - RemoteTimeout time.Duration `yaml:"remoteTimeout" usage:"The timeout of remote connections. Supports values like '30s', '5m'"` + Config string `arg:"config" yaml:"-" usage:"The config file path to load"` + ID string `yaml:"id" usage:"The unique id used to connect to server. Now it's the prefix of the domain."` + Secret string `yaml:"secret" usage:"The secret used to verify the id"` + ReconnectDelay time.Duration `yaml:"reconnectDelay" usage:"The delay before reconnect. Supports values like '30s', '5m'"` + Remote config.Slice[string] `yaml:"remote" usage:"The remote server url. Supports tcp:// and tls:// and quic://, default tcp://"` + RemoteSTUN string `yaml:"remoteSTUN" usage:"The remote STUN server address"` + RemoteAPI string `yaml:"remoteAPI" usage:"The API to get remote server url"` + RemoteCert string `yaml:"remoteCert" usage:"The path to remote cert"` + RemoteCertInsecure bool `yaml:"remoteCertInsecure" usage:"Accept self-signed SSL certs from remote"` + RemoteConnections uint `yaml:"remoteConnections" usage:"The max number of server connections in the pool. Valid value is 1 to 10"` + RemoteIdleConnections uint `yaml:"remoteIdleConnections" usage:"The number of idle server connections kept in the pool"` + RemoteTimeout time.Duration `yaml:"remoteTimeout" usage:"The timeout of remote connections. Supports values like '30s', '5m'"` HostPrefix config.PositionSlice[string] `yaml:"-" arg:"hostPrefix" usage:"The server will recognize this host prefix and forward data to local"` RemoteTCPPort config.PositionSlice[uint16] `yaml:"-" arg:"remoteTCPPort" usage:"The TCP port that the remote server will open"` diff --git a/client/debug.go b/client/debug.go index 0b695fc9..f1c2075b 100644 --- a/client/debug.go +++ b/client/debug.go @@ -48,6 +48,9 @@ type Client struct { // test purpose only OnTunnelClose atomic.Value + + // indicate which remote is chosen to establish tunnel + chosenRemoteLabel int } func (c *conn) onTunnelClose() { diff --git a/client/release.go b/client/release.go index 3478d57e..ecc0537a 100644 --- a/client/release.go +++ b/client/release.go @@ -45,6 +45,9 @@ type Client struct { configChecksum atomic.Pointer[[32]byte] reloadWaitGroup sync.WaitGroup reloading atomic.Bool + + // indicate which remote is chosen to establish tunnel + chosenRemoteLabel int } func (c *conn) onTunnelClose() { diff --git a/conn/quicConn.go b/conn/quicConn.go index 6a7e6cbd..b3c0d648 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -9,12 +9,12 @@ import ( "crypto/x509" "encoding/pem" quicbbr "github.com/DrakenLibra/gt-bbr" - probing "github.com/prometheus-community/pro-bing" + "github.com/isrc-cas/gt/predef" "github.com/quic-go/quic-go" "math/big" "net" - "sync" "sync/atomic" + "time" ) type QuicConnection struct { @@ -48,7 +48,7 @@ func (c *QuicBbrConnection) Close() error { func QuicDial(addr string, config *tls.Config) (net.Conn, error) { config.NextProtos = []string{"gt-quic"} - conn, err := quic.DialAddr(context.Background(), addr, config, &quic.Config{}) + conn, err := quic.DialAddr(context.Background(), addr, config, &quic.Config{EnableDatagrams: true}) if err != nil { panic(err) } @@ -82,7 +82,7 @@ func QuicBbrDial(addr string, config *tls.Config) (net.Conn, error) { func QuicListen(addr string, config *tls.Config) (net.Listener, error) { config.NextProtos = []string{"gt-quic"} - listener, err := quic.ListenAddr(addr, config, &quic.Config{}) + listener, err := quic.ListenAddr(addr, config, &quic.Config{EnableDatagrams: true}) if err != nil { panic(err) } @@ -151,38 +151,66 @@ func GenerateTLSConfig() *tls.Config { } } -func GetAutoProbesResults(addr string) (avgRtt, pktLoss float64) { - pureAddr, _, _ := net.SplitHostPort(addr) +func GetQuicProbesResults(addr string) (avgRtt float64, pktLoss float64, err error) { totalNum := 100 + var totalSuccessNum int64 = 0 + var totalDelay int64 = 0 + var buf []byte + probeCloseError := &quic.ApplicationError{ + Remote: false, + ErrorCode: 0x42, + ErrorMessage: "close QUIC probe connection", + } + tlsConfig := &tls.Config{} + tlsConfig.InsecureSkipVerify = true - var wg sync.WaitGroup - wg.Add(totalNum) + conn, err := QuicDial(addr, tlsConfig) + if err != nil { + return + } + sendBuffer := []byte{predef.MagicNumber, 0x02} + _, err = conn.Write(sendBuffer) + if err != nil { + return + } - var totalLossRate int64 = 0 - var totalDelay int64 = 0 for i := 0; i < totalNum; i++ { go func() { - pinger, err := probing.NewPinger(pureAddr) + err = conn.(*QuicConnection).SendMessage([]byte(time.Now().Format("2006-01-02 15:04:05.000000000"))) if err != nil { - panic(err) + return } - pinger.Count = 3 - err = pinger.Run() + }() + } + + for { + timer := time.AfterFunc(3*time.Second, func() { + err = conn.(*QuicConnection).CloseWithError(0x42, "close QUIC probe connection") if err != nil { - panic(err) + return } - stats := pinger.Statistics() - avgRtt := stats.AvgRtt.Microseconds() - pktLoss := int64(stats.PacketLoss * 100) - atomic.AddInt64(&totalLossRate, pktLoss) - atomic.AddInt64(&totalDelay, avgRtt) - wg.Done() - }() + }) + buf, err = conn.(*QuicConnection).ReceiveMessage() + if err != nil { + // QUIC的stream关闭时会返回io.EOF,但是QUIC的不可靠数据包Datagram是在connection层面进行发送的 + // 因此需要通过quic.ApplicationError判断QUIC connection是否由于应用程序主动关闭 + if err.Error() == probeCloseError.Error() { + err = nil + break + } else { + return + } + } + if buf != nil { + sendTine, _ := time.ParseInLocation("2006-01-02 15:04:05.000000000", string(buf), time.Local) + interval := time.Now().Sub(sendTine).Microseconds() + atomic.AddInt64(&totalSuccessNum, 1) + atomic.AddInt64(&totalDelay, interval) + } + timer.Stop() } - wg.Wait() avgRtt = float64(atomic.LoadInt64(&totalDelay)) / (float64(1000 * totalNum)) - pktLoss = float64(atomic.LoadInt64(&totalLossRate)) / float64(totalNum*100) - + pktLoss = 1 - float64(atomic.LoadInt64(&totalSuccessNum))/float64(totalNum) return } diff --git a/go.mod b/go.mod index 01362dae..0dcedd2b 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/jonboulle/clockwork v0.2.2 github.com/lestrrat-go/strftime v1.0.5 github.com/mattn/go-pointer v0.0.1 + github.com/onsi/gomega v1.27.6 github.com/pion/logging v0.2.2 github.com/pion/turn/v3 v3.0.1 github.com/pkg/errors v0.9.1 @@ -30,6 +31,7 @@ require ( github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang/mock v1.6.0 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/google/uuid v1.3.0 // indirect github.com/kr/pretty v0.3.1 // indirect diff --git a/go.sum b/go.sum index 163aecd5..86c5149a 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,7 @@ github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+Licev github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -72,6 +73,7 @@ github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= diff --git a/server/config.go b/server/config.go index da2f5a85..d0ae3488 100644 --- a/server/config.go +++ b/server/config.go @@ -91,8 +91,6 @@ type Options struct { Version bool `arg:"version" yaml:"-" usage:"Show the version of this program"` QuicAddr string `yaml:"quicAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` - //QuicBbrAddr string `yaml:"quicbbrAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` - AutoAddr string `yaml:"autoAddr" usage:"The address for intelligent Internal penetration to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` OpenBBR bool `yaml:"bbr" usage:"Use bbr as congestion control algorithm when GT use QUIC connection. Default algorithm is Cubic."` } diff --git a/server/conn.go b/server/conn.go index 3be6eef8..4d7621eb 100644 --- a/server/conn.go +++ b/server/conn.go @@ -18,6 +18,7 @@ import ( "bytes" "crypto/sha256" "errors" + "github.com/quic-go/quic-go" "io" "net" "runtime/debug" @@ -162,6 +163,34 @@ func (c *conn) handle(handleFunc func() bool) { // 不能将 reconnectTimes 传参,多线程环境下这个值应该实时获取 handled = c.handleTunnelLoop(remoteIP) return + case 0x02: + var buf []byte + probeCloseError := &quic.ApplicationError{ + Remote: true, + ErrorCode: 0x42, + ErrorMessage: "close QUIC probe connection", + } + for { + timer := time.AfterFunc(3*time.Second, func() { + c.Logger.Info().Msg("closing QUIC probe connection") + }) + if buf, err = c.Connection.Conn.(*connection.QuicConnection).ReceiveMessage(); err != nil { + if err.Error() == probeCloseError.Error() { + break + } else { + c.Logger.Warn().Err(err).Msg("failed to use QUIC probe connection to receive message") + return + } + } + err = c.Connection.Conn.(*connection.QuicConnection).SendMessage(buf) + if err != nil { + c.Logger.Warn().Err(err).Msg("failed to use QUIC probe connection to send message") + return + } + timer.Stop() + } + handled = true + return } } handled = handleFunc() diff --git a/server/server.go b/server/server.go index 26087443..7f071f90 100644 --- a/server/server.go +++ b/server/server.go @@ -292,13 +292,6 @@ func (s *Server) Start() (err error) { } var listening bool - if len(s.config.AutoAddr) > 0 { - if strings.IndexByte(s.config.AutoAddr, ':') == -1 { - s.config.AutoAddr = ":" + s.config.AutoAddr - } - s.config.QuicAddr = s.config.AutoAddr - s.config.TLSAddr = s.config.AutoAddr - } if len(s.config.TLSAddr) > 0 && len(s.config.CertFile) > 0 && len(s.config.KeyFile) > 0 { if strings.IndexByte(s.config.TLSAddr, ':') == -1 { s.config.TLSAddr = ":" + s.config.TLSAddr From 8cf7e71723617438841757bb30259e1ea0e03d2c Mon Sep 17 00:00:00 2001 From: Shadow Date: Thu, 26 Oct 2023 12:05:23 +0800 Subject: [PATCH 45/55] Add msquic for gt to implement QUIC bbr. --- .gitmodules | 3 + Makefile | 30 ++++-- client/client.go | 15 ++- conn/msquic/conneciton.go | 206 +++++++++++++++++++++++++++++++++++++ conn/msquic/connection.cpp | 162 +++++++++++++++++++++++++++++ conn/msquic/connection.h | 29 ++++++ conn/msquic/connection.hpp | 34 ++++++ conn/msquic/listener.cpp | 139 +++++++++++++++++++++++++ conn/msquic/listener.go | 128 +++++++++++++++++++++++ conn/msquic/listener.h | 22 ++++ conn/msquic/msquicConn.go | 43 ++++++++ conn/msquic/quic.cpp | 176 +++++++++++++++++++++++++++++++ conn/msquic/quic.go | 13 +++ conn/msquic/quic.h | 16 +++ conn/msquic/quic.hpp | 14 +++ conn/msquic/stream.cpp | 96 +++++++++++++++++ conn/msquic/stream.go | 144 ++++++++++++++++++++++++++ conn/msquic/stream.h | 25 +++++ conn/msquic/stream.hpp | 25 +++++ conn/quicConn.go | 61 +---------- dep/msquic | 1 + go.mod | 8 -- go.sum | 35 ------- server/server.go | 17 ++- 24 files changed, 1327 insertions(+), 115 deletions(-) create mode 100644 conn/msquic/conneciton.go create mode 100644 conn/msquic/connection.cpp create mode 100644 conn/msquic/connection.h create mode 100644 conn/msquic/connection.hpp create mode 100644 conn/msquic/listener.cpp create mode 100644 conn/msquic/listener.go create mode 100644 conn/msquic/listener.h create mode 100644 conn/msquic/msquicConn.go create mode 100644 conn/msquic/quic.cpp create mode 100644 conn/msquic/quic.go create mode 100644 conn/msquic/quic.h create mode 100644 conn/msquic/quic.hpp create mode 100644 conn/msquic/stream.cpp create mode 100644 conn/msquic/stream.go create mode 100644 conn/msquic/stream.h create mode 100644 conn/msquic/stream.hpp create mode 160000 dep/msquic diff --git a/.gitmodules b/.gitmodules index f479de32..aeea0a4c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -17,3 +17,6 @@ url = https://git.mirror.iscas.ac.cn/ao-space/google-webrtc.git branch = main shallow = true +[submodule "dep/msquic"] + path = dep/msquic + url = https://github.com/microsoft/msquic diff --git a/Makefile b/Makefile index f9997920..7a296d9d 100644 --- a/Makefile +++ b/Makefile @@ -53,11 +53,16 @@ export GOOS?=$(shell go env GOOS) export GOARCH?=$(shell go env GOARCH) export CC=$(TARGET)-gcc -w export CXX=$(TARGET)-g++ -w -export CGO_CXXFLAGS=-I$(shell pwd)/dep/_google-webrtc/src -I$(shell pwd)/dep/_google-webrtc/src/third_party/abseil-cpp -std=c++17 -DWEBRTC_POSIX -export CGO_LDFLAGS=$(shell pwd)/dep/_google-webrtc/src/out/release-$(TARGET)/obj/libwebrtc.a -ldl -pthread +export CGO_CXXFLAGS=-I$(shell pwd)/dep/_google-webrtc/src \ + -I$(shell pwd)/dep/_google-webrtc/src/third_party/abseil-cpp \ + -I$(shell pwd)/dep/msquic/src/inc \ + -std=c++17 -DWEBRTC_POSIX -DQUIC_API_ENABLE_PREVIEW_FEATURES +export CGO_LDFLAGS= $(shell pwd)/dep/_google-webrtc/src/out/release-$(TARGET)/obj/libwebrtc.a \ + $(shell pwd)/dep/msquic/$(TARGET)/bin/Release/libmsquic.a \ + -ldl -pthread -lnuma export CGO_ENABLED=1 -.PHONY: all build docker_build_linux_arm64 fmt build_client docker_build_linux_arm64_client gofumpt build_server docker_build_linux_arm64_server golangci-lint check_webrtc_dependencies docker_release_linux_amd64 release clean docker_release_linux_amd64_client release_client compile_webrtc docker_release_linux_amd64_server release_server docker_create_image docker_build_linux_amd64 docker_release_linux_arm64 revive docker_build_linux_amd64_client docker_release_linux_arm64_client test docker_build_linux_amd64_server docker_release_linux_arm64_server update_submodule +.PHONY: all build docker_build_linux_arm64 fmt build_client docker_build_linux_arm64_client gofumpt build_server docker_build_linux_arm64_server golangci-lint check_webrtc_dependencies docker_release_linux_amd64 release clean docker_release_linux_amd64_client release_client compile_webrtc docker_release_linux_amd64_server release_server docker_create_image docker_build_linux_amd64 docker_release_linux_arm64 revive docker_build_linux_amd64_client docker_release_linux_arm64_client test docker_build_linux_amd64_server docker_release_linux_arm64_server update_submodule check_msquic_dependencies compile_msquic all: gofumpt golangci-lint test release @@ -121,19 +126,19 @@ docker_release_linux_arm64_server: docker_create_image build: build_server build_client release: release_server release_client -build_client: $(SOURCES) Makefile compile_webrtc +build_client: $(SOURCES) Makefile compile_webrtc compile_msquic $(eval CGO_CXXFLAGS+=-O0 -g -ggdb) $(eval NAME=$(GOOS)-$(GOARCH)-client) go build $(DEBUG_OPTIONS) -o build/$(NAME)$(EXE) ./cmd/client -release_client: $(SOURCES) Makefile compile_webrtc +release_client: $(SOURCES) Makefile compile_webrtc compile_msquic $(eval CGO_CXXFLAGS+=-O3) $(eval NAME=$(GOOS)-$(GOARCH)-client) go build $(RELEASE_OPTIONS) -o release/$(NAME)$(EXE) ./cmd/client -build_server: $(SOURCES) Makefile compile_webrtc +build_server: $(SOURCES) Makefile compile_webrtc compile_msquic $(eval CGO_CXXFLAGS+=-O0 -g -ggdb) $(eval NAME=$(GOOS)-$(GOARCH)-server) go build $(DEBUG_OPTIONS) -o build/$(NAME)$(EXE) ./cmd/server -release_server: $(SOURCES) Makefile compile_webrtc +release_server: $(SOURCES) Makefile compile_webrtc compile_msquic $(eval CGO_CXXFLAGS+=-O3) $(eval NAME=$(GOOS)-$(GOARCH)-server) go build $(RELEASE_OPTIONS) -o release/$(NAME)$(EXE) ./cmd/server @@ -182,3 +187,14 @@ compile_webrtc: check_webrtc_dependencies update_submodule sed -i 's| [^ ]*g++ | $(CXX) |g' ./dep/_google-webrtc/src/out/release-$(TARGET)/toolchain.ninja sed -i 's|"ar"|$(TARGET)-ar|g' ./dep/_google-webrtc/src/out/release-$(TARGET)/toolchain.ninja ninja -C ./dep/_google-webrtc/src/out/release-$(TARGET) + +check_msquic_dependencies: + sh -c "command -v cmake" + +compile_msquic: check_msquic_dependencies update_submodule + mkdir -p ./dep/msquic/$(TARGET) + sed -i 's|\(^ *msquic_lib\)$$|\1 ALL|g' ./dep/msquic/src/bin/CMakeLists.txt + cmake -B./dep/msquic/$(TARGET) -S./dep/msquic -DQUIC_BUILD_SHARED=OFF -DCMAKE_TARGET_ARCHITECTURE=$(TARGET_CPU) + make -C./dep/msquic/$(TARGET) -j$(shell nproc) + @renameSymbols=$$(objdump -t ./dep/msquic/$(TARGET)/bin/Release/libmsquic.a | awk -v RS= '/_YB80VJ/{next}1' | grep -E 'g +(F|O) ' | grep -Evi ' (ms){0,1}quic' | awk '{print " --redefine-sym " $$NF "=" $$NF "_YB80VJ"}') && \ + objcopy $$renameSymbols ./dep/msquic/$(TARGET)/bin/Release/libmsquic.a \ No newline at end of file diff --git a/client/client.go b/client/client.go index 5dc3b29d..d5257e22 100644 --- a/client/client.go +++ b/client/client.go @@ -22,6 +22,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/isrc-cas/gt/conn/msquic" "io" "net" "net/http" @@ -252,8 +253,10 @@ func (d *dialer) init(c *Client, remote string, stun string) (err error) { } d.host = u.Host d.tlsConfig = tlsConfig + //quic-go只有Cubic一种拥塞控制算法 + //msquic默认使用bbr作为拥塞控制算法 if c.Config().OpenBBR { - d.dialFn = d.quicBbrDial + d.dialFn = d.msquicDial } else { d.dialFn = d.quicDial } @@ -318,8 +321,8 @@ func (d *dialer) quicDial() (conn net.Conn, err error) { return connection.QuicDial(d.host, d.tlsConfig) } -func (d *dialer) quicBbrDial() (conn net.Conn, err error) { - return connection.QuicBbrDial(d.host, d.tlsConfig) +func (d *dialer) msquicDial() (conn net.Conn, err error) { + return msquic.MsquicDial(d.host, d.tlsConfig) } // Start runs the client agent. @@ -371,12 +374,14 @@ func (c *Client) Start() (err error) { var dialer dialer if len(c.Config().Remote) > 0 { var hasQuic bool + var enterSwitch bool for index, _ := range c.Config().Remote { if !strings.Contains(c.Config().Remote[index], "://") { c.Config().Remote[index] = "tcp://" + c.Config().Remote[index] } } if len(c.Config().Remote) >= 2 { + enterSwitch = true for index, remote := range c.Config().Remote { var u *url.URL u, err = url.Parse(remote) @@ -417,7 +422,9 @@ func (c *Client) Start() (err error) { } else { c.chosenRemoteLabel = 0 } - c.Logger.Info().Str("remote", c.Config().Remote[c.chosenRemoteLabel]).Msg("intelligent switch strategy finally choose to establish with") + if enterSwitch { + c.Logger.Info().Str("remote", c.Config().Remote[c.chosenRemoteLabel]).Msg("intelligent switch strategy finally choose to establish with") + } err = dialer.initWithRemote(c) if err != nil { return diff --git a/conn/msquic/conneciton.go b/conn/msquic/conneciton.go new file mode 100644 index 00000000..a77970c9 --- /dev/null +++ b/conn/msquic/conneciton.go @@ -0,0 +1,206 @@ +package msquic + +/* +#include + +#include "connection.h" +#include "stream.h" +*/ +import "C" + +import ( + "errors" + "net" + "strconv" + "sync" + "time" + "unsafe" + + "github.com/mattn/go-pointer" +) + +type Connection struct { + cppConn unsafe.Pointer + pointerID unsafe.Pointer + onConnected chan struct{} + onPeerStreamStarted chan net.Conn + onClose chan struct{} + closeOnce sync.Once +} + +func NewConnection( + server string, + idleTimeoutMs uint64, + certFile string, + unsecure bool, +) (conn *Connection, err error) { + conn = &Connection{ + onConnected: make(chan struct{}, 1), + onPeerStreamStarted: make(chan net.Conn, 1), + onClose: make(chan struct{}), + } + conn.pointerID = pointer.Save(conn) + serverName, serverPortStr, err := net.SplitHostPort(server) + if err != nil { + return nil, err + } + cServerName := C.CString(serverName) + defer C.free(unsafe.Pointer(cServerName)) + serverPort, err := strconv.Atoi(serverPortStr) + if err != nil { + return nil, err + } + cCertFile := C.CString(certFile) + defer C.free(unsafe.Pointer(cCertFile)) + conn.cppConn = C.NewConnection( + conn.pointerID, + cServerName, + C.uint16_t(serverPort), + C.uint64_t(idleTimeoutMs), + cCertFile, + C.bool(unsecure), + ) + if conn.cppConn == nil { + return nil, errors.New("msquic NewConnection failed") + } + select { + case <-conn.onConnected: + return + case <-conn.onClose: + return nil, errors.New("msquic connection closed") + } +} + +// TODO quic connection层面的read和write主要指DATAGRAM扩展,有待实现 +func (c *Connection) Read(b []byte) (n int, err error) { + panic("not implemented") +} + +func (c *Connection) Write(b []byte) (n int, err error) { + panic("not implemented") +} + +func (c *Connection) LocalAddr() (addr net.Addr) { + cAddr := C.GetConnectionAddr(c.cppConn, C.bool(true)) + if cAddr == nil { + return + } + + addr, err := net.ResolveUDPAddr("udp", C.GoString(cAddr)) + if err != nil { + addr = nil + } + return +} + +func (c *Connection) RemoteAddr() (addr net.Addr) { + cAddr := C.GetConnectionAddr(c.cppConn, C.bool(false)) + if cAddr == nil { + return + } + + addr, err := net.ResolveUDPAddr("udp", C.GoString(cAddr)) + if err != nil { + addr = nil + } + return +} + +func (c *Connection) SetDeadline(t time.Time) error { + // TODO 这里实际上设置的是连接的空闲时间 + timeout := time.Since(t) / time.Millisecond + C.SetConnectionIdleTimeout(c.cppConn, C.uint64_t(timeout)) + return nil +} + +func (c *Connection) SetReadDeadline(t time.Time) error { + return c.SetDeadline(t) +} + +func (c *Connection) SetWriteDeadline(t time.Time) error { + return c.SetDeadline(t) +} + +func (c *Connection) Close() error { + c.closeOnce.Do(func() { + close(c.onClose) + }) + pointer.Unref(c.pointerID) + C.DeleteConnection(c.cppConn) + return nil +} + +func (c *Connection) OpenStream() (conn net.Conn, err error) { + s := &stream{ + onStarted: make(chan struct{}, 1), + onSend: make(chan struct{}, 1), + onClose: make(chan struct{}), + onReceive: make(chan []byte, 1), + conn: c, + } + s.pointerID = pointer.Save(s) + s.cppStream = C.OpenStream(c.cppConn, s.pointerID) + if s.cppStream == nil { + return nil, errors.New("msquic OpenStream failed") + } + select { + case <-s.onStarted: + return s, nil + case <-s.onClose: + return nil, errors.New("msquic stream closed") + } +} + +func (c *Connection) PeerStreamStarted() (conn net.Conn, err error) { + select { + case conn = <-c.onPeerStreamStarted: + case <-c.onClose: + err = errors.New("msquic connection closed") + } + return +} + +//export OnConnectionConnected +func OnConnectionConnected(cppConn, context unsafe.Pointer) { + conn, ok := pointer.Restore(context).(*Connection) + if !ok || conn == nil { + return + } + select { + case conn.onConnected <- struct{}{}: + case <-conn.onClose: + } +} + +//export OnConnectionShutdownComplete +func OnConnectionShutdownComplete(cppConn, context unsafe.Pointer) { + conn, ok := pointer.Restore(context).(*Connection) + if !ok || conn == nil { + return + } + conn.closeOnce.Do(func() { + close(conn.onClose) + }) +} + +//export OnPeerStreamStarted +func OnPeerStreamStarted(cppConn, cppStream, context unsafe.Pointer) { + conn, ok := pointer.Restore(context).(*Connection) + if !ok || conn == nil { + return + } + s := &stream{ + cppStream: cppStream, + onStarted: make(chan struct{}, 1), + onSend: make(chan struct{}, 1), + onClose: make(chan struct{}, 1), + onReceive: make(chan []byte, 1), + conn: conn, + } + s.pointerID = pointer.Save(s) + C.SetStreamContext(cppStream, s.pointerID) + select { + case conn.onPeerStreamStarted <- s: + case <-conn.onClose: + } +} diff --git a/conn/msquic/connection.cpp b/conn/msquic/connection.cpp new file mode 100644 index 00000000..f0a3a86b --- /dev/null +++ b/conn/msquic/connection.cpp @@ -0,0 +1,162 @@ +#include "connection.h" +#include "connection.hpp" +#include "quic.hpp" +#include "stream.hpp" + +Connection::Connection(void *context) : context(context) {} + +Connection::Connection(HQUIC connection) : connection(connection) { + MsQuic->SetCallbackHandler(connection, (void *)redirectCallback, this); +} + +Connection::~Connection() { + if (connection != nullptr) { + MsQuic->ConnectionClose(connection); + MsQuic->SetCallbackHandler(connection, nullptr, nullptr); + connection = nullptr; + } + if (configuration != nullptr) { + MsQuic->ConfigurationClose(configuration); + configuration = nullptr; + } +} + +bool Connection::Start(char *serverName, uint16_t serverPort, uint64_t IdleTimeoutMs, + char *certFile, bool unsecure) { + settings.IdleTimeoutMs = IdleTimeoutMs; + settings.IsSet.IdleTimeoutMs = true; + QUIC_STATUS status = MsQuic->ConfigurationOpen(Registration, &ALPN, 1, &settings, + sizeof(settings), nullptr, &configuration); + if (QUIC_FAILED(status)) { + return false; + } + + QUIC_CREDENTIAL_CONFIG credConfig = {}; + credConfig.Type = QUIC_CREDENTIAL_TYPE_NONE; + credConfig.Flags = QUIC_CREDENTIAL_FLAG_CLIENT; + if (strlen(certFile) != 0) { + // FIXME 按照 msquic 的 docs 描述,应该是这样用的,但是不知道为什么不行 + credConfig.Flags |= QUIC_CREDENTIAL_FLAG_SET_CA_CERTIFICATE_FILE; + credConfig.CaCertificateFile = certFile; + } + if (unsecure) { + credConfig.Flags |= QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION; + } + status = MsQuic->ConfigurationLoadCredential(configuration, &credConfig); + if (QUIC_FAILED(status)) { + return false; + } + + status = MsQuic->ConnectionOpen(Registration, redirectCallback, this, &connection); + if (QUIC_FAILED(status)) { + return false; + } + + status = MsQuic->ConnectionStart(connection, configuration, QUIC_ADDRESS_FAMILY_UNSPEC, + serverName, serverPort); + if (QUIC_FAILED(status)) { + return false; + } + + return true; +} + +Stream *Connection::OpenStream(void *context) { + auto stream = new Stream(context); + auto ok = stream->Start(connection); + if (!ok) { + delete stream; + stream = nullptr; + } + return stream; +} + +Stream *Connection::AcceptStream(void *context) { + auto stream = new Stream(context); + // TODO implement stream accept + auto ok = stream->Start(connection); + if (!ok) { + delete stream; + stream = nullptr; + } + return stream; +} + +char *Connection::GetAddr(bool local) { + QUIC_ADDR addr; + uint32_t addrLen = sizeof(addr); + auto flag = local ? QUIC_PARAM_CONN_LOCAL_ADDRESS : QUIC_PARAM_CONN_REMOTE_ADDRESS; + auto addrStr = local ? &localAddrStr : &remoteAddrStr; + QUIC_STATUS status = MsQuic->GetParam(connection, flag, &addrLen, &addr); + if (QUIC_FAILED(status)) { + return nullptr; + } + auto ok = QuicAddrToString(&addr, addrStr); + if (!ok) { + return nullptr; + } + return addrStr->Address; +} + +QUIC_STATUS Connection::redirectCallback(HQUIC connection, void *context, + QUIC_CONNECTION_EVENT *event) { + return ((Connection *)context)->callback(event); +} + +QUIC_STATUS Connection::callback(QUIC_CONNECTION_EVENT *event) { + Stream *stream; + // fprintf(stderr, "connection(%p) event: %s\n", this, StringEvent(event->Type)); + + switch (event->Type) { + case QUIC_CONNECTION_EVENT_CONNECTED: + OnConnectionConnected(this, context); + break; + case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_TRANSPORT: + break; + case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_PEER: + break; + case QUIC_CONNECTION_EVENT_SHUTDOWN_COMPLETE: + OnConnectionShutdownComplete(this, context); + break; + case QUIC_CONNECTION_EVENT_PEER_STREAM_STARTED: + stream = new Stream(event->PEER_STREAM_STARTED.Stream); + OnPeerStreamStarted(this, stream, context); + break; + default: + break; + } + return QUIC_STATUS_SUCCESS; +} + +void Connection::SetContext(void *context) { this->context = context; } + +void Connection::SetIdleTimeout(uint64_t idleTimeoutMs) { + settings.IdleTimeoutMs = idleTimeoutMs; + settings.IsSet.IdleTimeoutMs = true; + MsQuic->SetParam(connection, QUIC_PARAM_CONN_SETTINGS, sizeof(settings), &settings); +} + +void *NewConnection(void *context, char *serverName, uint16_t serverPort, uint64_t idleTimeoutMs, + char *certFile, bool unsecure) { + auto conn = new Connection(context); + auto ok = conn->Start(serverName, serverPort, idleTimeoutMs, certFile, unsecure); + if (!ok) { + delete conn; + conn = nullptr; + } + return conn; +} + +void DeleteConnection(void *conn) { delete (Connection *)conn; } + +void *OpenStream(void *conn, void *context) { return ((Connection *)conn)->OpenStream(context); } + +void *AcceptStream(void *conn, void *context) { return ((Connection *)conn)->AcceptStream(context); } + +char *GetConnectionAddr(void *conn, bool local) { return ((Connection *)conn)->GetAddr(local); } + +void SetConnectionContext(void *conn, void *context) { ((Connection *)conn)->SetContext(context); } + +void SetConnectionIdleTimeout(void *conn, uint64_t idleTimeoutMs) { + ((Connection *)conn)->SetIdleTimeout(idleTimeoutMs); +} diff --git a/conn/msquic/connection.h b/conn/msquic/connection.h new file mode 100644 index 00000000..bcc58970 --- /dev/null +++ b/conn/msquic/connection.h @@ -0,0 +1,29 @@ +#ifndef CONNECTION_H +#define CONNECTION_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +void *NewConnection(void *context, char *serverName, uint16_t serverPort, uint64_t idleTimeoutMs, + char *certFile, bool unsecure); +void DeleteConnection(void *conn); +void *OpenStream(void *conn, void *context); +void *AcceptStream(void *conn, void *context); +char *GetConnectionAddr(void *conn, bool local); +void SetConnectionContext(void *conn, void *context); +void SetConnectionIdleTimeout(void *conn, uint64_t idleTimeoutMs); + +void OnConnectionConnected(void *conn, void *context); +void OnConnectionShutdownComplete(void *conn, void *context); +void OnPeerStreamStarted(void *conn, void *stream, void *context); + +#ifdef __cplusplus +} +#endif + +#endif /* CONNECTION_H */ \ No newline at end of file diff --git a/conn/msquic/connection.hpp b/conn/msquic/connection.hpp new file mode 100644 index 00000000..8247b8ab --- /dev/null +++ b/conn/msquic/connection.hpp @@ -0,0 +1,34 @@ +#ifndef CONNECTION_HPP +#define CONNECTION_HPP + +#include + +#include "stream.hpp" + +class Connection { + public: + Connection(void *context); + Connection(HQUIC connection); + ~Connection(); + bool Start(char *serverName, uint16_t serverPort, uint64_t IdleTimeoutMs, char *certFile, + bool unsecure); + Stream *OpenStream(void *context); + Stream *AcceptStream(void *context); + char *GetAddr(bool local); + void SetContext(void *context); + void SetIdleTimeout(uint64_t idleTimeoutMs); + + private: + HQUIC configuration = {}; + HQUIC connection = {}; + void *context = {}; + QUIC_ADDR_STR localAddrStr = {}; + QUIC_ADDR_STR remoteAddrStr = {}; + QUIC_SETTINGS settings = {}; + + static QUIC_STATUS redirectCallback(HQUIC connection, void *context, + QUIC_CONNECTION_EVENT *event); + QUIC_STATUS callback(QUIC_CONNECTION_EVENT *event); +}; + +#endif /* CONNECTION_HPP */ \ No newline at end of file diff --git a/conn/msquic/listener.cpp b/conn/msquic/listener.cpp new file mode 100644 index 00000000..6c4e1d4c --- /dev/null +++ b/conn/msquic/listener.cpp @@ -0,0 +1,139 @@ +#include "listener.h" +#include "connection.hpp" +#include "quic.hpp" +#include + +class Listener { + public: + Listener(void *context) : context(context) {} + + ~Listener() { + if (listener != nullptr) { + MsQuic->ListenerClose(listener); + MsQuic->SetCallbackHandler(listener, nullptr, nullptr); + listener = nullptr; + } + if (configuration != nullptr) { + MsQuic->ConfigurationClose(configuration); + configuration = nullptr; + } + } + + bool Start(char *addr, uint64_t idleTimeoutMs, char *keyFile, char *certFile, char *password) { + QUIC_SETTINGS settings = {}; + settings.IdleTimeoutMs = idleTimeoutMs; + settings.IsSet.IdleTimeoutMs = true; + settings.ServerResumptionLevel = QUIC_SERVER_RESUME_AND_ZERORTT; + settings.IsSet.ServerResumptionLevel = true; + settings.PeerBidiStreamCount = 1024; + settings.IsSet.PeerBidiStreamCount = true; + QUIC_STATUS status = MsQuic->ConfigurationOpen(Registration, &ALPN, 1, &settings, + sizeof(settings), NULL, &configuration); + if (QUIC_FAILED(status)) { + return false; + } + + QUIC_CREDENTIAL_CONFIG CredConfig = {}; + CredConfig.Flags = QUIC_CREDENTIAL_FLAG_NONE; + if (strlen(password) == 0) { + CredConfig.Type = QUIC_CREDENTIAL_TYPE_CERTIFICATE_FILE; + QUIC_CERTIFICATE_FILE CertificateFile = {}; + CertificateFile.PrivateKeyFile = keyFile; + CertificateFile.CertificateFile = certFile; + CredConfig.CertificateFile = &CertificateFile; + std::cout << "key and cert : " << keyFile << " | " << certFile << std::endl; + } else { + CredConfig.Type = QUIC_CREDENTIAL_TYPE_CERTIFICATE_FILE_PROTECTED; + QUIC_CERTIFICATE_FILE_PROTECTED certFileProtected = {}; + certFileProtected.PrivateKeyFile = keyFile; + certFileProtected.CertificateFile = certFile; + certFileProtected.PrivateKeyPassword = password; + CredConfig.CertificateFileProtected = &certFileProtected; + } + + status = MsQuic->ConfigurationLoadCredential(configuration, &CredConfig); + if (QUIC_FAILED(status)) { + return false; + } + + auto cb = [](HQUIC listener, void *context, QUIC_LISTENER_EVENT *event) -> QUIC_STATUS { + return ((Listener *)context)->callback(event); + }; + status = MsQuic->ListenerOpen(Registration, cb, this, &listener); + if (QUIC_FAILED(status)) { + return false; + } + + QUIC_ADDR quicAddr; + auto ok = QuicAddrFromString(addr, 0, &quicAddr); + if (!ok) { + return false; + } + status = MsQuic->ListenerStart(listener, &ALPN, 1, &quicAddr); + if (QUIC_FAILED(status)) { + return false; + } + + return true; + } + + char *GetAddr() { + QUIC_ADDR addr; + uint32_t addrLen = sizeof(addr); + QUIC_STATUS status = + MsQuic->GetParam(listener, QUIC_PARAM_LISTENER_LOCAL_ADDRESS, &addrLen, &addr); + if (QUIC_FAILED(status)) { + return nullptr; + } + auto ok = QuicAddrToString(&addr, &addrStr); + if (!ok) { + return nullptr; + } + + return addrStr.Address; + } + + private: + HQUIC configuration = {}; + HQUIC listener = {}; + void *context = {}; + QUIC_ADDR_STR addrStr = {}; + + QUIC_STATUS callback(QUIC_LISTENER_EVENT *event) { + QUIC_STATUS status; + Connection *conn; + + switch (event->Type) { + case QUIC_LISTENER_EVENT_NEW_CONNECTION: + status = + MsQuic->ConnectionSetConfiguration(event->NEW_CONNECTION.Connection, configuration); + if (QUIC_FAILED(status)) { + MsQuic->ConnectionClose(event->NEW_CONNECTION.Connection); + break; + } + conn = new Connection(event->NEW_CONNECTION.Connection); + OnNewConnection(this, conn, context); + break; + case QUIC_LISTENER_EVENT_STOP_COMPLETE: + break; + default: + break; + } + return QUIC_STATUS_SUCCESS; + } +}; + +void *NewListener(char *addr, uint64_t idleTimeoutMs, char *keyFile, char *certFile, char *password, + void *context) { + auto listener = new Listener(context); + auto ok = listener->Start(addr, idleTimeoutMs, keyFile, certFile, password); + if (!ok) { + delete listener; + listener = nullptr; + } + return listener; +} + +void DeleteListener(void *listener) { delete (Listener *)listener; } + +char *GetListenerAddr(void *listener) { return ((Listener *)listener)->GetAddr(); } diff --git a/conn/msquic/listener.go b/conn/msquic/listener.go new file mode 100644 index 00000000..ac02223b --- /dev/null +++ b/conn/msquic/listener.go @@ -0,0 +1,128 @@ +package msquic + +/* +#include + +#include "connection.h" +#include "listener.h" +*/ +import "C" + +import ( + "errors" + "net" + "unsafe" + + "github.com/mattn/go-pointer" +) + +type Listener struct { + cppListener unsafe.Pointer + pointerID unsafe.Pointer + onClose chan struct{} + onNewConnection chan net.Conn +} + +func NewListenr( + addr string, + idleTimeoutMs uint64, + keyFile string, + certFile string, + password string, +) (listener *Listener, err error) { + listener = &Listener{ + onClose: make(chan struct{}), + onNewConnection: make(chan net.Conn, 1), + } + listener.pointerID = pointer.Save(listener) + cAddr := C.CString(addr) + defer C.free(unsafe.Pointer(cAddr)) + cKeyFile := C.CString(keyFile) + defer C.free(unsafe.Pointer(cKeyFile)) + cCertFile := C.CString(certFile) + defer C.free(unsafe.Pointer(cCertFile)) + cPassword := C.CString(password) + defer C.free(unsafe.Pointer(cPassword)) + listener.cppListener = C.NewListener( + cAddr, + C.uint64_t(idleTimeoutMs), + cKeyFile, + cCertFile, + cPassword, + listener.pointerID, + ) + if listener.cppListener == nil { + err = errors.New("failed to create listener") + } + return +} + +func (l *Listener) Accept() (conn net.Conn, err error) { + select { + case quicConn := <-l.onNewConnection: + newQuicConn, ok := quicConn.(*Connection) + if !ok { + return nil, errors.New("msquic not renturn a msquic connection") + } + streamConn, err := newQuicConn.PeerStreamStarted() + if streamConn == nil { + return nil, errors.New("msquic AcceptStream failed") + } + msquicConn := &MsquicConn{ + Conn: streamConn, + MsquicConnection: newQuicConn, + } + return msquicConn, err + case <-l.onClose: + err = errors.New("listener closed") + } + return +} + +func (l *Listener) Close() error { + pointer.Unref(l.pointerID) + C.DeleteListener(l.cppListener) + return nil +} + +func (l *Listener) Addr() (addr net.Addr) { + cAddr := C.GetListenerAddr(l.cppListener) + if cAddr == nil { + return + } + + addr, err := net.ResolveUDPAddr("udp", C.GoString(cAddr)) + if err != nil { + addr = nil + } + return +} + +//export OnNewConnection +func OnNewConnection(cppListener, cppConn, context unsafe.Pointer) { + listener, ok := pointer.Restore(context).(*Listener) + if !ok || listener == nil { + return + } + c := &Connection{ + cppConn: cppConn, + onConnected: make(chan struct{}, 1), + onPeerStreamStarted: make(chan net.Conn, 1), + onClose: make(chan struct{}), + } + c.pointerID = pointer.Save(c) + C.SetConnectionContext(cppConn, c.pointerID) + select { + case listener.onNewConnection <- c: + case <-listener.onClose: + } +} + +//export OnListenerStopComplete +func OnListenerStopComplete(cppListener, context unsafe.Pointer) { + listener, ok := pointer.Restore(context).(*Listener) + if !ok || listener == nil { + return + } + close(listener.onClose) +} diff --git a/conn/msquic/listener.h b/conn/msquic/listener.h new file mode 100644 index 00000000..611c9a49 --- /dev/null +++ b/conn/msquic/listener.h @@ -0,0 +1,22 @@ +#ifndef LISTENER_H +#define LISTENER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +void *NewListener(char *addr, uint64_t idleTimeoutMs, char *keyFile, char *certFile, char *password, + void *context); +void DeleteListener(void *listener); +char *GetListenerAddr(void *listener); + +void OnNewConnection(void *listener, void *conn, void *context); +void OnListenerStopComplete(void *listener, void *context); + +#ifdef __cplusplus +} +#endif + +#endif /* LISTENER_H */ \ No newline at end of file diff --git a/conn/msquic/msquicConn.go b/conn/msquic/msquicConn.go new file mode 100644 index 00000000..b871ecb6 --- /dev/null +++ b/conn/msquic/msquicConn.go @@ -0,0 +1,43 @@ +package msquic + +import ( + "crypto/tls" + "net" +) + +const msquicIdleTimeOutMs uint64 = 100_000 + +type MsquicConn struct { + net.Conn // *stream + MsquicConnection *Connection +} + +func (q *MsquicConn) Close() (err error) { + err1 := q.Conn.Close() + err2 := q.MsquicConnection.Close() + if err1 != nil { + return err1 + } + return err2 +} + +func MsquicDial(addr string, config *tls.Config) (conn net.Conn, err error) { + unsecure := config.InsecureSkipVerify + msquicConnection, err := NewConnection(addr, msquicIdleTimeOutMs, "", unsecure) + if err != nil { + return + } + stream, err := msquicConnection.OpenStream() + if err != nil { + return + } + conn = &MsquicConn{ + Conn: stream, + MsquicConnection: msquicConnection, + } + return +} + +func MsquicListen(addr string, keyFile string, certFile string) (net.Listener, error) { + return NewListenr(addr, msquicIdleTimeOutMs, keyFile, certFile, "") +} diff --git a/conn/msquic/quic.cpp b/conn/msquic/quic.cpp new file mode 100644 index 00000000..7c14a21c --- /dev/null +++ b/conn/msquic/quic.cpp @@ -0,0 +1,176 @@ +#include "quic.h" +#include "quic.hpp" + +const QUIC_API_TABLE *MsQuic = {}; +HQUIC Registration = {}; +const QUIC_BUFFER ALPN = {sizeof("default") - 1, (uint8_t *)"default"}; + +bool Init() { + QUIC_STATUS status = QUIC_STATUS_SUCCESS; + + if (MsQuic == nullptr) { + status = MsQuicOpen2((const QUIC_API_TABLE **)&MsQuic); + if (QUIC_FAILED(status)) { + goto Error; + } + + status = MsQuic->RegistrationOpen(nullptr, &Registration); + if (QUIC_FAILED(status)) { + goto Error; + } + } + return true; + +Error: + if (MsQuic != nullptr) { + if (Registration != nullptr) { + MsQuic->RegistrationClose(Registration); + Registration = nullptr; + } + MsQuicClose(MsQuic); + MsQuic = nullptr; + } + return false; +} + +const char *StringStatus(QUIC_STATUS status) { + switch (status) { + case QUIC_STATUS_SUCCESS: + return "success"; + case QUIC_STATUS_PENDING: + return "pending"; + case QUIC_STATUS_CONTINUE: + return "continue"; + case QUIC_STATUS_OUT_OF_MEMORY: + return "out of memory"; + case QUIC_STATUS_INVALID_PARAMETER: + return "invalid parameter"; + case QUIC_STATUS_INVALID_STATE: + return "invalid state"; + case QUIC_STATUS_NOT_SUPPORTED: + return "not supported"; + case QUIC_STATUS_NOT_FOUND: + return "not found"; + case QUIC_STATUS_BUFFER_TOO_SMALL: + return "buffer too small"; + case QUIC_STATUS_HANDSHAKE_FAILURE: + return "handshake failure"; + case QUIC_STATUS_ABORTED: + return "aborted"; + case QUIC_STATUS_ADDRESS_IN_USE: + return "address in use"; + case QUIC_STATUS_INVALID_ADDRESS: + return "invalid address"; + case QUIC_STATUS_CONNECTION_TIMEOUT: + return "connection timeout"; + case QUIC_STATUS_CONNECTION_IDLE: + return "connection idle"; + case QUIC_STATUS_INTERNAL_ERROR: + return "internal error"; + case QUIC_STATUS_CONNECTION_REFUSED: + return "connection refused"; + case QUIC_STATUS_PROTOCOL_ERROR: + return "protocol error"; + case QUIC_STATUS_VER_NEG_ERROR: + return "ver neg error"; + case QUIC_STATUS_UNREACHABLE: + return "unreachable"; + case QUIC_STATUS_TLS_ERROR: + return "tls error"; + case QUIC_STATUS_USER_CANCELED: + return "user canceled"; + case QUIC_STATUS_ALPN_NEG_FAILURE: + return "alpn neg failure"; + case QUIC_STATUS_STREAM_LIMIT_REACHED: + return "stream limit reached"; + case QUIC_STATUS_ALPN_IN_USE: + return "alpn in use"; + case QUIC_STATUS_ADDRESS_NOT_AVAILABLE: + return "address not available"; + case QUIC_STATUS_CLOSE_NOTIFY: + return "close notify"; + case QUIC_STATUS_BAD_CERTIFICATE: + return "bad certificate"; + case QUIC_STATUS_UNSUPPORTED_CERTIFICATE: + return "unsupported certificate"; + case QUIC_STATUS_REVOKED_CERTIFICATE: + return "revoked certificate"; + case QUIC_STATUS_EXPIRED_CERTIFICATE: + return "expired certificate"; + case QUIC_STATUS_UNKNOWN_CERTIFICATE: + return "unknown certificate"; + case QUIC_STATUS_REQUIRED_CERTIFICATE: + return "required certificate"; + case QUIC_STATUS_CERT_EXPIRED: + return "cert expired"; + case QUIC_STATUS_CERT_UNTRUSTED_ROOT: + return "cert untrusted root"; + case QUIC_STATUS_CERT_NO_CERT: + return "cert no cert"; + } + return "unknown"; +} + +const char *StringEvent(QUIC_STREAM_EVENT_TYPE type) { + switch (type) { + case QUIC_STREAM_EVENT_START_COMPLETE: + return "start complete"; + case QUIC_STREAM_EVENT_RECEIVE: + return "receive"; + case QUIC_STREAM_EVENT_SEND_COMPLETE: + return "send complete"; + case QUIC_STREAM_EVENT_PEER_SEND_SHUTDOWN: + return "peer send shutdown"; + case QUIC_STREAM_EVENT_PEER_SEND_ABORTED: + return "peer send aborted"; + case QUIC_STREAM_EVENT_PEER_RECEIVE_ABORTED: + return "peer receive aborted"; + case QUIC_STREAM_EVENT_SEND_SHUTDOWN_COMPLETE: + return "send shutdown complete"; + case QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE: + return "shutdown complete"; + case QUIC_STREAM_EVENT_IDEAL_SEND_BUFFER_SIZE: + return "ideal send buffer size"; + case QUIC_STREAM_EVENT_PEER_ACCEPTED: + return "peer accepted"; + } + return "unknown"; +} + +const char *StringEvent(QUIC_CONNECTION_EVENT_TYPE type) { + switch (type) { + case QUIC_CONNECTION_EVENT_CONNECTED: + return "connected"; + case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_TRANSPORT: + return "shutdown initiated by transport"; + case QUIC_CONNECTION_EVENT_SHUTDOWN_INITIATED_BY_PEER: + return "shutdown initiated by peer"; + case QUIC_CONNECTION_EVENT_SHUTDOWN_COMPLETE: + return "shutdown complete"; + case QUIC_CONNECTION_EVENT_LOCAL_ADDRESS_CHANGED: + return "local address changed"; + case QUIC_CONNECTION_EVENT_PEER_ADDRESS_CHANGED: + return "peer address changed"; + case QUIC_CONNECTION_EVENT_PEER_STREAM_STARTED: + return "peer stream started"; + case QUIC_CONNECTION_EVENT_STREAMS_AVAILABLE: + return "streams available"; + case QUIC_CONNECTION_EVENT_PEER_NEEDS_STREAMS: + return "peer needs streams"; + case QUIC_CONNECTION_EVENT_IDEAL_PROCESSOR_CHANGED: + return "ideal processor changed"; + case QUIC_CONNECTION_EVENT_DATAGRAM_STATE_CHANGED: + return "datagram state changed"; + case QUIC_CONNECTION_EVENT_DATAGRAM_RECEIVED: + return "datagram received"; + case QUIC_CONNECTION_EVENT_DATAGRAM_SEND_STATE_CHANGED: + return "datagram send state changed"; + case QUIC_CONNECTION_EVENT_RESUMED: + return "resumed"; + case QUIC_CONNECTION_EVENT_RESUMPTION_TICKET_RECEIVED: + return "resumption ticket received"; + case QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED: + return "peer certificate received"; + } + return "unknown"; +} diff --git a/conn/msquic/quic.go b/conn/msquic/quic.go new file mode 100644 index 00000000..445ce5f3 --- /dev/null +++ b/conn/msquic/quic.go @@ -0,0 +1,13 @@ +package msquic + +/* +#include "quic.h" +*/ +import "C" + +func init() { + ok := C.Init() + if !ok { + panic("msquic init failed") + } +} diff --git a/conn/msquic/quic.h b/conn/msquic/quic.h new file mode 100644 index 00000000..3055093b --- /dev/null +++ b/conn/msquic/quic.h @@ -0,0 +1,16 @@ +#ifndef QUIC_H +#define QUIC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +bool Init(); + +#ifdef __cplusplus +} +#endif + +#endif /* QUIC_H */ \ No newline at end of file diff --git a/conn/msquic/quic.hpp b/conn/msquic/quic.hpp new file mode 100644 index 00000000..2aaf08bf --- /dev/null +++ b/conn/msquic/quic.hpp @@ -0,0 +1,14 @@ +#ifndef QUIC_HPP +#define QUIC_HPP + +#include + +extern const QUIC_API_TABLE *MsQuic; +extern HQUIC Registration; +extern const QUIC_BUFFER ALPN; + +const char *StringStatus(QUIC_STATUS status); +const char *StringEvent(QUIC_CONNECTION_EVENT_TYPE type); +const char *StringEvent(QUIC_STREAM_EVENT_TYPE type); + +#endif /* QUIC_HPP */ \ No newline at end of file diff --git a/conn/msquic/stream.cpp b/conn/msquic/stream.cpp new file mode 100644 index 00000000..24e20eb5 --- /dev/null +++ b/conn/msquic/stream.cpp @@ -0,0 +1,96 @@ +#include "stream.h" +#include "quic.hpp" +#include "stream.hpp" + +Stream::Stream(void *context) : context(context) {} + +Stream::Stream(HQUIC stream) : stream(stream) { + MsQuic->SetCallbackHandler(stream, (void *)redirectCallback, this); +} + +Stream::~Stream() { + if (stream != nullptr) { + MsQuic->StreamClose(stream); + MsQuic->SetCallbackHandler(stream, nullptr, nullptr); + stream = nullptr; + } +} + +bool Stream::Start(HQUIC connection) { + QUIC_STATUS status = MsQuic->StreamOpen(connection, QUIC_STREAM_OPEN_FLAG_0_RTT, + redirectCallback, this, &stream); + if (QUIC_FAILED(status)) { + return false; + } + + status = MsQuic->StreamStart(stream, QUIC_STREAM_START_FLAG_NONE); + if (QUIC_FAILED(status)) { + return false; + } + + return true; +} + +bool Stream::Send(void *data, uint32_t dataLen) { + sendBuffer.Buffer = (uint8_t *)data; + sendBuffer.Length = dataLen; + QUIC_STATUS status = + MsQuic->StreamSend(stream, &sendBuffer, 1, QUIC_SEND_FLAG_ALLOW_0_RTT, data); + return QUIC_SUCCEEDED(status); +} + +QUIC_STATUS Stream::callback(QUIC_STREAM_EVENT *event) { + uint32_t bufLen = 0; + void *buf = nullptr; + // fprintf(stderr, "stream(%p) event: %s\n", this, StringEvent(event->Type)); + + auto status = QUIC_STATUS_SUCCESS; + switch (event->Type) { + case QUIC_STREAM_EVENT_START_COMPLETE: + OnStreamStartComplete(this, context); + break; + case QUIC_STREAM_EVENT_SEND_COMPLETE: + free(event->SEND_COMPLETE.ClientContext); + OnStreamSendComplete(this, context); + break; + case QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE: + OnStreamShutdownComplete(this, context); + break; + case QUIC_STREAM_EVENT_RECEIVE: + for (uint32_t i = 0; i < event->RECEIVE.BufferCount; ++i) { + bufLen += event->RECEIVE.Buffers[i].Length; + } + buf = malloc(bufLen); + for (uint32_t i = 0, offset = 0; i < event->RECEIVE.BufferCount; ++i) { + memcpy((uint8_t *)buf + offset, event->RECEIVE.Buffers[i].Buffer, + event->RECEIVE.Buffers[i].Length); + offset += event->RECEIVE.Buffers[i].Length; + } + OnStreamReceive(this, context, buf, bufLen); + status = QUIC_STATUS_PENDING; + break; + default: + break; + } + return status; +} + +void Stream::ReceiveComplete(uint64_t bufferLength) { + MsQuic->StreamReceiveComplete(stream, bufferLength); +} + +QUIC_STATUS Stream::redirectCallback(HQUIC stream, void *context, QUIC_STREAM_EVENT *event) { + return ((Stream *)context)->callback(event); +}; + +void Stream::SetContext(void *context) { this->context = context; } + +void DeleteStream(void *stream) { delete (Stream *)stream; } + +void StreamSend(void *stream, void *data, size_t length) { ((Stream *)stream)->Send(data, length); } + +void StreamReceiveComplete(void *stream, uint64_t bufferLength) { + ((Stream *)stream)->ReceiveComplete(bufferLength); +} + +void SetStreamContext(void *stream, void *context) { ((Stream *)stream)->SetContext(context); } diff --git a/conn/msquic/stream.go b/conn/msquic/stream.go new file mode 100644 index 00000000..1a24794b --- /dev/null +++ b/conn/msquic/stream.go @@ -0,0 +1,144 @@ +package msquic + +/* +#include + +#include "stream.h" +*/ +import "C" + +import ( + "errors" + "io" + "net" + "sync" + "time" + "unsafe" + + "github.com/mattn/go-pointer" +) + +type stream struct { + conn *Connection + cppStream unsafe.Pointer + pointerID unsafe.Pointer + onStarted chan struct{} + onClose chan struct{} + closeOnce sync.Once + onSend chan struct{} + onReceive chan []byte + receiveBuf []byte +} + +func (s *stream) Close() error { + s.closeOnce.Do(func() { + close(s.onClose) + }) + pointer.Unref(s.pointerID) + C.DeleteStream(s.cppStream) + return nil +} + +func (s *stream) Read(b []byte) (n int, err error) { + if len(s.receiveBuf) != 0 { + n = copy(b, s.receiveBuf) + s.receiveBuf = s.receiveBuf[n:] + goto handleMsquic + } + + select { + case buf := <-s.onReceive: + n = copy(b, buf) + s.receiveBuf = buf[n:] + goto handleMsquic + case <-s.onClose: + return 0, io.EOF + } + +handleMsquic: + C.StreamReceiveComplete(s.cppStream, C.uint64_t(n)) + return +} + +func (s *stream) Write(b []byte) (n int, err error) { + cBuf := C.CBytes(b) + C.StreamSend(s.cppStream, cBuf, C.size_t(len(b))) + select { + case <-s.onSend: + return len(b), nil + case <-s.onClose: + return 0, errors.New("msquic stream closed") + } +} + +func (s *stream) LocalAddr() net.Addr { + return s.conn.LocalAddr() +} + +func (s *stream) RemoteAddr() net.Addr { + return s.conn.RemoteAddr() +} + +func (s *stream) SetDeadline(t time.Time) error { + // stream 无法单独设置超时,只能设置 connection + return s.conn.SetDeadline(t) +} + +func (s *stream) SetReadDeadline(t time.Time) error { + // stream 无法单独设置超时,只能设置 connection + return s.conn.SetReadDeadline(t) +} + +func (s *stream) SetWriteDeadline(t time.Time) error { + // stream 无法单独设置超时,只能设置 connection + return s.conn.SetWriteDeadline(t) +} + +//export OnStreamShutdownComplete +func OnStreamShutdownComplete(cppConn, context unsafe.Pointer) { + stream, ok := pointer.Restore(context).(*stream) + if !ok || stream == nil { + return + } + stream.closeOnce.Do(func() { + close(stream.onClose) + }) +} + +//export OnStreamStartComplete +func OnStreamStartComplete(cppStream, context unsafe.Pointer) { + stream, ok := pointer.Restore(context).(*stream) + if !ok || stream == nil { + return + } + select { + case stream.onStarted <- struct{}{}: + case <-stream.onClose: + } +} + +//export OnStreamReceive +func OnStreamReceive(cppStream, context, data unsafe.Pointer, length C.size_t) { + stream, ok := pointer.Restore(context).(*stream) + if !ok || stream == nil { + return + } + buf := C.GoBytes(data, C.int(length)) + defer C.free(data) + select { + case stream.onReceive <- buf: + case <-stream.onClose: + } +} + +//export OnStreamSendComplete +func OnStreamSendComplete(cppStream, context unsafe.Pointer) { + stream, ok := pointer.Restore(context).(*stream) + if !ok || stream == nil { + return + } + select { + case stream.onSend <- struct{}{}: + case <-stream.onClose: + } +} diff --git a/conn/msquic/stream.h b/conn/msquic/stream.h new file mode 100644 index 00000000..2ac97a05 --- /dev/null +++ b/conn/msquic/stream.h @@ -0,0 +1,25 @@ +#ifndef STREAM_H +#define STREAM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +void DeleteStream(void *stream); +void StreamSend(void *stream, void *data, size_t length); +void StreamReceiveComplete(void *stream, uint64_t bufferLength); +void SetStreamContext(void *stream, void *context); + +void OnStreamStartComplete(void *stream, void *context); +void OnStreamShutdownComplete(void *stream, void *context); +void OnStreamReceive(void *stream, void *context, void *data, size_t length); +void OnStreamSendComplete(void *stream, void *context); + +#ifdef __cplusplus +} +#endif + +#endif /* STREAM_H */ \ No newline at end of file diff --git a/conn/msquic/stream.hpp b/conn/msquic/stream.hpp new file mode 100644 index 00000000..d13586fd --- /dev/null +++ b/conn/msquic/stream.hpp @@ -0,0 +1,25 @@ +#ifndef STREAM_HPP +#define STREAM_HPP + +#include + +class Stream { + public: + Stream(void *context); + Stream(HQUIC stream); + ~Stream(); + bool Start(HQUIC connection); + bool Send(void *data, uint32_t dataLen); + void ReceiveComplete(uint64_t bufferLength); + void SetContext(void *context); + + private: + HQUIC stream = {}; + void *context = {}; + QUIC_BUFFER sendBuffer = {}; + + QUIC_STATUS callback(QUIC_STREAM_EVENT *event); + static QUIC_STATUS redirectCallback(HQUIC stream, void *context, QUIC_STREAM_EVENT *event); +}; + +#endif /* STREAM_HPP */ \ No newline at end of file diff --git a/conn/quicConn.go b/conn/quicConn.go index b3c0d648..af587f32 100644 --- a/conn/quicConn.go +++ b/conn/quicConn.go @@ -8,7 +8,6 @@ import ( "crypto/tls" "crypto/x509" "encoding/pem" - quicbbr "github.com/DrakenLibra/gt-bbr" "github.com/isrc-cas/gt/predef" "github.com/quic-go/quic-go" "math/big" @@ -17,34 +16,19 @@ import ( "time" ) +const probePacketLostTimeOutMs = 5 + type QuicConnection struct { quic.Connection quic.Stream } -type QuicBbrConnection struct { - quicbbr.Session - quicbbr.Stream -} - type QuicListener struct { quic.Listener } -type QuicBbrListener struct { - quicbbr.Listener -} - var _ net.Conn = &QuicConnection{} var _ net.Listener = &QuicListener{} -var _ net.Conn = &QuicBbrConnection{} -var _ net.Listener = &QuicBbrListener{} - -func (c *QuicBbrConnection) Close() error { - err := c.Stream.Close() - err = c.Session.Close() - return err -} func QuicDial(addr string, config *tls.Config) (net.Conn, error) { config.NextProtos = []string{"gt-quic"} @@ -63,23 +47,6 @@ func QuicDial(addr string, config *tls.Config) (net.Conn, error) { return nc, err } -func QuicBbrDial(addr string, config *tls.Config) (net.Conn, error) { - config.NextProtos = []string{"gt-quic"} - conn, err := quicbbr.DialAddr(addr, config, &quicbbr.Config{}) - if err != nil { - panic(err) - } - stream, err := conn.OpenStreamSync() - if err != nil { - panic(err) - } - nc := &QuicBbrConnection{ - Session: conn, - Stream: stream, - } - return nc, err -} - func QuicListen(addr string, config *tls.Config) (net.Listener, error) { config.NextProtos = []string{"gt-quic"} listener, err := quic.ListenAddr(addr, config, &quic.Config{EnableDatagrams: true}) @@ -92,18 +59,6 @@ func QuicListen(addr string, config *tls.Config) (net.Listener, error) { return ln, err } -func QuicBbrListen(addr string, config *tls.Config) (net.Listener, error) { - config.NextProtos = []string{"gt-quic"} - listener, err := quicbbr.ListenAddr(addr, config, &quicbbr.Config{}) - if err != nil { - panic(err) - } - ln := &QuicBbrListener{ - Listener: listener, - } - return ln, err -} - func (ln *QuicListener) Accept() (net.Conn, error) { conn, _ := ln.Listener.Accept(context.Background()) stream, err := conn.AcceptStream(context.Background()) @@ -114,16 +69,6 @@ func (ln *QuicListener) Accept() (net.Conn, error) { return nc, err } -func (ln *QuicBbrListener) Accept() (net.Conn, error) { - conn, _ := ln.Listener.Accept() - stream, err := conn.AcceptStream() - nc := &QuicBbrConnection{ - Session: conn, - Stream: stream, - } - return nc, err -} - func GenerateTLSConfig() *tls.Config { ecdsaKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { @@ -184,7 +129,7 @@ func GetQuicProbesResults(addr string) (avgRtt float64, pktLoss float64, err err } for { - timer := time.AfterFunc(3*time.Second, func() { + timer := time.AfterFunc(probePacketLostTimeOutMs*time.Second, func() { err = conn.(*QuicConnection).CloseWithError(0x42, "close QUIC probe connection") if err != nil { return diff --git a/dep/msquic b/dep/msquic new file mode 160000 index 00000000..df4cc625 --- /dev/null +++ b/dep/msquic @@ -0,0 +1 @@ +Subproject commit df4cc6250ae7f1549ae974dabc50e1095c1c12af diff --git a/go.mod b/go.mod index 0dcedd2b..7dd01d09 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/isrc-cas/gt go 1.19 require ( - github.com/DrakenLibra/gt-bbr v0.0.0-20230928081539-5c3f8cfb9590 github.com/archdx/zerolog-sentry v1.5.0 github.com/buger/jsonparser v1.1.1 github.com/davecgh/go-spew v1.1.1 @@ -13,11 +12,9 @@ require ( github.com/jonboulle/clockwork v0.2.2 github.com/lestrrat-go/strftime v1.0.5 github.com/mattn/go-pointer v0.0.1 - github.com/onsi/gomega v1.27.6 github.com/pion/logging v0.2.2 github.com/pion/turn/v3 v3.0.1 github.com/pkg/errors v0.9.1 - github.com/prometheus-community/pro-bing v0.3.0 github.com/quic-go/quic-go v0.35.0 github.com/rs/zerolog v1.30.0 github.com/shirou/gopsutil v3.21.11+incompatible @@ -26,16 +23,12 @@ require ( ) require ( - github.com/cheekybits/genny v1.0.0 // indirect github.com/getsentry/sentry-go v0.24.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang/mock v1.6.0 // indirect - github.com/google/go-cmp v0.5.9 // indirect github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect - github.com/google/uuid v1.3.0 // indirect github.com/kr/pretty v0.3.1 // indirect - github.com/marten-seemann/qtls v0.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/onsi/ginkgo/v2 v2.9.5 // indirect @@ -54,7 +47,6 @@ require ( golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect golang.org/x/mod v0.10.0 // indirect golang.org/x/net v0.15.0 // indirect - golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.12.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.9.1 // indirect diff --git a/go.sum b/go.sum index 86c5149a..b9c54acc 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,7 @@ -github.com/DrakenLibra/gt-bbr v0.0.0-20230928081539-5c3f8cfb9590 h1:xrwkQrRETUM5fxDEtroBS/23PFuhX2tufkI1rAhE36s= -github.com/DrakenLibra/gt-bbr v0.0.0-20230928081539-5c3f8cfb9590/go.mod h1:gpyj8Qozj/mJGV0qdY8JWwKzJtVdjkFNy+l2gvyAtAE= github.com/archdx/zerolog-sentry v1.5.0 h1:wc3arq95hz749M2iPwfSb7jzdYhTch4AK/opofXHcNs= github.com/archdx/zerolog-sentry v1.5.0/go.mod h1:shfLC+5jaXkS1iBcAD/k07g5QH1M/jbPcVr5DkZyxk4= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -16,7 +12,6 @@ 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/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/getsentry/sentry-go v0.24.1 h1:W6/0GyTy8J6ge6lVCc94WB6Gx2ZuLrgopnn9w8Hiwuk= github.com/getsentry/sentry-go v0.24.1/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -26,23 +21,16 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= @@ -54,9 +42,6 @@ github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2t github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/strftime v1.0.5 h1:A7H3tT8DhTz8u65w+JRpiBxM4dINQhUXAZnhBa2xeOE= github.com/lestrrat-go/strftime v1.0.5/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= -github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= -github.com/marten-seemann/qtls v0.2.4 h1:mCJ6i1jAqcsm9XODrSGvXECodoAb1STta+TkxJCwCnE= -github.com/marten-seemann/qtls v0.2.4/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -66,14 +51,9 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= @@ -96,8 +76,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus-community/pro-bing v0.3.0 h1:SFT6gHqXwbItEDJhTkzPWVqU6CLEtqEfNAPp47RUON4= -github.com/prometheus-community/pro-bing v0.3.0/go.mod h1:p9dLb9zdmv+eLxWfCT6jESWuDrS+YzpPkQBgysQF8a0= github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM= @@ -129,7 +107,6 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -144,8 +121,6 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -157,16 +132,11 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -215,11 +185,6 @@ google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62Uo gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/server/server.go b/server/server.go index 7f071f90..b15186c1 100644 --- a/server/server.go +++ b/server/server.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" connection "github.com/isrc-cas/gt/conn" + "github.com/isrc-cas/gt/conn/msquic" "io" "math" "net" @@ -158,7 +159,9 @@ func (s *Server) quicListen(openBBR bool) (err error) { return } if openBBR { - s.quicListener, err = connection.QuicBbrListen(s.config.QuicAddr, tlsConfig) + //s.quicListener, err = connection.QuicBbrListen(s.config.QuicAddr, tlsConfig) + //s.quicListener, err = quic.NewListenr(s.config.QuicAddr, 10_000, s.config.KeyFile, s.config.CertFile, "") + s.quicListener, err = msquic.MsquicListen(s.config.QuicAddr, s.config.KeyFile, s.config.CertFile) } else { s.quicListener, err = connection.QuicListen(s.config.QuicAddr, tlsConfig) } @@ -303,8 +306,16 @@ func (s *Server) Start() (err error) { listening = true } if len(s.config.QuicAddr) > 0 { - if strings.IndexByte(s.config.QuicAddr, ':') == -1 { - s.config.QuicAddr = ":" + s.config.QuicAddr + //if strings.IndexByte(s.config.QuicAddr, ':') == -1 { + // s.config.QuicAddr = ":" + s.config.QuicAddr + //} + // TODO Go 的冒号加空格会同时监听 IPv4 和 IPv6,这里行为与其他的不一致 + colonIndex := strings.IndexByte(s.config.QuicAddr, ':') + if colonIndex == -1 { + s.config.QuicAddr = "0.0.0.0:" + s.config.QuicAddr + } + if colonIndex == 0 { + s.config.QuicAddr = "0.0.0.0" + s.config.QuicAddr } err = s.quicListen(s.config.OpenBBR) if err != nil { From 00ce0f911564744b3fdffaf8db4e5a3e9347d0cc Mon Sep 17 00:00:00 2001 From: Shadow Date: Sat, 28 Oct 2023 16:35:28 +0800 Subject: [PATCH 46/55] Merge branch 'dev' of github.com:ao-space/gt --- .gitignore | 36 +- Dockerfile | 9 + Makefile | 58 +- README_CN.md | 147 +- client/client.go | 84 +- client/config.go | 155 +- client/conn.go | 21 +- client/idle.go | 18 +- client/peer.go | 10 +- client/task.go | 8 +- client/web/api/api.go | 223 + client/web/api/api_test.go | 254 + client/web/service/service.go | 207 + client/web/service/service_test.go | 108 + client/web/web.go | 313 + client/web/web_test.go | 224 + cmd/client/main.go | 134 +- cmd/server/main.go | 149 +- config/config.go | 37 +- config/duration.go | 58 + config/duration_test.go | 228 + front/package.json | 14 - go.mod | 32 +- go.sum | 129 + predef/const.go | 51 + server/client.go | 19 + server/config.go | 157 +- server/conn.go | 30 +- server/server.go | 125 +- server/web/api/api.go | 209 + server/web/api/api_test.go | 266 + server/web/service/service.go | 200 + server/web/service/service_test.go | 109 + server/web/web.go | 312 + server/web/web_test.go | 235 + util/path.go | 38 + util/path_test.go | 77 + util/rand.go | 19 +- web/front/.editorconfig | 16 + web/front/.env | 11 + web/front/.env.development | 18 + web/front/.env.production | 24 + web/front/.env.test | 24 + web/front/.eslintignore | 15 + web/front/.eslintrc.cjs | 60 + web/front/.prettierignore | 9 + web/front/.prettierrc.cjs | 41 + web/front/.stylelintignore | 4 + web/front/.stylelintrc.cjs | 40 + web/front/LICENSE | 21 + web/front/README.md | 473 + web/front/README_CN.md | 429 + web/front/build/getEnv.ts | 42 + web/front/build/plugins.ts | 108 + web/front/build/proxy.ts | 30 + web/front/commitlint.config.cjs | 136 + web/front/index.html | 105 + web/front/lint-staged.config.cjs | 8 + web/front/package-lock.json | 24139 ++++++++++++++++ web/front/package.json | 99 + web/front/postcss.config.cjs | 5 + web/front/public/logo.png | Bin 0 -> 8248 bytes web/front/public/vue.svg | 1 + web/front/src/App.vue | 23 + web/front/src/api/helper/checkStatus.ts | 43 + web/front/src/api/index.ts | 108 + web/front/src/api/interface/index.ts | 122 + web/front/src/api/modules/clientConfig.ts | 15 + web/front/src/api/modules/connection.ts | 6 + web/front/src/api/modules/login.ts | 27 + web/front/src/api/modules/server.ts | 23 + web/front/src/api/modules/serverConfig.ts | 15 + web/front/src/api/modules/userInfo.ts | 10 + web/front/src/assets/fonts/MetroDF.ttf | Bin 0 -> 106934 bytes web/front/src/assets/fonts/font.scss | 4 + web/front/src/assets/iconfont/iconfont.scss | 38 + web/front/src/assets/iconfont/iconfont.ttf | Bin 0 -> 4128 bytes web/front/src/assets/images/403.png | Bin 0 -> 12713 bytes web/front/src/assets/images/404.png | Bin 0 -> 7788 bytes web/front/src/assets/images/500.png | Bin 0 -> 8069 bytes web/front/src/assets/images/login_bg.svg | 33 + web/front/src/assets/images/login_left.png | Bin 0 -> 35966 bytes web/front/src/assets/images/login_left1.png | Bin 0 -> 42169 bytes web/front/src/assets/images/login_left2.png | Bin 0 -> 31959 bytes web/front/src/assets/images/login_left3.png | Bin 0 -> 111980 bytes web/front/src/assets/images/login_left4.png | Bin 0 -> 153248 bytes web/front/src/assets/images/login_left5.png | Bin 0 -> 282032 bytes web/front/src/assets/images/logo.svg | 1 + web/front/src/assets/images/logo_m.png | Bin 0 -> 6609 bytes web/front/src/assets/images/logo_m_en.png | Bin 0 -> 9056 bytes web/front/src/assets/images/logo_pc.png | Bin 0 -> 6293 bytes web/front/src/assets/images/logo_pc_en.png | Bin 0 -> 12709 bytes web/front/src/assets/images/welcome.png | Bin 0 -> 75638 bytes web/front/src/assets/json/authMenuList.json | 72 + web/front/src/components/Anchor/index.vue | 63 + .../components/GeneralSetting.vue | 255 + .../components/LogSetting.vue | 108 + .../components/SentrySetting.vue | 141 + .../components/ServiceSetting.vue | 151 + .../components/TCPForwardSetting.vue | 92 + .../components/WebRTCSetting.vue | 101 + .../components/ClientConfigForm/index.scss | 3 + .../src/components/ClientConfigForm/index.vue | 369 + .../ClientConfigForm/interface/index.ts | 160 + .../src/components/ConnectionTable/index.vue | 120 + web/front/src/components/ErrorMessage/403.vue | 19 + web/front/src/components/ErrorMessage/404.vue | 19 + web/front/src/components/ErrorMessage/500.vue | 19 + .../src/components/ErrorMessage/index.scss | 32 + web/front/src/components/Loading/index.scss | 67 + web/front/src/components/Loading/index.vue | 13 + .../components/APISetting.vue | 104 + .../components/ConnectionSetting.vue | 122 + .../components/GeneralSetting.vue | 157 + .../components/HostSetting.vue | 222 + .../components/NetworkSetting.vue | 147 + .../components/SecuritySetting.vue | 88 + .../components/TCPSetting.vue | 173 + .../components/UserSetting.vue | 185 + .../components/ServerConfigForm/index.scss | 7 + .../src/components/ServerConfigForm/index.vue | 468 + .../ServerConfigForm/interface/index.ts | 261 + web/front/src/components/SwitchDark/index.vue | 12 + .../src/components/UsageTooltip/index.vue | 14 + web/front/src/components/Verify/index.vue | 62 + web/front/src/config/index.ts | 13 + web/front/src/config/nprogress.ts | 12 + web/front/src/config/piniaPersist.ts | 19 + web/front/src/config/serviceLoading.ts | 45 + web/front/src/enums/httpEnum.ts | 35 + web/front/src/hooks/interface/index.ts | 4 + web/front/src/hooks/useTheme.ts | 110 + .../src/layouts/LayoutClassic/index.scss | 54 + web/front/src/layouts/LayoutClassic/index.vue | 58 + .../src/layouts/components/Footer/index.scss | 11 + .../src/layouts/components/Footer/index.vue | 9 + .../layouts/components/Header/ToolBarLeft.vue | 23 + .../components/Header/ToolBarRight.vue | 40 + .../Header/components/AssemblySize.vue | 37 + .../components/Header/components/Avatar.vue | 141 + .../Header/components/Breadcrumb.vue | 94 + .../Header/components/CollapseIcon.vue | 21 + .../Header/components/Fullscreen.vue | 25 + .../components/Header/components/Guide.vue | 93 + .../Header/components/InfoDialog.vue | 24 + .../components/Header/components/InfoForm.vue | 105 + .../Header/components/ThemeSetting.vue | 12 + .../components/Main/components/Maximize.vue | 40 + .../src/layouts/components/Main/index.scss | 10 + .../src/layouts/components/Main/index.vue | 75 + .../src/layouts/components/Menu/SubMenu.vue | 91 + .../components/Tabs/components/MoreButton.vue | 86 + .../src/layouts/components/Tabs/index.scss | 53 + .../src/layouts/components/Tabs/index.vue | 111 + .../layouts/components/ThemeDrawer/index.scss | 137 + .../layouts/components/ThemeDrawer/index.vue | 128 + web/front/src/layouts/index.vue | 25 + web/front/src/main.ts | 45 + web/front/src/routers/index.ts | 95 + .../src/routers/modules/dynamicRouter.ts | 54 + web/front/src/routers/modules/staticRouter.ts | 70 + web/front/src/stores/index.ts | 8 + web/front/src/stores/interface/index.ts | 53 + web/front/src/stores/modules/auth.ts | 29 + web/front/src/stores/modules/global.ts | 47 + web/front/src/stores/modules/keepAlive.ts | 23 + web/front/src/stores/modules/tabs.ts | 50 + web/front/src/stores/modules/user.ts | 23 + web/front/src/styles/common.scss | 121 + web/front/src/styles/element-dark.scss | 16 + web/front/src/styles/element.scss | 182 + web/front/src/styles/reset.scss | 13 + web/front/src/styles/theme/aside.ts | 16 + web/front/src/styles/theme/header.ts | 25 + web/front/src/styles/theme/menu.ts | 31 + web/front/src/styles/var.scss | 2 + web/front/src/typings/global.d.ts | 64 + web/front/src/typings/window.d.ts | 8 + web/front/src/utils/color.ts | 59 + web/front/src/utils/eleValidate.ts | 90 + web/front/src/utils/errorHandler.ts | 27 + web/front/src/utils/index.ts | 50 + web/front/src/utils/map.ts | 286 + web/front/src/utils/mittBus.ts | 5 + web/front/src/utils/svg.ts | 13 + .../src/views/config/ClientConfig/index.vue | 9 + .../src/views/config/ServerConfig/index.vue | 9 + web/front/src/views/connection/index.scss | 22 + web/front/src/views/connection/index.vue | 191 + web/front/src/views/home/index.scss | 42 + web/front/src/views/home/index.vue | 163 + .../src/views/login/components/LoginForm.vue | 115 + web/front/src/views/login/index.scss | 85 + web/front/src/views/login/index.vue | 25 + web/front/src/views/pprof/index.vue | 7 + web/front/src/vite-env.d.ts | 1 + web/front/tsconfig.json | 42 + web/front/vite.config.ts | 89 + web/server/middleware/jwt.go | 28 + web/server/middleware/jwt_test.go | 129 + web/server/model/request/connection.go | 22 + web/server/model/request/permission.go | 22 + web/server/model/request/system.go | 35 + web/server/model/request/user.go | 12 + web/server/model/response/response.go | 55 + web/server/tokenManager.go | 85 + web/server/util/browser.go | 60 + web/server/util/https.go | 57 + web/server/util/jwt.go | 70 + web/server/util/jwt_test.go | 79 + web/server/util/net.go | 105 + web/server/util/net_test.go | 491 + web/server/util/system.go | 112 + 213 files changed, 39751 insertions(+), 312 deletions(-) create mode 100644 client/web/api/api.go create mode 100644 client/web/api/api_test.go create mode 100644 client/web/service/service.go create mode 100644 client/web/service/service_test.go create mode 100644 client/web/web.go create mode 100644 client/web/web_test.go create mode 100644 config/duration.go create mode 100644 config/duration_test.go delete mode 100644 front/package.json create mode 100644 server/web/api/api.go create mode 100644 server/web/api/api_test.go create mode 100644 server/web/service/service.go create mode 100644 server/web/service/service_test.go create mode 100644 server/web/web.go create mode 100644 server/web/web_test.go create mode 100644 util/path.go create mode 100644 util/path_test.go create mode 100644 web/front/.editorconfig create mode 100644 web/front/.env create mode 100644 web/front/.env.development create mode 100644 web/front/.env.production create mode 100644 web/front/.env.test create mode 100644 web/front/.eslintignore create mode 100644 web/front/.eslintrc.cjs create mode 100644 web/front/.prettierignore create mode 100644 web/front/.prettierrc.cjs create mode 100644 web/front/.stylelintignore create mode 100644 web/front/.stylelintrc.cjs create mode 100644 web/front/LICENSE create mode 100644 web/front/README.md create mode 100644 web/front/README_CN.md create mode 100644 web/front/build/getEnv.ts create mode 100644 web/front/build/plugins.ts create mode 100644 web/front/build/proxy.ts create mode 100644 web/front/commitlint.config.cjs create mode 100644 web/front/index.html create mode 100644 web/front/lint-staged.config.cjs create mode 100644 web/front/package-lock.json create mode 100644 web/front/package.json create mode 100644 web/front/postcss.config.cjs create mode 100644 web/front/public/logo.png create mode 100644 web/front/public/vue.svg create mode 100644 web/front/src/App.vue create mode 100644 web/front/src/api/helper/checkStatus.ts create mode 100644 web/front/src/api/index.ts create mode 100644 web/front/src/api/interface/index.ts create mode 100644 web/front/src/api/modules/clientConfig.ts create mode 100644 web/front/src/api/modules/connection.ts create mode 100644 web/front/src/api/modules/login.ts create mode 100644 web/front/src/api/modules/server.ts create mode 100644 web/front/src/api/modules/serverConfig.ts create mode 100644 web/front/src/api/modules/userInfo.ts create mode 100644 web/front/src/assets/fonts/MetroDF.ttf create mode 100644 web/front/src/assets/fonts/font.scss create mode 100644 web/front/src/assets/iconfont/iconfont.scss create mode 100644 web/front/src/assets/iconfont/iconfont.ttf create mode 100644 web/front/src/assets/images/403.png create mode 100644 web/front/src/assets/images/404.png create mode 100644 web/front/src/assets/images/500.png create mode 100644 web/front/src/assets/images/login_bg.svg create mode 100644 web/front/src/assets/images/login_left.png create mode 100644 web/front/src/assets/images/login_left1.png create mode 100644 web/front/src/assets/images/login_left2.png create mode 100644 web/front/src/assets/images/login_left3.png create mode 100644 web/front/src/assets/images/login_left4.png create mode 100644 web/front/src/assets/images/login_left5.png create mode 100644 web/front/src/assets/images/logo.svg create mode 100644 web/front/src/assets/images/logo_m.png create mode 100644 web/front/src/assets/images/logo_m_en.png create mode 100644 web/front/src/assets/images/logo_pc.png create mode 100644 web/front/src/assets/images/logo_pc_en.png create mode 100644 web/front/src/assets/images/welcome.png create mode 100644 web/front/src/assets/json/authMenuList.json create mode 100644 web/front/src/components/Anchor/index.vue create mode 100644 web/front/src/components/ClientConfigForm/components/GeneralSetting.vue create mode 100644 web/front/src/components/ClientConfigForm/components/LogSetting.vue create mode 100644 web/front/src/components/ClientConfigForm/components/SentrySetting.vue create mode 100644 web/front/src/components/ClientConfigForm/components/ServiceSetting.vue create mode 100644 web/front/src/components/ClientConfigForm/components/TCPForwardSetting.vue create mode 100644 web/front/src/components/ClientConfigForm/components/WebRTCSetting.vue create mode 100644 web/front/src/components/ClientConfigForm/index.scss create mode 100644 web/front/src/components/ClientConfigForm/index.vue create mode 100644 web/front/src/components/ClientConfigForm/interface/index.ts create mode 100644 web/front/src/components/ConnectionTable/index.vue create mode 100644 web/front/src/components/ErrorMessage/403.vue create mode 100644 web/front/src/components/ErrorMessage/404.vue create mode 100644 web/front/src/components/ErrorMessage/500.vue create mode 100644 web/front/src/components/ErrorMessage/index.scss create mode 100644 web/front/src/components/Loading/index.scss create mode 100644 web/front/src/components/Loading/index.vue create mode 100644 web/front/src/components/ServerConfigForm/components/APISetting.vue create mode 100644 web/front/src/components/ServerConfigForm/components/ConnectionSetting.vue create mode 100644 web/front/src/components/ServerConfigForm/components/GeneralSetting.vue create mode 100644 web/front/src/components/ServerConfigForm/components/HostSetting.vue create mode 100644 web/front/src/components/ServerConfigForm/components/NetworkSetting.vue create mode 100644 web/front/src/components/ServerConfigForm/components/SecuritySetting.vue create mode 100644 web/front/src/components/ServerConfigForm/components/TCPSetting.vue create mode 100644 web/front/src/components/ServerConfigForm/components/UserSetting.vue create mode 100644 web/front/src/components/ServerConfigForm/index.scss create mode 100644 web/front/src/components/ServerConfigForm/index.vue create mode 100644 web/front/src/components/ServerConfigForm/interface/index.ts create mode 100644 web/front/src/components/SwitchDark/index.vue create mode 100644 web/front/src/components/UsageTooltip/index.vue create mode 100644 web/front/src/components/Verify/index.vue create mode 100644 web/front/src/config/index.ts create mode 100644 web/front/src/config/nprogress.ts create mode 100644 web/front/src/config/piniaPersist.ts create mode 100644 web/front/src/config/serviceLoading.ts create mode 100644 web/front/src/enums/httpEnum.ts create mode 100644 web/front/src/hooks/interface/index.ts create mode 100644 web/front/src/hooks/useTheme.ts create mode 100644 web/front/src/layouts/LayoutClassic/index.scss create mode 100644 web/front/src/layouts/LayoutClassic/index.vue create mode 100644 web/front/src/layouts/components/Footer/index.scss create mode 100644 web/front/src/layouts/components/Footer/index.vue create mode 100644 web/front/src/layouts/components/Header/ToolBarLeft.vue create mode 100644 web/front/src/layouts/components/Header/ToolBarRight.vue create mode 100644 web/front/src/layouts/components/Header/components/AssemblySize.vue create mode 100644 web/front/src/layouts/components/Header/components/Avatar.vue create mode 100644 web/front/src/layouts/components/Header/components/Breadcrumb.vue create mode 100644 web/front/src/layouts/components/Header/components/CollapseIcon.vue create mode 100644 web/front/src/layouts/components/Header/components/Fullscreen.vue create mode 100644 web/front/src/layouts/components/Header/components/Guide.vue create mode 100644 web/front/src/layouts/components/Header/components/InfoDialog.vue create mode 100644 web/front/src/layouts/components/Header/components/InfoForm.vue create mode 100644 web/front/src/layouts/components/Header/components/ThemeSetting.vue create mode 100644 web/front/src/layouts/components/Main/components/Maximize.vue create mode 100644 web/front/src/layouts/components/Main/index.scss create mode 100644 web/front/src/layouts/components/Main/index.vue create mode 100644 web/front/src/layouts/components/Menu/SubMenu.vue create mode 100644 web/front/src/layouts/components/Tabs/components/MoreButton.vue create mode 100644 web/front/src/layouts/components/Tabs/index.scss create mode 100644 web/front/src/layouts/components/Tabs/index.vue create mode 100644 web/front/src/layouts/components/ThemeDrawer/index.scss create mode 100644 web/front/src/layouts/components/ThemeDrawer/index.vue create mode 100644 web/front/src/layouts/index.vue create mode 100644 web/front/src/main.ts create mode 100644 web/front/src/routers/index.ts create mode 100644 web/front/src/routers/modules/dynamicRouter.ts create mode 100644 web/front/src/routers/modules/staticRouter.ts create mode 100644 web/front/src/stores/index.ts create mode 100644 web/front/src/stores/interface/index.ts create mode 100644 web/front/src/stores/modules/auth.ts create mode 100644 web/front/src/stores/modules/global.ts create mode 100644 web/front/src/stores/modules/keepAlive.ts create mode 100644 web/front/src/stores/modules/tabs.ts create mode 100644 web/front/src/stores/modules/user.ts create mode 100644 web/front/src/styles/common.scss create mode 100644 web/front/src/styles/element-dark.scss create mode 100644 web/front/src/styles/element.scss create mode 100644 web/front/src/styles/reset.scss create mode 100644 web/front/src/styles/theme/aside.ts create mode 100644 web/front/src/styles/theme/header.ts create mode 100644 web/front/src/styles/theme/menu.ts create mode 100644 web/front/src/styles/var.scss create mode 100644 web/front/src/typings/global.d.ts create mode 100644 web/front/src/typings/window.d.ts create mode 100644 web/front/src/utils/color.ts create mode 100644 web/front/src/utils/eleValidate.ts create mode 100644 web/front/src/utils/errorHandler.ts create mode 100644 web/front/src/utils/index.ts create mode 100644 web/front/src/utils/map.ts create mode 100644 web/front/src/utils/mittBus.ts create mode 100644 web/front/src/utils/svg.ts create mode 100644 web/front/src/views/config/ClientConfig/index.vue create mode 100644 web/front/src/views/config/ServerConfig/index.vue create mode 100644 web/front/src/views/connection/index.scss create mode 100644 web/front/src/views/connection/index.vue create mode 100644 web/front/src/views/home/index.scss create mode 100644 web/front/src/views/home/index.vue create mode 100644 web/front/src/views/login/components/LoginForm.vue create mode 100644 web/front/src/views/login/index.scss create mode 100644 web/front/src/views/login/index.vue create mode 100644 web/front/src/views/pprof/index.vue create mode 100644 web/front/src/vite-env.d.ts create mode 100644 web/front/tsconfig.json create mode 100644 web/front/vite.config.ts create mode 100644 web/server/middleware/jwt.go create mode 100644 web/server/middleware/jwt_test.go create mode 100644 web/server/model/request/connection.go create mode 100644 web/server/model/request/permission.go create mode 100644 web/server/model/request/system.go create mode 100644 web/server/model/request/user.go create mode 100644 web/server/model/response/response.go create mode 100644 web/server/tokenManager.go create mode 100644 web/server/util/browser.go create mode 100644 web/server/util/https.go create mode 100644 web/server/util/jwt.go create mode 100644 web/server/util/jwt_test.go create mode 100644 web/server/util/net.go create mode 100644 web/server/util/net_test.go create mode 100644 web/server/util/system.go diff --git a/.gitignore b/.gitignore index ccad0441..22c6bda0 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,39 @@ build release -.vscode .dockerignore +.DS_Store +# IDE files +.vscode .idea -.DS_Store \ No newline at end of file + +# Frontend specific ignores +web/front/logs +web/front/*.log +web/front/npm-debug.log* +web/front/yarn-debug.log* +web/front/yarn-error.log* +web/front/pnpm-debug.log* +web/front/lerna-debug.log* + +web/front/node_modules +web/front/dist +web/front/dist-ssr +web/front/stats.html +web/front/*.local + +# Editor directories and files +web/front/.vscode/* +web/front/!.vscode/extensions.json +web/front/!.vscode/settings.json +web/front/.idea +web/front/.DS_Store +web/front/*.suo +web/front/*.ntvs* +web/front/*.njsproj +web/front/*.sln +web/front/*.sw? + +# dist +server/web/dist +client/web/dist diff --git a/Dockerfile b/Dockerfile index 992130ba..c6b278aa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,15 @@ RUN sed -i 's|deb.debian.org|mirrors.163.com|g' /etc/apt/sources.list && \ apt update && \ apt install xz-utils bzip2 sudo lsb-release ninja-build generate-ninja file patch -y +# 安装nodejs 20 +RUN apt-get install -y ca-certificates curl gnupg && \ + mkdir -p /etc/apt/keyrings && \ + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \ + NODE_MAJOR=20 && \ + echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && \ + apt-get update && \ + apt-get install nodejs -y + # golang 切换国内源并且提前安装好依赖 ENV GO111MODULE=on ENV GOPROXY=https://goproxy.cn diff --git a/Makefile b/Makefile index 7a296d9d..17c6beec 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,10 @@ endif RELEASE_OPTIONS=$(GO_RACE) -tags release -trimpath -ldflags "$(GO_STATIC_LINK_FLAG) -s -w -X 'github.com/isrc-cas/gt/predef.Version=$(VERSION)'" DEBUG_OPTIONS=$(GO_RACE) -trimpath -ldflags "$(GO_STATIC_LINK_FLAG) -X 'github.com/isrc-cas/gt/predef.Version=$(VERSION)'" SOURCES=$(shell ls -1 **/*.go) +FRONTEND_DIR=web/front +SOURCES_FRONT = $(shell find $(FRONTEND_DIR) -type d \( -name 'node_modules' -o -name 'dist' \) -prune -o -type f \( -name '*.ts' -o -name '*.vue' -o -name '*.scss' -o -name '*.json' -o -name '*.cjs' -o -name '*.config.ts' -o -name '*.html' \) -print) +SERVER_FRONT_DIR=server/web +CLIENT_FRONT_DIR=client/web TARGET?=$(shell gcc -dumpmachine) TARGET_OS=$(shell echo $(TARGET) | awk -F '-' '{print $$2}') ifeq ($(TARGET_OS), native) @@ -62,7 +66,7 @@ export CGO_LDFLAGS= $(shell pwd)/dep/_google-webrtc/src/out/release-$(TARGET)/ob -ldl -pthread -lnuma export CGO_ENABLED=1 -.PHONY: all build docker_build_linux_arm64 fmt build_client docker_build_linux_arm64_client gofumpt build_server docker_build_linux_arm64_server golangci-lint check_webrtc_dependencies docker_release_linux_amd64 release clean docker_release_linux_amd64_client release_client compile_webrtc docker_release_linux_amd64_server release_server docker_create_image docker_build_linux_amd64 docker_release_linux_arm64 revive docker_build_linux_amd64_client docker_release_linux_arm64_client test docker_build_linux_amd64_server docker_release_linux_arm64_server update_submodule check_msquic_dependencies compile_msquic +.PHONY: all build docker_build_linux_arm64 fmt build_client docker_build_linux_arm64_client gofumpt build_server docker_build_linux_arm64_server golangci-lint check_webrtc_dependencies docker_release_linux_amd64 release clean docker_release_linux_amd64_client release_client compile_webrtc docker_release_linux_amd64_server release_server docker_create_image docker_build_linux_amd64 docker_release_linux_arm64 revive docker_build_linux_amd64_client docker_release_linux_arm64_client test docker_build_linux_amd64_server docker_release_linux_arm64_server update_submodule build_web_server build_web_client release_web_server release_web_client check_npm front_release duplicate_dist_server clean_duplication_client clean_web clean_dist clean_duplication clean_duplication_server clean_duplication_client check_msquic_dependencies compile_msquic all: gofumpt golangci-lint test release @@ -89,6 +93,8 @@ golangci-lint: --exclude 'S1000: should use a simple channel send/receive instead of `select` with a single case' update_submodule: + git config --global --add safe.directory /go/src/github.com/isrc-cas/gt + git config --global --add safe.directory /go/src/github.com/isrc-cas/gt/dep/_google-webrtc $(UPDATE_SUBMODULE_COMMAND) docker_create_image: update_submodule @@ -126,26 +132,62 @@ docker_release_linux_arm64_server: docker_create_image build: build_server build_client release: release_server release_client -build_client: $(SOURCES) Makefile compile_webrtc compile_msquic +build_client: $(SOURCES) Makefile compile_webrtc build_web_client compile_msquic $(eval CGO_CXXFLAGS+=-O0 -g -ggdb) $(eval NAME=$(GOOS)-$(GOARCH)-client) go build $(DEBUG_OPTIONS) -o build/$(NAME)$(EXE) ./cmd/client -release_client: $(SOURCES) Makefile compile_webrtc compile_msquic +release_client: $(SOURCES) Makefile compile_webrtc release_web_client compile_msquic $(eval CGO_CXXFLAGS+=-O3) $(eval NAME=$(GOOS)-$(GOARCH)-client) go build $(RELEASE_OPTIONS) -o release/$(NAME)$(EXE) ./cmd/client -build_server: $(SOURCES) Makefile compile_webrtc compile_msquic +build_server: $(SOURCES) Makefile compile_webrtc build_web_server compile_msquic $(eval CGO_CXXFLAGS+=-O0 -g -ggdb) $(eval NAME=$(GOOS)-$(GOARCH)-server) go build $(DEBUG_OPTIONS) -o build/$(NAME)$(EXE) ./cmd/server -release_server: $(SOURCES) Makefile compile_webrtc compile_msquic +release_server: $(SOURCES) Makefile compile_webrtc release_web_server compile_msquic $(eval CGO_CXXFLAGS+=-O3) $(eval NAME=$(GOOS)-$(GOARCH)-server) go build $(RELEASE_OPTIONS) -o release/$(NAME)$(EXE) ./cmd/server -clean: - rm build/* release/* - rm -r dep/_google-webrtc/src/out/* +build_web_server: $(SOURCES_FRONT) Makefile check_npm front_build duplicate_dist_server +build_web_client: $(SOURCES_FRONT) Makefile check_npm front_build duplicate_dist_client + +release_web_server: $(SOURCES_FRONT) Makefile check_npm front_release duplicate_dist_server +release_web_client: $(SOURCES_FRONT) Makefile check_npm front_release duplicate_dist_client + +check_npm: + npm --version || curl -qL https://www.npmjs.com/install.sh | sh + +front_build: $(SOURCES_FRONT) + (cd $(FRONTEND_DIR) && npm install && npm run "build:test") + +front_release: $(SOURCES_FRONT) + (cd $(FRONTEND_DIR) && npm install && npm run "build:pro") + +duplicate_dist_server: + cp -r $(FRONTEND_DIR)/dist $(SERVER_FRONT_DIR)/dist + +duplicate_dist_client: + cp -r $(FRONTEND_DIR)/dist $(CLIENT_FRONT_DIR)/dist + +clean: clean_web + rm -rf build/* release/* + rm -rf dep/_google-webrtc/src/out/* + +clean_web: clean_dist + rm -rf $(FRONTEND_DIR)/node_modules + rm -f $(FRONTEND_DIR)/package-lock.json + +clean_dist: clean_duplication + rm -rf $(FRONTEND_DIR)/dist + +clean_duplication: clean_duplication_server clean_duplication_client + +clean_duplication_server: + rm -rf $(SERVER_FRONT_DIR)/dist +clean_duplication_client: + rm -rf $(CLIENT_FRONT_DIR)/dist + check_webrtc_dependencies: sh -c "command -v gn" diff --git a/README_CN.md b/README_CN.md index 8a314396..69cd2dec 100644 --- a/README_CN.md +++ b/README_CN.md @@ -6,85 +6,95 @@ GT 是一个支持点对点直连(P2P)和互联网中转的反向代理开 具有以下设计特点: -- 注重隐私保护,在保证满足功能实现需要的情况下,最少化 server 端对数据包的分析,例如:基于 TCP 连接的实现方式,应用层 HTTP - 协议传输只分析第一个数据包的 HTTP 协议头的目标数据,不作任何多余分析,将后续数据直接转发。 -- 注重性能,在代码实现上,倾向于采用性能更高的设计,例如:修改标准库来实现减少内存分配和复制的设计方案。 +- 注重隐私保护 + - 服务端的端口复用功能,是基于协议目标特征位置来实现的。例如:基于 TCP 数据流,应用层 HTTP 协议转发只定位第一个数据包的 + HTTP 协议头的转发目标,不作任何多余处理,将后续数据直接转发 + - 支持 HTTPS SNI 端到端加密转发 + - 不打印敏感信息到日志 +- 注重性能 + - 在保持跨平台和功能稳定的前提下,会尝试采用性能更高的技术方案 +- 注重易用性 + - 支持命令行参数、 yaml 配置文件和 Web 配置管理 + - 服务端支持多用户功能 + - 客户端支持指向多个服务,并支持热更新 + - 零参数配置启动,进入 Web 配置初始化 - 基于 WebRTC 实现的点对点连接功能,支持所有支持 WebRTC 的平台,例如:iOS,Android,浏览器等。 目前已经实现的主要功能有: - 支持 HTTP(S)、WebSocket(S)、SSH、SMB 等基于 TCP 协议的通信协议转发 - 支持 WebRTC 点对点连接 -- 多用户功能 +- 客户端支持指向多个服务,并支持热更新 +- 服务端多用户功能 - 支持多种用户验证方式:API服务、本地配置 - 每个用户独立配置 - 限制用户速度 - 限制客户端连接数 - 验证失败达一定次数后,拒绝访问一段时间 - 服务端与客户端之间通信采用 TCP 连接池 -- 保持命令行参数与 yaml 配置参数一致 - 支持日志上报到 Sentry 服务 ## 目录 -* [GT](#gt) - * [目录](#目录) - * [工作原理](#工作原理) - * [用法](#用法) - * [配置文件](#配置文件) - * [服务端配置 users](#服务端配置-users) - * [通过命令行配置 users](#通过命令行配置-users) - * [通过 users 配置文件配置 users](#通过-users-配置文件配置-users) - * [通过 config 配置文件配置 users](#通过-config-配置文件配置-users) - * [允许所有的客户端](#允许所有的客户端) - * [服务端配置 TCP](#服务端配置-tcp) - * [通过 users 配置文件配置 TCP](#通过-users-配置文件配置-tcp) - * [通过 config 配置文件配置 TCP](#通过-config-配置文件配置-tcp) - * [命令行参数](#命令行参数) - * [HTTP 内网穿透](#http-内网穿透) - * [HTTPS 内网穿透](#https-内网穿透) - * [HTTPS SNI 内网穿透](#https-sni-内网穿透) - * [TLS 加密客户端服务端之间的通信](#tls-加密客户端服务端之间的通信) - * [TCP 内网穿透](#tcp-内网穿透) - * [QUIC 内网穿透](#quic-内网穿透) - * [智能内网穿透(自适应选择 TCP/QUIC )](#智能内网穿透自适应选择-tcpquic-) - * [客户端同时开启多个服务](#客户端同时开启多个服务) - * [服务端 API](#服务端-api) - * [性能测试](#性能测试) - * [第一组(MacOS环境+nginx测试)](#第一组macos环境nginx测试) - * [GT benchmark](#gt-benchmark) - * [frp dev branch 42745a3](#frp-dev-branch-42745a3) - * [第二组(Ubuntu环境+nginx测试)](#第二组ubuntu环境nginx测试) - * [GT-TCP](#gt-tcp) - * [GT-QUIC](#gt-quic) - * [frp v0.52.1](#frp-v0521) - * [第三组(Ubuntu环境+short request测试)](#第三组ubuntu环境short-request测试) - * [GT-TCP](#gt-tcp-1) - * [GT-QUIC](#gt-quic-1) - * [frp v0.52.1](#frp-v0521-1) - * [运行](#运行) - * [Docker 容器运行](#docker-容器运行) - * [编译](#编译) - * [在 Ubuntu/Debian 上编译](#在-ubuntudebian-上编译) - * [安装依赖](#安装依赖) - * [获取代码并编译](#获取代码并编译) - * [从 ISCAS 镜像获取 WebRTC 并编译 GT](#从-iscas-镜像获取-webrtc-并编译-gt) - * [从官方获取 WebRTC 并编译 GT](#从官方获取-webrtc-并编译-gt) - * [在 Ubuntu/Debian 上通过 Docker 编译](#在-ubuntudebian-上通过-docker-编译) - * [安装依赖](#安装依赖-1) - * [获取代码并编译](#获取代码并编译-1) - * [从 ISCAS 镜像获取 WebRTC 并编译 GT](#从-iscas-镜像获取-webrtc-并编译-gt-1) - * [从官方获取 WebRTC 并编译 GT](#从官方获取-webrtc-并编译-gt-1) - * [演进计划](#演进计划) - * [贡献指南](#贡献指南) - * [贡献代码](#贡献代码) - * [代码质量](#代码质量) - * [提交信息](#提交信息) - * [问题报告](#问题报告) - * [功能请求](#功能请求) - * [感谢您的贡献](#感谢您的贡献) - * [贡献者](#贡献者) +- [GT](#gt) + - [目录](#目录) + - [工作原理](#工作原理) + - [用法](#用法) + - [Web 管理](#web-管理) + - [配置文件](#配置文件) + - [服务端配置 users](#服务端配置-users) + - [通过命令行配置 users](#通过命令行配置-users) + - [通过 users 配置文件配置 users](#通过-users-配置文件配置-users) + - [通过 config 配置文件配置 users](#通过-config-配置文件配置-users) + - [允许所有的客户端](#允许所有的客户端) + - [服务端配置 TCP](#服务端配置-tcp) + - [通过 users 配置文件配置 TCP](#通过-users-配置文件配置-tcp) + - [通过 config 配置文件配置 TCP](#通过-config-配置文件配置-tcp) + - [命令行参数](#命令行参数) + - [HTTP 内网穿透](#http-内网穿透) + - [HTTPS 内网穿透](#https-内网穿透) + - [HTTPS SNI 内网穿透](#https-sni-内网穿透) + - [TLS 加密客户端服务端之间的通信](#tls-加密客户端服务端之间的通信) + - [TCP 内网穿透](#tcp-内网穿透) + - [QUIC 内网穿透](#quic-内网穿透) + - [智能内网穿透(自适应选择 TCP/QUIC )](#智能内网穿透自适应选择-tcpquic-) + - [客户端同时开启多个服务](#客户端同时开启多个服务) + - [服务端 API](#服务端-api) + - [性能测试](#性能测试) + - [第一组(MacOS环境+nginx测试)](#第一组macos环境nginx测试) + - [GT benchmark](#gt-benchmark) + - [frp dev branch 42745a3](#frp-dev-branch-42745a3) + - [第二组(Ubuntu环境+nginx测试)](#第二组ubuntu环境nginx测试) + - [GT-TCP](#gt-tcp) + - [GT-QUIC](#gt-quic) + - [frp v0.52.1](#frp-v0521) + - [第三组(Ubuntu环境+short request测试)](#第三组ubuntu环境short-request测试) + - [GT-TCP](#gt-tcp-1) + - [GT-QUIC](#gt-quic-1) + - [frp v0.52.1](#frp-v0521-1) + - [运行](#运行) + - [Docker 容器运行](#docker-容器运行) + - [编译](#编译) + - [在 Ubuntu/Debian 上编译](#在-ubuntudebian-上编译) + - [安装依赖](#安装依赖) + - [获取代码并编译](#获取代码并编译) + - [从 ISCAS 镜像获取 WebRTC 并编译 GT](#从-iscas-镜像获取-webrtc-并编译-gt) + - [从官方获取 WebRTC 并编译 GT](#从官方获取-webrtc-并编译-gt) + - [在 Ubuntu/Debian 上通过 Docker 编译](#在-ubuntudebian-上通过-docker-编译) + - [安装依赖](#安装依赖-1) + - [获取代码并编译](#获取代码并编译-1) + - [从 ISCAS 镜像获取 WebRTC 并编译 GT](#从-iscas-镜像获取-webrtc-并编译-gt-1) + - [从官方获取 WebRTC 并编译 GT](#从官方获取-webrtc-并编译-gt-1) + - [演进计划](#演进计划) + - [贡献指南](#贡献指南) + - [贡献代码](#贡献代码) + - [代码质量](#代码质量) + - [提交信息](#提交信息) + - [问题报告](#问题报告) + - [功能请求](#功能请求) + - [感谢您的贡献](#感谢您的贡献) + - [贡献者](#贡献者) ## 工作原理 @@ -107,6 +117,19 @@ GT 是一个支持点对点直连(P2P)和互联网中转的反向代理开 ## 用法 +支持命令行参数、 yaml 配置文件和 Web 管理。 + +### Web 管理 + +默认设置 + +- gt-server 的 Web 地址默认为 127.0.0.1:8000 +- gt-client 的 Web 地址默认为 127.0.0.1:7000 + +如果不是本地运行,可以修改 `webAddr` 参数为 `0.0.0.0:8000` 和 `0.0.0.0:7000`,来通过对应的 IP 来访问。 + +[Web 管理文档](web/front/README_CN.md) + ### 配置文件 配置文件使用 yaml 格式,客户端与服务端均可以使用配置文件。 diff --git a/client/client.go b/client/client.go index d5257e22..28de27a8 100644 --- a/client/client.go +++ b/client/client.go @@ -52,7 +52,7 @@ import ( // New parses the command line args and creates a Client. out 用于测试 func New(args []string, out io.Writer) (c *Client, err error) { - conf := defaultConfig() + conf := getDefaultConfig(args) err = config.ParseFlags(args, &conf, &conf.Options) if err != nil { return @@ -97,6 +97,17 @@ func New(args []string, out io.Writer) (c *Client, err error) { c.apiServer.ReadTimeout = 30 * time.Second return } +func getDefaultConfig(args []string) (conf Config) { + if predef.IsNoArgs() { + conf = defaultConfigWithNoArgs() + } else { + conf = defaultConfig() + if util.Contains(args, "-webAddr") { + conf.Config = predef.GetDefaultClientConfigPath() + } + } + return +} func processSignal(signal string) (err error) { switch signal { @@ -280,7 +291,7 @@ func (d *dialer) initWithRemoteAPI(c *Client) (err error) { req.URL.RawQuery = query.Encode() req.Header.Set("Request-Id", strconv.FormatInt(time.Now().Unix(), 10)) client := http.Client{ - Timeout: c.Config().RemoteTimeout, + Timeout: c.Config().RemoteTimeout.Duration, } resp, err := client.Do(req) if err != nil { @@ -446,7 +457,7 @@ func (c *Client) Start() (err error) { break } c.Logger.Error().Err(err).Msg("failed to query server address") - time.Sleep(c.Config().ReconnectDelay) + time.Sleep(c.Config().ReconnectDelay.Duration) } } if len(dialer.host) == 0 { @@ -468,6 +479,8 @@ func (c *Client) Start() (err error) { conf4Log := *c.Config() conf4Log.Secret = "******" + conf4Log.Password = "******" + conf4Log.SigningKey = "******" c.Logger.Info().Msg(spew.Sdump(conf4Log)) for i := uint(1); i <= c.Config().RemoteConnections; i++ { go c.connectLoop(dialer, i) @@ -498,6 +511,25 @@ func (c *Client) Config() *Config { return c.config.Load() } +func (c *Client) GetConnectionPoolStatus() (status map[uint]Status) { + if c.idleManager == nil { + return + } + return c.idleManager.GetConnectionStatus() +} + +func (c *Client) GetConnectionPoolNetInfo() (pools []PoolInfo) { + c.tunnelsRWMtx.RLock() + defer c.tunnelsRWMtx.RUnlock() + for conn := range c.tunnels { + pools = append(pools, PoolInfo{ + LocalAddr: conn.LocalAddr(), + RemoteAddr: conn.RemoteAddr(), + }) + } + return +} + // Close stops the client agent. func (c *Client) Close() { if !atomic.CompareAndSwapUint32(&c.closing, 0, 1) { @@ -515,7 +547,9 @@ func (c *Client) Close() { p.Close() } c.peersRWMtx.Unlock() - c.idleManager.Close() + if c.idleManager != nil { + c.idleManager.Close() + } c.Logger.Info().Err(c.apiServer.Close()).Msg("api server close") if c.tcpForwardListener != nil { _ = c.tcpForwardListener.Close() @@ -524,10 +558,15 @@ func (c *Client) Close() { // Shutdown stops the client gracefully. func (c *Client) Shutdown() { + defer c.Logger.Close() + c.ShutdownWithoutClosingLogger() +} + +func (c *Client) ShutdownWithoutClosingLogger() { if !atomic.CompareAndSwapUint32(&c.closing, 0, 1) { return } - defer c.Logger.Close() + c.tunnelsRWMtx.Lock() for t := range c.tunnels { t.SendCloseSignal() @@ -539,7 +578,9 @@ func (c *Client) Shutdown() { } c.peersRWMtx.Unlock() - c.idleManager.Close() + if c.idleManager != nil { + c.idleManager.Close() + } c.waitTunnelsShutdown.Wait() c.Logger.Info().Err(c.apiServer.Close()).Msg("api server close") @@ -596,7 +637,7 @@ func (c *Client) connect(d dialer, connID uint) (closing bool) { if atomic.LoadUint32(&c.closing) == 1 { return true } - time.Sleep(c.Config().ReconnectDelay) + time.Sleep(c.Config().ReconnectDelay.Duration) c.idleManager.SetWait(connID) c.idleManager.WaitIdle(connID) @@ -609,7 +650,7 @@ func (c *Client) connect(d dialer, connID uint) (closing bool) { break } c.Logger.Error().Uint("connID", connID).Err(err).Msg("failed to query server address") - time.Sleep(c.Config().ReconnectDelay) + time.Sleep(c.Config().ReconnectDelay.Duration) } return } @@ -664,14 +705,15 @@ func (c *Client) WaitUntilReady(timeout time.Duration) (err error) { return } +var errNoService = errors.New("no service is configured") + func (c *Client) parseServices() (err error) { services, err := parseServices(c.Config()) if err != nil { return } - // services 不能为空 if len(services) == 0 { - err = errors.New("no service is configured") + err = errNoService return } h := sha256.New() @@ -713,7 +755,7 @@ func parseServices(config *Config) (result services, err error) { if configServicesLen == 1 || (x.Position > config.Local[i].Position && (i == configServicesLen-1 || x.Position < config.Local[i+1].Position)) { - configServices[i].LocalTimeout = x.Value + configServices[i].LocalTimeout.Duration = x.Value } } for _, x := range config.UseLocalAsHTTPHost { @@ -737,12 +779,11 @@ func parseServices(config *Config) (result services, err error) { for i := 0; i < len(result); i++ { if result[i].LocalURL.URL == nil { err = errors.New("local url (-local option) cannot be empty") - return } // 设置默认值 - if result[i].LocalTimeout == 0 { - result[i].LocalTimeout = 120 * time.Second + if result[i].LocalTimeout.Duration == 0 { + result[i].LocalTimeout.Duration = 120 * time.Second } if result[i].RemoteTCPRandom == nil { result[i].RemoteTCPRandom = new(bool) @@ -779,7 +820,7 @@ func parseServices(config *Config) (result services, err error) { return } default: - err = fmt.Errorf("local url (-local option) '%s' must begin with http://, https:// or tcp://", config.Local[i].Value) + err = fmt.Errorf("local url (-local option) '%s' must begin with http://, https:// or tcp://", result[i].LocalURL.String()) return } @@ -823,7 +864,16 @@ func (c *Client) ReloadServices() (err error) { c.reloading.Store(false) }() - conf := defaultConfig() + conf := getDefaultConfig(os.Args) + // ignore the webSetting + conf.WebAddr = c.Config().WebAddr + conf.WebKeyFile = c.Config().WebKeyFile + conf.WebCertFile = c.Config().WebCertFile + conf.EnablePprof = c.Config().EnablePprof + conf.SigningKey = c.Config().SigningKey + conf.Admin = c.Config().Admin + conf.Password = c.Config().Password + err = config.ParseFlags(os.Args, &conf, &conf.Options) if err != nil { return @@ -852,7 +902,7 @@ func (c *Client) ReloadServices() (err error) { return } if len(services) == 0 { - err = errors.New("no service is configured") + err = errNoService return } checksum := [32]byte{} diff --git a/client/config.go b/client/config.go index 4a563162..b26bfde9 100644 --- a/client/config.go +++ b/client/config.go @@ -15,7 +15,9 @@ package client import ( + "encoding/json" "fmt" + "gopkg.in/yaml.v3" "net/url" "strconv" "strings" @@ -24,78 +26,87 @@ import ( "github.com/isrc-cas/gt/config" "github.com/isrc-cas/gt/predef" "github.com/rs/zerolog" - "gopkg.in/yaml.v3" ) // Config is a client config. type Config struct { - Version string // 目前未使用 + Version string `yaml:"-" json:"-"` // 目前未使用 Services services Options } // Options is the config options for a client. type Options struct { - Config string `arg:"config" yaml:"-" usage:"The config file path to load"` - ID string `yaml:"id" usage:"The unique id used to connect to server. Now it's the prefix of the domain."` - Secret string `yaml:"secret" usage:"The secret used to verify the id"` - ReconnectDelay time.Duration `yaml:"reconnectDelay" usage:"The delay before reconnect. Supports values like '30s', '5m'"` - Remote config.Slice[string] `yaml:"remote" usage:"The remote server url. Supports tcp:// and tls:// and quic://, default tcp://"` - RemoteSTUN string `yaml:"remoteSTUN" usage:"The remote STUN server address"` - RemoteAPI string `yaml:"remoteAPI" usage:"The API to get remote server url"` - RemoteCert string `yaml:"remoteCert" usage:"The path to remote cert"` - RemoteCertInsecure bool `yaml:"remoteCertInsecure" usage:"Accept self-signed SSL certs from remote"` - RemoteConnections uint `yaml:"remoteConnections" usage:"The max number of server connections in the pool. Valid value is 1 to 10"` - RemoteIdleConnections uint `yaml:"remoteIdleConnections" usage:"The number of idle server connections kept in the pool"` - RemoteTimeout time.Duration `yaml:"remoteTimeout" usage:"The timeout of remote connections. Supports values like '30s', '5m'"` - - HostPrefix config.PositionSlice[string] `yaml:"-" arg:"hostPrefix" usage:"The server will recognize this host prefix and forward data to local"` - RemoteTCPPort config.PositionSlice[uint16] `yaml:"-" arg:"remoteTCPPort" usage:"The TCP port that the remote server will open"` - RemoteTCPRandom config.PositionSlice[bool] `yaml:"-" arg:"remoteTCPRandom" usage:"Whether to choose a random tcp port by the remote server"` - Local config.PositionSlice[string] `yaml:"-" arg:"local" usage:"The local service url"` - LocalTimeout config.PositionSlice[time.Duration] `yaml:"-" arg:"localTimeout" usage:"The timeout of local connections. Supports values like '30s', '5m'"` - UseLocalAsHTTPHost config.PositionSlice[bool] `yaml:"-" arg:"useLocalAsHTTPHost" usage:"Use the local address as host"` - - SentryDSN string `yaml:"sentryDSN" usage:"Sentry DSN to use"` - SentryLevel config.Slice[string] `yaml:"sentryLevel" usage:"Sentry levels: trace, debug, info, warn, error, fatal, panic (default [\"error\", \"fatal\", \"panic\"])"` - SentrySampleRate float64 `yaml:"sentrySampleRate" usage:"Sentry sample rate for event submission: [0.0 - 1.0]"` - SentryRelease string `yaml:"sentryRelease" usage:"Sentry release to be sent with events"` - SentryEnvironment string `yaml:"sentryEnvironment" usage:"Sentry environment to be sent with events"` - SentryServerName string `yaml:"sentryServerName" usage:"Sentry server name to be reported"` - SentryDebug bool `yaml:"sentryDebug" usage:"Sentry debug mode, the debug information is printed to help you understand what sentry is doing"` - - WebRTCConnectionIdleTimeout time.Duration `yaml:"webrtcConnectionIdleTimeout" usage:"The timeout of WebRTC connection. Supports values like '30s', '5m'"` - WebRTCLogLevel string `yaml:"webrtcLogLevel" usage:"WebRTC log level: verbose, info, warning, error"` - WebRTCMinPort uint16 `yaml:"webrtcMinPort" usage:"The min port of WebRTC peer connection"` - WebRTCMaxPort uint16 `yaml:"webrtcMaxPort" usage:"The max port of WebRTC peer connection"` - - TCPForwardAddr string `yaml:"tcpForwardAddr" usage:"The address of TCP forward"` - TCPForwardHostPrefix string `yaml:"tcpForwardHostPrefix" usage:"The host prefix of TCP forward"` - TCPForwardConnections uint `yaml:"tcpForwardConnections" usage:"The max number of TCP forward peer connections in the pool. Valid value is 1 to 10"` - - LogFile string `yaml:"logFile" usage:"Path to save the log file"` - LogFileMaxSize int64 `yaml:"logFileMaxSize" usage:"Max size of the log files"` - LogFileMaxCount uint `yaml:"logFileMaxCount" usage:"Max count of the log files"` - LogLevel string `yaml:"logLevel" usage:"Log level: trace, debug, info, warn, error, fatal, panic, disable"` - Version bool `arg:"version" yaml:"-" usage:"Show the version of this program"` - - Signal string `arg:"s" yaml:"-" usage:"Send signal to client processes. Supports values: reload, restart, stop, kill"` - - OpenBBR bool `yaml:"bbr" usage:"Use bbr as congestion control algorithm when GT use QUIC connection. Default algorithm is Cubic."` + Config string `arg:"config" yaml:"-" json:"-" usage:"The config file path to load"` + ID string `yaml:"id,omitempty" json:",omitempty" usage:"The unique id used to connect to server. Now it's the prefix of the domain."` + Secret string `yaml:"secret,omitempty" json:",omitempty" usage:"The secret used to verify the id"` + ReconnectDelay config.Duration `yaml:"reconnectDelay,omitempty" json:",omitempty" usage:"The delay before reconnect. Supports values like '30s', '5m'"` + Remote config.Slice[string] `yaml:"remote,omitempty" json:",omitempty" usage:"The remote server url. Supports tcp:// and tls:// and quic://, default tcp://"` + RemoteSTUN string `yaml:"remoteSTUN,omitempty" json:",omitempty" usage:"The remote STUN server address"` + RemoteAPI string `yaml:"remoteAPI,omitempty" json:",omitempty" usage:"The API to get remote server url"` + RemoteCert string `yaml:"remoteCert,omitempty" json:",omitempty" usage:"The path to remote cert"` + RemoteCertInsecure bool `yaml:"remoteCertInsecure,omitempty" json:",omitempty" usage:"Accept self-signed SSL certs from remote"` + RemoteConnections uint `yaml:"remoteConnections,omitempty" json:",omitempty" usage:"The max number of server connections in the pool. Valid value is 1 to 10"` + RemoteIdleConnections uint `yaml:"remoteIdleConnections,omitempty" json:",omitempty" usage:"The number of idle server connections kept in the pool"` + RemoteTimeout config.Duration `yaml:"remoteTimeout,omitempty" json:",omitempty" usage:"The timeout of remote connections. Supports values like '30s', '5m'"` + + HostPrefix config.PositionSlice[string] `yaml:"-" json:"-" arg:"hostPrefix" usage:"The server will recognize this host prefix and forward data to local"` + RemoteTCPPort config.PositionSlice[uint16] `yaml:"-" json:"-" arg:"remoteTCPPort" usage:"The TCP port that the remote server will open"` + RemoteTCPRandom config.PositionSlice[bool] `yaml:"-" json:"-" arg:"remoteTCPRandom" usage:"Whether to choose a random tcp port by the remote server"` + Local config.PositionSlice[string] `yaml:"-" json:"-" arg:"local" usage:"The local service url"` + LocalTimeout config.PositionSlice[time.Duration] `yaml:"-" json:"-" arg:"localTimeout" usage:"The timeout of local connections. Supports values like '30s', '5m'"` + UseLocalAsHTTPHost config.PositionSlice[bool] `yaml:"-" json:"-" arg:"useLocalAsHTTPHost" usage:"Use the local address as host"` + + SentryDSN string `yaml:"sentryDSN,omitempty" json:",omitempty" usage:"Sentry DSN to use"` + SentryLevel config.Slice[string] `yaml:"sentryLevel,omitempty" json:",omitempty" usage:"Sentry levels: trace, debug, info, warn, error, fatal, panic (default [\"error\", \"fatal\", \"panic\"])"` + SentrySampleRate float64 `yaml:"sentrySampleRate,omitempty" json:",omitempty" usage:"Sentry sample rate for event submission: [0.0 - 1.0]"` + SentryRelease string `yaml:"sentryRelease,omitempty" json:",omitempty" usage:"Sentry release to be sent with events"` + SentryEnvironment string `yaml:"sentryEnvironment,omitempty" json:",omitempty" usage:"Sentry environment to be sent with events"` + SentryServerName string `yaml:"sentryServerName,omitempty" json:",omitempty" usage:"Sentry server name to be reported"` + SentryDebug bool `yaml:"sentryDebug,omitempty" json:",omitempty" usage:"Sentry debug mode, the debug information is printed to help you understand what sentry is doing"` + + WebRTCConnectionIdleTimeout config.Duration `yaml:"webrtcConnectionIdleTimeout,omitempty" usage:"The timeout of WebRTC connection. Supports values like '30s', '5m'"` + WebRTCLogLevel string `yaml:"webrtcLogLevel,omitempty" json:",omitempty" usage:"WebRTC log level: verbose, info, warning, error"` + WebRTCMinPort uint16 `yaml:"webrtcMinPort,omitempty" json:",omitempty" usage:"The min port of WebRTC peer connection"` + WebRTCMaxPort uint16 `yaml:"webrtcMaxPort,omitempty" json:",omitempty" usage:"The max port of WebRTC peer connection"` + + TCPForwardAddr string `yaml:"tcpForwardAddr,omitempty" json:",omitempty" usage:"The address of TCP forward"` + TCPForwardHostPrefix string `yaml:"tcpForwardHostPrefix,omitempty" json:",omitempty" usage:"The host prefix of TCP forward"` + TCPForwardConnections uint `yaml:"tcpForwardConnections,omitempty" json:",omitempty" usage:"The max number of TCP forward peer connections in the pool. Valid value is 1 to 10"` + + LogFile string `yaml:"logFile,omitempty" json:",omitempty" usage:"Path to save the log file"` + LogFileMaxSize int64 `yaml:"logFileMaxSize,omitempty" json:",omitempty" usage:"Max size of the log files"` + LogFileMaxCount uint `yaml:"logFileMaxCount,omitempty" json:",omitempty" usage:"Max count of the log files"` + LogLevel string `yaml:"logLevel,omitempty" json:",omitempty" usage:"Log level: trace, debug, info, warn, error, fatal, panic, disable"` + Version bool `arg:"version" yaml:"-" json:"-" usage:"Show the version of this program"` + + WebAddr string `arg:"webAddr" yaml:"webAddr,omitempty" json:"-" usage:"The address of web server"` + WebCertFile string `arg:"webCertFile" yaml:"webCertFile,omitempty" json:"-" usage:"The path to cert file for GT-Web server"` + WebKeyFile string `arg:"webKeyFile" yaml:"webKeyFile,omitempty" json:"-" usage:"The path to key file for GT-Web server"` + EnablePprof bool `arg:"pprof" yaml:"pprof,omitempty" json:"-" usage:"Enable pprof in web server"` + SigningKey string `arg:"signingKey" yaml:"signingKey,omitempty" json:"-" usage:"JWT signing key for web server"` + Admin string `arg:"admin" yaml:"admin,omitempty" json:"-" usage:"Admin username use for login in web server"` + Password string `arg:"password" yaml:"password,omitempty" json:"-" usage:"Admin password use for login in web server"` + + Signal string `arg:"s" yaml:"-" json:"-" usage:"Send signal to client processes. Supports values: reload, restart, stop, kill"` + + OpenBBR bool `yaml:"bbr" usage:"Use bbr as congestion control algorithm (through msquic) when GT use QUIC connection. Default algorithm is Cubic (through quic-go)."` } +// if you enable web service, it will set 'Config' if not specified + func defaultConfig() Config { return Config{ Options: Options{ - ReconnectDelay: 5 * time.Second, - RemoteTimeout: 45 * time.Second, + ReconnectDelay: config.Duration{Duration: 5 * time.Second}, + RemoteTimeout: config.Duration{Duration: 45 * time.Second}, RemoteConnections: 3, RemoteIdleConnections: 1, SentrySampleRate: 1.0, SentryRelease: predef.Version, - WebRTCConnectionIdleTimeout: 5 * time.Minute, + WebRTCConnectionIdleTimeout: config.Duration{Duration: 5 * time.Minute}, WebRTCLogLevel: "warning", TCPForwardConnections: 3, @@ -109,6 +120,13 @@ func defaultConfig() Config { } } +func defaultConfigWithNoArgs() Config { + conf := defaultConfig() + conf.Config = predef.GetDefaultClientConfigPath() + conf.WebAddr = "127.0.0.1:7000" + return conf +} + type clientURL struct { *url.URL } @@ -117,14 +135,37 @@ func (c *clientURL) UnmarshalYAML(value *yaml.Node) (err error) { c.URL, err = url.Parse(value.Value) return } +func (c clientURL) MarshalYAML() (interface{}, error) { + return c.URL.String(), nil +} + +func (c *clientURL) UnmarshalJSON(data []byte) error { + var urlStr string + if err := json.Unmarshal(data, &urlStr); err != nil { + return err + } + parsedURL, err := url.Parse(urlStr) + if err != nil { + return err + } + c.URL = parsedURL + return nil +} + +func (c clientURL) MarshalJSON() ([]byte, error) { + if c.URL == nil { + return json.Marshal(nil) + } + return json.Marshal(c.URL.String()) +} type service struct { - HostPrefix string `yaml:"hostPrefix"` - RemoteTCPPort uint16 `yaml:"remoteTCPPort"` - RemoteTCPRandom *bool `yaml:"remoteTCPRandom"` - LocalURL clientURL `yaml:"local"` - LocalTimeout time.Duration `yaml:"localTimeout"` - UseLocalAsHTTPHost bool `yaml:"useLocalAsHTTPHost"` + HostPrefix string `yaml:"hostPrefix,omitempty" json:",omitempty"` + RemoteTCPPort uint16 `yaml:"remoteTCPPort,omitempty" json:",omitempty"` + RemoteTCPRandom *bool `yaml:"remoteTCPRandom,omitempty" json:",omitempty"` + LocalURL clientURL `yaml:"local,omitempty" json:",omitempty"` + LocalTimeout config.Duration `yaml:"localTimeout,omitempty" json:",omitempty"` + UseLocalAsHTTPHost bool `yaml:"useLocalAsHTTPHost,omitempty" json:",omitempty"` } func (s *service) String() string { diff --git a/client/conn.go b/client/conn.go index 3cb09409..b86c782c 100644 --- a/client/conn.go +++ b/client/conn.go @@ -38,12 +38,17 @@ type conn struct { services atomic.Pointer[services] } +type PoolInfo struct { + LocalAddr net.Addr + RemoteAddr net.Addr +} + func newConn(c net.Conn, client *Client) *conn { nc := &conn{ Connection: connection.Connection{ Conn: c, Reader: pool.GetReader(c), - WriteTimeout: client.Config().RemoteTimeout, + WriteTimeout: client.Config().RemoteTimeout.Duration, }, client: client, tasks: make(map[uint32]*httpTask, 100), @@ -177,10 +182,10 @@ func (c *conn) readLoop(connID uint) { r := &bufio.LimitedReader{} r.Reader = c.Reader var timeout time.Duration - if c.client.Config().RemoteTimeout > 0 { - timeout = c.client.Config().RemoteTimeout / 2 + if c.client.Config().RemoteTimeout.Duration > 0 { + timeout = c.client.Config().RemoteTimeout.Duration / 2 if timeout <= 0 { - timeout = c.client.Config().RemoteTimeout + timeout = c.client.Config().RemoteTimeout.Duration } } for pings <= 3 { @@ -431,8 +436,8 @@ func (c *conn) processServiceData(connID uint, taskID uint32, s *service, r *buf readErr = err } } - if task.service.LocalTimeout > 0 { - dl := time.Now().Add(task.service.LocalTimeout) + if task.service.LocalTimeout.Duration > 0 { + dl := time.Now().Add(task.service.LocalTimeout.Duration) writeErr = task.conn.SetReadDeadline(dl) if writeErr != nil { return @@ -478,8 +483,8 @@ func (c *conn) processData(taskID uint32, r *bufio.LimitedReader) (readErr, writ readErr = err } } - if task.service.LocalTimeout > 0 { - dl := time.Now().Add(task.service.LocalTimeout) + if task.service.LocalTimeout.Duration > 0 { + dl := time.Now().Add(task.service.LocalTimeout.Duration) writeErr = task.conn.SetReadDeadline(dl) if writeErr != nil { return diff --git a/client/idle.go b/client/idle.go index e0790bc8..085965bb 100644 --- a/client/idle.go +++ b/client/idle.go @@ -21,16 +21,16 @@ import ( ) const ( - running status = iota + running Status = iota idle wait connecting ) -type status int +type Status int type idleManager struct { - status map[uint]status + status map[uint]Status statusMtx sync.RWMutex statusCond *sync.Cond min uint @@ -44,9 +44,19 @@ func (m *idleManager) String() string { return fmt.Sprintf("%#v", m.status) } +func (m *idleManager) GetConnectionStatus() (status map[uint]Status) { + m.statusMtx.RLock() + defer m.statusMtx.RUnlock() + status = make(map[uint]Status, len(m.status)) + for k, v := range m.status { + status[k] = v + } + return +} + func newIdleManager(min uint) *idleManager { m := &idleManager{ - status: make(map[uint]status), + status: make(map[uint]Status), min: min, } m.statusCond = sync.NewCond(&m.statusMtx) diff --git a/client/peer.go b/client/peer.go index fab7f27b..ef5b775d 100644 --- a/client/peer.go +++ b/client/peer.go @@ -215,8 +215,8 @@ func respAndClose(id uint32, c *conn, data [][]byte) { return } remoteTimeout := c.client.Config().RemoteTimeout - if remoteTimeout > 0 { - dl := time.Now().Add(remoteTimeout) + if remoteTimeout.Duration > 0 { + dl := time.Now().Add(remoteTimeout.Duration) wErr = c.Conn.SetReadDeadline(dl) if wErr != nil { return @@ -519,7 +519,7 @@ func (dco *dataChannelObserver) OnOpen() { defer func() { count := dco.peerTask.channelCount.Add(^uint32(0)) if count == 0 { - dco.peerTask.timer.Reset(dco.peerTask.tunnel.client.Config().WebRTCConnectionIdleTimeout) + dco.peerTask.timer.Reset(dco.peerTask.tunnel.client.Config().WebRTCConnectionIdleTimeout.Duration) } logger.Info().Err(err).Uint32("channelCount", count). Str("state", dco.dataChannel.State().String()). @@ -554,8 +554,8 @@ func (dco *dataChannelObserver) OnOpen() { defer pool.BytesPool.Put(buf) for { - if service.LocalTimeout > 0 { - dl := time.Now().Add(service.LocalTimeout) + if service.LocalTimeout.Duration > 0 { + dl := time.Now().Add(service.LocalTimeout.Duration) rErr = task.conn.SetReadDeadline(dl) if rErr != nil { return diff --git a/client/task.go b/client/task.go index fe5bcf05..cfd3188c 100644 --- a/client/task.go +++ b/client/task.go @@ -280,8 +280,8 @@ func (t *httpTask) process(connID uint, taskID uint32, c *conn) { buf[4] = byte(predef.Data >> 8) buf[5] = byte(predef.Data) for { - if t.service.LocalTimeout > 0 { - dl := time.Now().Add(t.service.LocalTimeout) + if t.service.LocalTimeout.Duration > 0 { + dl := time.Now().Add(t.service.LocalTimeout.Duration) rErr = t.conn.SetReadDeadline(dl) if rErr != nil { return @@ -303,8 +303,8 @@ func (t *httpTask) process(connID uint, taskID uint32, c *conn) { if wErr != nil { return } - if c.client.Config().RemoteTimeout > 0 { - dl := time.Now().Add(c.client.Config().RemoteTimeout) + if c.client.Config().RemoteTimeout.Duration > 0 { + dl := time.Now().Add(c.client.Config().RemoteTimeout.Duration) wErr = c.Conn.SetReadDeadline(dl) if wErr != nil { return diff --git a/client/web/api/api.go b/client/web/api/api.go new file mode 100644 index 00000000..1705936a --- /dev/null +++ b/client/web/api/api.go @@ -0,0 +1,223 @@ +package api + +import ( + "github.com/gin-gonic/gin" + "github.com/isrc-cas/gt/client" + "github.com/isrc-cas/gt/client/web/service" + "github.com/isrc-cas/gt/predef" + "github.com/isrc-cas/gt/web/server" + "github.com/isrc-cas/gt/web/server/model/request" + "github.com/isrc-cas/gt/web/server/model/response" + "github.com/isrc-cas/gt/web/server/util" +) + +func HealthCheck(ctx *gin.Context) { + response.Success(ctx) +} + +func Login(c *client.Client) gin.HandlerFunc { + return func(ctx *gin.Context) { + var loginReq = request.User{} + if err := ctx.ShouldBindJSON(&loginReq); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + if err := service.VerifyUser(loginReq, c); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + token, err := util.GenerateToken(c.Config().SigningKey, predef.DefaultTokenDuration, "gt-client", loginReq) + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.SuccessWithData(gin.H{"token": token}, ctx) + } +} + +func VerifyTempKey(tokenManager *server.TokenManager) gin.HandlerFunc { + return func(ctx *gin.Context) { + tempKey := ctx.Query("key") + if tempKey == "" { + response.InvalidKey(ctx) + return + } + + actualToken, err := tokenManager.GetActualToken(tempKey) + if err != nil { + response.InvalidKey(ctx) + return + } + response.SuccessWithData(gin.H{"token": actualToken}, ctx) + } +} + +func ChangeUserInfo(c *client.Client) gin.HandlerFunc { + return func(ctx *gin.Context) { + var userInfo = request.UserInfo{} + if err := ctx.ShouldBindJSON(&userInfo); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + if err := service.ChangeUserInfo(userInfo, c); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + user := request.User{ + Username: userInfo.Username, + Password: userInfo.Password, + } + token, err := util.GenerateToken(c.Config().SigningKey, predef.DefaultTokenDuration, "gt-client", user) + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.SuccessWithData(gin.H{"token": token}, ctx) + } +} + +func GetUserInfo(c *client.Client) gin.HandlerFunc { + return func(ctx *gin.Context) { + var userInfo request.UserInfo + cfg, err := service.GetConfigFromFile(c) + if err != nil { + userInfo = request.UserInfo{ + Username: cfg.Admin, + Password: cfg.Password, + EnablePprof: cfg.EnablePprof, + } + } + // Get the user info from running config,if the config file is not specified + userInfo = request.UserInfo{ + Username: c.Config().Admin, + Password: c.Config().Password, + EnablePprof: c.Config().EnablePprof, + } + response.SuccessWithData(userInfo, ctx) + } +} + +// GetMenu returns the permission menu based on the role of the user +func GetMenu(c *client.Client) gin.HandlerFunc { + return func(ctx *gin.Context) { + menu := service.GetMenu(c) + response.SuccessWithData(menu, ctx) + } +} + +// GetServerInfo returns system info ( OS, CPU, Memory, Disk ) +func GetServerInfo(ctx *gin.Context) { + serverInfo, err := util.GetServerInfo() + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.SuccessWithData(gin.H{"serverInfo": serverInfo}, ctx) +} + +// GetConnectionInfo returns connection info ( pool, external ) +func GetConnectionInfo(c *client.Client) gin.HandlerFunc { + return func(ctx *gin.Context) { + poolStatus := service.GetConnectionPoolStatus(c) + conn, err := service.GetConnectionInfo(c) + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.SuccessWithData(gin.H{"clientPool": poolStatus, "external": conn}, ctx) + } +} + +// GetRunningConfig GetConfig returns the current config +func GetRunningConfig(c *client.Client) gin.HandlerFunc { + return func(ctx *gin.Context) { + var cfg = c.Config() + c.Logger.Info().Msg("get running config") + response.SuccessWithData(gin.H{"config": cfg}, ctx) + } +} + +// GetConfigFromFile returns the config from file, +// if failed, try to fetch running config +func GetConfigFromFile(c *client.Client) gin.HandlerFunc { + return func(ctx *gin.Context) { + cfg, err := service.GetConfigFromFile(c) + c.Logger.Info().Msg("get config from file") + if err != nil { + c.Logger.Info().Msg("get config from file failed, try to fetch running config") + // try to fetch running config + GetRunningConfig(c)(ctx) + return + } + response.SuccessWithData(gin.H{"config": cfg}, ctx) + } +} + +// SaveConfigToFile save config to file, +// If the config file is not specified, save to the default path +func SaveConfigToFile(c *client.Client) gin.HandlerFunc { + return func(ctx *gin.Context) { + oldConfig, err := service.InheritConfig(c) + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + var cfg client.Config + if err := service.InheritImmutableConfigFields(&oldConfig, &cfg); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + if err := ctx.ShouldBindJSON(&cfg); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + fullPath, err := service.SaveConfigToFile(&cfg) + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + c.Logger.Info().Str("config", fullPath).Msg("save config to file") + response.SuccessWithMessage("save config to "+fullPath, ctx) + } +} + +// ReloadServices reloads the services in the config file +// without restarting the current process +func ReloadServices(ctx *gin.Context) { + err := util.SendSignal("reload") + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.SuccessWithMessage("reload services done", ctx) +} + +// Restart for a brand-new config process, +// not only reload the services, +// but also restart the process to load the brand-new config(mainly for options part) +func Restart(ctx *gin.Context) { + err := util.SendSignal("restart") + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.Success(ctx) +} + +func Stop(ctx *gin.Context) { + err := util.SendSignal("stop") + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.Success(ctx) +} + +func Kill(ctx *gin.Context) { + err := util.SendSignal("kill") + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.Success(ctx) +} diff --git a/client/web/api/api_test.go b/client/web/api/api_test.go new file mode 100644 index 00000000..045e5ace --- /dev/null +++ b/client/web/api/api_test.go @@ -0,0 +1,254 @@ +package api + +import ( + "bytes" + "encoding/json" + "github.com/gin-gonic/gin" + "github.com/isrc-cas/gt/client" + "github.com/isrc-cas/gt/web/server/model/response" + "github.com/stretchr/testify/assert" + "net/http" + "net/http/httptest" + "testing" +) + +func TestLogin(t *testing.T) { + gin.SetMode(gin.TestMode) + args := []string{ + "client4test", + "-admin", "admin4test", + "-password", "password4test", + } + client4test, err := client.New(args, nil) + if err != nil { + t.Fatalf("failed to create client: %v", err) + } + tests := []struct { + name string + input string + client *client.Client + expectedCode float64 + checkToken bool + }{ + { + name: "JSON binding failure", + input: `{"invalid": "json"`, + client: client4test, + expectedCode: response.ERROR, + }, + { + name: "User verification failure", + input: func() string { + return `{"username": "wrongUsername", "password": "wrongPassword"}` + }(), + client: client4test, + expectedCode: response.ERROR, + }, + { + name: "User verification success", + input: func() string { + return `{"username": "admin4test", "password": "password4test"}` + }(), + client: client4test, + expectedCode: response.SUCCESS, + checkToken: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := gin.Default() + r.POST("/login", Login(tt.client)) + + req, _ := http.NewRequest(http.MethodPost, "/login", bytes.NewBufferString(tt.input)) + req.Header.Set("Content-Type", "application/json") + resp := httptest.NewRecorder() + r.ServeHTTP(resp, req) + + var responseBody map[string]interface{} + err := json.Unmarshal(resp.Body.Bytes(), &responseBody) + if err != nil { + t.Fatalf("failed to unmarshal response body: %v", err) + } + + // Assert the status code + assert.Equal(t, http.StatusOK, resp.Code) + + // Asserting the code in the response body + assert.Equal(t, tt.expectedCode, responseBody["code"]) + + // Check if token exists in successful response + if tt.checkToken { + data, exists := responseBody["data"].(map[string]interface{}) + if assert.True(t, exists, "Data should be a map") { + _, tokenExists := data["token"] + assert.True(t, tokenExists, "Token should exist in data") + } + } + }) + } +} + +func TestGetMenu(t *testing.T) { + argsWithPprof := []string{ + "client4test", + "-pprof", + } + clientWithPprof, err := client.New(argsWithPprof, nil) + if err != nil { + t.Fatalf("failed to create client: %v", err) + } + argsWithoutPprof := []string{ + "client4test", + } + clientWithoutPprof, err := client.New(argsWithoutPprof, nil) + if err != nil { + t.Fatalf("failed to create client: %v", err) + } + gin.SetMode(gin.TestMode) + + type Response struct { + Code int `json:"code"` + Data []gin.H `json:"data"` + Msg string `json:"msg"` + } + + // Test with pprof + r1 := gin.New() + r1.GET("/menu", GetMenu(clientWithPprof)) + req1, _ := http.NewRequest(http.MethodGet, "/menu", nil) + resp1 := httptest.NewRecorder() + r1.ServeHTTP(resp1, req1) + menuWithPprof := resp1.Body.String() + + var responseWithPprof Response + if err := json.Unmarshal([]byte(menuWithPprof), &responseWithPprof); err != nil { + t.Fatalf("failed to parse response with pprof: %v", err) + } + + // Test without pprof + r2 := gin.New() + r2.GET("/menu", GetMenu(clientWithoutPprof)) + req2, _ := http.NewRequest(http.MethodGet, "/menu", nil) + resp2 := httptest.NewRecorder() + r2.ServeHTTP(resp2, req2) + menuWithoutPprof := resp2.Body.String() + + var responseWithoutPprof Response + if err := json.Unmarshal([]byte(menuWithoutPprof), &responseWithoutPprof); err != nil { + t.Fatalf("failed to parse response without pprof: %v", err) + } + + if len(responseWithPprof.Data)-len(responseWithoutPprof.Data) != 1 { + t.Errorf("menuWithPprof items: %d, menuWithoutPprof items: %d", len(responseWithPprof.Data), len(responseWithoutPprof.Data)) + } +} + +func TestGetServerInfo(t *testing.T) { + gin.SetMode(gin.TestMode) + + r := gin.New() + r.GET("/server/info", GetServerInfo) + + req, _ := http.NewRequest(http.MethodGet, "/server/info", nil) + resp := httptest.NewRecorder() + + r.ServeHTTP(resp, req) + + //check HTTPStatusCode + if resp.Code != http.StatusOK { + t.Fatalf("Expected status code 200, got %d", resp.Code) + } + + var jsonResponse map[string]interface{} + err := json.Unmarshal(resp.Body.Bytes(), &jsonResponse) + if err != nil { + t.Fatalf("Failed to parse JSON response: %v", err) + } + + data, ok := jsonResponse["data"].(map[string]interface{}) + if !ok { + t.Fatalf("Expected 'data' field in response") + } + + _, ok = data["serverInfo"].(map[string]interface{}) + if !ok { + t.Fatalf("Expected 'serverInfo' field in 'data'") + } +} + +func TestGetRunningConfig(t *testing.T) { + gin.SetMode(gin.TestMode) + args := []string{ + "client4test", + } + client4test, err := client.New(args, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + + r := gin.New() + r.GET("/config/running", GetRunningConfig(client4test)) + + testConfigEndpoint(t, r, "/config/running", "Expected 'config' field from running config") +} + +func TestGetConfigFromFile(t *testing.T) { + gin.SetMode(gin.TestMode) + + // Server without config file argument + argsWithoutConfig := []string{ + "client4test", + } + + clientWithoutConfig, err := client.New(argsWithoutConfig, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + + r1 := gin.New() + r1.GET("/config/file", GetConfigFromFile(clientWithoutConfig)) + testConfigEndpoint(t, r1, "/config/file", "Expected 'config' field from running config") + + // Server with config file argument + argsWithConfig := []string{ + "server4test", + "-config", "../../../example/config/client.yaml", + } + + clientWithConfig, err := client.New(argsWithConfig, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + + r2 := gin.New() + r2.GET("/config/file", GetConfigFromFile(clientWithConfig)) + testConfigEndpoint(t, r2, "/config/file", "Expected 'config' field from file") +} + +func testConfigEndpoint(t *testing.T, router *gin.Engine, url, errMsg string) { + req, _ := http.NewRequest(http.MethodGet, url, nil) + resp := httptest.NewRecorder() + + router.ServeHTTP(resp, req) + + // Check HTTPStatusCode + if resp.Code != http.StatusOK { + t.Fatalf("Expected status code 200, got %d", resp.Code) + } + + var jsonResponse map[string]interface{} + err := json.Unmarshal(resp.Body.Bytes(), &jsonResponse) + if err != nil { + t.Fatalf("Failed to parse JSON response: %v", err) + } + + data, ok := jsonResponse["data"].(map[string]interface{}) + if !ok { + t.Fatalf("Expected 'data' field in response") + } + + _, ok = data["config"].(map[string]interface{}) + if !ok { + t.Fatalf(errMsg) + } +} diff --git a/client/web/service/service.go b/client/web/service/service.go new file mode 100644 index 00000000..d70e655b --- /dev/null +++ b/client/web/service/service.go @@ -0,0 +1,207 @@ +package service + +import ( + "errors" + "fmt" + "github.com/davecgh/go-spew/spew" + "github.com/isrc-cas/gt/client" + "github.com/isrc-cas/gt/config" + "github.com/isrc-cas/gt/predef" + util2 "github.com/isrc-cas/gt/util" + "github.com/isrc-cas/gt/web/server/model/request" + "github.com/isrc-cas/gt/web/server/util" + "github.com/jinzhu/copier" + "github.com/shirou/gopsutil/v3/net" + + "gopkg.in/yaml.v3" + "os" +) + +func VerifyUser(user request.User, c *client.Client) (err error) { + if user.Username == c.Config().Admin && user.Password == c.Config().Password { + return nil + } else { + return errors.New("username or password is wrong, please try again") + } +} + +// ChangeUserInfo Match the user information in the configuration file +func ChangeUserInfo(user request.UserInfo, c *client.Client) error { + cfg, err := InheritConfig(c) + if err != nil { + return err + } + cfg.Admin = user.Username + cfg.Password = user.Password + cfg.EnablePprof = user.EnablePprof + + conf4log := cfg + conf4log.Password = "******" + conf4log.SigningKey = "******" + _, err = SaveConfigToFile(&cfg) + if err != nil { + return err + } + c.Logger.Info().Str("config", "change user info").Msg(spew.Sdump(conf4log)) + return nil +} + +func GetMenu(c *client.Client) (menu []request.Menu) { + menu = []request.Menu{ + //Home + { + Path: "/home/index", + Name: "home", + Component: "/home/index", + Meta: request.MetaProps{ + Icon: "HomeFilled", + Title: "Home", + IsHide: false, + IsFull: false, + IsAffix: true, + IsKeepAlive: false, + }, + }, + //Connection + { + Path: "/connection", + Name: "connection", + Component: "/connection/index", + Meta: request.MetaProps{ + Icon: "Connection", + Title: "Connection Status", + IsHide: false, + IsFull: false, + IsAffix: false, + IsKeepAlive: false, + }, + }, + //Client Config + { + Path: "/config/client", + Name: "client", + Component: "/config/ClientConfig/index", + Meta: request.MetaProps{ + Icon: "Setting", + Title: "Client", + IsHide: false, + IsFull: false, + IsAffix: false, + IsKeepAlive: true, + }, + }, + } + //pprof + if c.Config().EnablePprof { + enableHTTPS := true + if len(c.Config().WebCertFile) == 0 && len(c.Config().WebKeyFile) == 0 { + enableHTTPS = false + } + webUrl, err := util.SwitchToValidWebURL(c.Config().WebAddr, enableHTTPS) + if err != nil { + c.Logger.Error().Err(err).Msg("switch to valid web url failed while getting pprof link") + return + } + pprofLink := fmt.Sprintf("%s/debug/pprof/", webUrl) + + menu = append(menu, request.Menu{ + Path: "/pprof", + Name: "pprof", + Component: "/pprof/index", + Meta: request.MetaProps{ + Icon: "link", + Title: "pprof", + IsLink: pprofLink, + IsHide: false, + IsFull: false, + IsAffix: false, + IsKeepAlive: false, + }, + }) + } + return +} + +func GetConnectionPoolStatus(c *client.Client) map[uint]client.Status { + return c.GetConnectionPoolStatus() +} + +// GetConnectionInfo get all connections of current process +// except connections of pools +func GetConnectionInfo(c *client.Client) (info []request.SimplifiedConnection, err error) { + pid := int32(os.Getpid()) + conns, err := net.ConnectionsPid("all", pid) + if err != nil { + return + } + pools := c.GetConnectionPoolNetInfo() + + filter := util.FilterOutMatchingConnections(conns, pools) + info = util.SimplifyConnections(filter) + return +} + +// GetConfigFromFile need to set configPath before +func GetConfigFromFile(c *client.Client) (cfg client.Config, err error) { + fullPath := c.Config().Options.Config + if len(fullPath) == 0 { + err = errors.New("config path is empty") + return + } + err = config.Yaml2Interface(fullPath, &cfg) + if err != nil { + return + } + return +} + +// SaveConfigToFile if didn't set configPath before, +// it will save config to clientConfig.yaml by default +func SaveConfigToFile(cfg *client.Config) (fullPath string, err error) { + + // switch config type to yaml + yamlData, err := yaml.Marshal(cfg) + if err != nil { + return + } + if cfg.Config != "" { + fullPath = cfg.Options.Config + } else { + fullPath = predef.GetDefaultClientConfigPath() + cfg.Options.Config = fullPath + } + err = util2.WriteYamlToFile(fullPath, yamlData) + if err != nil { + return + } + return +} + +// InheritImmutableConfigFields copy immutable fields from original to new +func InheritImmutableConfigFields(original *client.Config, new *client.Config) (err error) { + if original == nil { + err = errors.New("original config is nil") + return + } + new.Config = original.Config + new.WebAddr = original.WebAddr + new.WebCertFile = original.WebCertFile + new.WebKeyFile = original.WebKeyFile + new.EnablePprof = original.EnablePprof + new.SigningKey = original.SigningKey + new.Admin = original.Admin + new.Password = original.Password + return +} +func InheritConfig(c *client.Client) (cfg client.Config, err error) { + // Get From File + cfg, err = GetConfigFromFile(c) + if err != nil { + // Get From Running + err = copier.Copy(&cfg, c.Config()) // SigningKey is also copied + if err != nil { + return + } + } + return +} diff --git a/client/web/service/service_test.go b/client/web/service/service_test.go new file mode 100644 index 00000000..cf080c68 --- /dev/null +++ b/client/web/service/service_test.go @@ -0,0 +1,108 @@ +package service + +import ( + "github.com/isrc-cas/gt/client" + "github.com/isrc-cas/gt/web/server/model/request" + "testing" +) + +func TestVerifyUser(t *testing.T) { + args := []string{ + "client4test", + "-admin", "admin4test", + "-password", "password4test", + } + client4test, err := client.New(args, nil) + if err != nil { + t.Fatalf("failed to create client: %v", err) + } + tests := []struct { + name string + inputUser request.User + client *client.Client + expectedErr bool + }{ + + { + name: "Matching username and password", + inputUser: request.User{ + Username: "admin4test", + Password: "password4test", + }, + client: client4test, + expectedErr: false, + }, + { + name: "Mismatched username", + inputUser: request.User{ + Username: "wrongAdmin", + Password: "password4test", + }, + client: client4test, + expectedErr: true, + }, + { + name: "Mismatched password", + inputUser: request.User{ + Username: "admin4test", + Password: "wrongPassword", + }, + client: client4test, + expectedErr: true, + }, + { + name: "Mismatched username and password", + inputUser: request.User{ + Username: "wrongAdmin", + Password: "wrongPassword", + }, + client: client4test, + expectedErr: true, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + err := VerifyUser(test.inputUser, test.client) + gotErr := err != nil + if gotErr != test.expectedErr { + t.Errorf("VerifyUser() error = %v, expectedErr %v", err, test.expectedErr) + } + }) + } +} + +func TestGetMenu(t *testing.T) { + clientWithPprof, err := client.New([]string{"client4test", "-pprof"}, nil) + if err != nil { + t.Fatalf("failed to create client: %v", err) + } + clientWithoutPprof, err := client.New([]string{"client4test"}, nil) + if err != nil { + t.Fatalf("failed to create client: %v", err) + } + tests := []struct { + name string + client *client.Client + expectedLen int + }{ + { + name: "Without pprof", + client: clientWithoutPprof, + expectedLen: 3, + }, + { + name: "With pprof", + client: clientWithPprof, + expectedLen: 4, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + menu := GetMenu(tt.client) + if len(menu) != tt.expectedLen { + t.Errorf("expected menu length %d, got %d", tt.expectedLen, len(menu)) + } + }) + } +} diff --git a/client/web/web.go b/client/web/web.go new file mode 100644 index 00000000..4c4aaf2e --- /dev/null +++ b/client/web/web.go @@ -0,0 +1,313 @@ +package web + +import ( + "context" + "crypto/tls" + "embed" + "errors" + "github.com/gin-gonic/gin" + "github.com/isrc-cas/gt/client" + "github.com/isrc-cas/gt/client/web/api" + "github.com/isrc-cas/gt/logger" + "github.com/isrc-cas/gt/predef" + "github.com/isrc-cas/gt/util" + "github.com/isrc-cas/gt/web/server" + "github.com/isrc-cas/gt/web/server/middleware" + "github.com/isrc-cas/gt/web/server/model/request" + webUtil "github.com/isrc-cas/gt/web/server/util" + "io" + "io/fs" + "net" + "net/http" + "net/http/pprof" + "os" + "path/filepath" + "strconv" + "strings" + "syscall" + "time" +) + +//go:embed dist/* +var FS embed.FS + +type Server struct { + server *http.Server + logger logger.Logger // have no right to close logger + tokenManager *server.TokenManager + enableTLS bool +} + +func NewWebServer(c *client.Client) (*Server, error) { + + err := checkConfig(c) + if err != nil { + return nil, err + } + + tm := server.NewTokenManager(server.DefaultTokenManagerConfig()) + + fullPath := filepath.Join(util.GetAppDir(), "web_client.log") + f, _ := os.Create(fullPath) + gin.DefaultWriter = io.MultiWriter(f) + + r := gin.Default() + err = setRoutes(c, tm, r) + if err != nil { + return nil, err + } + + ws, err := getServer(c, tm, r) + if err != nil { + return nil, err + } + + serverErr := make(chan error, 1) + go ws.start(serverErr) + timeout := time.After(2 * time.Second) + + select { + case err = <-serverErr: + case <-timeout: + enableHTTPS := ws.enableTLS + validURL, _ := webUtil.SwitchToValidWebURL(ws.server.Addr, enableHTTPS) + if isFirstStart(c) { + tempKey, err := getTempKey(ws, c) + if err != nil { + return nil, err + } + //add tempKey to url + validURL = webUtil.CreateUrlWithTempKey(validURL, tempKey) + c.Logger.Info().Str("url", validURL).Msg("first start, browser url") + c.Logger.Info().Msg("You have 3 chances to use this within the next 3 minutes. Please use it as soon as possible.") + } + if err := webUtil.OpenBrowser(validURL); err != nil { + c.Logger.Info().Msg("failed to open browser, please open it manually") + } + } + return ws, err +} + +func checkConfig(c *client.Client) error { + if len(c.Config().WebAddr) == 0 { + return errors.New("option webAddr must be set") + } + if strings.IndexByte(c.Config().WebAddr, ':') == -1 { + c.Config().WebAddr = ":" + c.Config().WebAddr + } + if len(c.Config().Config) == 0 { + c.Config().Config = predef.GetDefaultClientConfigPath() + c.Logger.Info().Str("config", c.Config().Config).Msg("use default config path") + } + if len(c.Config().SigningKey) == 0 { + c.Config().SigningKey = util.RandomString(predef.DefaultSigningKeySize) + } + + if len(c.Config().WebCertFile) > 0 && len(c.Config().WebKeyFile) > 0 { + if c.Config().WebCertFile != "auto" && c.Config().WebKeyFile != "auto" { + _, certErr := os.Stat(c.Config().WebCertFile) + _, keyErr := os.Stat(c.Config().WebKeyFile) + if os.IsNotExist(certErr) || os.IsNotExist(keyErr) { + return errors.New("provided webCertFile or webKeyFile does not exist") + } + } + } + return nil +} + +func getServer(c *client.Client, tokenManager *server.TokenManager, r *gin.Engine) (*Server, error) { + webServer := &Server{ + server: &http.Server{ + Addr: c.Config().WebAddr, + Handler: r, + }, + logger: c.Logger, + tokenManager: tokenManager, + enableTLS: false, + } + + certFile := c.Config().WebCertFile + keyFile := c.Config().WebKeyFile + + if len(certFile) == 0 && len(keyFile) == 0 { + // if both certFile and keyFile are empty, use HTTP, no need to do anything else + return webServer, nil + } else if certFile == "auto" && keyFile == "auto" { + // if both certFile and keyFile are "auto", generate a self-signed certificate and enable HTTPS + webServer.server.TLSConfig = webUtil.GenerateCertification() + webServer.enableTLS = true + } else { + // if user provides certFile and keyFile, load them and enable HTTPS + tlsCert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + err = errors.New("failed to load certFile or keyFile for web server") + return nil, err + } + webServer.server.TLSConfig = &tls.Config{ + Certificates: []tls.Certificate{tlsCert}, + } + webServer.enableTLS = true + } + + return webServer, nil +} + +func setRoutes(c *client.Client, tm *server.TokenManager, r *gin.Engine) error { + staticFiles, err := fs.Sub(FS, "dist") + if err != nil { + return err + } + r.StaticFS("/static", http.FS(staticFiles)) + + PublicGroup := r.Group("/") + { + PublicGroup.POST("/api/login", api.Login(c)) + PublicGroup.GET("/api/health", api.HealthCheck) + PublicGroup.GET("/api/verify", api.VerifyTempKey(tm)) + } + + apiGroup := r.Group("/api") + apiGroup.Use(middleware.JWTAuthMiddleware(c.Config().SigningKey, predef.DefaultTokenDuration)) + { + userGroup := apiGroup.Group("/user") + { + userGroup.POST("/change", api.ChangeUserInfo(c)) + userGroup.GET("/info", api.GetUserInfo(c)) + } + configGroup := apiGroup.Group("/config") + { + configGroup.GET("/running", api.GetRunningConfig(c)) + configGroup.GET("/file", api.GetConfigFromFile(c)) + configGroup.POST("/save", api.SaveConfigToFile(c)) + } + + serverGroup := apiGroup.Group("/server") + { + serverGroup.GET("/info", api.GetServerInfo) + serverGroup.PUT("/reload", api.ReloadServices) + serverGroup.PUT("/restart", api.Restart) + serverGroup.PUT("/stop", api.Stop) + serverGroup.PUT("/kill", api.Kill) + } + + connectionGroup := apiGroup.Group("/connection") + { + connectionGroup.GET("/list", api.GetConnectionInfo(c)) + } + + permissionGroup := apiGroup.Group("/permission") + { + permissionGroup.GET("/menu", api.GetMenu(c)) + } + } + + if c.Config().EnablePprof { + pprofGroup := r.Group("/debug/pprof") + { + pprofGroup.GET("/", gin.WrapF(pprof.Index)) + pprofGroup.GET("/cmdline", gin.WrapF(pprof.Cmdline)) + pprofGroup.GET("/profile", gin.WrapF(pprof.Profile)) + pprofGroup.POST("/symbol", gin.WrapF(pprof.Symbol)) + pprofGroup.GET("/symbol", gin.WrapF(pprof.Symbol)) + pprofGroup.GET("/trace", gin.WrapF(pprof.Trace)) + pprofGroup.GET("/allocs", gin.WrapH(pprof.Handler("allocs"))) + pprofGroup.GET("/block", gin.WrapH(pprof.Handler("block"))) + pprofGroup.GET("/goroutine", gin.WrapH(pprof.Handler("goroutine"))) + pprofGroup.GET("/heap", gin.WrapH(pprof.Handler("heap"))) + pprofGroup.GET("/mutex", gin.WrapH(pprof.Handler("mutex"))) + pprofGroup.GET("/threadcreate", gin.WrapH(pprof.Handler("threadcreate"))) + } + } + + r.NoRoute(func(ctx *gin.Context) { + data, err := fs.ReadFile(FS, "dist/index.html") + if err != nil { + _ = ctx.AbortWithError(http.StatusInternalServerError, err) + return + } + ctx.Data(http.StatusOK, "text/html; charset=utf-8", data) + }) + return nil +} + +func (s *Server) start(serverErr chan<- error) { + defer s.logger.Info().Msg("web server stopped") + if predef.IsNoArgs() { + startTime := time.Now() + for { + s.logger.Info().Str("addr", s.server.Addr).Msg("web server started") + err := s.server.ListenAndServe() + if err == nil || errors.Is(err, http.ErrServerClosed) { + return + } + if opErr, ok := err.(*net.OpError); ok { + if sysErr, ok := opErr.Err.(*os.SyscallError); ok { + if sysErr.Err == syscall.EADDRINUSE { + if time.Since(startTime) > 1*time.Second { + err = errors.New("retry timeout, web server stopped") + serverErr <- err + return + } + s.logger.Error().Err(err).Msg("web server failed to serve") + s.logger.Warn().Msg("web server address already in use, retrying...") + //Try to use a random port + s.server.Addr = ":" + strconv.Itoa(util.RandomPort()) + continue + } + } + } + serverErr <- err + return + } + } else { + s.logger.Info().Str("addr", s.server.Addr).Msg("web server started") + var err error + if s.enableTLS { + s.logger.Info().Msg("start web server with TLS") + err = s.server.ListenAndServeTLS("", "") + } else { + s.logger.Info().Msg("start web server without TLS") + err = s.server.ListenAndServe() + } + if err != nil && !errors.Is(err, http.ErrServerClosed) { + s.logger.Error().Err(err).Msg("web server failed to serve") + serverErr <- err + } + } +} + +// isFirstStart checks if the server is started for the first time, and set a random user +func isFirstStart(c *client.Client) bool { + var isFirst bool + // if the Admin and Password is not set, + // treat it as the first start + if len(c.Config().Admin) == 0 { + c.Config().Admin = util.RandomString(predef.DefaultAdminSize) + isFirst = true + } + if len(c.Config().Password) == 0 { + c.Config().Password = util.RandomString(predef.DefaultPasswordSize) + isFirst = true + } + return isFirst +} + +func getTempKey(ws *Server, c *client.Client) (string, error) { + tempUser := request.User{ + Username: c.Config().Admin, + Password: c.Config().Password, + } + token, err := webUtil.GenerateToken(c.Config().SigningKey, predef.DefaultTokenDuration, "gt-client", tempUser) + if err != nil { + return "", err + } + tempKey := ws.tokenManager.GenerateTempKey(token) + + return tempKey, nil +} + +func (s *Server) Shutdown() error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + return s.server.Shutdown(ctx) +} diff --git a/client/web/web_test.go b/client/web/web_test.go new file mode 100644 index 00000000..b1547af9 --- /dev/null +++ b/client/web/web_test.go @@ -0,0 +1,224 @@ +package web + +import ( + "bytes" + "encoding/json" + "fmt" + "github.com/gin-gonic/gin" + "github.com/isrc-cas/gt/client" + "github.com/isrc-cas/gt/web/server" + "io" + "io/fs" + "net/http" + "net/http/httptest" + "testing" +) + +func TestCheckConfig(t *testing.T) { + tests := []struct { + name string + args []string + expectErr bool + }{ + { + name: "all options set", + args: []string{ + "client", + "-webAddr", "localhost:7000", + "-admin", "admin", + "-password", "password", + "-signingKey", "signingKey", + "-pprof", "true", + }, + expectErr: false, + }, + { + name: "missing webAddr", + args: []string{ + "client", + "-admin", "admin", + "-password", "password", + "-signingKey", "signingKey", + "-pprof", "true", + }, + expectErr: true, + }, + { + name: "missing signingKey", + args: []string{ + "client", + "-webAddr", "localhost:7000", + "-admin", "admin", + "-password", "password", + "-pprof", "true", + }, + expectErr: false, + }, + // Can't be tested because of os.Args is not equal to tt.args + //{ + // name: "all options not set", + // args: []string{ + // "client", + // }, + // expectErr: false, //client New will set default values + //}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c, err := client.New(tt.args, nil) + if err != nil { + t.Errorf("Error while initializing the client: %v", err) + } + if err := checkConfig(c); (err != nil) != tt.expectErr { + t.Errorf("CheckConfig() error = %v, expectErr %v", err, tt.expectErr) + } + }) + } +} + +type RouteTestCase struct { + name string + method string + path string + server *client.Client + headers map[string]string + expectRedirect bool +} + +func executeTestCase(t *testing.T, r *gin.Engine, testCase RouteTestCase, noRouteContent []byte) { + w := performRequestWithHeaders(r, testCase.method, testCase.path, nil, testCase.headers) + + if bytes.Equal(w.Body.Bytes(), noRouteContent) { + if testCase.expectRedirect { + t.Logf("Request was caught by NoRoute as expected.") + } else { + t.Errorf("Request was unexpectedly caught by NoRoute.") + } + } else { + if testCase.expectRedirect { + t.Errorf("Request was not caught by NoRoute but was expected to be.") + } else { + t.Logf("Request was not caught by NoRoute as expected.") + } + } +} + +func TestSetRoutes(t *testing.T) { + gin.SetMode(gin.TestMode) + + data, err := fs.ReadFile(FS, "dist/index.html") + if err != nil { + t.Fatalf("Failed to read dist/index.html: %v", err) + } + noRouteContent := data + clientWithPprof := initializeClient(t, generateClientArgs(true)) + clientWithoutPprof := initializeClient(t, generateClientArgs(false)) + + r := gin.New() + tm := server.NewTokenManager(server.DefaultTokenManagerConfig()) + err = setRoutes(clientWithPprof, tm, r) + if err != nil { + t.Fatalf("Failed to set routes: %v", err) + } + + loginPayload := map[string]interface{}{ + "username": "admin", + "password": "password", + } + token, err := performLogin(r, loginPayload) + if err != nil { + t.Fatalf("failed to login: %v", err) + } + testCases := []RouteTestCase{ + {"Check Health Route", "GET", "/api/health", clientWithPprof, nil, false}, + {"Check Login Route", "POST", "/api/login", clientWithPprof, nil, false}, + {"Check Server Info Route", "GET", "/api/server/info", clientWithPprof, map[string]string{"x-token": token}, false}, + + {"Check User Info Route", "GET", "/api/user/info", clientWithPprof, map[string]string{"x-token": token}, false}, + {"Check UserChangeInfo Route", "POST", "/api/user/change", clientWithoutPprof, map[string]string{"x-token": token}, false}, + + {"Check Running Config Route", "GET", "/api/config/running", clientWithPprof, map[string]string{"x-token": token}, false}, + {"Check Config From File Route", "GET", "/api/config/file", clientWithPprof, map[string]string{"x-token": token}, false}, + {"Check Save Config Route", "POST", "/api/config/save", clientWithPprof, map[string]string{"x-token": token}, false}, + + {"Check Server Info Route", "GET", "/api/server/info", clientWithPprof, map[string]string{"x-token": token}, false}, + + {"Check Connection Info Route", "GET", "/api/connection/list", clientWithPprof, map[string]string{"x-token": token}, false}, + {"Check Permissions Route", "GET", "/api/permission/menu", clientWithPprof, map[string]string{"x-token": token}, false}, + + {"Check Pprof Route with pprof enabled", "GET", "/debug/pprof/", clientWithPprof, nil, false}, + {"Check Pprof Route with pprof disabled", "GET", "/debug/pprof/", clientWithoutPprof, nil, true}, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + r := gin.New() + err := setRoutes(testCase.server, tm, r) + if err != nil { + t.Errorf("setRoutes() error = %v", err) + } + executeTestCase(t, r, testCase, noRouteContent) + }) + } +} +func generateClientArgs(withPprof bool) []string { + args := []string{ + "client", + "-webAddr", "localhost:7000", + "-admin", "admin", + "-password", "password", + "-signingKey", "signingKey", + } + if withPprof { + args = append(args, "-pprof", "true") + } + return args +} +func initializeClient(t *testing.T, args []string) *client.Client { + c, err := client.New(args, nil) + if err != nil { + t.Fatalf("Error while initializing the client: %v", err) + } + return c +} + +func performLogin(r *gin.Engine, loginPayload map[string]interface{}) (string, error) { + payloadBytes, err := json.Marshal(loginPayload) + if err != nil { + return "", fmt.Errorf("failed to marshal login payload: %v", err) + } + payloadReader := bytes.NewReader(payloadBytes) + + w := performRequestWithHeaders(r, "POST", "/api/login", payloadReader, nil) + if w.Code != http.StatusOK { + return "", fmt.Errorf("failed to login during test setup with status: %d, response: %s", w.Code, w.Body.String()) + } + + response := map[string]interface{}{} + err = json.Unmarshal(w.Body.Bytes(), &response) + if err != nil { + return "", fmt.Errorf("failed to unmarshal login response: %v", err) + } + + data, ok := response["data"].(map[string]interface{}) + if !ok { + return "", fmt.Errorf("data not found or is not an object in login response") + } + + token, exists := data["token"] + if !exists { + return "", fmt.Errorf("token not found in login response") + } + + return token.(string), nil +} + +func performRequestWithHeaders(r *gin.Engine, method, path string, body io.Reader, headers map[string]string) *httptest.ResponseRecorder { + req, _ := http.NewRequest(method, path, body) + for k, v := range headers { + req.Header.Set(k, v) + } + w := httptest.NewRecorder() + r.ServeHTTP(w, req) + return w +} diff --git a/cmd/client/main.go b/cmd/client/main.go index 198ea68b..14eb305f 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -15,6 +15,11 @@ package main import ( + "github.com/isrc-cas/gt/client/web" + "github.com/isrc-cas/gt/config" + "github.com/isrc-cas/gt/predef" + "github.com/isrc-cas/gt/util" + "gopkg.in/yaml.v3" "os" "os/exec" "os/signal" @@ -25,28 +30,29 @@ import ( "github.com/rs/zerolog/log" ) -func runCmd(args []string) (err error) { - cmd := exec.Command(args[0], args[1:]...) - cmd.SysProcAttr = &syscall.SysProcAttr{ - Setpgid: true, - } - err = cmd.Start() - if err != nil { - return err - } - err = cmd.Process.Release() - return -} - func main() { c, err := client.New(os.Args, nil) if err != nil { log.Fatal().Err(err).Msg("failed to create client") } defer c.Close() - err = c.Start() + + webServer, err := startWebServer(c) if err != nil { - c.Logger.Fatal().Err(err).Msg("failed to start") + c.Logger.Fatal().Err(err).Msg("failed to start web server") + } + + if len(c.Config().WebAddr) == 0 || checkConfigFile(c) { + err = c.Start() + if err != nil { + if len(c.Config().WebAddr) == 0 { + // web server is not started, exit + c.Logger.Fatal().Err(err).Msg("failed to start") + } else { + // web server is started, continue for web server + c.Logger.Error().Err(err).Msg("failed to start GT Client, please utilize the web server interface for further GT Client configuration.") + } + } } osSig := make(chan os.Signal, 1) @@ -63,7 +69,15 @@ func main() { return case syscall.SIGQUIT: // restart, start a new process and then shutdown gracefully - err := runCmd(os.Args) + err = shutdownWebServer(webServer) + if err != nil { + c.Logger.Error().Err(err).Msg("failed to shutdown web server") + continue + } + // avoid port conflict + c.ShutdownWithoutClosingLogger() + + err = runCmd(os.Args, c) if err != nil { c.Logger.Error().Err(err).Msg("failed to start new process") continue @@ -71,8 +85,8 @@ func main() { // yield control to the new process // will use api to wait for connected response of new process before shutdown c.Logger.Info().Msg("wait 5s to shutdown gracefully") - time.Sleep(5 * time.Second) - fallthrough + c.Logger.Close() + os.Exit(0) default: c.Logger.Info().Msg("wait 30s to stop immediately") time.AfterFunc(30*time.Second, func() { @@ -83,3 +97,87 @@ func main() { } } } +func runCmd(args []string, c *client.Client) (err error) { + args = checkAndSetLogPath(args, c) + cmd := exec.Command(args[0], args[1:]...) + cmd.SysProcAttr = &syscall.SysProcAttr{ + Setpgid: true, + } + err = cmd.Start() + if err != nil { + return err + } + err = cmd.Process.Release() + return +} +func startWebServer(c *client.Client) (*web.Server, error) { + if len(c.Config().WebAddr) != 0 { + return web.NewWebServer(c) + } + return nil, nil +} + +func shutdownWebServer(webServer *web.Server) (err error) { + if webServer == nil { + return + } + err = webServer.Shutdown() + return +} + +// checkConfigFile checks whether the config file exists to determine whether to start the server +func checkConfigFile(c *client.Client) bool { + configPath := c.Config().Config + if len(configPath) == 0 { + configPath = predef.GetDefaultClientConfigPath() + } + if _, err := os.Stat(configPath); os.IsNotExist(err) { + return false + } + return true +} +func checkAndSetLogPath(args []string, c *client.Client) []string { + if len(c.Config().LogFile) != 0 { + return args + } + + if len(args) == 1 || util.Contains(args, "-webAddr") { + if err := updateConfigLogPath(c); err != nil { + c.Logger.Error().Err(err).Msg("failed to update log path in config") + } + return args + } + + return append(args, "-logFile", predef.GetDefaultClientLogPath()) +} + +func updateConfigLogPath(c *client.Client) error { + configPath := c.Config().Config + if len(configPath) == 0 { + configPath = predef.GetDefaultClientConfigPath() + } + + var tmp client.Config + if err := config.Yaml2Interface(configPath, &tmp); err != nil { + // ignore error when config file does not exist + if !os.IsNotExist(err) { + return err + } + } + + if len(tmp.LogFile) != 0 { + // already set in config file + return nil + } + + tmp.LogFile = predef.GetDefaultClientLogPath() + yamlData, err := yaml.Marshal(&tmp) + if err != nil { + return err + } + if err = util.WriteYamlToFile(configPath, yamlData); err != nil { + return err + } + + return nil +} diff --git a/cmd/server/main.go b/cmd/server/main.go index 959fdfe0..cf6c4c17 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -15,13 +15,18 @@ package main import ( + "github.com/isrc-cas/gt/config" + "github.com/isrc-cas/gt/predef" + "github.com/isrc-cas/gt/server" + "github.com/isrc-cas/gt/server/web" + "github.com/isrc-cas/gt/util" + "github.com/rs/zerolog/log" + "gopkg.in/yaml.v3" "os" + "os/exec" "os/signal" "syscall" "time" - - "github.com/isrc-cas/gt/server" - "github.com/rs/zerolog/log" ) func main() { @@ -30,20 +35,144 @@ func main() { log.Fatal().Err(err).Msg("failed to create server") } defer s.Close() - err = s.Start() + + webServer, err := startWebServer(s) if err != nil { - s.Logger.Fatal().Err(err).Msg("failed to start") + s.Logger.Fatal().Err(err).Msg("failed to start web server") + } + + if len(s.Config().WebAddr) == 0 || checkConfigFile(s) { + err = s.Start() + if err != nil { + if len(s.Config().WebAddr) == 0 { + // web server is not started, exit + s.Logger.Fatal().Err(err).Msg("failed to start") + } else { + // web server is started, continue for web server + s.Logger.Error().Err(err).Msg("failed to start GT Server, please utilize the web server interface for further GT Server configuration.") + } + } } osSig := make(chan os.Signal, 1) signal.Notify(osSig, syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) - select { - case sig := <-osSig: + for sig := range osSig { s.Logger.Info().Str("signal", sig.String()).Msg("received os signal") - time.AfterFunc(3*time.Minute, func() { + switch sig { + case syscall.SIGTERM: + return + case syscall.SIGQUIT: + // restart, start a new process and then shutdown gracefully + err = shutdownWebServer(webServer) + if err != nil { + s.Logger.Error().Err(err).Msg("failed to shutdown web server") + continue + } + // avoid port conflict + s.ShutdownWithoutClosingLogger() + + err = runCmd(os.Args, s) + if err != nil { + s.Logger.Error().Err(err).Msg("failed to start new process") + continue + } + s.Logger.Info().Msg("Restart successfully") + s.Logger.Close() os.Exit(0) - }) - s.Shutdown() + default: + s.Logger.Info().Msg("wait 3m to stop immediately") + time.AfterFunc(3*time.Minute, func() { + os.Exit(1) + }) + s.Shutdown() + os.Exit(0) + } + } +} + +func runCmd(args []string, s *server.Server) (err error) { + args = checkAndSetLogPath(args, s) + cmd := exec.Command(args[0], args[1:]...) + cmd.SysProcAttr = &syscall.SysProcAttr{ + Setpgid: true, + } + err = cmd.Start() + if err != nil { + return err + } + err = cmd.Process.Release() + return +} + +func startWebServer(s *server.Server) (*web.Server, error) { + if len(s.Config().WebAddr) != 0 { + return web.NewWebServer(s) + } + return nil, nil +} +func shutdownWebServer(webServer *web.Server) (err error) { + if webServer == nil { + return + } + err = webServer.Shutdown() + return +} + +// checkConfigFile checks whether the config file exists to determine whether to start the server +func checkConfigFile(s *server.Server) bool { + configPath := s.Config().Config + if len(configPath) == 0 { + configPath = predef.GetDefaultServerConfigPath() + } + if _, err := os.Stat(configPath); os.IsNotExist(err) { + return false + } + return true +} + +func checkAndSetLogPath(args []string, s *server.Server) []string { + if len(s.Config().LogFile) != 0 { + return args } + + if len(args) == 1 || util.Contains(args, "-webAddr") { + if err := updateConfigLogPath(s); err != nil { + s.Logger.Error().Err(err).Msg("failed to update config log path") + } + return args + } + + return append(args, "-logFile", predef.GetDefaultServerLogPath()) +} + +func updateConfigLogPath(s *server.Server) error { + configPath := s.Config().Config + if len(configPath) == 0 { + configPath = predef.GetDefaultServerConfigPath() + } + + var tmp server.Config + if err := config.Yaml2Interface(configPath, &tmp); err != nil { + // ignore error when config file does not exist + if !os.IsNotExist(err) { + return err + } + } + + if len(tmp.LogFile) != 0 { + // already set in config file + return nil + } + + tmp.LogFile = predef.GetDefaultServerLogPath() + yamlData, err := yaml.Marshal(&tmp) + if err != nil { + return err + } + if err = util.WriteYamlToFile(configPath, yamlData); err != nil { + return err + } + + return nil } diff --git a/config/config.go b/config/config.go index b21cdd83..1e577869 100644 --- a/config/config.go +++ b/config/config.go @@ -17,8 +17,11 @@ package config import ( "flag" "fmt" + "github.com/isrc-cas/gt/predef" + "github.com/isrc-cas/gt/util" "os" "reflect" + "strings" "sync" "sync/atomic" "time" @@ -33,23 +36,29 @@ var ( // ParseFlags parses args and sets the result to config and options. func ParseFlags(args []string, config, options interface{}) error { - if len(args) < 2 { - return nil - } positionMtx.Lock() defer positionMtx.Unlock() position.Store(0) + if len(args) == 0 { + return nil + } flagSet, n2fi, configPath := registerFlags(args[0], options) - err := flagSet.Parse(args[1:]) - if err != nil { - return err + if len(args) > 1 { + // 有参数时,解析参数 + err := flagSet.Parse(args[1:]) + if err != nil { + return err + } } if configPath != nil { - err = Yaml2Interface(*configPath, config) + err := Yaml2Interface(*configPath, config) if err != nil { - return err + // 如果是 (零配置启动/启用了web服务,&&配置文件不存在),则忽略错误,否则返回错误 + if !((predef.IsNoArgs() || util.Contains(args, "-webAddr")) && os.IsNotExist(err)) { + return err + } } } @@ -65,7 +74,6 @@ func Yaml2Interface(path string, dstInterface interface{}) (err error) { file, err := os.Open(path) if err != nil { - err = fmt.Errorf("open yaml file %q failed: %v", path, err) return } defer func() { @@ -103,6 +111,13 @@ func copyFlagsValue(dst interface{}, src *flag.FlagSet, name2FieldIndex map[stri fieldType := field.Type() flagValue := reflect.ValueOf(f.Value.(flag.Getter).Get()) flagValueType := flagValue.Type() + + if fieldType == reflect.TypeOf(Duration{}) { + durationValue := flagValue.Interface().(time.Duration) + field.Set(reflect.ValueOf(Duration{Duration: durationValue})) + return + } + if !flagValueType.AssignableTo(fieldType) { if flagValueType.ConvertibleTo(fieldType) { flagValue = flagValue.Convert(fieldType) @@ -131,6 +146,10 @@ func registerFlags(flagSetName string, options interface{}) (flagSet *flag.FlagS continue } } + + // 用这种方式可以处理 yaml:"xxx,omitempty" 的情况 + name = strings.Split(name, ",")[0] + name2FieldIndex[name] = i usage := fieldType.Tag.Get("usage") diff --git a/config/duration.go b/config/duration.go new file mode 100644 index 00000000..233435a1 --- /dev/null +++ b/config/duration.go @@ -0,0 +1,58 @@ +package config + +import ( + "encoding/json" + "gopkg.in/yaml.v3" + "time" +) + +type Duration struct { + time.Duration +} + +// String flag.Value Interface +func (d *Duration) String() string { + return d.Duration.String() +} + +// Set flag.Value Interface +func (d *Duration) Set(s string) error { + var err error + d.Duration, err = time.ParseDuration(s) + return err +} + +// Get flag.Getter Interface +func (d *Duration) Get() interface{} { + return d.Duration +} + +func (d *Duration) UnmarshalYAML(value *yaml.Node) (err error) { + duration, err := time.ParseDuration(value.Value) + if err != nil { + return + } + d.Duration = duration + return +} + +func (d Duration) MarshalYAML() (interface{}, error) { + return d.Duration.String(), nil +} + +func (d *Duration) UnmarshalJSON(data []byte) (err error) { + var s string + if err = json.Unmarshal(data, &s); err != nil { + return err + } + duration, err := time.ParseDuration(s) + if err != nil { + return err + } + d.Duration = duration + return nil +} + +func (d Duration) MarshalJSON() ([]byte, error) { + return json.Marshal(d.Duration.String()) +} diff --git a/config/duration_test.go b/config/duration_test.go new file mode 100644 index 00000000..408fcafe --- /dev/null +++ b/config/duration_test.go @@ -0,0 +1,228 @@ +package config + +import ( + "encoding/json" + "gopkg.in/yaml.v3" + "testing" + "time" +) + +func TestDurationString(t *testing.T) { + testCases := []struct { + duration Duration + expected string + }{ + {duration: Duration{0}, expected: "0s"}, + {duration: Duration{time.Nanosecond}, expected: "1ns"}, + {duration: Duration{time.Microsecond}, expected: "1µs"}, + {duration: Duration{time.Millisecond}, expected: "1ms"}, + {duration: Duration{time.Second}, expected: "1s"}, + {duration: Duration{time.Minute}, expected: "1m0s"}, + {duration: Duration{time.Hour}, expected: "1h0m0s"}, + + {duration: Duration{time.Second * 90}, expected: "1m30s"}, + {duration: Duration{time.Second * 120}, expected: "2m0s"}, + {duration: Duration{time.Hour + 30*time.Minute + 30*time.Second}, expected: "1h30m30s"}, + } + + for _, tc := range testCases { + t.Run(tc.expected, func(t *testing.T) { + actual := tc.duration.String() + if actual != tc.expected { + t.Errorf("expected %s, got %s", tc.expected, actual) + } + }) + } +} + +func TestDurationSet(t *testing.T) { + testCases := []struct { + input string + expected time.Duration + hasError bool + }{ + {input: "", expected: 0, hasError: true}, + {input: "123", expected: 0, hasError: true}, + {input: "1x", expected: 0, hasError: true}, + {input: "hello", expected: 0, hasError: true}, + + {input: "1ns", expected: time.Nanosecond, hasError: false}, + {input: "2µs", expected: time.Microsecond * 2, hasError: false}, + {input: "3ms", expected: time.Millisecond * 3, hasError: false}, + {input: "4s", expected: time.Second * 4, hasError: false}, + {input: "5m", expected: time.Minute * 5, hasError: false}, + {input: "6h", expected: time.Hour * 6, hasError: false}, + {input: "7h30m", expected: time.Hour*7 + time.Minute*30, hasError: false}, + {input: "8m9s10h", expected: time.Hour*10 + time.Minute*8 + time.Second*9, hasError: false}, + } + + for _, tc := range testCases { + t.Run(tc.input, func(t *testing.T) { + d := &Duration{} + err := d.Set(tc.input) + if tc.hasError && err == nil { + t.Fatalf("expected an error, but got none for input %s", tc.input) + } + if !tc.hasError && err != nil { + t.Fatalf("didn't expect an error, but got: %v for input %s", err, tc.input) + } + if d.Duration != tc.expected { + t.Errorf("for input %s, expected duration %v, got %v", tc.input, tc.expected, d.Duration) + } + }) + } +} + +func TestDurationGet(t *testing.T) { + testCases := []struct { + duration Duration + expected time.Duration + }{ + {duration: Duration{time.Second}, expected: time.Second}, + {duration: Duration{time.Minute}, expected: time.Minute}, + {duration: Duration{time.Hour}, expected: time.Hour}, + {duration: Duration{time.Millisecond * 500}, expected: time.Millisecond * 500}, + {duration: Duration{time.Second * 90}, expected: time.Second * 90}, + } + + for _, tc := range testCases { + t.Run(tc.expected.String(), func(t *testing.T) { + actual := tc.duration.Get() + if actualDuration, ok := actual.(time.Duration); ok { + if actualDuration != tc.expected { + t.Errorf("expected %v, got %v", tc.expected, actualDuration) + } + } else { + t.Errorf("Get() did not return a time.Duration for %v", tc.duration) + } + }) + } +} + +func TestDurationUnmarshalYAML(t *testing.T) { + testCases := []struct { + yamlInput string + expected time.Duration + hasError bool + }{ + {yamlInput: "duration: 1x", expected: 0, hasError: true}, + {yamlInput: "duration: hello", expected: 0, hasError: true}, + {yamlInput: "duration: 123", expected: 0, hasError: true}, + {yamlInput: `duration: ""`, expected: 0, hasError: true}, + {yamlInput: "duration: 1d", expected: 0, hasError: true}, + + {yamlInput: "duration: ", expected: 0, hasError: false}, + {yamlInput: "duration: 1s", expected: time.Second, hasError: false}, + {yamlInput: "duration: 1m", expected: time.Minute, hasError: false}, + {yamlInput: "duration: 1h", expected: time.Hour, hasError: false}, + {yamlInput: "duration: 500ms", expected: time.Millisecond * 500, hasError: false}, + {yamlInput: "duration: 1h30m", expected: time.Hour + time.Minute*30, hasError: false}, + } + + for _, tc := range testCases { + t.Run(tc.yamlInput, func(t *testing.T) { + var output struct { + Duration Duration + } + err := yaml.Unmarshal([]byte(tc.yamlInput), &output) + if tc.hasError && err == nil { + t.Fatalf("expected an error, but got none for input %s", tc.yamlInput) + } + if !tc.hasError && err != nil { + t.Fatalf("didn't expect an error, but got: %v for input %s", err, tc.yamlInput) + } + if output.Duration.Duration != tc.expected { + t.Errorf("for input %s, expected duration %v, got %v", tc.yamlInput, tc.expected, output.Duration.Duration) + } + }) + } +} + +func TestDurationMarshalYAML(t *testing.T) { + testCases := []struct { + duration Duration + expected string + }{ + {duration: Duration{time.Nanosecond}, expected: "1ns"}, + {duration: Duration{time.Millisecond * 500}, expected: "500ms"}, + {duration: Duration{time.Second}, expected: "1s"}, + {duration: Duration{time.Minute}, expected: "1m0s"}, + {duration: Duration{time.Hour}, expected: "1h0m0s"}, + {duration: Duration{time.Hour + time.Minute*30}, expected: "1h30m0s"}, + {duration: Duration{time.Hour + time.Minute*30 + time.Second*15}, expected: "1h30m15s"}, + } + + for _, tc := range testCases { + t.Run(tc.expected, func(t *testing.T) { + result, err := yaml.Marshal(tc.duration) + if err != nil { + t.Fatalf("didn't expect an error, but got: %v", err) + } + if string(result) != tc.expected+"\n" { // yaml.Marshal adds a newline at the end + t.Errorf("expected %s, got %s", tc.expected, result) + } + }) + } +} + +func TestDurationUnmarshalJSON(t *testing.T) { + testCases := []struct { + jsonInput string + expected time.Duration + hasError bool + }{ + {jsonInput: `"1x"`, expected: 0, hasError: true}, + {jsonInput: `"hello"`, expected: 0, hasError: true}, + {jsonInput: `"123"`, expected: 0, hasError: true}, + {jsonInput: `""`, expected: 0, hasError: true}, + {jsonInput: `"1d"`, expected: 0, hasError: true}, + + {jsonInput: `"1532ms"`, expected: time.Millisecond * 1532, hasError: false}, + {jsonInput: `"1s"`, expected: time.Second, hasError: false}, + {jsonInput: `"5m"`, expected: time.Minute * 5, hasError: false}, + {jsonInput: `"90m"`, expected: time.Minute * 90, hasError: false}, + {jsonInput: `"7h"`, expected: time.Hour * 7, hasError: false}, + {jsonInput: `"1h30m"`, expected: time.Hour + time.Minute*30, hasError: false}, + } + + for _, tc := range testCases { + t.Run(tc.jsonInput, func(t *testing.T) { + var d Duration + err := json.Unmarshal([]byte(tc.jsonInput), &d) + if tc.hasError && err == nil { + t.Fatalf("expected an error, but got none for input %s", tc.jsonInput) + } + if !tc.hasError && err != nil { + t.Fatalf("didn't expect an error, but got: %v for input %s", err, tc.jsonInput) + } + if d.Duration != tc.expected { + t.Errorf("for input %s, expected duration %v, got %v", tc.jsonInput, tc.expected, d.Duration) + } + }) + } +} + +func TestDurationMarshalJSON(t *testing.T) { + testCases := []struct { + duration Duration + expected string + }{ + {duration: Duration{time.Second}, expected: `"1s"`}, + {duration: Duration{time.Minute}, expected: `"1m0s"`}, + {duration: Duration{time.Hour}, expected: `"1h0m0s"`}, + {duration: Duration{time.Hour + time.Minute*30}, expected: `"1h30m0s"`}, + {duration: Duration{time.Hour + time.Minute*30 + time.Second*15}, expected: `"1h30m15s"`}, + } + + for _, tc := range testCases { + t.Run(tc.expected, func(t *testing.T) { + result, err := json.Marshal(tc.duration) + if err != nil { + t.Fatalf("didn't expect an error, but got: %v", err) + } + if string(result) != tc.expected { + t.Errorf("expected %s, got %s", tc.expected, result) + } + }) + } +} diff --git a/front/package.json b/front/package.json deleted file mode 100644 index c81207ca..00000000 --- a/front/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "gt-web", - "version": "1.0.0", - "description": "通过web端管理gt配置", - "main": "index.js", - "scripts": { - "test": "test" - }, - "keywords": [ - "gt-web" - ], - "author": "dejun@iscas.ac.cn", - "license": "ISC" -} diff --git a/go.mod b/go.mod index 7dd01d09..ef10e359 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,15 @@ module github.com/isrc-cas/gt go 1.19 require ( - github.com/archdx/zerolog-sentry v1.5.0 + github.com/archdx/zerolog-sentry v1.2.0 github.com/buger/jsonparser v1.1.1 github.com/davecgh/go-spew v1.1.1 github.com/emirpasic/gods v1.18.1 + github.com/gin-gonic/gin v1.9.1 + github.com/golang-jwt/jwt/v5 v5.0.0 github.com/gorilla/websocket v1.5.0 github.com/hashicorp/golang-lru/v2 v2.0.3 + github.com/jinzhu/copier v0.4.0 github.com/jonboulle/clockwork v0.2.2 github.com/lestrrat-go/strftime v1.0.5 github.com/mattn/go-pointer v0.0.1 @@ -16,21 +19,38 @@ require ( github.com/pion/turn/v3 v3.0.1 github.com/pkg/errors v0.9.1 github.com/quic-go/quic-go v0.35.0 - github.com/rs/zerolog v1.30.0 + github.com/rs/zerolog v1.31.0 github.com/shirou/gopsutil v3.21.11+incompatible + github.com/shirou/gopsutil/v3 v3.23.7 github.com/stretchr/testify v1.8.4 gopkg.in/yaml.v3 v3.0.1 ) require ( - github.com/getsentry/sentry-go v0.24.1 // indirect + github.com/bytedance/sonic v1.9.2 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/getsentry/sentry-go v0.13.0 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-ole/go-ole v1.2.6 // 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.14.1 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang/mock v1.6.0 // indirect github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.0.9 // indirect github.com/onsi/ginkgo/v2 v2.9.5 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/randutil v0.1.0 // indirect @@ -38,17 +58,23 @@ require ( github.com/pion/transport/v2 v2.2.4 // indirect github.com/pion/transport/v3 v3.0.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/quic-go/qtls-go1-19 v0.3.2 // indirect github.com/quic-go/qtls-go1-20 v0.3.3 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect + golang.org/x/arch v0.4.0 // indirect golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect golang.org/x/mod v0.10.0 // indirect golang.org/x/net v0.15.0 // indirect golang.org/x/sys v0.12.0 // indirect golang.org/x/text v0.13.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect golang.org/x/tools v0.9.1 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect ) diff --git a/go.sum b/go.sum index b9c54acc..3887e131 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,46 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/archdx/zerolog-sentry v1.2.0 h1:FDFqlo5XvL/jpDAPoAWI15EjJQVFvixn70v3IH//eTM= +github.com/archdx/zerolog-sentry v1.2.0/go.mod h1:3H8gClGFafB90fKMsvfP017bdmkG5MD6UiA+6iPEwGw= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/archdx/zerolog-sentry v1.5.0 h1:wc3arq95hz749M2iPwfSb7jzdYhTch4AK/opofXHcNs= github.com/archdx/zerolog-sentry v1.5.0/go.mod h1:shfLC+5jaXkS1iBcAD/k07g5QH1M/jbPcVr5DkZyxk4= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.9.2 h1:GDaNjuWSGu09guE9Oql0MSTNhNCLlWwO8y/xM5BzcbM= +github.com/bytedance/sonic v1.9.2/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/getsentry/sentry-go v0.13.0 h1:20dgTiUSfxRB/EhMPtxcL9ZEbM1ZdR+W/7f7NWD+xWo= +github.com/getsentry/sentry-go v0.13.0/go.mod h1:EOsfu5ZdvKPfeHYV6pTVQnsjfp30+XA7//UooKNumH0= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/getsentry/sentry-go v0.24.1 h1:W6/0GyTy8J6ge6lVCc94WB6Gx2ZuLrgopnn9w8Hiwuk= github.com/getsentry/sentry-go v0.24.1/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -20,6 +49,15 @@ github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +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.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= +github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= @@ -27,22 +65,59 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= +github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= +github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= +github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= +github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= +github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/strftime v1.0.5 h1:A7H3tT8DhTz8u65w+JRpiBxM4dINQhUXAZnhBa2xeOE= github.com/lestrrat-go/strftime v1.0.5/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -51,6 +126,15 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= +github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= @@ -71,6 +155,7 @@ github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9 github.com/pion/turn/v3 v3.0.1 h1:wLi7BTQr6/Q20R0vt/lHbjv6y4GChFtC33nkYbasoT8= github.com/pion/turn/v3 v3.0.1/go.mod h1:MrJDKgqryDyWy1/4NT9TWfXWGMC7UHT6pJIv1+gMeNE= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -84,18 +169,38 @@ github.com/quic-go/quic-go v0.35.0 h1:JXIf219xJK+4qGeY52rlnrVqeB2AXUAwfLU9JSoWXw github.com/quic-go/quic-go v0.35.0/go.mod h1:+4CVgVppm0FNjpG3UcX8Joi/frKOH7/ciD5yGcwOO1g= 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/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +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.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= +github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.23.7 h1:C+fHO8hfIppoJ1WdsVm1RoI0RwXoNdfTK7yWXV0wVj4= +github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -104,9 +209,24 @@ github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7Am github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= +golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -143,6 +263,7 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -154,6 +275,7 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -182,9 +304,16 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/predef/const.go b/predef/const.go index 84f61a0f..346eceb8 100644 --- a/predef/const.go +++ b/predef/const.go @@ -14,6 +14,13 @@ package predef +import ( + "github.com/isrc-cas/gt/util" + "os" + "path/filepath" + "time" +) + const ( // MinIDSize is the minimum size of ID MinIDSize = 1 @@ -27,6 +34,14 @@ const ( MaxSecretSize = MaxIDSize // DefaultSecretSize secret 的默认长度 DefaultSecretSize = DefaultIDSize + // DefaultSigningKeySize signing key 的默认长度 + DefaultSigningKeySize = 32 + // DefaultAdminSize admin 的默认长度 + DefaultAdminSize = 8 + // DefaultPasswordSize password 的默认长度 + DefaultPasswordSize = 8 + // DefaultTokenDuration token 的默认有效期 + DefaultTokenDuration = 30 * time.Minute // MinHostPrefixSize 表示 host 前缀长度的最小值 MinHostPrefixSize = MinIDSize // MaxHostPrefixSize 表示 host 前缀长度的最大值 @@ -63,3 +78,39 @@ var ( // MagicNumber 常量数字,见 https://en.wikipedia.org/wiki/Magic_number_(programming) const MagicNumber byte = 0xF0 + +var ( + defaultClientConfigPath string + defaultClientLogPath string + defaultServerConfigPath string + defaultServerLogPath string +) + +// IsNoArgs 表示是否没有参数, 用于判断是否需要提供更多的默认配置 +var isNoArgs = false + +func init() { + defaultClientConfigPath = filepath.Join(util.GetAppDir(), "client.yaml") + defaultClientLogPath = filepath.Join(util.GetAppDir(), "client.log") + defaultServerConfigPath = filepath.Join(util.GetAppDir(), "server.yaml") + defaultServerLogPath = filepath.Join(util.GetAppDir(), "server.log") + if len(os.Args) <= 1 { + isNoArgs = true + } +} + +func GetDefaultClientConfigPath() string { + return defaultClientConfigPath +} +func GetDefaultClientLogPath() string { + return defaultClientLogPath +} +func GetDefaultServerConfigPath() string { + return defaultServerConfigPath +} +func GetDefaultServerLogPath() string { + return defaultServerLogPath +} +func IsNoArgs() bool { + return isNoArgs +} diff --git a/server/client.go b/server/client.go index e08e1200..568398d7 100644 --- a/server/client.go +++ b/server/client.go @@ -480,3 +480,22 @@ func (c *client) speedLimit(bufLen uint32, isUpload bool) { *count -= sleepSeconds * c.speedNum time.Sleep(time.Duration(sleepSeconds) * time.Second) } + +type ConnectionInfo struct { + ID string + LocalAddr net.Addr + RemoteAddr net.Addr +} + +func (c *client) GetConnectionInfo() (info []ConnectionInfo) { + c.tunnelsRWMtx.RLock() + defer c.tunnelsRWMtx.RUnlock() + for conn := range c.tunnels { + info = append(info, ConnectionInfo{ + ID: c.id, + RemoteAddr: conn.RemoteAddr(), + LocalAddr: conn.LocalAddr(), + }) + } + return +} diff --git a/server/config.go b/server/config.go index d0ae3488..54914d75 100644 --- a/server/config.go +++ b/server/config.go @@ -28,77 +28,86 @@ import ( // Config is a server config. type Config struct { - Version string // 目前未使用 - Users map[string]user `yaml:"users"` - TCPs []tcp `yaml:"tcp"` - Host host + Version string `yaml:"-" json:"-"` // 目前未使用 + Users map[string]user `yaml:"users,omitempty"` + TCPs []tcp `yaml:"tcp,omitempty" json:",omitempty"` + Host host `yaml:"host,omitempty" json:",omitempty"` Options } // Options is the config Options for a server. type Options struct { - Config string `arg:"config" yaml:"-" usage:"The config file path to load"` - Addr string `yaml:"addr" usage:"The address to listen on. Supports values like: '80', ':80' or '0.0.0.0:80'"` - TLSAddr string `yaml:"tlsAddr" usage:"The address for tls to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` - TLSMinVersion string `yaml:"tlsVersion" usage:"The tls min version. Supports values: tls1.1, tls1.2, tls1.3"` - CertFile string `yaml:"certFile" usage:"The path to cert file"` - KeyFile string `yaml:"keyFile" usage:"The path to key file"` - - IDs config.Slice[string] `arg:"id" yaml:"-" usage:"The user id"` - Secrets config.Slice[string] `arg:"secret" yaml:"-" usage:"The secret for user id"` - Users string `yaml:"users" usage:"The users yaml file to load"` - AuthAPI string `yaml:"authAPI" usage:"The API to authenticate user with id and secret"` - AllowAnyClient bool `yaml:"allowAnyClient" usage:"Allow any client to connect to the server"` - TCPRanges config.Slice[string] `yaml:"tcpRange" usage:"The tcp port range, like 1024-65535"` - TCPNumber uint16 `yaml:"tcpNumber" usage:"The number of tcp ports allowed to be opened for each id"` - Speed uint32 `yaml:"speed" usage:"The max number of bytes the client can transfer per second"` - Connections uint32 `yaml:"connections" usage:"The max number of tunnel connections for a client"` - ReconnectTimes uint32 `yaml:"reconnectTimes" usage:"The max number of times the client fails to reconnect"` - ReconnectDuration time.Duration `yaml:"reconnectDuration" usage:"The time that the client cannot connect after the number of failed reconnections reaches the max number"` - HostNumber uint32 `yaml:"hostNumber" usage:"The number of host-based services that the user can start"` - HostRegex config.Slice[string] `yaml:"hostRegex" usage:"The host prefix started by user must conform to one of these rules"` - HostWithID bool `yaml:"hostWithID" usage:"The prefix of host will become the form of id-host"` - - HTTPMUXHeader string `yaml:"httpMUXHeader" usage:"The http multiplexing header to be used"` - MaxHandShakeOptions uint16 `yaml:"maxHandShakeOptions" usage:"The max number of hand shake options"` - - Timeout time.Duration `yaml:"timeout" usage:"The timeout of connections. Supports values like '30s', '5m'"` - TimeoutOnUnidirectionalTraffic bool `yaml:"timeoutOnUnidirectionalTraffic" usage:"Timeout will happens when traffic is unidirectional"` + Config string `arg:"config" yaml:"-" json:"-" usage:"The config file path to load"` + Addr string `yaml:"addr,omitempty" usage:"The address to listen on. Supports values like: '80', ':80' or '0.0.0.0:80'"` + TLSAddr string `yaml:"tlsAddr,omitempty" json:",omitempty" usage:"The address for tls to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` + TLSMinVersion string `yaml:"tlsVersion,omitempty" json:",omitempty" usage:"The tls min version. Supports values: tls1.1, tls1.2, tls1.3"` + CertFile string `yaml:"certFile,omitempty" json:",omitempty" usage:"The path to cert file"` + KeyFile string `yaml:"keyFile,omitempty" json:",omitempty" usage:"The path to key file"` + + IDs config.Slice[string] `arg:"id" yaml:"-" json:"-" usage:"The user id"` + Secrets config.Slice[string] `arg:"secret" yaml:"-" json:"-" usage:"The secret for user id"` + Users string `yaml:"users,omitempty" json:"UserPath,omitempty" usage:"The users yaml file to load"` + AuthAPI string `yaml:"authAPI,omitempty" json:",omitempty" usage:"The API to authenticate user with id and secret"` + AllowAnyClient bool `yaml:"allowAnyClient,omitempty" json:",omitempty" usage:"Allow any client to connect to the server"` + TCPRanges config.Slice[string] `arg:"tcpRange" yaml:"-" json:"-" usage:"The tcp port range, like 1024-65535"` + TCPNumber uint16 `arg:"tcpNumber" yaml:"tcpNumber,omitempty" json:",omitempty" usage:"The number of tcp ports allowed to be opened for each id"` + Speed uint32 `yaml:"speed,omitempty" json:",omitempty" usage:"The max number of bytes the client can transfer per second"` + Connections uint32 `yaml:"connections,omitempty" json:",omitempty" usage:"The max number of tunnel connections for a client"` + ReconnectTimes uint32 `yaml:"reconnectTimes,omitempty" json:",omitempty" usage:"The max number of times the client fails to reconnect"` + ReconnectDuration config.Duration `yaml:"reconnectDuration,omitempty" json:",omitempty" json:",omitempty" usage:"The time that the client cannot connect after the number of failed reconnections reaches the max number"` + HostNumber uint32 `arg:"hostNumber" yaml:"-" json:"-" usage:"The number of host-based services that the user can start"` + HostRegex config.Slice[string] `arg:"hostRegex" yaml:"-" json:"-" usage:"The host prefix started by user must conform to one of these rules"` + HostWithID bool `arg:"hostWithID" yaml:"-" json:"-" usage:"The prefix of host will become the form of id-host"` + + HTTPMUXHeader string `yaml:"httpMUXHeader,omitempty" json:",omitempty" usage:"The http multiplexing header to be used"` + MaxHandShakeOptions uint16 `yaml:"maxHandShakeOptions,omitempty" json:",omitempty" usage:"The max number of hand shake options"` + + Timeout config.Duration `yaml:"timeout,omitempty" json:",omitempty" usage:"The timeout of connections. Supports values like '30s', '5m'"` + TimeoutOnUnidirectionalTraffic bool `yaml:"timeoutOnUnidirectionalTraffic,omitempty" json:",omitempty" usage:"Timeout will happens when traffic is unidirectional"` // internal api service - APIAddr string `yaml:"apiAddr" usage:"The address to listen on for internal api service. Supports values like: '8080', ':8080' or '0.0.0.0:8080'"` - APICertFile string `yaml:"apiCertFile" usage:"The path to cert file"` - APIKeyFile string `yaml:"apiKeyFile" usage:"The path to key file"` - APITLSMinVersion string `yaml:"apiTLSVersion" usage:"The tls min version. Supports values: tls1.1, tls1.2, tls1.3"` - - STUNAddr string `yaml:"stunAddr" usage:"The address to listen on for STUN service. Supports values like: '3478', ':3478' or '0.0.0.0:3478'"` - STUNLogLevel string `yaml:"stunLogLevel" usage:"Log level: trace, debug, info, warn, error, disable"` - - SNIAddr string `yaml:"sniAddr" usage:"The address to listen on for raw tls proxy. Host comes from Server Name Indication. Supports values like: '443', ':443' or '0.0.0.0:443'"` - - SentryDSN string `yaml:"sentryDSN" usage:"Sentry DSN to use"` - SentryLevel config.Slice[string] `yaml:"sentryLevel" usage:"Sentry levels: trace, debug, info, warn, error, fatal, panic (default [\"error\", \"fatal\", \"panic\"])"` - SentrySampleRate float64 `yaml:"sentrySampleRate" usage:"Sentry sample rate for event submission: [0.0 - 1.0]"` - SentryRelease string `yaml:"sentryRelease" usage:"Sentry release to be sent with events"` - SentryEnvironment string `yaml:"sentryEnvironment" usage:"Sentry environment to be sent with events"` - SentryServerName string `yaml:"sentryServerName" usage:"Sentry server name to be reported"` - SentryDebug bool `yaml:"sentryDebug" usage:"Sentry debug mode, the debug information is printed to help you understand what sentry is doing"` - - LogFile string `yaml:"logFile" usage:"Path to save the log file"` - LogFileMaxSize int64 `yaml:"logFileMaxSize" usage:"Max size of the log files"` - LogFileMaxCount uint `yaml:"logFileMaxCount" usage:"Max count of the log files"` - LogLevel string `yaml:"logLevel" usage:"Log level: trace, debug, info, warn, error, fatal, panic, disable"` - Version bool `arg:"version" yaml:"-" usage:"Show the version of this program"` + APIAddr string `yaml:"apiAddr,omitempty" json:",omitempty" usage:"The address to listen on for internal api service. Supports values like: '8080', ':8080' or '0.0.0.0:8080'"` + APICertFile string `yaml:"apiCertFile,omitempty" json:",omitempty" usage:"The path to cert file"` + APIKeyFile string `yaml:"apiKeyFile,omitempty" json:",omitempty" usage:"The path to key file"` + APITLSMinVersion string `yaml:"apiTLSVersion,omitempty" json:",omitempty" usage:"The tls min version. Supports values: tls1.1, tls1.2, tls1.3"` + + STUNAddr string `yaml:"stunAddr,omitempty" json:",omitempty" usage:"The address to listen on for STUN service. Supports values like: '3478', ':3478' or '0.0.0.0:3478'"` + STUNLogLevel string `yaml:"stunLogLevel,omitempty" json:",omitempty" usage:"Log level: trace, debug, info, warn, error, disable"` + + SNIAddr string `yaml:"sniAddr,omitempty" json:",omitempty" usage:"The address to listen on for raw tls proxy. Host comes from Server Name Indication. Supports values like: '443', ':443' or '0.0.0.0:443'"` + + SentryDSN string `yaml:"sentryDSN,omitempty" json:",omitempty" usage:"Sentry DSN to use"` + SentryLevel config.Slice[string] `yaml:"sentryLevel,omitempty" json:",omitempty" usage:"Sentry levels: trace, debug, info, warn, error, fatal, panic (default [\"error\", \"fatal\", \"panic\"])"` + SentrySampleRate float64 `yaml:"sentrySampleRate,omitempty" json:",omitempty" usage:"Sentry sample rate for event submission: [0.0 - 1.0]"` + SentryRelease string `yaml:"sentryRelease,omitempty" json:",omitempty" usage:"Sentry release to be sent with events"` + SentryEnvironment string `yaml:"sentryEnvironment,omitempty" json:",omitempty" usage:"Sentry environment to be sent with events"` + SentryServerName string `yaml:"sentryServerName,omitempty" json:",omitempty" usage:"Sentry server name to be reported"` + SentryDebug bool `yaml:"sentryDebug,omitempty" json:",omitempty" usage:"Sentry debug mode, the debug information is printed to help you understand what sentry is doing"` + + LogFile string `yaml:"logFile,omitempty" json:",omitempty" usage:"Path to save the log file"` + LogFileMaxSize int64 `yaml:"logFileMaxSize,omitempty" json:",omitempty" usage:"Max size of the log files"` + LogFileMaxCount uint `yaml:"logFileMaxCount,omitempty" json:",omitempty" usage:"Max count of the log files"` + LogLevel string `yaml:"logLevel,omitempty" json:",omitempty" usage:"Log level: trace, debug, info, warn, error, fatal, panic, disable"` + Version bool `arg:"version" yaml:"-" json:"-" usage:"Show the version of this program"` + + WebAddr string `arg:"webAddr" yaml:"webAddr,omitempty" json:"-" usage:"The address to listen on for web server"` + WebCertFile string `arg:"webCertFile" yaml:"webCertFile,omitempty" json:"-" usage:"The path to cert file for GT-Web server"` + WebKeyFile string `arg:"webKeyFile" yaml:"webKeyFile,omitempty" json:"-" usage:"The path to key file for GT-Web server"` + EnablePprof bool `arg:"pprof" yaml:"pprof,omitempty" json:"-" usage:"Enable pprof in web server"` + SigningKey string `arg:"signingKey" yaml:"signingKey,omitempty" json:"-" usage:"JWT signing key for web server"` + Admin string `arg:"admin" yaml:"admin,omitempty" json:"-" usage:"Admin username use for login in web server"` + Password string `arg:"password" yaml:"password,omitempty" json:"-" usage:"Admin password use for login in web server"` + + Signal string `arg:"s" yaml:"-" json:"-" usage:"Send signal to client processes. Supports values: restart, stop, kill"` QuicAddr string `yaml:"quicAddr" usage:"The address for quic connection (between GT client and GT server) to listen on. Supports values like: '443', ':443' or '0.0.0.0:443'"` - OpenBBR bool `yaml:"bbr" usage:"Use bbr as congestion control algorithm when GT use QUIC connection. Default algorithm is Cubic."` + OpenBBR bool `yaml:"bbr" usage:"Use bbr as congestion control algorithm (through msquic) when GT use QUIC connection. Default algorithm is Cubic (through quic-go)."` } func defaultConfig() Config { return Config{ Options: Options{ - Addr: "80", - Timeout: 90 * time.Second, + Timeout: config.Duration{Duration: 90 * time.Second}, TLSMinVersion: "tls1.2", APITLSMinVersion: "tls1.2", LogFileMaxCount: 7, @@ -113,7 +122,7 @@ func defaultConfig() Config { Connections: 10, ReconnectTimes: 3, - ReconnectDuration: 5 * time.Minute, + ReconnectDuration: config.Duration{Duration: 5 * time.Minute}, HostNumber: 0, @@ -124,19 +133,29 @@ func defaultConfig() Config { } } +// if you enable web service, it will set 'Config' if not specified + +func defaultConfigWithNoArgs() Config { + conf := defaultConfig() + conf.Options.Config = predef.GetDefaultServerConfigPath() + conf.Options.WebAddr = "127.0.0.1:8000" + + return conf +} + // tcp 管理 type tcp struct { - Range string + Range string `yaml:"range,omitempty" json:",omitempty"` } // user 用户权限细节 type user struct { Secret string - TCPs []tcp `yaml:"tcp"` - TCPNumber *uint16 `yaml:"tcpNumber"` - Speed uint32 `yaml:"speed"` - Connections uint32 `yaml:"connections"` - Host host + TCPs []tcp `yaml:"tcp,omitempty" json:",omitempty"` + TCPNumber *uint16 `yaml:"tcpNumber,omitempty"` + Speed uint32 `yaml:"speed,omitempty" json:",omitempty"` + Connections uint32 `yaml:"connections,omitempty" json:",omitempty"` + Host host `yaml:"host,omitempty" json:",omitempty"` temp bool portsManager *portsManager @@ -214,9 +233,9 @@ func (u *users) isIDConflict(id string) bool { // host 管理 type host struct { - Number *uint32 `yaml:"number"` - RegexStr *config.Slice[string] `yaml:"regex"` - Regex *[]*regexp.Regexp `yaml:"-"` - WithID *bool `yaml:"withID"` - Prefixes map[string]struct{} `yaml:"-"` + Number *uint32 `yaml:"number" json:",omitempty"` + RegexStr *config.Slice[string] `yaml:"regex" json:",omitempty"` + Regex *[]*regexp.Regexp `yaml:"-" json:"-"` + WithID *bool `yaml:"withID" json:",omitempty"` + Prefixes map[string]struct{} `yaml:"-" json:"-"` } diff --git a/server/conn.go b/server/conn.go index 4d7621eb..01523ede 100644 --- a/server/conn.go +++ b/server/conn.go @@ -60,7 +60,7 @@ func newConn(c net.Conn, s *Server) *conn { nc := &conn{ Connection: connection.Connection{ Conn: c, - WriteTimeout: s.config.Timeout, + WriteTimeout: s.config.Timeout.Duration, }, server: s, tasks: make(map[uint32]*conn, 100), @@ -111,8 +111,8 @@ func (c *conn) handle(handleFunc func() bool) { atomic.AddUint64(&c.server.failed, 1) } }() - if c.server.config.Timeout > 0 { - dl := startTime.Add(c.server.config.Timeout) + if c.server.config.Timeout.Duration > 0 { + dl := startTime.Add(c.server.config.Timeout.Duration) err := c.SetReadDeadline(dl) if err != nil { c.Logger.Debug().Err(err).Msg("handle set deadline failed") @@ -370,8 +370,8 @@ func (c *conn) handleTunnel(remoteIP string, r bool) (handled, reload bool, cli c.server.reconnectRWMutex.Unlock() // ReconnectDuration 为 0 表示不进行限制解除 - if c.server.config.ReconnectDuration > 0 && reconnectTimes > c.server.config.ReconnectTimes { - time.AfterFunc(c.server.config.ReconnectDuration, func() { + if c.server.config.ReconnectDuration.Duration > 0 && reconnectTimes > c.server.config.ReconnectTimes { + time.AfterFunc(c.server.config.ReconnectDuration.Duration, func() { c.server.reconnectRWMutex.Lock() c.server.reconnect[remoteIP] = 0 c.server.reconnectRWMutex.Unlock() @@ -415,8 +415,8 @@ func (c *conn) handleTunnel(remoteIP string, r bool) (handled, reload bool, cli c.server.reconnectRWMutex.Unlock() // ReconnectDuration 为 0 表示不进行限制解除 - if c.server.config.ReconnectDuration > 0 && reconnectTimes > c.server.config.ReconnectTimes { - time.AfterFunc(c.server.config.ReconnectDuration, func() { + if c.server.config.ReconnectDuration.Duration > 0 && reconnectTimes > c.server.config.ReconnectTimes { + time.AfterFunc(c.server.config.ReconnectDuration.Duration, func() { c.server.reconnectRWMutex.Lock() c.server.reconnect[remoteIP] = 0 c.server.reconnectRWMutex.Unlock() @@ -795,8 +795,8 @@ func (c *conn) readLoop(cli *client) (reload bool) { r := &bufio.LimitedReader{} isClosing := false for { - if c.server.config.Timeout > 0 { - dl := time.Now().Add(c.server.config.Timeout) + if c.server.config.Timeout.Duration > 0 { + dl := time.Now().Add(c.server.config.Timeout.Duration) err = c.SetReadDeadline(dl) if err != nil { return @@ -923,8 +923,8 @@ func (c *conn) readLoop(cli *client) (reload bool) { } return } - if c.server.config.Timeout > 0 && !c.server.config.TimeoutOnUnidirectionalTraffic { - dl := time.Now().Add(c.server.config.Timeout) + if c.server.config.Timeout.Duration > 0 && !c.server.config.TimeoutOnUnidirectionalTraffic { + dl := time.Now().Add(c.server.config.Timeout.Duration) err = task.SetReadDeadline(dl) if err != nil { c.Logger.Debug().Err(err).Uint32("taskID", taskID).Msg("update read deadline failed") @@ -1007,8 +1007,8 @@ func (c *conn) process(taskID uint32, task *conn, cli *client) { buf[bufIndex+1] = byte(predef.Data) bufIndex += 2 for { - if c.server.config.Timeout > 0 { - dl := time.Now().Add(c.server.config.Timeout) + if c.server.config.Timeout.Duration > 0 { + dl := time.Now().Add(c.server.config.Timeout.Duration) rErr = task.SetReadDeadline(dl) if rErr != nil { return @@ -1032,8 +1032,8 @@ func (c *conn) process(taskID uint32, task *conn, cli *client) { if wErr != nil { return } - if c.server.config.Timeout > 0 && !c.server.config.TimeoutOnUnidirectionalTraffic { - dl := time.Now().Add(c.server.config.Timeout) + if c.server.config.Timeout.Duration > 0 && !c.server.config.TimeoutOnUnidirectionalTraffic { + dl := time.Now().Add(c.server.config.Timeout.Duration) wErr = c.SetReadDeadline(dl) if wErr != nil { return diff --git a/server/server.go b/server/server.go index b15186c1..2c084748 100644 --- a/server/server.go +++ b/server/server.go @@ -22,6 +22,8 @@ import ( "fmt" connection "github.com/isrc-cas/gt/conn" "github.com/isrc-cas/gt/conn/msquic" + "github.com/pion/turn/v3" + "github.com/shirou/gopsutil/process" "io" "math" "net" @@ -34,6 +36,7 @@ import ( "strings" gosync "sync" "sync/atomic" + "syscall" "time" "github.com/buger/jsonparser" @@ -45,7 +48,6 @@ import ( "github.com/isrc-cas/gt/server/sync" "github.com/isrc-cas/gt/util" "github.com/pion/logging" - "github.com/pion/turn/v3" ) // Server is a network agent server. @@ -81,7 +83,15 @@ type Server struct { // New parses the command line args and creates a Server. out 用于测试 func New(args []string, out io.Writer) (s *Server, err error) { - conf := defaultConfig() + var conf Config + if predef.IsNoArgs() { + conf = defaultConfigWithNoArgs() + } else { + conf = defaultConfig() + if util.Contains(args, "-webAddr") { + conf.Config = predef.GetDefaultServerConfigPath() + } + } err = config.ParseFlags(args, &conf, &conf.Options) if err != nil { return @@ -91,6 +101,13 @@ func New(args []string, out io.Writer) (s *Server, err error) { os.Exit(0) } + if len(conf.Options.Signal) > 0 { + err = processSignal(conf.Options.Signal) + if err != nil { + return + } + } + l, err := logger.Init(logger.Options{ FilePath: conf.LogFile, Out: out, @@ -117,6 +134,80 @@ func New(args []string, out io.Writer) (s *Server, err error) { return } +func processSignal(signal string) (err error) { + switch signal { + case "restart": + err := sig(syscall.SIGQUIT) + if err != nil { + os.Exit(1) + } + os.Exit(0) + case "stop": + err := sig(syscall.SIGTERM) + if err != nil { + os.Exit(1) + } + os.Exit(0) + case "kill": + err := sig(syscall.SIGKILL) + if err != nil { + os.Exit(1) + } + os.Exit(0) + default: + err = fmt.Errorf("unknown value of '-s': %q", signal) + } + return +} + +func sig(sig syscall.Signal) (err error) { + processes, err := process.Processes() + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + return + } + tid := os.Getpid() + p, err := process.NewProcess(int32(tid)) + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + return + } + e, err := p.Exe() + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + return + } + + for _, proc := range processes { + pid := int(proc.Pid) + if pid == tid { + continue + } + var exe string + exe, err = proc.Exe() + if err != nil { + if os.IsNotExist(err) || os.IsPermission(err) { + continue + } + _, _ = fmt.Fprintln(os.Stderr, err) + return + } + if strings.HasPrefix(exe, e) { + p, err := os.FindProcess(pid) + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + return err + } + err = p.Signal(sig) + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + return err + } + fmt.Printf("sent signal to process %d.\n", pid) + } + } + return +} func (s *Server) tlsListen() (err error) { var tlsConfig *tls.Config tlsConfig, err = newTLSConfig(s.config.CertFile, s.config.KeyFile, s.config.TLSMinVersion) @@ -239,7 +330,6 @@ func (s *Server) acceptLoop(l net.Listener, handle func(*conn)) { // Start runs the server. func (s *Server) Start() (err error) { s.Logger.Info().Msg(predef.Version) - err = s.users.mergeUsers(s.config.Users, nil, nil) if err != nil { return @@ -361,7 +451,12 @@ func (s *Server) Start() (err error) { return } } - s.Logger.Info().Msg(spew.Sdump(s.config)) + + conf4log := *s.Config() + conf4log.Password = "******" + conf4log.SigningKey = "******" + + s.Logger.Info().Msg(spew.Sdump(conf4log)) return } @@ -510,7 +605,7 @@ func (s *Server) authWithAPI(id string, secret string, prefixes []string) (hostP req.Header.Set("Content-Type", "application/json") req.Header.Set("Request-Id", strconv.FormatInt(time.Now().Unix(), 10)) client := http.Client{ - Timeout: s.config.Timeout, + Timeout: s.config.Timeout.Duration, } resp, err := client.Do(req) if err != nil { @@ -577,10 +672,14 @@ func (s *Server) IsClosing() (closing bool) { // Shutdown stops the server gracefully. func (s *Server) Shutdown() { + defer s.Logger.Close() + s.ShutdownWithoutClosingLogger() +} + +func (s *Server) ShutdownWithoutClosingLogger() { if !atomic.CompareAndSwapUint32(&s.closing, 0, 1) { return } - defer s.Logger.Close() event := s.Logger.Info() if s.apiServer != nil { event.AnErr("api", s.apiServer.Close()) @@ -1010,3 +1109,17 @@ func (s *Server) GetSTUNListenerAddrPort() (addrPort netip.AddrPort) { addrPort = s.turnListener.LocalAddr().(*net.UDPAddr).AddrPort() return } + +func (s *Server) Config() *Config { + return &s.config +} + +func (s *Server) GetConnectionInfo() (info []ConnectionInfo) { + s.id2Client.Range(func(key, value interface{}) bool { + client := value.(*client) + clientInfo := client.GetConnectionInfo() + info = append(info, clientInfo...) + return true + }) + return +} diff --git a/server/web/api/api.go b/server/web/api/api.go new file mode 100644 index 00000000..cec2e83f --- /dev/null +++ b/server/web/api/api.go @@ -0,0 +1,209 @@ +package api + +import ( + "github.com/gin-gonic/gin" + "github.com/isrc-cas/gt/predef" + "github.com/isrc-cas/gt/server" + "github.com/isrc-cas/gt/server/web/service" + wServer "github.com/isrc-cas/gt/web/server" + "github.com/isrc-cas/gt/web/server/model/request" + "github.com/isrc-cas/gt/web/server/model/response" + "github.com/isrc-cas/gt/web/server/util" +) + +func HealthCheck(ctx *gin.Context) { + response.Success(ctx) +} + +func Login(s *server.Server) gin.HandlerFunc { + return func(ctx *gin.Context) { + var loginReq = request.User{} + if err := ctx.ShouldBindJSON(&loginReq); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + if err := service.VerifyUser(loginReq, s); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + token, err := util.GenerateToken(s.Config().SigningKey, predef.DefaultTokenDuration, "gt-server", loginReq) + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.SuccessWithData(gin.H{"token": token}, ctx) + } +} + +func VerifyTempKey(tokenManager *wServer.TokenManager) gin.HandlerFunc { + return func(ctx *gin.Context) { + tempKey := ctx.Query("key") + if tempKey == "" { + response.InvalidKey(ctx) + return + } + + actualToken, err := tokenManager.GetActualToken(tempKey) + if err != nil { + response.InvalidKey(ctx) + return + } + response.SuccessWithData(gin.H{"token": actualToken}, ctx) + } +} + +func ChangeUserInfo(s *server.Server) gin.HandlerFunc { + return func(ctx *gin.Context) { + var userInfo = request.UserInfo{} + if err := ctx.ShouldBindJSON(&userInfo); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + if err := service.ChangeUserInfo(userInfo, s); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + user := request.User{ + Username: userInfo.Username, + Password: userInfo.Password, + } + token, err := util.GenerateToken(s.Config().SigningKey, predef.DefaultTokenDuration, "gt-server", user) + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.SuccessWithData(gin.H{"token": token}, ctx) + } +} + +func GetUserInfo(s *server.Server) gin.HandlerFunc { + return func(ctx *gin.Context) { + var userInfo request.UserInfo + cfg, err := service.GetConfigFromFile(s) + if err != nil { + userInfo = request.UserInfo{ + Username: cfg.Admin, + Password: cfg.Password, + EnablePprof: cfg.EnablePprof, + } + } + // Get the user info from running config,if the config file is not specified + userInfo = request.UserInfo{ + Username: s.Config().Admin, + Password: s.Config().Password, + EnablePprof: s.Config().EnablePprof, + } + response.SuccessWithData(userInfo, ctx) + } +} + +// GetMenu returns the permission menu based on the role of the user +func GetMenu(s *server.Server) gin.HandlerFunc { + return func(ctx *gin.Context) { + menu := service.GetMenu(s) + response.SuccessWithData(menu, ctx) + + } +} + +// GetServerInfo returns system info ( OS, CPU, Memory, Disk ) +func GetServerInfo(ctx *gin.Context) { + serverInfo, err := util.GetServerInfo() + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.SuccessWithData(gin.H{"serverInfo": serverInfo}, ctx) +} + +// GetConnectionInfo returns connection info ( client pool, external ) +func GetConnectionInfo(s *server.Server) gin.HandlerFunc { + return func(ctx *gin.Context) { + serverPool, external, err := service.GetConnectionInfo(s) + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.SuccessWithData(gin.H{"serverPool": serverPool, "external": external}, ctx) + } +} + +// GetRunningConfig returns the running config +func GetRunningConfig(s *server.Server) gin.HandlerFunc { + return func(ctx *gin.Context) { + var cfg = s.Config() + s.Logger.Info().Msg("get running config") + response.SuccessWithData(gin.H{"config": cfg}, ctx) + } +} + +// GetConfigFromFile returns the config from file, +// If failed, try to fetch running config +func GetConfigFromFile(s *server.Server) gin.HandlerFunc { + return func(ctx *gin.Context) { + cfg, err := service.GetConfigFromFile(s) + s.Logger.Info().Msg("get config from file") + if err != nil { + s.Logger.Info().Msg("get config from file failed, try to fetch running config") + // try to fetch running config + GetRunningConfig(s)(ctx) + return + } + response.SuccessWithData(gin.H{"config": cfg}, ctx) + } +} + +// SaveConfigToFile saves the config to file, +// If the config file is not specified, save to default config file +func SaveConfigToFile(s *server.Server) gin.HandlerFunc { + return func(ctx *gin.Context) { + oldConfig, err := service.InheritConfig(s) + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + var cfg server.Config + if err := service.InheritImmutableConfigFields(&oldConfig, &cfg); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + if err := ctx.ShouldBindJSON(&cfg); err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + fullPath, err := service.SaveConfigToFile(&cfg) + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + s.Logger.Info().Str("config", fullPath).Msg("save config to file") + response.SuccessWithMessage("save config to "+fullPath, ctx) + } +} + +func Restart(ctx *gin.Context) { + err := util.SendSignal("restart") + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.Success(ctx) +} + +func Stop(ctx *gin.Context) { + err := util.SendSignal("stop") + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.Success(ctx) +} + +func Kill(ctx *gin.Context) { + err := util.SendSignal("kill") + if err != nil { + response.FailWithMessage(err.Error(), ctx) + return + } + response.Success(ctx) +} diff --git a/server/web/api/api_test.go b/server/web/api/api_test.go new file mode 100644 index 00000000..6772055f --- /dev/null +++ b/server/web/api/api_test.go @@ -0,0 +1,266 @@ +package api + +import ( + "bytes" + "encoding/json" + "github.com/gin-gonic/gin" + "github.com/isrc-cas/gt/server" + "github.com/isrc-cas/gt/web/server/model/request" + "github.com/isrc-cas/gt/web/server/model/response" + "github.com/stretchr/testify/assert" + "net/http" + "net/http/httptest" + "testing" +) + +func TestLogin(t *testing.T) { + gin.SetMode(gin.TestMode) + args := []string{ + "server4test", + "-admin", "admin4test", + "-password", "password4test", + } + server4test, err := server.New(args, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + + tests := []struct { + name string + input string + server *server.Server + expectedCode float64 + checkToken bool + }{ + { + name: "JSON binding failure", + input: `{"invalid": "json"`, + server: server4test, + expectedCode: response.ERROR, + }, + { + name: "User verification failure", + input: func() string { + data, _ := json.Marshal(request.User{ + Username: "wrongUsername", + Password: "wrongPassword", + }) + return string(data) + }(), + server: server4test, + expectedCode: response.ERROR, + }, + { + name: "User verification success", + input: func() string { + data, _ := json.Marshal(request.User{ + Username: "admin4test", + Password: "password4test", + }) + return string(data) + }(), + server: server4test, + expectedCode: response.SUCCESS, + checkToken: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := gin.Default() + server4test = tt.server + r.POST("/login", Login(server4test)) + + req, _ := http.NewRequest(http.MethodPost, "/login", bytes.NewBufferString(tt.input)) + req.Header.Set("Content-Type", "application/json") + resp := httptest.NewRecorder() + r.ServeHTTP(resp, req) + + var responseBody map[string]interface{} + err := json.Unmarshal(resp.Body.Bytes(), &responseBody) + if err != nil { + t.Fatalf("failed to unmarshal response body: %v", err) + } + + // Assert the status code + assert.Equal(t, http.StatusOK, resp.Code) + + // Asserting the code in the response body + assert.Equal(t, tt.expectedCode, responseBody["code"]) + + // Check if token exists in successful response + if tt.checkToken { + data, exists := responseBody["data"].(map[string]interface{}) + if assert.True(t, exists, "Data should be a map") { + _, tokenExists := data["token"] + assert.True(t, tokenExists, "Token should exist in data") + } + } + }) + } +} + +func TestGetMenu(t *testing.T) { + argsWithPprof := []string{ + "server4test", + "-pprof", + } + serverWithPprof, err := server.New(argsWithPprof, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + argsWithoutPprof := []string{ + "server4test", + } + serverWithoutPprof, err := server.New(argsWithoutPprof, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + gin.SetMode(gin.TestMode) + + type Response struct { + Code int `json:"code"` + Data []interface{} `json:"data"` + Msg string `json:"msg"` + } + + // Test with pprof + r1 := gin.New() + r1.GET("/menu", GetMenu(serverWithPprof)) + req1, _ := http.NewRequest(http.MethodGet, "/menu", nil) + resp1 := httptest.NewRecorder() + r1.ServeHTTP(resp1, req1) + menuWithPprof := resp1.Body.String() + + var responseWithPprof Response + if err := json.Unmarshal([]byte(menuWithPprof), &responseWithPprof); err != nil { + t.Fatalf("failed to parse response with pprof: %v", err) + } + + // Test without pprof + r2 := gin.New() + r2.GET("/menu", GetMenu(serverWithoutPprof)) + req2, _ := http.NewRequest(http.MethodGet, "/menu", nil) + resp2 := httptest.NewRecorder() + r2.ServeHTTP(resp2, req2) + menuWithoutPprof := resp2.Body.String() + + var responseWithoutPprof Response + if err := json.Unmarshal([]byte(menuWithoutPprof), &responseWithoutPprof); err != nil { + t.Fatalf("failed to parse response without pprof: %v", err) + } + + if len(responseWithPprof.Data)-len(responseWithoutPprof.Data) != 1 { + t.Errorf("menuWithPprof items: %d, menuWithoutPprof items: %d", len(responseWithPprof.Data), len(responseWithoutPprof.Data)) + } +} + +func TestGetServerInfo(t *testing.T) { + gin.SetMode(gin.TestMode) + + r := gin.New() + r.GET("/server/info", GetServerInfo) + + req, _ := http.NewRequest(http.MethodGet, "/server/info", nil) + resp := httptest.NewRecorder() + + r.ServeHTTP(resp, req) + + //check HTTPStatusCode + if resp.Code != http.StatusOK { + t.Fatalf("Expected status code 200, got %d", resp.Code) + } + + var jsonResponse map[string]interface{} + err := json.Unmarshal(resp.Body.Bytes(), &jsonResponse) + if err != nil { + t.Fatalf("Failed to parse JSON response: %v", err) + } + + data, ok := jsonResponse["data"].(map[string]interface{}) + if !ok { + t.Fatalf("Expected 'data' field in response") + } + + _, ok = data["serverInfo"].(map[string]interface{}) + if !ok { + t.Fatalf("Expected 'serverInfo' field in 'data'") + } +} + +func TestGetRunningConfig(t *testing.T) { + gin.SetMode(gin.TestMode) + args := []string{ + "server4test", + } + server4test, err := server.New(args, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + + r := gin.New() + r.GET("/config/running", GetRunningConfig(server4test)) + + testConfigEndpoint(t, r, "/config/running", "Expected 'config' field from running config") +} + +func TestGetConfigFromFile(t *testing.T) { + gin.SetMode(gin.TestMode) + + // Server without config file argument + argsWithoutConfig := []string{ + "server4test", + } + + serverWithoutConfig, err := server.New(argsWithoutConfig, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + + r1 := gin.New() + r1.GET("/config/file", GetConfigFromFile(serverWithoutConfig)) + testConfigEndpoint(t, r1, "/config/file", "Expected 'config' field from running config") + + // Server with config file argument + argsWithConfig := []string{ + "server4test", + "-config", "../../testdata/config.yaml", + } + + serverWithConfig, err := server.New(argsWithConfig, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + + r2 := gin.New() + r2.GET("/config/file", GetConfigFromFile(serverWithConfig)) + testConfigEndpoint(t, r2, "/config/file", "Expected 'config' field from file") +} + +func testConfigEndpoint(t *testing.T, router *gin.Engine, url, errMsg string) { + req, _ := http.NewRequest(http.MethodGet, url, nil) + resp := httptest.NewRecorder() + + router.ServeHTTP(resp, req) + + // Check HTTPStatusCode + if resp.Code != http.StatusOK { + t.Fatalf("Expected status code 200, got %d", resp.Code) + } + + var jsonResponse map[string]interface{} + err := json.Unmarshal(resp.Body.Bytes(), &jsonResponse) + if err != nil { + t.Fatalf("Failed to parse JSON response: %v", err) + } + + data, ok := jsonResponse["data"].(map[string]interface{}) + if !ok { + t.Fatalf("Expected 'data' field in response") + } + + _, ok = data["config"].(map[string]interface{}) + if !ok { + t.Fatalf(errMsg) + } +} diff --git a/server/web/service/service.go b/server/web/service/service.go new file mode 100644 index 00000000..0edc8ed7 --- /dev/null +++ b/server/web/service/service.go @@ -0,0 +1,200 @@ +package service + +import ( + "errors" + "fmt" + "github.com/davecgh/go-spew/spew" + "github.com/isrc-cas/gt/config" + "github.com/isrc-cas/gt/predef" + "github.com/isrc-cas/gt/server" + util2 "github.com/isrc-cas/gt/util" + "github.com/isrc-cas/gt/web/server/model/request" + "github.com/isrc-cas/gt/web/server/util" + "github.com/jinzhu/copier" + "github.com/shirou/gopsutil/v3/net" + "gopkg.in/yaml.v3" + "os" +) + +func VerifyUser(user request.User, s *server.Server) (err error) { + if user.Username == s.Config().Admin && user.Password == s.Config().Password { + return nil + } else { + return errors.New("username or password is wrong, please try again") + } +} + +func ChangeUserInfo(user request.UserInfo, s *server.Server) error { + cfg, err := InheritConfig(s) + if err != nil { + return err + } + cfg.Admin = user.Username + cfg.Password = user.Password + cfg.EnablePprof = user.EnablePprof + + conf4Log := cfg + conf4Log.Password = "******" + conf4Log.SigningKey = "******" + + _, err = SaveConfigToFile(&cfg) + if err != nil { + return err + } + s.Logger.Info().Str("config", "change user info").Msg(spew.Sdump(conf4Log)) + return nil +} + +func GetMenu(s *server.Server) (menu []request.Menu) { + menu = []request.Menu{ + //Home + { + Path: "/home/index", + Name: "home", + Component: "/home/index", + Meta: request.MetaProps{ + Icon: "HomeFilled", + Title: "Home", + IsHide: false, + IsFull: false, + IsAffix: true, + IsKeepAlive: false, + }, + }, + //Connection + { + Path: "/connection", + Name: "connection", + Component: "/connection/index", + Meta: request.MetaProps{ + Icon: "Connection", + Title: "Connection Status", + IsHide: false, + IsFull: false, + IsAffix: false, + IsKeepAlive: false, + }, + }, + //Server Config + { + Path: "/config/server", + Name: "server", + Component: "/config/ServerConfig/index", + Meta: request.MetaProps{ + Icon: "Setting", + Title: "Server", + IsHide: false, + IsFull: false, + IsAffix: false, + IsKeepAlive: true, + }, + }, + } + //pprof + if s.Config().EnablePprof { + enableHTTPS := true + if len(s.Config().WebCertFile) == 0 && len(s.Config().WebKeyFile) == 0 { + enableHTTPS = false + } + + webUrl, err := util.SwitchToValidWebURL(s.Config().WebAddr, enableHTTPS) + if err != nil { + s.Logger.Error().Err(err).Msg("switch to valid web url failed while getting pprof link") + return + } + pprofLink := fmt.Sprintf("%s/debug/pprof/", webUrl) + + menu = append(menu, request.Menu{ + Path: "/pprof", + Name: "pprof", + Component: "/pprof/index", + Meta: request.MetaProps{ + Icon: "link", + Title: "pprof", + IsLink: pprofLink, + IsHide: false, + IsFull: false, + IsAffix: false, + IsKeepAlive: false, + }, + }) + } + return +} + +// GetConnectionInfo returns the connection info (both in pool and external) of the server +func GetConnectionInfo(s *server.Server) (serverPool []request.SimplifiedConnectionWithID, external []request.SimplifiedConnection, err error) { + pid := int32(os.Getpid()) + conns, err := net.ConnectionsPid("all", pid) + if err != nil { + return + } + pools := s.GetConnectionInfo() + poolsInfo := util.SelectedMatchingConnections(conns, pools) + externalConnection := util.FilterOutMatchingConnections(conns, util.SwitchToPoolInfo(pools)) + + serverPool = util.SimplifyConnectionsWithID(poolsInfo) + external = util.SimplifyConnections(externalConnection) + return +} + +func GetConfigFromFile(s *server.Server) (cfg server.Config, err error) { + fullPath := s.Config().Options.Config + if len(fullPath) == 0 { + err = errors.New("config path is empty") + return + } + err = config.Yaml2Interface(fullPath, &cfg) + if err != nil { + return + } + return +} + +func SaveConfigToFile(cfg *server.Config) (fullPath string, err error) { + yamlData, err := yaml.Marshal(cfg) + if err != nil { + return + } + if cfg.Options.Config != "" { + fullPath = cfg.Options.Config + } else { + fullPath = predef.GetDefaultServerConfigPath() + cfg.Options.Config = fullPath + } + err = util2.WriteYamlToFile(fullPath, yamlData) + if err != nil { + return + } + return +} + +// InheritImmutableConfigFields copy immutable fields from original to new +func InheritImmutableConfigFields(original *server.Config, new *server.Config) (err error) { + if original == nil { + err = errors.New("original config is nil") + return + } + new.Config = original.Config + new.WebAddr = original.WebAddr + new.WebCertFile = original.WebCertFile + new.WebKeyFile = original.WebKeyFile + new.EnablePprof = original.EnablePprof + new.SigningKey = original.SigningKey + new.Admin = original.Admin + new.Password = original.Password + return +} + +func InheritConfig(s *server.Server) (cfg server.Config, err error) { + // Get From File + cfg, err = GetConfigFromFile(s) + if err != nil { + // Get From Running + err = copier.Copy(&cfg, s.Config()) // SigningKey is also copied + if err != nil { + return + } + } + return +} diff --git a/server/web/service/service_test.go b/server/web/service/service_test.go new file mode 100644 index 00000000..47b8c2fd --- /dev/null +++ b/server/web/service/service_test.go @@ -0,0 +1,109 @@ +package service + +import ( + "github.com/isrc-cas/gt/server" + "github.com/isrc-cas/gt/web/server/model/request" + "testing" +) + +func TestVerifyUser(t *testing.T) { + args := []string{ + "server4test", + "-admin", "admin4test", + "-password", "password4test", + } + server4test, err := server.New(args, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + + tests := []struct { + name string + inputUser request.User + server *server.Server + expectedErr bool + }{ + { + name: "Matching username and password", + inputUser: request.User{ + Username: "admin4test", + Password: "password4test", + }, + server: server4test, + expectedErr: false, + }, + { + name: "Mismatched username", + inputUser: request.User{ + Username: "wrongAdmin", + Password: "password4test", + }, + server: server4test, + expectedErr: true, + }, + { + name: "Mismatched password", + inputUser: request.User{ + Username: "admin4test", + Password: "wrongPassword", + }, + server: server4test, + expectedErr: true, + }, + { + name: "Mismatched username and password", + inputUser: request.User{ + Username: "wrongAdmin", + Password: "wrongPassword", + }, + server: server4test, + expectedErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := VerifyUser(tt.inputUser, tt.server) + gotError := (err != nil) + if gotError != tt.expectedErr { + t.Errorf("expected error %v, got error %v", tt.expectedErr, gotError) + } + }) + } +} + +func TestGetMenu(t *testing.T) { + serverWithPprof, err := server.New([]string{"server4test", "-pprof"}, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + serverWithoutPprof, err := server.New([]string{"server4test"}, nil) + if err != nil { + t.Fatalf("failed to create server: %v", err) + } + tests := []struct { + name string + server *server.Server + expectedLen int + }{ + { + name: "Without pprof", + server: serverWithoutPprof, + expectedLen: 3, + }, + { + name: "With pprof", + server: serverWithPprof, + expectedLen: 4, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + menu := GetMenu(tt.server) + if len(menu) != tt.expectedLen { + t.Errorf("expected menu length %d, got %d", tt.expectedLen, len(menu)) + } + }) + } +} diff --git a/server/web/web.go b/server/web/web.go new file mode 100644 index 00000000..41652b5a --- /dev/null +++ b/server/web/web.go @@ -0,0 +1,312 @@ +package web + +import ( + "context" + "crypto/tls" + "embed" + "errors" + "github.com/gin-gonic/gin" + "github.com/isrc-cas/gt/logger" + "github.com/isrc-cas/gt/predef" + "github.com/isrc-cas/gt/server" + "github.com/isrc-cas/gt/server/web/api" + "github.com/isrc-cas/gt/util" + wServer "github.com/isrc-cas/gt/web/server" + "github.com/isrc-cas/gt/web/server/middleware" + "github.com/isrc-cas/gt/web/server/model/request" + webUtil "github.com/isrc-cas/gt/web/server/util" + "io" + "io/fs" + "net" + "net/http" + "net/http/pprof" + "os" + "path/filepath" + "strconv" + "strings" + "syscall" + "time" +) + +//go:embed dist/* +var FS embed.FS + +type Server struct { + server *http.Server + logger logger.Logger // have no right to close logger + tokenManager *wServer.TokenManager + enableTLS bool +} + +func NewWebServer(s *server.Server) (*Server, error) { + + //make sure the web Addr is valid + err := checkConfig(s) + if err != nil { + return nil, err + } + + tm := wServer.NewTokenManager(wServer.DefaultTokenManagerConfig()) + + //set the log file + fullPath := filepath.Join(util.GetAppDir(), "web_server.log") + f, _ := os.Create(fullPath) + gin.DefaultWriter = io.MultiWriter(f) + + r := gin.Default() + err = setRoutes(s, tm, r) + if err != nil { + return nil, err + } + + ws, err := getServer(s, tm, r) + if err != nil { + return nil, err + } + + serverErr := make(chan error, 1) + go ws.start(serverErr) + timeout := time.After(2 * time.Second) + + select { + case err = <-serverErr: + case <-timeout: + enableHTTPS := ws.enableTLS + validURL, _ := webUtil.SwitchToValidWebURL(ws.server.Addr, enableHTTPS) + if isFirstStart(s) { + tempKey, err := getTempKey(ws, s) + if err != nil { + return nil, err + } + //add tempKey to url + validURL = webUtil.CreateUrlWithTempKey(validURL, tempKey) + s.Logger.Info().Str("url", validURL).Msg("first start, browser url") + s.Logger.Info().Msg("You have 3 chances to use this within the next 3 minutes. Please use it as soon as possible.") + } + if err := webUtil.OpenBrowser(validURL); err != nil { + s.Logger.Info().Msg("failed to open browser, please open it manually") + } + } + return ws, err +} + +// checkConfig checks the config of webAddr and set signingKey if it is not set +func checkConfig(s *server.Server) error { + if len(s.Config().WebAddr) == 0 { + return errors.New("option web_addr must be set") + } + if strings.IndexByte(s.Config().WebAddr, ':') == -1 { + s.Config().WebAddr = ":" + s.Config().WebAddr + } + if len(s.Config().Config) == 0 { + s.Config().Config = predef.GetDefaultServerConfigPath() + s.Logger.Info().Str("config", s.Config().Config).Msg("use default config path") + } + if len(s.Config().SigningKey) == 0 { + s.Config().SigningKey = util.RandomString(predef.DefaultSigningKeySize) + } + if len(s.Config().WebCertFile) > 0 && len(s.Config().WebKeyFile) > 0 { + if s.Config().WebCertFile != "auto" && s.Config().WebKeyFile != "auto" { + _, certErr := os.Stat(s.Config().WebCertFile) + _, keyErr := os.Stat(s.Config().WebKeyFile) + if os.IsNotExist(certErr) || os.IsNotExist(keyErr) { + return errors.New("provided webCertFile or webKeyFile does not exist") + } + } + } + return nil +} +func getServer(s *server.Server, tokenManager *wServer.TokenManager, r *gin.Engine) (*Server, error) { + webServer := &Server{ + server: &http.Server{ + Addr: s.Config().WebAddr, + Handler: r, + }, + logger: s.Logger, + tokenManager: tokenManager, + enableTLS: false, + } + certFile := s.Config().WebCertFile + keyFile := s.Config().WebKeyFile + + if len(certFile) == 0 && len(keyFile) == 0 { + // if both certFile and keyFile are empty, use HTTP, no need to do anything else + return webServer, nil + } else if certFile == "auto" && keyFile == "auto" { + // if both certFile and keyFile are "auto", generate a self-signed certificate and enable HTTPS + webServer.server.TLSConfig = webUtil.GenerateCertification() + webServer.enableTLS = true + } else { + // if user provides certFile and keyFile, load them and enable HTTPS + tlsCert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + err = errors.New("failed to load certFile or keyFile for web server") + return nil, err + } + webServer.server.TLSConfig = &tls.Config{ + Certificates: []tls.Certificate{tlsCert}, + } + webServer.enableTLS = true + } + return webServer, nil +} + +func setRoutes(s *server.Server, tm *wServer.TokenManager, r *gin.Engine) error { + staticFiles, err := fs.Sub(FS, "dist") + if err != nil { + return err + } + r.StaticFS("/static", http.FS(staticFiles)) + + PublicGroup := r.Group("/") + { + PublicGroup.POST("/api/login", api.Login(s)) + PublicGroup.GET("/api/health", api.HealthCheck) + PublicGroup.GET("/api/verify", api.VerifyTempKey(tm)) + } + apiGroup := r.Group("/api") + apiGroup.Use(middleware.JWTAuthMiddleware(s.Config().SigningKey, predef.DefaultTokenDuration)) + { + userGroup := apiGroup.Group("/user") + { + userGroup.POST("/change", api.ChangeUserInfo(s)) + userGroup.GET("/info", api.GetUserInfo(s)) + } + configGroup := apiGroup.Group("/config") + { + configGroup.GET("/running", api.GetRunningConfig(s)) + configGroup.GET("/file", api.GetConfigFromFile(s)) + configGroup.POST("/save", api.SaveConfigToFile(s)) + } + + serverGroup := apiGroup.Group("/server") + { + serverGroup.GET("/info", api.GetServerInfo) + serverGroup.PUT("/restart", api.Restart) + serverGroup.PUT("/stop", api.Stop) + serverGroup.PUT("/kill", api.Kill) + } + + connectionGroup := apiGroup.Group("/connection") + { + connectionGroup.GET("/list", api.GetConnectionInfo(s)) + } + + permissionGroup := apiGroup.Group("/permission") + { + permissionGroup.GET("/menu", api.GetMenu(s)) + } + } + + if s.Config().EnablePprof { + pprofGroup := r.Group("/debug/pprof") + { + pprofGroup.GET("/", gin.WrapF(pprof.Index)) + pprofGroup.GET("/cmdline", gin.WrapF(pprof.Cmdline)) + pprofGroup.GET("/profile", gin.WrapF(pprof.Profile)) + pprofGroup.POST("/symbol", gin.WrapF(pprof.Symbol)) + pprofGroup.GET("/symbol", gin.WrapF(pprof.Symbol)) + pprofGroup.GET("/trace", gin.WrapF(pprof.Trace)) + pprofGroup.GET("/allocs", gin.WrapH(pprof.Handler("allocs"))) + pprofGroup.GET("/block", gin.WrapH(pprof.Handler("block"))) + pprofGroup.GET("/goroutine", gin.WrapH(pprof.Handler("goroutine"))) + pprofGroup.GET("/heap", gin.WrapH(pprof.Handler("heap"))) + pprofGroup.GET("/mutex", gin.WrapH(pprof.Handler("mutex"))) + pprofGroup.GET("/threadcreate", gin.WrapH(pprof.Handler("threadcreate"))) + } + + } + + r.NoRoute(func(ctx *gin.Context) { + data, err := fs.ReadFile(FS, "dist/index.html") + if err != nil { + _ = ctx.AbortWithError(http.StatusInternalServerError, err) + return + } + ctx.Data(http.StatusOK, "text/html; charset=utf-8", data) + }) + + return nil +} + +func (s *Server) start(serverErr chan<- error) { + defer s.logger.Info().Msg("web server stopped") + if predef.IsNoArgs() { + startTime := time.Now() + for { + s.logger.Info().Str("addr", s.server.Addr).Msg("web server started") + err := s.server.ListenAndServe() + if err == nil || errors.Is(err, http.ErrServerClosed) { + return + } + if opErr, ok := err.(*net.OpError); ok { + if sysErr, ok := opErr.Err.(*os.SyscallError); ok { + if sysErr.Err == syscall.EADDRINUSE { + if time.Since(startTime) > 1*time.Second { + err = errors.New("retry timeout, web server stopped") + serverErr <- err + return + } + s.logger.Error().Err(err).Msg("web server failed to serve") + s.logger.Warn().Msg("web server address already in use, retrying...") + //Try to use a random port + s.server.Addr = ":" + strconv.Itoa(util.RandomPort()) + continue + } + } + } + serverErr <- err + return + } + } else { + s.logger.Info().Str("addr", s.server.Addr).Msg("web server started") + var err error + if s.enableTLS { + s.logger.Info().Msg("start web server with TLS") + err = s.server.ListenAndServeTLS("", "") + } else { + s.logger.Info().Msg("start web server without TLS") + err = s.server.ListenAndServe() + } + if err != nil && !errors.Is(err, http.ErrServerClosed) { + s.logger.Error().Err(err).Msg("web server failed to serve") + serverErr <- err + } + } +} + +// isFirstStart checks if the server is started for the first time, and set a random user +func isFirstStart(s *server.Server) bool { + var isFirst bool + // if the Admin and Password is not set, + // treat it as the first start + if len(s.Config().Admin) == 0 { + s.Config().Admin = util.RandomString(predef.DefaultAdminSize) + isFirst = true + } + if len(s.Config().Password) == 0 { + s.Config().Password = util.RandomString(predef.DefaultPasswordSize) + isFirst = true + } + return isFirst +} + +func getTempKey(ws *Server, s *server.Server) (string, error) { + tempUser := request.User{ + Username: s.Config().Admin, + Password: s.Config().Password, + } + token, err := webUtil.GenerateToken(s.Config().SigningKey, predef.DefaultTokenDuration, "gt-server", tempUser) + if err != nil { + return "", err + } + tempKey := ws.tokenManager.GenerateTempKey(token) + + return tempKey, nil +} + +func (s *Server) Shutdown() error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + return s.server.Shutdown(ctx) +} diff --git a/server/web/web_test.go b/server/web/web_test.go new file mode 100644 index 00000000..9b828774 --- /dev/null +++ b/server/web/web_test.go @@ -0,0 +1,235 @@ +package web + +import ( + "bytes" + "encoding/json" + "fmt" + "github.com/gin-gonic/gin" + "github.com/isrc-cas/gt/server" + wServer "github.com/isrc-cas/gt/web/server" + "io" + "io/fs" + "net/http" + "net/http/httptest" + "testing" +) + +func TestCheckConfig(t *testing.T) { + tests := []struct { + name string + args []string + expectErr bool + }{ + { + name: "all options set", + args: []string{ + "server", + "-webAddr", "localhost:8000", + "-admin", "admin", + "-password", "password", + "-signingKey", "signingKey", + "-pprof", "true", + }, + expectErr: false, + }, + { + name: "missing webAddr", + args: []string{ + "server", + "-admin", "admin", + "-password", "password", + "-signingKey", "signingKey", + "-pprof", "true", + }, + expectErr: true, + }, + { + name: "signingKey is empty string but other options set", + args: []string{ + "server", + "-webAddr", "localhost:8000", + "-admin", "admin", + "-password", "password", + "-signingKey", "", + "-pprof", "true", + }, + expectErr: false, // Because it'll get a random value if not set + }, + // Can't test this because os.Args is not equal to tt.args + //{ + // name: "all options not set", + // args: []string{ + // "server", + // }, + // expectErr: false, // server New will create a default webAddr + //}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s, err := server.New(tt.args, nil) + if err != nil { + t.Fatalf("Error while initializing the server: %v", err) + } + + err = checkConfig(s) + if (err != nil) != tt.expectErr { + t.Errorf("checkConfig() error = %v, expectErr %v", err, tt.expectErr) + } + }) + } +} + +type RouteTestCase struct { + name string + method string + path string + server *server.Server + headers map[string]string + expectRedirect bool +} + +func executeTestCase(t *testing.T, r *gin.Engine, testCase RouteTestCase, noRouteContent []byte) { + w := performRequestWithHeaders(r, testCase.method, testCase.path, nil, testCase.headers) + + if bytes.Equal(w.Body.Bytes(), noRouteContent) { + if testCase.expectRedirect { + t.Logf("Request was caught by NoRoute as expected.") + } else { + t.Errorf("Request was unexpectedly caught by NoRoute.") + } + } else { + if testCase.expectRedirect { + t.Errorf("Request was not caught by NoRoute but was expected to be.") + } else { + t.Logf("Request was not caught by NoRoute as expected.") + } + } +} + +func TestSetRoutes(t *testing.T) { + gin.SetMode(gin.TestMode) + + data, err := fs.ReadFile(FS, "dist/index.html") + if err != nil { + t.Fatalf("Failed to read dist/index.html: %v", err) + } + noRouteContent := data + + serverWithPprof := initializeServer(t, generateServerArgs(true)) + serverWithoutPprof := initializeServer(t, generateServerArgs(false)) + + r := gin.New() + tm := wServer.NewTokenManager(wServer.DefaultTokenManagerConfig()) + err = setRoutes(serverWithPprof, tm, r) + if err != nil { + t.Fatalf("Failed to set routes: %v", err) + } + loginPayload := map[string]interface{}{ + "username": "admin4test", + "password": "password4test", + } + token, err := performLogin(r, loginPayload) + if err != nil { + t.Fatalf("Failed to perform login: %v", err) + } + testCases := []RouteTestCase{ + {"Check Health Route", "GET", "/api/health", serverWithPprof, nil, false}, + {"Check Login Route", "POST", "/api/login", serverWithPprof, nil, false}, + {"Check Server Info Route", "GET", "/api/server/info", serverWithPprof, map[string]string{"x-token": token}, false}, + + {"Check UserInfo Route", "GET", "/api/user/info", serverWithPprof, map[string]string{"x-token": token}, false}, + {"Check UserChangeInfo Route", "POST", "/api/user/change", serverWithPprof, map[string]string{"x-token": token}, false}, + + {"Check Running Config Route", "GET", "/api/config/running", serverWithPprof, map[string]string{"x-token": token}, false}, + {"Check Config From File Route", "GET", "/api/config/file", serverWithPprof, map[string]string{"x-token": token}, false}, + {"Check Save Config Route", "POST", "/api/config/save", serverWithPprof, map[string]string{"x-token": token}, false}, + + {"Check Server Info Route", "GET", "/api/server/info", serverWithPprof, map[string]string{"x-token": token}, false}, + //Can't test these routes because they will kill the test server + //{"Check Server Restart Route", "PUT", "/api/server/restart", serverWithPprof, http.StatusOK, map[string]string{"x-token": token}}, + //{"Check Server Shutdown Route", "PUT", "/api/server/shutdown", serverWithPprof, http.StatusOK, map[string]string{"x-token": token}}, + //{"Check Server Kill Route", "PUT", "/api/server/kill", serverWithPprof, http.StatusOK, map[string]string{"x-token": token}}, + + {"Check Connections Route", "GET", "/api/connection/list", serverWithPprof, map[string]string{"x-token": token}, false}, + {"Check Permissions Route", "GET", "/api/permission/menu", serverWithPprof, map[string]string{"x-token": token}, false}, + + {"Check Pprof Route with pprof permission", "GET", "/debug/pprof/", serverWithPprof, nil, false}, + {"Check Pprof Route without pprof permission", "GET", "/debug/pprof/", serverWithoutPprof, nil, true}, + } + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + r := gin.New() + err := setRoutes(testCase.server, tm, r) + if err != nil { + t.Errorf("setRoutes() error = %v", err) + } + executeTestCase(t, r, testCase, noRouteContent) + }) + } +} + +func generateServerArgs(withPprof bool) []string { + args := []string{ + "server", + "-webAddr", "localhost:8080", + "-admin", "admin4test", + "-password", "password4test", + "-signingKey", "signingKey4test", + } + + if withPprof { + args = append(args, "-pprof") + } + + return args +} + +func initializeServer(t *testing.T, args []string) *server.Server { + s, err := server.New(args, nil) + if err != nil { + t.Fatalf("Error while initializing the server: %v", err) + } + return s +} + +func performLogin(r *gin.Engine, loginPayload map[string]interface{}) (string, error) { + payloadBytes, err := json.Marshal(loginPayload) + if err != nil { + return "", fmt.Errorf("failed to marshal login payload: %v", err) + } + payloadReader := bytes.NewReader(payloadBytes) + + w := performRequestWithHeaders(r, "POST", "/api/login", payloadReader, nil) + if w.Code != http.StatusOK { + return "", fmt.Errorf("failed to login during test setup with status: %d, response: %s", w.Code, w.Body.String()) + } + + response := map[string]interface{}{} + err = json.Unmarshal(w.Body.Bytes(), &response) + if err != nil { + return "", fmt.Errorf("failed to unmarshal login response: %v", err) + } + + data, ok := response["data"].(map[string]interface{}) + if !ok { + return "", fmt.Errorf("data not found or is not an object in login response") + } + + token, exists := data["token"] + if !exists { + return "", fmt.Errorf("token not found in login response") + } + + return token.(string), nil +} + +func performRequestWithHeaders(r *gin.Engine, method, path string, body io.Reader, headers map[string]string) *httptest.ResponseRecorder { + req, _ := http.NewRequest(method, path, body) + for k, v := range headers { + req.Header.Set(k, v) + } + w := httptest.NewRecorder() + r.ServeHTTP(w, req) + return w +} diff --git a/util/path.go b/util/path.go new file mode 100644 index 00000000..76ab11e9 --- /dev/null +++ b/util/path.go @@ -0,0 +1,38 @@ +package util + +import ( + "os" + "path/filepath" +) + +func GetAppDir() string { + if path, err := filepath.Abs(filepath.Dir(os.Args[0])); err == nil { + return path + } + return os.Args[0] +} + +func WriteYamlToFile(fullPath string, data []byte) error { + + file, err := os.Create(fullPath) + if err != nil { + return err + } + defer file.Close() + + _, err = file.Write(data) + if err != nil { + return err + } + + return nil +} + +func Contains(slice []string, target string) bool { + for _, item := range slice { + if item == target { + return true + } + } + return false +} diff --git a/util/path_test.go b/util/path_test.go new file mode 100644 index 00000000..c38dd83c --- /dev/null +++ b/util/path_test.go @@ -0,0 +1,77 @@ +package util + +import ( + "io/ioutil" + "os" + "testing" +) + +func TestWriteYamlToFile(t *testing.T) { + tmpDir, err := ioutil.TempDir("", "writeyamltest") + if err != nil { + t.Fatalf("Error creating temp directory: %s", err) + } + defer os.RemoveAll(tmpDir) + + tests := []struct { + name string + inputData []byte + filePath string + expectError bool + expected []byte + }{ + { + name: "normal write", + inputData: []byte("example: data"), + filePath: tmpDir + "/test.yaml", + expected: []byte("example: data"), + }, + { + name: "overwrite existing file", + inputData: []byte("new: data"), + filePath: tmpDir + "/test2.yaml", + expected: []byte("new: data"), + }, + { + name: "write empty data", + inputData: []byte(""), + filePath: tmpDir + "/empty.yaml", + expected: []byte(""), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + if tt.name == "overwrite existing file" { + err := ioutil.WriteFile(tt.filePath, []byte("initial: data"), 0644) + if err != nil { + t.Fatalf("Failed to create file: %s", err) + } + } + + err := WriteYamlToFile(tt.filePath, tt.inputData) + + // check if we expect an error + if tt.expectError { + if err == nil { + t.Errorf("Expected an error but got none") + return + } + } else if err != nil { + t.Errorf("Didn't expect an error but got: %s", err) + return + } + + // check the content of the file + content, readErr := ioutil.ReadFile(tt.filePath) + if readErr != nil { + t.Fatalf("Failed to read file: %s", readErr) + } + + if string(content) != string(tt.expected) { + t.Errorf("Expected content %s, got %s", string(tt.expected), string(content)) + } + }) + } +} diff --git a/util/rand.go b/util/rand.go index 2216ad4f..784e7af1 100644 --- a/util/rand.go +++ b/util/rand.go @@ -16,17 +16,34 @@ package util import ( "math/rand" + "sync" "time" ) +var ( + r *rand.Rand + lock sync.Mutex +) + +func init() { + r = rand.New(rand.NewSource(time.Now().Unix())) +} + // RandomString 随机字符串 func RandomString(n int) string { letters := []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") - r := rand.New(rand.NewSource(time.Now().Unix())) s := make([]byte, n) + lock.Lock() + defer lock.Unlock() for i := range s { s[i] = letters[r.Intn(len(letters))] } return string(s) } + +func RandomPort() int { + lock.Lock() + defer lock.Unlock() + return r.Intn(65535-1024) + 1024 +} diff --git a/web/front/.editorconfig b/web/front/.editorconfig new file mode 100644 index 00000000..d8e1cc52 --- /dev/null +++ b/web/front/.editorconfig @@ -0,0 +1,16 @@ +# @see: http://editorconfig.org + +root = true + +[*] # Applies to all files +charset = utf-8 # set encoding +end_of_line = lf # control characters at the end of line (lf | crlf | cr) +insert_final_newline = true # insert a new line at the end of file +indent_style = space # set indent style (space | tab) +indent_size = 2 # set indent size +max_line_length = 130 # set max line length + +[*.md] # Applies to all files which extension is md +max_line_length = off # turn off max line length +trim_trailing_whitespace = false # turn off trim trailing whitespace + diff --git a/web/front/.env b/web/front/.env new file mode 100644 index 00000000..45a1dd45 --- /dev/null +++ b/web/front/.env @@ -0,0 +1,11 @@ +# title +VITE_GLOB_APP_TITLE = GT Admin + +# the port to serve the dev server on +VITE_PORT = 8848 + +# auto open browser when dev server is started +VITE_OPEN = true + +# whether to generate package analysis file after packaging +VITE_REPORT = true diff --git a/web/front/.env.development b/web/front/.env.development new file mode 100644 index 00000000..ac845785 --- /dev/null +++ b/web/front/.env.development @@ -0,0 +1,18 @@ +# local env +VITE_USER_NODE_ENV = development + +# public path +VITE_PUBLIC_PATH = / + +# whether to drop console when building +VITE_DROP_CONSOLE = flase + +# whether to enable VitePWA +VITE_PWA = false + +# 开发环境接口地址 +# API_URL used in development +VITE_API_URL = /api + +# vite proxy, support multiple proxies +VITE_PROXY = [["/api","http://localhost:8000"]] diff --git a/web/front/.env.production b/web/front/.env.production new file mode 100644 index 00000000..4ac60e59 --- /dev/null +++ b/web/front/.env.production @@ -0,0 +1,24 @@ +# environment +VITE_USER_NODE_ENV = production + +# public path +VITE_PUBLIC_PATH = /static/ + +# whether to enable gzip or brotli compression when buildin, if you need multiple compression rules, you can use "," for separatin +# Optional: gzip | brotli | none +VITE_BUILD_COMPRESS = none + +# whether to delete the origin file after compression +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false + +# whether to drop console when building +VITE_DROP_CONSOLE = true + +# whether to enable source map when building +VITE_SOURCE_MAP = false + +# whether to enable VitePWA +VITE_PWA = false + +# API_URL used in production +VITE_API_URL = /api diff --git a/web/front/.env.test b/web/front/.env.test new file mode 100644 index 00000000..98804500 --- /dev/null +++ b/web/front/.env.test @@ -0,0 +1,24 @@ +# environment +VITE_USER_NODE_ENV = test + +# public path +VITE_PUBLIC_PATH = /static/ + +# whether to enable gzip or brotli compression when buildin, if you need multiple compression rules, you can use "," for separatin +# Optional: gzip | brotli | none +VITE_BUILD_COMPRESS = none + +# whether to delete the origin file after compression +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false + +# whether to drop console when building +VITE_DROP_CONSOLE = false + +# whether to enable source map when building +VITE_SOURCE_MAP = true + +# whether to enable VitePWA +VITE_PWA = false + +# API_URL used in test +VITE_API_URL = /api diff --git a/web/front/.eslintignore b/web/front/.eslintignore new file mode 100644 index 00000000..2debdc3f --- /dev/null +++ b/web/front/.eslintignore @@ -0,0 +1,15 @@ +*.sh +node_modules +*.md +*.woff +*.ttf +.vscode +.idea +dist +/public +/docs +.husky +.local +/bin +/src/mock/* +stats.html diff --git a/web/front/.eslintrc.cjs b/web/front/.eslintrc.cjs new file mode 100644 index 00000000..9f274469 --- /dev/null +++ b/web/front/.eslintrc.cjs @@ -0,0 +1,60 @@ +// @see: http://eslint.cn + +module.exports = { + root: true, + env: { + browser: true, + node: true, + es6: true + }, + // Specifies how to parse syntax + parser: "vue-eslint-parser", + // Has a lower priority than the parse syntax configuration + parserOptions: { + parser: "@typescript-eslint/parser", + ecmaVersion: 2020, + sourceType: "module", + jsxPragma: "React", + ecmaFeatures: { + jsx: true + } + }, + // Inheritance of some existing rules + extends: ["plugin:vue/vue3-recommended", "plugin:@typescript-eslint/recommended", "plugin:prettier/recommended"], + /** + * "off" 或 0 ==> Turn off the rule + * "warn" 或 1 ==> Turn on the rule ad a warning + * "error" 或 2 ==> Rule as an error + */ + rules: { + // eslint (http://eslint.cn/docs/rules) + "no-var": "error", // Required use let or const instead of var + "no-multiple-empty-lines": ["error", { max: 1 }], // Disallow multiple empty lines + "prefer-const": "off", // For variables declared with the let keyword but never reassigned after the initial assignment, require the use of const + "no-use-before-define": "off", // Prohibit the use of variables before they are defined + + // typeScript (https://typescript-eslint.io/rules) + "@typescript-eslint/no-unused-vars": "error", // Prohibit the use of variables before they are defined + "@typescript-eslint/prefer-ts-expect-error": "error", // prohibit the use of @ts-ignore + "@typescript-eslint/ban-ts-comment": "error", // Prohibit the use of @ts- comments or require a description after the directive + "@typescript-eslint/no-inferrable-types": "off", // Explicit types that can be easily inferred may add unnecessary verbosity + "@typescript-eslint/no-namespace": "off", // Prohibit the use of custom TypeScript modules and namespaces + "@typescript-eslint/no-explicit-any": "off", // Prohibit the use of the any type + "@typescript-eslint/ban-types": "off", // Prohibit the use of specific types + "@typescript-eslint/no-var-requires": "off", // Allow the use of the require() function to import modules + "@typescript-eslint/no-empty-function": "off", // Prohibit empty functions + "@typescript-eslint/no-non-null-assertion": "off", // Do not allow the use of the non-null assertion postfix operator(!) + + // vue (https://eslint.vuejs.org/rules) + "vue/script-setup-uses-vars": "error", // Prevent variables used in + + + diff --git a/web/front/lint-staged.config.cjs b/web/front/lint-staged.config.cjs new file mode 100644 index 00000000..04d1d409 --- /dev/null +++ b/web/front/lint-staged.config.cjs @@ -0,0 +1,8 @@ +module.exports = { + "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"], + "{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": ["prettier --write--parser json"], + "package.json": ["prettier --write"], + "*.vue": ["eslint --fix", "prettier --write", "stylelint --fix"], + "*.{scss,less,styl,html}": ["stylelint --fix", "prettier --write"], + "*.md": ["prettier --write"] +}; diff --git a/web/front/package-lock.json b/web/front/package-lock.json new file mode 100644 index 00000000..3da59539 --- /dev/null +++ b/web/front/package-lock.json @@ -0,0 +1,24139 @@ +{ + "name": "gt-web", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "gt-web", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@element-plus/icons-vue": "^2.1.0", + "@vueuse/core": "^10.2.1", + "axios": "^1.4.0", + "dayjs": "^1.11.9", + "driver.js": "^1.3.0", + "echarts": "^5.4.3", + "element-plus": "^2.3.4", + "lodash": "^4.17.21", + "mitt": "^3.0.1", + "nprogress": "^0.2.0", + "pinia": "^2.1.4", + "pinia-plugin-persistedstate": "^3.1.0", + "screenfull": "^6.0.2", + "sortablejs": "^1.15.0", + "uuid": "^9.0.0", + "vue": "^3.3.4", + "vue-echarts": "^6.6.1", + "vue-eslint-parser": "^9.3.1", + "vue-router": "^4.2.4" + }, + "devDependencies": { + "@types/nprogress": "^0.2.0", + "@types/sortablejs": "^1.15.2", + "@types/uuid": "^9.0.4", + "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/parser": "^5.61.0", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "autoprefixer": "^10.4.16", + "czg": "^1.6.1", + "eslint": "^8.44.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-vue": "^9.15.1", + "lint-staged": "^13.2.3", + "prettier": "^2.8.8", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "^1.63.6", + "standard-version": "^9.5.0", + "stylelint": "^15.10.1", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recess-order": "^4.2.0", + "stylelint-config-recommended-scss": "^12.0.0", + "stylelint-config-recommended-vue": "^1.4.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^10.0.0", + "typescript": "^5.1.6", + "unplugin-vue-setup-extend-plus": "^1.0.0", + "vite": "^4.4.4", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-html": "^3.2.0", + "vite-plugin-pwa": "^0.16.4", + "vite-plugin-svg-icons": "^2.0.1", + "vue-tsc": "^1.8.5" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.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/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "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.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz", + "integrity": "sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.2.1" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz", + "integrity": "sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz", + "integrity": "sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.3.2", + "@csstools/css-tokenizer": "^2.2.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", + "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz", + "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", + "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "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.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "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.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dev": true, + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.4", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.4.tgz", + "integrity": "sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", + "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.9", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.9.tgz", + "integrity": "sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/minimist": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz", + "integrity": "sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.8.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", + "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.25.1" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", + "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==", + "dev": true + }, + "node_modules/@types/nprogress": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.1.tgz", + "integrity": "sha512-TYuyVnp+nOnimgdOydDIDYIxv2kSeuJZw4tF0p/KG7hpzcMF1WkHaREwM8O4blqfT1F7rq0nht6Ko2KVUfWzBA==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "dev": true + }, + "node_modules/@types/sortablejs": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.3.tgz", + "integrity": "sha512-v+zh6TZP/cLeMUK0MDx1onp8e7Jk2/4iTQ7sb/n80rTAvBm14yJkpOEfJdrTCkHiF7IZbPjxGX2NRJfogRoYIg==", + "dev": true + }, + "node_modules/@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", + "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.5.tgz", + "integrity": "sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.18.tgz", + "integrity": "sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz", + "integrity": "sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.2.tgz", + "integrity": "sha512-obF26P2Z4Ogy3cPp07B4VaW6rpiu0ue4OT2Y15UxT5BZZ76haUY9guOsZV3uWh/I6xc+VeiW+ZVabRE82FyzWw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.10", + "@babel/plugin-transform-typescript": "^7.22.10", + "@vue/babel-plugin-jsx": "^1.1.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.4.tgz", + "integrity": "sha512-Na69qA6uwVIdA0rHuOc2W3pHtVQQO8hCNim7FOaKNpRJh0oAFnu5r9i7Oopo5C4cnELZkPNjTrbmpcCTiW+CMQ==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.10.4" + } + }, + "node_modules/@volar/source-map": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.4.tgz", + "integrity": "sha512-RxZdUEL+pV8p+SMqnhVjzy5zpb1QRZTlcwSk4bdcBO7yOu4rtEWqDGahVCEj4CcXour+0yJUMrMczfSCpP9Uxg==", + "dev": true, + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.4.tgz", + "integrity": "sha512-BCCUEBASBEMCrz7qmNSi2hBEWYsXD0doaktRKpmmhvb6XntM2sAWYu6gbyK/MluLDgluGLFiFRpWgobgzUqolg==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.10.4" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "node_modules/@vue/language-core": { + "version": "1.8.19", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.19.tgz", + "integrity": "sha512-nt3dodGs97UM6fnxeQBazO50yYCKBK53waFWB3qMbLmR6eL3aUryZgQtZoBe1pye17Wl8fs9HysV3si6xMgndQ==", + "dev": true, + "dependencies": { + "@volar/language-core": "~1.10.4", + "@volar/source-map": "~1.10.4", + "@vue/compiler-dom": "^3.3.0", + "@vue/reactivity": "^3.3.0", + "@vue/shared": "^3.3.0", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/reactivity-transform/node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "node_modules/@vue/typescript": { + "version": "1.8.19", + "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.19.tgz", + "integrity": "sha512-k/SHeeQROUgqsxyHQ8Cs3Zz5TnX57p7BcBDVYR2E0c61QL2DJ2G8CsaBremmNGuGE6o1R5D50IHIxFmroMz8iw==", + "dev": true, + "dependencies": { + "@volar/typescript": "~1.10.4", + "@vue/language-core": "1.8.19" + } + }, + "node_modules/@vueuse/core": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.5.0.tgz", + "integrity": "sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==", + "dependencies": { + "@types/web-bluetooth": "^0.0.18", + "@vueuse/metadata": "10.5.0", + "@vueuse/shared": "10.5.0", + "vue-demi": ">=0.14.6" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "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/@vueuse/metadata": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.5.0.tgz", + "integrity": "sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.5.0.tgz", + "integrity": "sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==", + "dependencies": { + "vue-demi": ">=0.14.6" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "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/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", + "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.32.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "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" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001549", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz", + "integrity": "sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA==", + "dev": true, + "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" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "node_modules/conventional-changelog": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-config-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", + "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", + "dev": true + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "dev": true, + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + }, + "bin": { + "conventional-recommended-bump": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", + "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", + "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "dev": true, + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/czg": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/czg/-/czg-1.7.1.tgz", + "integrity": "sha512-KP93cTbZxgWYDKJzZpjnLe0sy/2FwyegatnrOaqsath04WinvsdhZl5QCGkxTKBY2DavpKloIBW/WGZzCKmrlA==", + "dev": true, + "bin": { + "czg": "bin/index.js", + "git-czg": "bin/index.js" + }, + "engines": { + "node": ">=v12.20.0" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "peer": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dotenv-expand": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-8.0.3.tgz", + "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/dotgitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotgitignore/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/driver.js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/driver.js/-/driver.js-1.3.0.tgz", + "integrity": "sha512-ilUkVc5iMIYfMd8FdWy8n5Wv//gsJuRP+lo8QfWpwP9c0UGOgD7P9nVQMZwcdW84aqAZHHUHrV7GgiopAN6HUQ==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/echarts": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz", + "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.4.4" + } + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.556", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.556.tgz", + "integrity": "sha512-6RPN0hHfzDU8D56E72YkDvnLw5Cj2NMXZGg3UkgyoHxjVhG99KZpsKgBWMmTy0Ei89xwan+rbRsVB9yzATmYzQ==", + "dev": true + }, + "node_modules/element-plus": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.4.0.tgz", + "integrity": "sha512-yJEa8LXkGOOgkfkeqMMEdeX/Dc8EH9qPcRuX91dlhSXxgCKKbp9tH3QFTOG99ibZsrN/Em62nh7ddvbc7I1frw==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.0.6", + "@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.3", + "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/element-plus/node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "node_modules/element-plus/node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "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/element-plus/node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "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/element-plus/node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/element-plus/node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/element-plus/node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "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/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.51.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz", + "integrity": "sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.3.1", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "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/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-pkg-repo/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/get-pkg-repo/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/get-pkg-repo/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/get-pkg-repo/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/get-pkg-repo/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/get-pkg-repo/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-pkg-repo/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/get-pkg-repo/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/get-pkg-repo/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/get-pkg-repo/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "dependencies": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "dev": true + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lint-staged": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", + "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", + "dev": true, + "dependencies": { + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", + "lilconfig": "2.1.0", + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/listr2": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/meow/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "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/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", + "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persistedstate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.0.tgz", + "integrity": "sha512-tZbNGf2vjAQcIm7alK40sE51Qu/m9oWr+rEgNm/2AWr1huFxj72CjvpQcIQzMknDBJEkQznCLAGtJTIcLKrKdw==", + "peerDependencies": { + "pinia": "^2.0.0" + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "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/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-html": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.5.0.tgz", + "integrity": "sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==", + "dev": true, + "peer": true, + "dependencies": { + "htmlparser2": "^8.0.0", + "js-tokens": "^8.0.0", + "postcss": "^8.4.0", + "postcss-safe-parser": "^6.0.0" + }, + "engines": { + "node": "^12 || >=14" + } + }, + "node_modules/postcss-html/node_modules/js-tokens": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.2.tgz", + "integrity": "sha512-Olnt+V7xYdvGze9YTbGFZIfQXuGV4R3nQwwl8BrtgaPE/wq8UFpUHWuTNc05saowhSr1ZO6tx+V6RjE9D5YQog==", + "dev": true, + "peer": true + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true, + "peerDependencies": { + "postcss": ">4 <9" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sorting": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz", + "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", + "dev": true, + "peerDependencies": { + "postcss": "^8.4.20" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + } + }, + "node_modules/posthtml-parser/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/posthtml-parser/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/posthtml-parser/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/posthtml-parser/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/posthtml-parser/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/posthtml-parser/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/posthtml-parser/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/posthtml-parser/node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "1.0.5" + } + }, + "node_modules/posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "dependencies": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "dev": true, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/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" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resize-detector": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/resize-detector/-/resize-detector-0.3.0.tgz", + "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.2.tgz", + "integrity": "sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==", + "dev": true, + "dependencies": { + "open": "^8.4.0", + "picomatch": "^2.3.1", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "rollup": "2.x || 3.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sass": { + "version": "1.69.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.3.tgz", + "integrity": "sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/screenfull": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz", + "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/standard-version": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", + "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "conventional-changelog": "3.1.25", + "conventional-changelog-config-spec": "2.1.0", + "conventional-changelog-conventionalcommits": "4.6.3", + "conventional-recommended-bump": "6.1.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "dotgitignore": "^2.1.0", + "figures": "^3.1.0", + "find-up": "^5.0.0", + "git-semver-tags": "^4.0.0", + "semver": "^7.1.1", + "stringify-package": "^1.0.1", + "yargs": "^16.0.0" + }, + "bin": { + "standard-version": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/standard-version/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/standard-version/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/standard-version/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/standard-version/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/standard-version/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/standard-version/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/standard-version/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/standard-version/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/standard-version/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", + "deprecated": "This module is not used anymore, and has been replaced by @npmcli/package-json", + "dev": true + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, + "node_modules/stylelint": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", + "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", + "dev": true, + "dependencies": { + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/media-query-list-parser": "^2.1.4", + "@csstools/selector-specificity": "^3.0.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^8.2.0", + "css-functions-list": "^3.2.1", + "css-tree": "^2.3.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^7.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^5.2.4", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.29.0", + "mathml-tag-names": "^2.1.3", + "meow": "^10.1.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.28", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^3.0.0", + "svg-tags": "^1.0.0", + "table": "^6.8.1", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-html": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-html/-/stylelint-config-html-1.1.0.tgz", + "integrity": "sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==", + "dev": true, + "engines": { + "node": "^12 || >=14" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "postcss-html": "^1.0.0", + "stylelint": ">=14.0.0" + } + }, + "node_modules/stylelint-config-recess-order": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recess-order/-/stylelint-config-recess-order-4.3.0.tgz", + "integrity": "sha512-EWVtxZ8oq4/meTrRNUDrS5TqMz6TX72JjKDwVQq0JJDXE+P/o7UuFw3wWV/0O9yvJfh/da6nJY71ZUn/wSfB4g==", + "dev": true, + "dependencies": { + "stylelint-order": "6.x" + }, + "peerDependencies": { + "stylelint": ">=15" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-12.0.0.tgz", + "integrity": "sha512-x6x8QNARrGO2sG6iURkzqL+Dp+4bJorPMMRNPScdvaUK8PsynriOcMW7AFDKqkWAS5wbue/u8fUT/4ynzcmqdQ==", + "dev": true, + "peerDependencies": { + "stylelint": "^15.5.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-12.0.0.tgz", + "integrity": "sha512-5Bb2mlGy6WLa30oNeKpZvavv2lowJUsUJO25+OA68GFTemlwd1zbFsL7q0bReKipOSU3sG47hKneZ6Nd+ctrFA==", + "dev": true, + "dependencies": { + "postcss-scss": "^4.0.6", + "stylelint-config-recommended": "^12.0.0", + "stylelint-scss": "^5.0.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^15.5.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-recommended-vue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.5.0.tgz", + "integrity": "sha512-65TAK/clUqkNtkZLcuytoxU0URQYlml+30Nhop7sRkCZ/mtWdXt7T+spPSB3KMKlb+82aEVJ4OrcstyDBdbosg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5", + "stylelint-config-html": ">=1.0.0", + "stylelint-config-recommended": ">=6.0.0" + }, + "engines": { + "node": "^12 || >=14" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "postcss-html": "^1.0.0", + "stylelint": ">=14.0.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "34.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-34.0.0.tgz", + "integrity": "sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^13.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "stylelint": "^15.10.0" + } + }, + "node_modules/stylelint-config-standard-scss": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-10.0.0.tgz", + "integrity": "sha512-bChBEo1p3xUVWh/wenJI+josoMk21f2yuLDGzGjmKYcALfl2u3DFltY+n4UHswYiXghqXaA8mRh+bFy/q1hQlg==", + "dev": true, + "dependencies": { + "stylelint-config-recommended-scss": "^12.0.0", + "stylelint-config-standard": "^33.0.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^15.5.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-standard-scss/node_modules/stylelint-config-standard": { + "version": "33.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-33.0.0.tgz", + "integrity": "sha512-eyxnLWoXImUn77+ODIuW9qXBDNM+ALN68L3wT1lN2oNspZ7D9NVGlNHb2QCUn4xDug6VZLsh0tF8NyoYzkgTzg==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^12.0.0" + }, + "peerDependencies": { + "stylelint": "^15.5.0" + } + }, + "node_modules/stylelint-config-standard/node_modules/stylelint-config-recommended": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz", + "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==", + "dev": true, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "stylelint": "^15.10.0" + } + }, + "node_modules/stylelint-order": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.3.tgz", + "integrity": "sha512-1j1lOb4EU/6w49qZeT2SQVJXm0Ht+Qnq9GMfUa3pMwoyojIWfuA+JUDmoR97Bht1RLn4ei0xtLGy87M7d29B1w==", + "dev": true, + "dependencies": { + "postcss": "^8.4.21", + "postcss-sorting": "^8.0.2" + }, + "peerDependencies": { + "stylelint": "^14.0.0 || ^15.0.0" + } + }, + "node_modules/stylelint-scss": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.2.1.tgz", + "integrity": "sha512-ZoTJUM85/qqpQHfEppjW/St//8s6p9Qsg8deWlYlr56F9iUgC9vXeIDQvH4odkRRJLTLFQzYMALSOFCQ3MDkgw==", + "dev": true, + "dependencies": { + "known-css-properties": "^0.28.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "stylelint": "^14.5.1 || ^15.0.0" + } + }, + "node_modules/stylelint-scss/node_modules/known-css-properties": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz", + "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==", + "dev": true + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.1.tgz", + "integrity": "sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ==", + "dev": true, + "dependencies": { + "flat-cache": "^3.1.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/stylelint/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + } + }, + "node_modules/svg-baker/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/svg-baker/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/table/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", + "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz", + "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/unplugin-vue-setup-extend-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-setup-extend-plus/-/unplugin-vue-setup-extend-plus-1.0.0.tgz", + "integrity": "sha512-Qb34atQ/elvkErQ12PNv6UWJPWIG4dEgjjizYKyycPeiRqQaMVNCKqRIqfxlhXntcU2l+o3VQuk1NNZN6QJ/xw==", + "dev": true, + "dependencies": { + "@vue/compiler-sfc": "^3.2.37", + "magic-string": "^0.26.2", + "unplugin": "^1.3.1" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "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" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", + "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-compression": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz", + "integrity": "sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "debug": "^4.3.3", + "fs-extra": "^10.0.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-compression/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vite-plugin-compression/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/vite-plugin-compression/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vite-plugin-compression/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/vite-plugin-compression/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vite-plugin-compression/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vite-plugin-eslint": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz", + "integrity": "sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.2.1", + "@types/eslint": "^8.4.5", + "rollup": "^2.77.2" + }, + "peerDependencies": { + "eslint": ">=7", + "vite": ">=2" + } + }, + "node_modules/vite-plugin-eslint/node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-plugin-html": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-3.2.0.tgz", + "integrity": "sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.2.0", + "colorette": "^2.0.16", + "connect-history-api-fallback": "^1.6.0", + "consola": "^2.15.3", + "dotenv": "^16.0.0", + "dotenv-expand": "^8.0.2", + "ejs": "^3.1.6", + "fast-glob": "^3.2.11", + "fs-extra": "^10.0.1", + "html-minifier-terser": "^6.1.0", + "node-html-parser": "^5.3.3", + "pathe": "^0.2.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-pwa": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.16.5.tgz", + "integrity": "sha512-Ahol4dwhMP2UHPQXkllSlXbihOaDFnvBIDPmAxoSZ1EObBUJGP4CMRyCyAVkIHjd6/H+//vH0DM2ON+XxHr81g==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "pretty-bytes": "^6.1.1", + "workbox-build": "^7.0.0", + "workbox-window": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0", + "workbox-build": "^7.0.0", + "workbox-window": "^7.0.0" + } + }, + "node_modules/vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dev": true, + "dependencies": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/vue-echarts": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/vue-echarts/-/vue-echarts-6.6.1.tgz", + "integrity": "sha512-EpreTzlNeJ+eaUn0AhXEmKJk98xJGecgTqAdyZovoXWnhTxnlW2HuBM0ei3y8rLw1JCUabf8/sYvxjlr8SzBKQ==", + "hasInstallScript": true, + "dependencies": { + "resize-detector": "^0.3.0", + "vue-demi": "^0.13.11" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.5", + "echarts": "^5.4.1", + "vue": "^2.6.12 || ^3.1.1" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-echarts/node_modules/vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "hasInstallScript": true, + "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-eslint-parser": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", + "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-router": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", + "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.8.19", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.19.tgz", + "integrity": "sha512-tacMQLQ0CXAfbhRycCL5sWIy1qujXaIEtP1hIQpzHWOUuICbtTj9gJyFf91PvzG5KCNIkA5Eg7k2Fmgt28l5DQ==", + "dev": true, + "dependencies": { + "@vue/language-core": "1.8.19", + "@vue/typescript": "1.8.19", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/workbox-background-sync": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz", + "integrity": "sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==", + "dev": true, + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.0.0.tgz", + "integrity": "sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-build": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.0.0.tgz", + "integrity": "sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==", + "dev": true, + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.0.0", + "workbox-broadcast-update": "7.0.0", + "workbox-cacheable-response": "7.0.0", + "workbox-core": "7.0.0", + "workbox-expiration": "7.0.0", + "workbox-google-analytics": "7.0.0", + "workbox-navigation-preload": "7.0.0", + "workbox-precaching": "7.0.0", + "workbox-range-requests": "7.0.0", + "workbox-recipes": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0", + "workbox-streams": "7.0.0", + "workbox-sw": "7.0.0", + "workbox-window": "7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/workbox-build/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/workbox-build/node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/workbox-build/node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/workbox-build/node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz", + "integrity": "sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.0.0.tgz", + "integrity": "sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==", + "dev": true + }, + "node_modules/workbox-expiration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.0.0.tgz", + "integrity": "sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==", + "dev": true, + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.0.0.tgz", + "integrity": "sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==", + "dev": true, + "dependencies": { + "workbox-background-sync": "7.0.0", + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz", + "integrity": "sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-precaching": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.0.0.tgz", + "integrity": "sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.0.0.tgz", + "integrity": "sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-recipes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.0.0.tgz", + "integrity": "sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==", + "dev": true, + "dependencies": { + "workbox-cacheable-response": "7.0.0", + "workbox-core": "7.0.0", + "workbox-expiration": "7.0.0", + "workbox-precaching": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "node_modules/workbox-routing": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.0.0.tgz", + "integrity": "sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-strategies": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.0.0.tgz", + "integrity": "sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-streams": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.0.0.tgz", + "integrity": "sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0" + } + }, + "node_modules/workbox-sw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.0.0.tgz", + "integrity": "sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==", + "dev": true + }, + "node_modules/workbox-window": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.0.0.tgz", + "integrity": "sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==", + "dev": true, + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zrender": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz", + "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==", + "dependencies": { + "tslib": "2.3.0" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" + }, + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + } + }, + "@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "dev": true + }, + "@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.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" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "requires": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "requires": { + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + } + }, + "@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + } + }, + "@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + } + }, + "@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "requires": {} + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/preset-env": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@csstools/css-parser-algorithms": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz", + "integrity": "sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==", + "dev": true, + "requires": {} + }, + "@csstools/css-tokenizer": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz", + "integrity": "sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==", + "dev": true + }, + "@csstools/media-query-list-parser": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz", + "integrity": "sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==", + "dev": true, + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", + "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", + "dev": true, + "requires": {} + }, + "@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==" + }, + "@element-plus/icons-vue": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz", + "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==", + "requires": {} + }, + "@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", + "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==" + }, + "@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "@eslint/js": { + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==" + }, + "@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "requires": { + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "requires": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@popperjs/core": { + "version": "npm:@sxzz/popperjs-es@2.11.7", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" + }, + "@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dev": true, + "requires": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/eslint": { + "version": "8.44.4", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.4.tgz", + "integrity": "sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/estree": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", + "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==" + }, + "@types/lodash-es": { + "version": "4.17.9", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.9.tgz", + "integrity": "sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==", + "requires": { + "@types/lodash": "*" + } + }, + "@types/minimist": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz", + "integrity": "sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==", + "dev": true + }, + "@types/node": { + "version": "20.8.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", + "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", + "dev": true, + "requires": { + "undici-types": "~5.25.1" + } + }, + "@types/normalize-package-data": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", + "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==", + "dev": true + }, + "@types/nprogress": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.1.tgz", + "integrity": "sha512-TYuyVnp+nOnimgdOydDIDYIxv2kSeuJZw4tF0p/KG7hpzcMF1WkHaREwM8O4blqfT1F7rq0nht6Ko2KVUfWzBA==", + "dev": true + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "dev": true + }, + "@types/sortablejs": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.3.tgz", + "integrity": "sha512-v+zh6TZP/cLeMUK0MDx1onp8e7Jk2/4iTQ7sb/n80rTAvBm14yJkpOEfJdrTCkHiF7IZbPjxGX2NRJfogRoYIg==", + "dev": true + }, + "@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/trusted-types": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", + "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==", + "dev": true + }, + "@types/uuid": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.5.tgz", + "integrity": "sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ==", + "dev": true + }, + "@types/web-bluetooth": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.18.tgz", + "integrity": "sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@vitejs/plugin-vue": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz", + "integrity": "sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==", + "dev": true, + "requires": {} + }, + "@vitejs/plugin-vue-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.2.tgz", + "integrity": "sha512-obF26P2Z4Ogy3cPp07B4VaW6rpiu0ue4OT2Y15UxT5BZZ76haUY9guOsZV3uWh/I6xc+VeiW+ZVabRE82FyzWw==", + "dev": true, + "requires": { + "@babel/core": "^7.22.10", + "@babel/plugin-transform-typescript": "^7.22.10", + "@vue/babel-plugin-jsx": "^1.1.5" + } + }, + "@volar/language-core": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.4.tgz", + "integrity": "sha512-Na69qA6uwVIdA0rHuOc2W3pHtVQQO8hCNim7FOaKNpRJh0oAFnu5r9i7Oopo5C4cnELZkPNjTrbmpcCTiW+CMQ==", + "dev": true, + "requires": { + "@volar/source-map": "1.10.4" + } + }, + "@volar/source-map": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.4.tgz", + "integrity": "sha512-RxZdUEL+pV8p+SMqnhVjzy5zpb1QRZTlcwSk4bdcBO7yOu4rtEWqDGahVCEj4CcXour+0yJUMrMczfSCpP9Uxg==", + "dev": true, + "requires": { + "muggle-string": "^0.3.1" + } + }, + "@volar/typescript": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.4.tgz", + "integrity": "sha512-BCCUEBASBEMCrz7qmNSi2hBEWYsXD0doaktRKpmmhvb6XntM2sAWYu6gbyK/MluLDgluGLFiFRpWgobgzUqolg==", + "dev": true, + "requires": { + "@volar/language-core": "1.10.4" + } + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + } + }, + "@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "requires": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "requires": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "requires": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + }, + "dependencies": { + "magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + } + } + }, + "@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "requires": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "@vue/language-core": { + "version": "1.8.19", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.19.tgz", + "integrity": "sha512-nt3dodGs97UM6fnxeQBazO50yYCKBK53waFWB3qMbLmR6eL3aUryZgQtZoBe1pye17Wl8fs9HysV3si6xMgndQ==", + "dev": true, + "requires": { + "@volar/language-core": "~1.10.4", + "@volar/source-map": "~1.10.4", + "@vue/compiler-dom": "^3.3.0", + "@vue/reactivity": "^3.3.0", + "@vue/shared": "^3.3.0", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "vue-template-compiler": "^2.7.14" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "requires": { + "@vue/shared": "3.3.4" + } + }, + "@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "requires": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + }, + "dependencies": { + "magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + } + } + }, + "@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "requires": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "requires": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "requires": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "@vue/typescript": { + "version": "1.8.19", + "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.19.tgz", + "integrity": "sha512-k/SHeeQROUgqsxyHQ8Cs3Zz5TnX57p7BcBDVYR2E0c61QL2DJ2G8CsaBremmNGuGE6o1R5D50IHIxFmroMz8iw==", + "dev": true, + "requires": { + "@volar/typescript": "~1.10.4", + "@vue/language-core": "1.8.19" + } + }, + "@vueuse/core": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.5.0.tgz", + "integrity": "sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==", + "requires": { + "@types/web-bluetooth": "^0.0.18", + "@vueuse/metadata": "10.5.0", + "@vueuse/shared": "10.5.0", + "vue-demi": ">=0.14.6" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "requires": {} + } + } + }, + "@vueuse/metadata": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.5.0.tgz", + "integrity": "sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw==" + }, + "@vueuse/shared": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.5.0.tgz", + "integrity": "sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==", + "requires": { + "vue-demi": ">=0.14.6" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "requires": {} + } + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, + "requires": { + "type-fest": "^1.0.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "requires": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "axios": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", + "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.32.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.3" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30001549", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz", + "integrity": "sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "dev": true + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "conventional-changelog": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + } + }, + "conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-config-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", + "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", + "dev": true + }, + "conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "dev": true, + "requires": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + } + }, + "conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "requires": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "requires": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + } + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "core-js-compat": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", + "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", + "dev": true, + "requires": { + "browserslist": "^4.22.1" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "requires": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "css-functions-list": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", + "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "dev": true + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "requires": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "czg": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/czg/-/czg-1.7.1.tgz", + "integrity": "sha512-KP93cTbZxgWYDKJzZpjnLe0sy/2FwyegatnrOaqsath04WinvsdhZl5QCGkxTKBY2DavpKloIBW/WGZzCKmrlA==", + "dev": true + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "peer": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "peer": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "peer": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true + }, + "dotenv-expand": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-8.0.3.tgz", + "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==", + "dev": true + }, + "dotgitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "minimatch": "^3.0.4" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + } + } + }, + "driver.js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/driver.js/-/driver.js-1.3.0.tgz", + "integrity": "sha512-ilUkVc5iMIYfMd8FdWy8n5Wv//gsJuRP+lo8QfWpwP9c0UGOgD7P9nVQMZwcdW84aqAZHHUHrV7GgiopAN6HUQ==" + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "echarts": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz", + "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==", + "requires": { + "tslib": "2.3.0", + "zrender": "5.4.4" + } + }, + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.4.556", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.556.tgz", + "integrity": "sha512-6RPN0hHfzDU8D56E72YkDvnLw5Cj2NMXZGg3UkgyoHxjVhG99KZpsKgBWMmTy0Ei89xwan+rbRsVB9yzATmYzQ==", + "dev": true + }, + "element-plus": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.4.0.tgz", + "integrity": "sha512-yJEa8LXkGOOgkfkeqMMEdeX/Dc8EH9qPcRuX91dlhSXxgCKKbp9tH3QFTOG99ibZsrN/Em62nh7ddvbc7I1frw==", + "requires": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.0.6", + "@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.3", + "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" + }, + "dependencies": { + "@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "requires": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "requires": {} + } + } + }, + "@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" + }, + "@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "requires": { + "vue-demi": "*" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "requires": {} + } + } + } + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "peer": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.11" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "eslint": { + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.51.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-vue": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz", + "integrity": "sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.3.1", + "xml-name-validator": "^4.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" + }, + "follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "requires": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } + }, + "git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "requires": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "requires": { + "ini": "^1.3.2" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } + } + }, + "html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "peer": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true + }, + "immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true + }, + "jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "known-css-properties": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "lint-staged": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", + "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", + "dev": true, + "requires": { + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", + "lilconfig": "2.1.0", + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + } + } + }, + "listr2": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "dev": true, + "requires": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "requires": {} + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "dev": true, + "requires": { + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true + }, + "mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.1" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "requires": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", + "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "requires": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "requires": {} + } + } + }, + "pinia-plugin-persistedstate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.0.tgz", + "integrity": "sha512-tZbNGf2vjAQcIm7alK40sE51Qu/m9oWr+rEgNm/2AWr1huFxj72CjvpQcIQzMknDBJEkQznCLAGtJTIcLKrKdw==", + "requires": {} + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-html": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.5.0.tgz", + "integrity": "sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==", + "dev": true, + "peer": true, + "requires": { + "htmlparser2": "^8.0.0", + "js-tokens": "^8.0.0", + "postcss": "^8.4.0", + "postcss-safe-parser": "^6.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.2.tgz", + "integrity": "sha512-Olnt+V7xYdvGze9YTbGFZIfQXuGV4R3nQwwl8BrtgaPE/wq8UFpUHWuTNc05saowhSr1ZO6tx+V6RjE9D5YQog==", + "dev": true, + "peer": true + } + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true, + "requires": {} + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "dev": true + }, + "postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "requires": {} + }, + "postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "requires": {} + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-sorting": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz", + "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", + "dev": true, + "requires": {} + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "requires": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + } + }, + "posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "requires": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + }, + "dependencies": { + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + } + } + }, + "posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true + }, + "posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "requires": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + } + }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resize-detector": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/resize-detector/-/resize-detector-0.3.0.tgz", + "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==" + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-visualizer": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.2.tgz", + "integrity": "sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==", + "dev": true, + "requires": { + "open": "^8.4.0", + "picomatch": "^2.3.1", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "sass": { + "version": "1.69.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.3.tgz", + "integrity": "sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "screenfull": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz", + "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==" + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "standard-version": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", + "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "conventional-changelog": "3.1.25", + "conventional-changelog-config-spec": "2.1.0", + "conventional-changelog-conventionalcommits": "4.6.3", + "conventional-recommended-bump": "6.1.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "dotgitignore": "^2.1.0", + "figures": "^3.1.0", + "find-up": "^5.0.0", + "git-semver-tags": "^4.0.0", + "semver": "^7.1.1", + "stringify-package": "^1.0.1", + "yargs": "^16.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true + } + } + }, + "stringify-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, + "stylelint": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", + "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", + "dev": true, + "requires": { + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/media-query-list-parser": "^2.1.4", + "@csstools/selector-specificity": "^3.0.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^8.2.0", + "css-functions-list": "^3.2.1", + "css-tree": "^2.3.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^7.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^5.2.4", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.29.0", + "mathml-tag-names": "^2.1.3", + "meow": "^10.1.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.28", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^3.0.0", + "svg-tags": "^1.0.0", + "table": "^6.8.1", + "write-file-atomic": "^5.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "requires": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + } + }, + "decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "file-entry-cache": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.1.tgz", + "integrity": "sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ==", + "dev": true, + "requires": { + "flat-cache": "^3.1.1" + } + }, + "indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + } + }, + "read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "requires": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + } + }, + "redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "requires": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "requires": { + "min-indent": "^1.0.1" + } + }, + "trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "dev": true + } + } + }, + "stylelint-config-html": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-html/-/stylelint-config-html-1.1.0.tgz", + "integrity": "sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==", + "dev": true, + "requires": {} + }, + "stylelint-config-recess-order": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recess-order/-/stylelint-config-recess-order-4.3.0.tgz", + "integrity": "sha512-EWVtxZ8oq4/meTrRNUDrS5TqMz6TX72JjKDwVQq0JJDXE+P/o7UuFw3wWV/0O9yvJfh/da6nJY71ZUn/wSfB4g==", + "dev": true, + "requires": { + "stylelint-order": "6.x" + } + }, + "stylelint-config-recommended": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-12.0.0.tgz", + "integrity": "sha512-x6x8QNARrGO2sG6iURkzqL+Dp+4bJorPMMRNPScdvaUK8PsynriOcMW7AFDKqkWAS5wbue/u8fUT/4ynzcmqdQ==", + "dev": true, + "requires": {} + }, + "stylelint-config-recommended-scss": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-12.0.0.tgz", + "integrity": "sha512-5Bb2mlGy6WLa30oNeKpZvavv2lowJUsUJO25+OA68GFTemlwd1zbFsL7q0bReKipOSU3sG47hKneZ6Nd+ctrFA==", + "dev": true, + "requires": { + "postcss-scss": "^4.0.6", + "stylelint-config-recommended": "^12.0.0", + "stylelint-scss": "^5.0.0" + } + }, + "stylelint-config-recommended-vue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.5.0.tgz", + "integrity": "sha512-65TAK/clUqkNtkZLcuytoxU0URQYlml+30Nhop7sRkCZ/mtWdXt7T+spPSB3KMKlb+82aEVJ4OrcstyDBdbosg==", + "dev": true, + "requires": { + "semver": "^7.3.5", + "stylelint-config-html": ">=1.0.0", + "stylelint-config-recommended": ">=6.0.0" + } + }, + "stylelint-config-standard": { + "version": "34.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-34.0.0.tgz", + "integrity": "sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==", + "dev": true, + "requires": { + "stylelint-config-recommended": "^13.0.0" + }, + "dependencies": { + "stylelint-config-recommended": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz", + "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==", + "dev": true, + "requires": {} + } + } + }, + "stylelint-config-standard-scss": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-10.0.0.tgz", + "integrity": "sha512-bChBEo1p3xUVWh/wenJI+josoMk21f2yuLDGzGjmKYcALfl2u3DFltY+n4UHswYiXghqXaA8mRh+bFy/q1hQlg==", + "dev": true, + "requires": { + "stylelint-config-recommended-scss": "^12.0.0", + "stylelint-config-standard": "^33.0.0" + }, + "dependencies": { + "stylelint-config-standard": { + "version": "33.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-33.0.0.tgz", + "integrity": "sha512-eyxnLWoXImUn77+ODIuW9qXBDNM+ALN68L3wT1lN2oNspZ7D9NVGlNHb2QCUn4xDug6VZLsh0tF8NyoYzkgTzg==", + "dev": true, + "requires": { + "stylelint-config-recommended": "^12.0.0" + } + } + } + }, + "stylelint-order": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.3.tgz", + "integrity": "sha512-1j1lOb4EU/6w49qZeT2SQVJXm0Ht+Qnq9GMfUa3pMwoyojIWfuA+JUDmoR97Bht1RLn4ei0xtLGy87M7d29B1w==", + "dev": true, + "requires": { + "postcss": "^8.4.21", + "postcss-sorting": "^8.0.2" + } + }, + "stylelint-scss": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.2.1.tgz", + "integrity": "sha512-ZoTJUM85/qqpQHfEppjW/St//8s6p9Qsg8deWlYlr56F9iUgC9vXeIDQvH4odkRRJLTLFQzYMALSOFCQ3MDkgw==", + "dev": true, + "requires": { + "known-css-properties": "^0.28.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0" + }, + "dependencies": { + "known-css-properties": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz", + "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==", + "dev": true + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, + "tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true + } + } + }, + "terser": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", + "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "devOptional": true + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unplugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz", + "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==", + "dev": true, + "requires": { + "acorn": "^8.10.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "unplugin-vue-setup-extend-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-setup-extend-plus/-/unplugin-vue-setup-extend-plus-1.0.0.tgz", + "integrity": "sha512-Qb34atQ/elvkErQ12PNv6UWJPWIG4dEgjjizYKyycPeiRqQaMVNCKqRIqfxlhXntcU2l+o3VQuk1NNZN6QJ/xw==", + "dev": true, + "requires": { + "@vue/compiler-sfc": "^3.2.37", + "magic-string": "^0.26.2", + "unplugin": "^1.3.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vite": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", + "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + } + }, + "vite-plugin-compression": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz", + "integrity": "sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "debug": "^4.3.3", + "fs-extra": "^10.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "vite-plugin-eslint": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz", + "integrity": "sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^4.2.1", + "@types/eslint": "^8.4.5", + "rollup": "^2.77.2" + }, + "dependencies": { + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + } + } + }, + "vite-plugin-html": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-3.2.0.tgz", + "integrity": "sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^4.2.0", + "colorette": "^2.0.16", + "connect-history-api-fallback": "^1.6.0", + "consola": "^2.15.3", + "dotenv": "^16.0.0", + "dotenv-expand": "^8.0.2", + "ejs": "^3.1.6", + "fast-glob": "^3.2.11", + "fs-extra": "^10.0.1", + "html-minifier-terser": "^6.1.0", + "node-html-parser": "^5.3.3", + "pathe": "^0.2.0" + } + }, + "vite-plugin-pwa": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.16.5.tgz", + "integrity": "sha512-Ahol4dwhMP2UHPQXkllSlXbihOaDFnvBIDPmAxoSZ1EObBUJGP4CMRyCyAVkIHjd6/H+//vH0DM2ON+XxHr81g==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "pretty-bytes": "^6.1.1", + "workbox-build": "^7.0.0", + "workbox-window": "^7.0.0" + } + }, + "vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dev": true, + "requires": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + } + }, + "vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "requires": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "vue-echarts": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/vue-echarts/-/vue-echarts-6.6.1.tgz", + "integrity": "sha512-EpreTzlNeJ+eaUn0AhXEmKJk98xJGecgTqAdyZovoXWnhTxnlW2HuBM0ei3y8rLw1JCUabf8/sYvxjlr8SzBKQ==", + "requires": { + "resize-detector": "^0.3.0", + "vue-demi": "^0.13.11" + }, + "dependencies": { + "vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "requires": {} + } + } + }, + "vue-eslint-parser": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", + "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "dependencies": { + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "vue-router": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", + "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", + "requires": { + "@vue/devtools-api": "^6.5.0" + } + }, + "vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "vue-tsc": { + "version": "1.8.19", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.19.tgz", + "integrity": "sha512-tacMQLQ0CXAfbhRycCL5sWIy1qujXaIEtP1hIQpzHWOUuICbtTj9gJyFf91PvzG5KCNIkA5Eg7k2Fmgt28l5DQ==", + "dev": true, + "requires": { + "@vue/language-core": "1.8.19", + "@vue/typescript": "1.8.19", + "semver": "^7.5.4" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "workbox-background-sync": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz", + "integrity": "sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==", + "dev": true, + "requires": { + "idb": "^7.0.1", + "workbox-core": "7.0.0" + } + }, + "workbox-broadcast-update": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.0.0.tgz", + "integrity": "sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==", + "dev": true, + "requires": { + "workbox-core": "7.0.0" + } + }, + "workbox-build": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.0.0.tgz", + "integrity": "sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==", + "dev": true, + "requires": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.0.0", + "workbox-broadcast-update": "7.0.0", + "workbox-cacheable-response": "7.0.0", + "workbox-core": "7.0.0", + "workbox-expiration": "7.0.0", + "workbox-google-analytics": "7.0.0", + "workbox-navigation-preload": "7.0.0", + "workbox-precaching": "7.0.0", + "workbox-range-requests": "7.0.0", + "workbox-recipes": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0", + "workbox-streams": "7.0.0", + "workbox-sw": "7.0.0", + "workbox-window": "7.0.0" + }, + "dependencies": { + "@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, + "requires": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + } + }, + "@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + } + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "requires": { + "whatwg-url": "^7.0.0" + } + } + } + }, + "workbox-cacheable-response": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz", + "integrity": "sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==", + "dev": true, + "requires": { + "workbox-core": "7.0.0" + } + }, + "workbox-core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.0.0.tgz", + "integrity": "sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==", + "dev": true + }, + "workbox-expiration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.0.0.tgz", + "integrity": "sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==", + "dev": true, + "requires": { + "idb": "^7.0.1", + "workbox-core": "7.0.0" + } + }, + "workbox-google-analytics": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.0.0.tgz", + "integrity": "sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==", + "dev": true, + "requires": { + "workbox-background-sync": "7.0.0", + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "workbox-navigation-preload": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz", + "integrity": "sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==", + "dev": true, + "requires": { + "workbox-core": "7.0.0" + } + }, + "workbox-precaching": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.0.0.tgz", + "integrity": "sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==", + "dev": true, + "requires": { + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "workbox-range-requests": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.0.0.tgz", + "integrity": "sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==", + "dev": true, + "requires": { + "workbox-core": "7.0.0" + } + }, + "workbox-recipes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.0.0.tgz", + "integrity": "sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==", + "dev": true, + "requires": { + "workbox-cacheable-response": "7.0.0", + "workbox-core": "7.0.0", + "workbox-expiration": "7.0.0", + "workbox-precaching": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "workbox-routing": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.0.0.tgz", + "integrity": "sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==", + "dev": true, + "requires": { + "workbox-core": "7.0.0" + } + }, + "workbox-strategies": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.0.0.tgz", + "integrity": "sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==", + "dev": true, + "requires": { + "workbox-core": "7.0.0" + } + }, + "workbox-streams": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.0.0.tgz", + "integrity": "sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==", + "dev": true, + "requires": { + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0" + } + }, + "workbox-sw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.0.0.tgz", + "integrity": "sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==", + "dev": true + }, + "workbox-window": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.0.0.tgz", + "integrity": "sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==", + "dev": true, + "requires": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.0.0" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + } + } + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zrender": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz", + "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==", + "requires": { + "tslib": "2.3.0" + } + } + } +} diff --git a/web/front/package.json b/web/front/package.json new file mode 100644 index 00000000..aaf5b698 --- /dev/null +++ b/web/front/package.json @@ -0,0 +1,99 @@ +{ + "name": "gt-web", + "version": "1.0.0", + "description": "通过web端管理gt配置", + "author": "dejun@iscas.ac.cn", + "license": "MIT", + "scripts": { + "dev": "vite", + "serve": "vite", + "build:dev": "vue-tsc && vite build --mode development", + "build:pro": "vue-tsc && vite build --mode production", + "build:test": "vue-tsc && vite build --mode test", + "type:check": "vue-tsc --noEmit --skipLibCheck", + "preview": "npm run build:dev && vite preview", + "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src", + "lint:prettier": "prettier --write \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"", + "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/", + "lint:lint-staged": "lint-staged", + "release": "standard-version", + "commit": "git add -A && czg && git push" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.1.0", + "@vueuse/core": "^10.2.1", + "axios": "^1.4.0", + "dayjs": "^1.11.9", + "driver.js": "^1.3.0", + "echarts": "^5.4.3", + "element-plus": "^2.3.4", + "lodash": "^4.17.21", + "mitt": "^3.0.1", + "nprogress": "^0.2.0", + "pinia": "^2.1.4", + "pinia-plugin-persistedstate": "^3.1.0", + "screenfull": "^6.0.2", + "sortablejs": "^1.15.0", + "uuid": "^9.0.0", + "vue": "^3.3.4", + "vue-echarts": "^6.6.1", + "vue-eslint-parser": "^9.3.1", + "vue-router": "^4.2.4" + }, + "devDependencies": { + "@types/nprogress": "^0.2.0", + "@types/sortablejs": "^1.15.2", + "@types/uuid": "^9.0.4", + "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/parser": "^5.61.0", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "autoprefixer": "^10.4.16", + "czg": "^1.6.1", + "eslint": "^8.44.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-vue": "^9.15.1", + "lint-staged": "^13.2.3", + "prettier": "^2.8.8", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "^1.63.6", + "standard-version": "^9.5.0", + "stylelint": "^15.10.1", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recess-order": "^4.2.0", + "stylelint-config-recommended-scss": "^12.0.0", + "stylelint-config-recommended-vue": "^1.4.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^10.0.0", + "typescript": "^5.1.6", + "unplugin-vue-setup-extend-plus": "^1.0.0", + "vite": "^4.4.4", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-html": "^3.2.0", + "vite-plugin-pwa": "^0.16.4", + "vite-plugin-svg-icons": "^2.0.1", + "vue-tsc": "^1.8.5" + }, + "engines": { + "node": ">=16.0.0" + }, + "browserslist": { + "production": [ + "> 1%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "config": { + "commitizen": { + "path": "node_modules/cz-git" + } + } +} diff --git a/web/front/postcss.config.cjs b/web/front/postcss.config.cjs new file mode 100644 index 00000000..5bfb8f62 --- /dev/null +++ b/web/front/postcss.config.cjs @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +}; diff --git a/web/front/public/logo.png b/web/front/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4538f47c127ece50a41ea755d3c28b04d573bd6a GIT binary patch literal 8248 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 VCX|qvcK5$=BmFyi6*|sQ{{#PK7~cQ@ literal 0 HcmV?d00001 diff --git a/web/front/public/vue.svg b/web/front/public/vue.svg new file mode 100644 index 00000000..770e9d33 --- /dev/null +++ b/web/front/public/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/front/src/App.vue b/web/front/src/App.vue new file mode 100644 index 00000000..1d1415fa --- /dev/null +++ b/web/front/src/App.vue @@ -0,0 +1,23 @@ + + + diff --git a/web/front/src/api/helper/checkStatus.ts b/web/front/src/api/helper/checkStatus.ts new file mode 100644 index 00000000..a7aee90e --- /dev/null +++ b/web/front/src/api/helper/checkStatus.ts @@ -0,0 +1,43 @@ +import { ElMessage } from "element-plus"; + +/** + * @description: Validate the network request status code + * @param {Number} status + * @return void + */ +export const checkStatus = (status: number) => { + switch (status) { + case 400: + ElMessage.error("Request failed! Please try again later."); + break; + case 401: + ElMessage.error("Login expired! Please log in again."); + break; + case 403: + ElMessage.error("You do not have permission to access this resource."); + break; + case 404: + ElMessage.error("The resource you are trying to access does not exist!"); + break; + case 405: + ElMessage.error("Invalid request method! Please try again later"); + break; + case 408: + ElMessage.error("Request timed out! Please try again later"); + break; + case 500: + ElMessage.error("Internal server error."); + break; + case 502: + ElMessage.error("Bad gateway."); + break; + case 503: + ElMessage.error("Service is currently unavailable. Please try again later."); + break; + case 504: + ElMessage.error("Gateway timeout. The server took too long to respond."); + break; + default: + ElMessage.error("An unexpected error occurred. Please try again."); + } +}; diff --git a/web/front/src/api/index.ts b/web/front/src/api/index.ts new file mode 100644 index 00000000..0b6c1cc8 --- /dev/null +++ b/web/front/src/api/index.ts @@ -0,0 +1,108 @@ +import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, InternalAxiosRequestConfig, AxiosResponse } from "axios"; +import { showFullScreenLoading, tryHideFullScreenLoading } from "@/config/serviceLoading"; +import { LOGIN_URL } from "@/config"; +import { ElMessage } from "element-plus"; +import { ResultData } from "@/api/interface"; +import { ResultEnum } from "@/enums/httpEnum"; +import { checkStatus } from "./helper/checkStatus"; +import { useUserStore } from "@/stores/modules/user"; +import router from "@/routers"; + +export interface CustomAxiosRequestConfig extends InternalAxiosRequestConfig { + noLoading?: boolean; +} + +const config = { + // Default API URL, can be modified in .env.** files + baseURL: import.meta.env.VITE_API_URL as string, + // Setting timeout duration + timeout: ResultEnum.TIMEOUT as number, + // Allow credentials for cross-origin requests + withCredentials: true +}; + +class RequestHttp { + service: AxiosInstance; + public constructor(config: AxiosRequestConfig) { + // Creating an Axios instance + this.service = axios.create(config); + + /** + * @description Request interceptor + * Client sends request -> [Request Interceptor] -> Server + * Token validation (JWT): Receive token from the server, store it in vuex/pinia/local storage + */ + this.service.interceptors.request.use( + (config: CustomAxiosRequestConfig) => { + const userStore = useUserStore(); + // if current request is no need for loading, + // it will be controlled by the third parameter: { noLoading: true } in the api service + config.noLoading || showFullScreenLoading(); + config.headers["x-token"] = userStore.token; + return config; + }, + (error: AxiosError) => { + return Promise.reject(error); + } + ); + + /** + * @description Response interceptor + * Server returns information -> [Interceptor processes it] -> Client JS receives the information + */ + this.service.interceptors.response.use( + (response: AxiosResponse) => { + const { data } = response; + const userStore = useUserStore(); + tryHideFullScreenLoading(); + // If login has expired + if (data.code == ResultEnum.OVERDUE) { + userStore.setToken(""); + router.replace(LOGIN_URL); + ElMessage.error(data.msg); + return Promise.reject(data); + } + // Global error message interception (to prevent errors when downloading files that return data streams without a code) + if (data.code && data.code !== ResultEnum.SUCCESS) { + ElMessage.error(data.msg); + return Promise.reject(data); + } + // Successful request (on the page, unless there's a special case, no need to handle failure logic) + return data; + }, + async (error: AxiosError) => { + const { response } = error; + tryHideFullScreenLoading(); + // Separate checks for request timeout and network errors, as they don't have a response + if (error.message.indexOf("timeout") !== -1) ElMessage.error("Request timed out! Please try again later"); + if (error.message.indexOf("Network Error") !== -1) ElMessage.error("Network error! Please try again later"); + // Handle different server error status codes + if (response) checkStatus(response.status); + // If there's no server response (could be a server error or client is offline), handle offline scenario: can redirect to an error page + if (!window.navigator.onLine) router.replace("/500"); + return Promise.reject(error); + } + ); + } + + /** + * @description Encapsulation of common request methods + */ + get(url: string, params?: object, _object = {}): Promise> { + return this.service.get(url, { params, ..._object }); + } + post(url: string, params?: object | string, _object = {}): Promise> { + return this.service.post(url, params, _object); + } + put(url: string, params?: object, _object = {}): Promise> { + return this.service.put(url, params, _object); + } + delete(url: string, params?: any, _object = {}): Promise> { + return this.service.delete(url, { params, ..._object }); + } + download(url: string, params?: object, _object = {}): Promise { + return this.service.post(url, params, { ..._object, responseType: "blob" }); + } +} + +export default new RequestHttp(config); diff --git a/web/front/src/api/interface/index.ts b/web/front/src/api/interface/index.ts new file mode 100644 index 00000000..1b3fdbfa --- /dev/null +++ b/web/front/src/api/interface/index.ts @@ -0,0 +1,122 @@ +import { ClientConfig } from "@/components/ClientConfigForm/interface"; +import { ServerConfig } from "@/components/ServerConfigForm/interface"; + +// Request with no data +export interface Result { + code: string; + msg: string; +} + +// Request with data +export interface ResultData extends Result { + data: T; +} + +export namespace Login { + export interface ReqLoginForm { + username: string; + password: string; + } + export interface ReqKeyValue { + key: string; + } + export interface ResLogin { + token: string; + } + export interface ResAuthButtons { + [key: string]: string[]; + } +} +export namespace Register { + export interface ReqRegisterForm { + username: string; + password: string; + enablePprof: boolean; + } + export interface ResRegister { + token: string; + } +} + +export namespace Server { + export interface ResServerInfo { + serverInfo: SystemState; + } + export interface SystemState { + os: { + goos: string; + numCpu: number; + compiler: string; + goVersion: string; + numGoroutine: number; + }; + disk: { + totalMb: number; + usedMb: number; + totalGb: number; + usedGb: number; + usedPercent: number; + }; + cpu: { + cores: number; + cpus: number[]; + }; + ram: { + totalMb: number; + usedMb: number; + usedPercent: number; + }; + } +} + +export namespace Config { + export namespace Client { + export interface ResConfig { + config: ClientConfig.Config; + } + } + export namespace Server { + export interface ResConfig { + config: ServerConfig.Config; + } + } +} + +export namespace Connection { + export enum Status { + Running = 0, + Idle = 1, + Wait = 2, + Connecting = 3 + } + export const StatusMap: { [key in Status]: string } = { + [Status.Running]: "Running", + [Status.Idle]: "Idle", + [Status.Wait]: "Wait", + [Status.Connecting]: "Connecting" + }; + export interface LocalAddr { + ip: string; + port: number; + } + export interface RemoteAddr { + ip: string; + port: number; + } + export interface Connection { + id?: string; + family: number; + type: number; + localaddr: LocalAddr; + remoteaddr: RemoteAddr; + status: string; + } + export interface Pool { + [key: string]: Status; + } + export interface ResConnection { + external: Connection[]; + serverPool?: Connection[]; + clientPool?: Pool; + } +} diff --git a/web/front/src/api/modules/clientConfig.ts b/web/front/src/api/modules/clientConfig.ts new file mode 100644 index 00000000..88603940 --- /dev/null +++ b/web/front/src/api/modules/clientConfig.ts @@ -0,0 +1,15 @@ +import http from "@/api"; +import { Config } from "@/api/interface/index"; +import { ClientConfig } from "@/components/ClientConfigForm/interface"; + +export const getRunningClientConfigApi = () => { + return http.get(`/config/running`); +}; + +export const getClientConfigFromFileApi = () => { + return http.get(`/config/file`); +}; + +export const saveClientConfigApi = (data: ClientConfig.Config) => { + return http.post(`/config/save`, data); +}; diff --git a/web/front/src/api/modules/connection.ts b/web/front/src/api/modules/connection.ts new file mode 100644 index 00000000..744ca797 --- /dev/null +++ b/web/front/src/api/modules/connection.ts @@ -0,0 +1,6 @@ +import http from "@/api"; +import { Connection } from "@/api/interface/index"; + +export const getConnectionApi = () => { + return http.get(`/connection/list`); +}; diff --git a/web/front/src/api/modules/login.ts b/web/front/src/api/modules/login.ts new file mode 100644 index 00000000..18b66d4b --- /dev/null +++ b/web/front/src/api/modules/login.ts @@ -0,0 +1,27 @@ +import { Login } from "@/api/interface/index"; +import authMenuList from "@/assets/json/authMenuList.json"; +import http from "@/api"; + +/** + * @name Login + */ +// User Login in +export const loginApi = (params: Login.ReqLoginForm) => { + return http.post(`/login`, params); // Standard post json request ==> application/json + // return http.post(`/login`, params, { noLoading: true }); // Control the current request to not show loading + // return http.post(`/login`, {}, { params }); // post request with query parameters ==> ?username=admin&password=123456 +}; + +export const verifyKeyApi = (params: Login.ReqKeyValue) => { + return http.get(`/verify`, params, { noLoading: false }); +}; + +//Get Menu Permission +export const getAuthMenuListApi = () => { + return http.get(`/permission/menu`, {}, { noLoading: true }); + + //If you want to make the menu a local data, + //comment out the previous line of code and introduce the local authMenuList.json data + + return authMenuList; //for test +}; diff --git a/web/front/src/api/modules/server.ts b/web/front/src/api/modules/server.ts new file mode 100644 index 00000000..adda88fd --- /dev/null +++ b/web/front/src/api/modules/server.ts @@ -0,0 +1,23 @@ +import http from "@/api"; +import { Server } from "@/api/interface/index"; + +export const getServerInfoApi = () => { + return http.get(`/server/info`, {}, { noLoading: true }); +}; + +// currently use for gt-client to control Server's behavior +export const reloadServicesApi = () => { + return http.put(`/server/reload`); +}; + +export const restartServerApi = () => { + return http.put(`/server/restart`); +}; + +export const stopServerApi = () => { + return http.put(`/server/stop`); +}; + +export const killServerApi = () => { + return http.put(`/server/kill`); +}; diff --git a/web/front/src/api/modules/serverConfig.ts b/web/front/src/api/modules/serverConfig.ts new file mode 100644 index 00000000..5bad21cf --- /dev/null +++ b/web/front/src/api/modules/serverConfig.ts @@ -0,0 +1,15 @@ +import http from "@/api"; +import { Config } from "@/api/interface/index"; +import { ServerConfig } from "@/components/ServerConfigForm/interface"; + +export const getRunningServerConfigApi = () => { + return http.get(`/config/running`); +}; + +export const getServerConfigFromFileApi = () => { + return http.get(`/config/file`); +}; + +export const saveServerConfigApi = (data: ServerConfig.Config) => { + return http.post(`/config/save`, data); +}; diff --git a/web/front/src/api/modules/userInfo.ts b/web/front/src/api/modules/userInfo.ts new file mode 100644 index 00000000..560555b8 --- /dev/null +++ b/web/front/src/api/modules/userInfo.ts @@ -0,0 +1,10 @@ +import { Register } from "@/api/interface/index"; +import http from "@/api"; + +export const changeInfoApi = (params: Register.ReqRegisterForm) => { + return http.post(`/user/change`, params); +}; + +export const getInfoApi = () => { + return http.get(`/user/info`); +}; diff --git a/web/front/src/assets/fonts/MetroDF.ttf b/web/front/src/assets/fonts/MetroDF.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9d31af4977002c65bad9cbc521764401d5035890 GIT binary patch literal 106934 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
8|u-mxD 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 literal 0 HcmV?d00001 diff --git a/web/front/src/assets/images/403.png b/web/front/src/assets/images/403.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5ec7c7c6fc51e7118b2857d5c2322b0433ab81 GIT binary patch literal 12713 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 literal 0 HcmV?d00001 diff --git a/web/front/src/assets/images/404.png b/web/front/src/assets/images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..2333586e41590ab1684dfb8ff71927ad96f8d3a5 GIT binary patch literal 7788 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/front/src/assets/images/login_left.png b/web/front/src/assets/images/login_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ebc1163e49e562efda757fe7c2509bec735b5f GIT binary patch literal 35966 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