First commit
This commit is contained in:
commit
7a965ed7c6
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/upload/
|
||||
12
Dockerfile
Normal file
12
Dockerfile
Normal file
@ -0,0 +1,12 @@
|
||||
FROM golang:1.24
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN go build -o shelfy .
|
||||
|
||||
CMD ["./shelfy"]
|
||||
BIN
data/shelfly_db.db
Normal file
BIN
data/shelfly_db.db
Normal file
Binary file not shown.
27
docker-compose.yml
Normal file
27
docker-compose.yml
Normal file
@ -0,0 +1,27 @@
|
||||
version: "3.9"
|
||||
|
||||
services:
|
||||
go-app:
|
||||
image: golang:1.24 # Image officielle Go 1.24, on build en local
|
||||
container_name: shelfy-go
|
||||
working_dir: /app
|
||||
volumes:
|
||||
- ./:/app # Code source monté pour le dev (remplace par ./build:/app pour de la prod)
|
||||
- ./upload:/app/upload # Dossier upload persistant, PAS rebuild
|
||||
- go-modules:/go/pkg/mod # Cache des modules Go
|
||||
ports:
|
||||
- "8080:8080" # HTTP
|
||||
- "2121:2121" # FTP
|
||||
command: >
|
||||
sh -c "go mod tidy &&
|
||||
go build -o shelfy . &&
|
||||
./shelfy"
|
||||
labels:
|
||||
- traefik.http.routers.shelfy.middlewares=webdav-allow-methods@docker
|
||||
- traefik.http.middlewares.webdav-allow-methods.headers.accesscontrolallowmethods=GET,PUT,POST,DELETE,PROPFIND,OPTIONS,LOCK,UNLOCK,HEAD
|
||||
- traefik.http.middlewares.webdav-allow-methods.headers.accesscontrolallowheaders=Authorization,Depth,Content-Type,If-Modified-Since,User-Agent,Destination,Overwrite
|
||||
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
go-modules:
|
||||
40
gen/main.go
Normal file
40
gen/main.go
Normal file
@ -0,0 +1,40 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gorm"
|
||||
"canguidev/shelfy/internal/models"
|
||||
|
||||
)
|
||||
|
||||
// Dynamic SQL
|
||||
type Querier interface {
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
FilterWithNameAndRole(name, role string) ([]gen.T, error)
|
||||
}
|
||||
|
||||
func main() {
|
||||
g := gen.NewGenerator(gen.Config{
|
||||
OutPath: "../query",
|
||||
Mode: gen.WithoutContext|gen.WithDefaultQuery|gen.WithQueryInterface, // generate mode
|
||||
})
|
||||
dbName:="../data/shelfly_db.db"
|
||||
|
||||
db, err := gorm.Open(sqlite.Open(dbName), &gorm.Config{})
|
||||
|
||||
if err != nil {
|
||||
log.Fatalf("Erreur de connexion à la base de données : %v", err)
|
||||
}
|
||||
g.UseDB(db) // reuse your gorm db
|
||||
|
||||
// Generate basic type-safe DAO API for struct `model.User` following conventions
|
||||
g.ApplyBasic(models.User{},models.Files{})
|
||||
|
||||
// Generate Type Safe API with Dynamic SQL defined on Querier interface for `model.User` and `model.Company`
|
||||
g.ApplyInterface(func(Querier){},models.User{},models.Files{},models.LibrarySection{},models.MediaItem{},models.MediaPart{},models.MetadataItem{},models.SectionLocation{},models.Tag{},models.Tagging{},models.PathDownload{})
|
||||
|
||||
// Generate the code
|
||||
g.Execute()
|
||||
}
|
||||
62
go.mod
Normal file
62
go.mod
Normal file
@ -0,0 +1,62 @@
|
||||
module canguidev/shelfy
|
||||
|
||||
go 1.24.5
|
||||
|
||||
require (
|
||||
github.com/fclairamb/ftpserverlib v0.26.0
|
||||
github.com/spf13/afero v1.14.0
|
||||
gorm.io/driver/sqlite v1.6.0
|
||||
gorm.io/gen v0.3.27
|
||||
gorm.io/plugin/dbresolver v1.6.2
|
||||
)
|
||||
|
||||
require (
|
||||
filippo.io/edwards25519 v1.1.0 // indirect
|
||||
github.com/fclairamb/go-log v0.6.0 // indirect
|
||||
github.com/go-sql-driver/mysql v1.9.3 // indirect
|
||||
github.com/google/uuid v1.6.0 // indirect
|
||||
github.com/kr/pretty v0.3.0 // indirect
|
||||
github.com/rogpeppe/go-internal v1.8.0 // indirect
|
||||
golang.org/x/mod v0.26.0 // indirect
|
||||
golang.org/x/sync v0.16.0 // indirect
|
||||
golang.org/x/tools v0.35.0 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||
gorm.io/datatypes v1.2.6 // indirect
|
||||
gorm.io/driver/mysql v1.6.0 // indirect
|
||||
gorm.io/hints v1.1.2 // indirect
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/bytedance/sonic v1.14.0 // indirect
|
||||
github.com/bytedance/sonic/loader v0.3.0 // indirect
|
||||
github.com/cloudwego/base64x v0.1.5 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
|
||||
github.com/gin-contrib/sse v1.1.0 // indirect
|
||||
github.com/gin-gonic/gin v1.10.1
|
||||
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.27.0 // indirect
|
||||
github.com/goccy/go-json v0.10.5 // indirect
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible
|
||||
github.com/golang-jwt/jwt/v4 v4.5.2
|
||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||
github.com/jinzhu/now v1.1.5 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
||||
github.com/leodido/go-urn v1.4.0 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mattn/go-sqlite3 v1.14.29 // 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.2.4 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
github.com/ugorji/go/codec v1.3.0 // indirect
|
||||
golang.org/x/arch v0.19.0 // indirect
|
||||
golang.org/x/crypto v0.40.0
|
||||
golang.org/x/net v0.42.0 // indirect
|
||||
golang.org/x/sys v0.34.0 // indirect
|
||||
golang.org/x/text v0.27.0 // indirect
|
||||
google.golang.org/protobuf v1.36.6 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
gorm.io/gorm v1.30.1
|
||||
)
|
||||
179
go.sum
Normal file
179
go.sum
Normal file
@ -0,0 +1,179 @@
|
||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||
github.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=
|
||||
github.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=
|
||||
github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
|
||||
github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
|
||||
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
|
||||
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
||||
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
|
||||
github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
|
||||
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
||||
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/fclairamb/ftpserverlib v0.26.0 h1:86K7qms8rrguRYQ4hxVMVl5HBSymUlqu+enjdk9Ug5A=
|
||||
github.com/fclairamb/ftpserverlib v0.26.0/go.mod h1:XMm3NdvCvmBtoAVK86oERDVmoYo0GTNS5gdds4f9lpM=
|
||||
github.com/fclairamb/go-log v0.5.0 h1:Gz9wSamEaA6lta4IU2cjJc2xSq5sV5VYSB5w/SUHhVc=
|
||||
github.com/fclairamb/go-log v0.5.0/go.mod h1:XoRO1dYezpsGmLLkZE9I+sHqpqY65p8JA+Vqblb7k40=
|
||||
github.com/fclairamb/go-log v0.6.0 h1:1V7BJ75P2PvanLHRyGBBFjncB6d4AgEmu+BPWKbMkaU=
|
||||
github.com/fclairamb/go-log v0.6.0/go.mod h1:cyXxOw4aJwO6lrZb8GRELSw+sxO6wwkLJdsjY5xYCWA=
|
||||
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
|
||||
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
|
||||
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
|
||||
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
|
||||
github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ=
|
||||
github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
||||
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
|
||||
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
|
||||
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
|
||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
||||
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||
github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4=
|
||||
github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
|
||||
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
|
||||
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
|
||||
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
|
||||
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
|
||||
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
|
||||
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
|
||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
|
||||
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
|
||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA=
|
||||
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
||||
github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
|
||||
github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
|
||||
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
|
||||
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
||||
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||
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/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
|
||||
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
||||
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
|
||||
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/mattn/go-sqlite3 v1.14.29 h1:1O6nRLJKvsi1H2Sj0Hzdfojwt8GiGKm+LOfLaBFaouQ=
|
||||
github.com/mattn/go-sqlite3 v1.14.29/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA=
|
||||
github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA=
|
||||
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/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
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/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
|
||||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
||||
github.com/secsy/goftp v0.0.0-20200609142545-aa2de14babf4 h1:PT+ElG/UUFMfqy5HrxJxNzj3QBOf7dZwupeVC+mG1Lo=
|
||||
github.com/secsy/goftp v0.0.0-20200609142545-aa2de14babf4/go.mod h1:MnkX001NG75g3p8bhFycnyIjeQoOjGL6CEIsdE/nKSY=
|
||||
github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA=
|
||||
github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo=
|
||||
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.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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
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.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
|
||||
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
|
||||
golang.org/x/arch v0.19.0 h1:LmbDQUodHThXE+htjrnmVD73M//D9GTH6wFZjyDkjyU=
|
||||
golang.org/x/arch v0.19.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
|
||||
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
|
||||
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
|
||||
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
|
||||
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
|
||||
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
|
||||
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
|
||||
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
|
||||
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
|
||||
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
|
||||
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
|
||||
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
|
||||
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
|
||||
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
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=
|
||||
gorm.io/datatypes v1.2.6 h1:KafLdXvFUhzNeL2ncm03Gl3eTLONQfNKZ+wJ+9Y4Nck=
|
||||
gorm.io/datatypes v1.2.6/go.mod h1:M2iO+6S3hhi4nAyYe444Pcb0dcIiOMJ7QHaUXxyiNZY=
|
||||
gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg=
|
||||
gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo=
|
||||
gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U=
|
||||
gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A=
|
||||
gorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I=
|
||||
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
|
||||
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
|
||||
gorm.io/driver/sqlserver v1.6.0 h1:VZOBQVsVhkHU/NzNhRJKoANt5pZGQAS1Bwc6m6dgfnc=
|
||||
gorm.io/driver/sqlserver v1.6.0/go.mod h1:WQzt4IJo/WHKnckU9jXBLMJIVNMVeTu25dnOzehntWw=
|
||||
gorm.io/gen v0.3.27 h1:ziocAFLpE7e0g4Rum69pGfB9S6DweTxK8gAun7cU8as=
|
||||
gorm.io/gen v0.3.27/go.mod h1:9zquz2xD1f3Eb/eHq4oLn2z6vDVvQlCY5S3uMBLv4EA=
|
||||
gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
|
||||
gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
|
||||
gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs=
|
||||
gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
|
||||
gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
|
||||
gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
|
||||
gorm.io/hints v1.1.2 h1:b5j0kwk5p4+3BtDtYqqfY+ATSxjj+6ptPgVveuynn9o=
|
||||
gorm.io/hints v1.1.2/go.mod h1:/ARdpUHAtyEMCh5NNi3tI7FsGh+Cj/MIUlvNxCNCFWg=
|
||||
gorm.io/plugin/dbresolver v1.6.0 h1:XvKDeOtTn1EIX6s4SrKpEH82q0gXVemhYjbYZFGFVcw=
|
||||
gorm.io/plugin/dbresolver v1.6.0/go.mod h1:tctw63jdrOezFR9HmrKnPkmig3m5Edem9fdxk9bQSzM=
|
||||
gorm.io/plugin/dbresolver v1.6.2 h1:F4b85TenghUeITqe3+epPSUtHH7RIk3fXr5l83DF8Pc=
|
||||
gorm.io/plugin/dbresolver v1.6.2/go.mod h1:tctw63jdrOezFR9HmrKnPkmig3m5Edem9fdxk9bQSzM=
|
||||
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
|
||||
BIN
internal/.DS_Store
vendored
Normal file
BIN
internal/.DS_Store
vendored
Normal file
Binary file not shown.
589
internal/client/debridlink.go
Normal file
589
internal/client/debridlink.go
Normal file
@ -0,0 +1,589 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
const baseURL = "https://debrid-link.com/api/v2/"
|
||||
|
||||
type Client struct {
|
||||
http *http.Client
|
||||
db *gorm.DB
|
||||
clientID string
|
||||
clientSecret string
|
||||
account *DebridAccount
|
||||
}
|
||||
|
||||
type DebridAccount struct {
|
||||
ID uint `gorm:"primaryKey"`
|
||||
Host string `gorm:"column:host" json:"host"`
|
||||
Username string `gorm:"column:username" json:"username"`
|
||||
Password string `gorm:"column:password" json:"password"`
|
||||
IsActive bool `gorm:"column:is_active" json:"is_active"`
|
||||
AccessToken string `gorm:"column:access_token"`
|
||||
RefreshToken string `gorm:"column:refresh_token"`
|
||||
ExpiresAt time.Time `gorm:"column:expires_at"`
|
||||
CreatedAt time.Time `gorm:"autoCreateTime"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime"`
|
||||
}
|
||||
|
||||
type TokenResponse struct {
|
||||
AccessToken string `json:"access_token"`
|
||||
RefreshToken string `json:"refresh_token"`
|
||||
ExpiresIn int64 `json:"expires_in"`
|
||||
}
|
||||
|
||||
func NewClient(db *gorm.DB) *Client {
|
||||
return &Client{
|
||||
http: &http.Client{Timeout: 15 * time.Second},
|
||||
db: db,
|
||||
clientID: "bMs32shaby43qVGVKnkRqw",
|
||||
clientSecret: "XRMJ8JNJtJZBsRP8gzBnYc6huLK2cqXay3ihKId9mt4",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func (c *Client) SetAccount(account *DebridAccount) {
|
||||
c.account = account
|
||||
}
|
||||
|
||||
func (c *Client) refreshAccessToken(ctx context.Context) error {
|
||||
form := url.Values{}
|
||||
form.Set("client_id", c.clientID)
|
||||
form.Set("client_secret", c.clientSecret)
|
||||
form.Set("grant_type", "refresh_token")
|
||||
form.Set("refresh_token", c.account.RefreshToken)
|
||||
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, baseURL+"oauth/token", strings.NewReader(form.Encode()))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
resp, err := c.http.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode >= 400 {
|
||||
b, _ := io.ReadAll(resp.Body)
|
||||
return fmt.Errorf("refresh failed: %s", string(b))
|
||||
}
|
||||
|
||||
var tokenResp TokenResponse
|
||||
if err := json.NewDecoder(resp.Body).Decode(&tokenResp); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
c.account.AccessToken = tokenResp.AccessToken
|
||||
c.account.RefreshToken = tokenResp.RefreshToken
|
||||
c.account.ExpiresAt = time.Now().Add(time.Duration(tokenResp.ExpiresIn) * time.Second)
|
||||
|
||||
return c.db.Save(c.account).Error
|
||||
}
|
||||
func (c *Client) ToggleActiveStatus(ctx context.Context, id uint) error {
|
||||
if c.db == nil {
|
||||
return errors.New("la connexion à la base de données est manquante")
|
||||
}
|
||||
|
||||
var account DebridAccount
|
||||
if err := c.db.First(&account, id).Error; err != nil {
|
||||
return fmt.Errorf("compte introuvable : %w", err)
|
||||
}
|
||||
|
||||
account.IsActive = !account.IsActive
|
||||
account.UpdatedAt = time.Now()
|
||||
|
||||
if err := c.db.Save(&account).Error; err != nil {
|
||||
return fmt.Errorf("échec de la mise à jour : %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
// ===========================
|
||||
// CRUD pour DebridAccount
|
||||
// ===========================
|
||||
|
||||
func (c *Client) CreateDebridAccount(ctx context.Context, acc *DebridAccount) error {
|
||||
return c.db.Create(acc).Error
|
||||
}
|
||||
|
||||
func (c *Client) GetDebridAccount(ctx context.Context, id uint) (*DebridAccount, error) {
|
||||
var acc DebridAccount
|
||||
if err := c.db.First(&acc, id).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &acc, nil
|
||||
}
|
||||
|
||||
func (c *Client) ListDebridAccounts(ctx context.Context) ([]DebridAccount, error) {
|
||||
var accounts []DebridAccount
|
||||
if err := c.db.Order("id desc").Find(&accounts).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return accounts, nil
|
||||
}
|
||||
|
||||
func (c *Client) UpdateDebridAccount(ctx context.Context, acc *DebridAccount) error {
|
||||
return c.db.Save(acc).Error
|
||||
}
|
||||
|
||||
func (c *Client) DeleteDebridAccount(ctx context.Context, id uint) error {
|
||||
return c.db.Delete(&DebridAccount{}, id).Error
|
||||
}
|
||||
func (c *Client) RequestDeviceCodeWithCredentials(ctx context.Context, username, password string) (*DeviceCodeResponse, error) {
|
||||
|
||||
form := url.Values{}
|
||||
log.Println("[DEBUG] Envoi device_code avec :")
|
||||
log.Println("client_id:", c.clientID)
|
||||
log.Println("username:", username)
|
||||
log.Println("password (len):", len(password))
|
||||
log.Println("scope:", form.Get("scope"))
|
||||
log.Println("URL:", "https://debrid-link.com/api/oauth/device/code")
|
||||
form.Set("client_id", c.clientID)
|
||||
form.Set("grant_type", "password") // possible variation
|
||||
form.Set("username", username)
|
||||
form.Set("password", password)
|
||||
form.Set("scope", "get.post.downloader get.post.seedbox get.account get.post.stream")
|
||||
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://debrid-link.com/api/oauth/device/code", strings.NewReader(form.Encode()))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
resp, err := c.http.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode >= 400 {
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
return nil, fmt.Errorf("device code request failed: %s", string(body))
|
||||
}
|
||||
|
||||
var result DeviceCodeResponse
|
||||
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (c *Client) RequestDeviceCode(ctx context.Context) (*DeviceCodeResponse, error) {
|
||||
form := url.Values{}
|
||||
form.Set("client_id", c.clientID)
|
||||
form.Set("scope", "get.post.downloader get.post.seedbox get.account")
|
||||
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://debrid-link.com/api/oauth/device/code", strings.NewReader(form.Encode()))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
resp, err := c.http.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode >= 400 {
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
return nil, fmt.Errorf("device code request failed: %s", string(body))
|
||||
}
|
||||
|
||||
var result DeviceCodeResponse
|
||||
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
|
||||
type DeviceCodeResponse struct {
|
||||
DeviceCode string `json:"device_code"`
|
||||
UserCode string `json:"user_code"`
|
||||
VerificationURL string `json:"verification_url"`
|
||||
ExpiresIn int `json:"expires_in"`
|
||||
Interval int `json:"interval"`
|
||||
}
|
||||
func (c *Client) PasswordGrant(ctx context.Context, username, password string) (*TokenResponse, error) {
|
||||
form := url.Values{}
|
||||
form.Set("client_id", c.clientID)
|
||||
form.Set("client_secret", c.clientSecret)
|
||||
form.Set("grant_type", "password")
|
||||
form.Set("username", username)
|
||||
form.Set("password", password)
|
||||
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://debrid-link.com/api/oauth/token", strings.NewReader(form.Encode()))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
resp, err := c.http.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode >= 400 {
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
return nil, fmt.Errorf("auth error: %s", string(body))
|
||||
}
|
||||
|
||||
var tokens TokenResponse
|
||||
if err := json.NewDecoder(resp.Body).Decode(&tokens); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &tokens, nil
|
||||
}
|
||||
|
||||
func (c *Client) PollDeviceToken(ctx context.Context, deviceCode string, interval int) (*TokenResponse, error) {
|
||||
form := url.Values{}
|
||||
form.Set("client_id", c.clientID)
|
||||
form.Set("grant_type", "urn:ietf:params:oauth:grant-type:device_code")
|
||||
form.Set("code", deviceCode)
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return nil, ctx.Err()
|
||||
case <-time.After(time.Duration(interval) * time.Second):
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://debrid-link.com/api/oauth/token", strings.NewReader(form.Encode()))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
resp, err := c.http.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode == 200 {
|
||||
var tokens TokenResponse
|
||||
if err := json.NewDecoder(resp.Body).Decode(&tokens); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &tokens, nil
|
||||
}
|
||||
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
if strings.Contains(string(body), "authorization_pending") {
|
||||
continue // Attente de validation utilisateur
|
||||
}
|
||||
return nil, fmt.Errorf("device auth failed: %s", string(body))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (c *Client) doJSON(ctx context.Context, method, path string, params url.Values, body, out interface{}) error {
|
||||
if c.account == nil {
|
||||
return errors.New("no active Debrid account")
|
||||
}
|
||||
if time.Now().After(c.account.ExpiresAt) {
|
||||
if err := c.refreshAccessToken(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
urlStr := baseURL + path
|
||||
if params != nil {
|
||||
urlStr += "?" + params.Encode()
|
||||
}
|
||||
|
||||
var reqBody io.Reader
|
||||
if body != nil {
|
||||
b, err := json.Marshal(body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
reqBody = bytes.NewReader(b)
|
||||
|
||||
// 👇 DEBUG : afficher le body
|
||||
log.Printf("➡️ [API %s] URL: %s\nBody: %s\n", method, urlStr, string(b))
|
||||
} else {
|
||||
log.Printf("➡️ [API %s] URL: %s (empty body)", method, urlStr)
|
||||
}
|
||||
|
||||
req, err := http.NewRequestWithContext(ctx, method, urlStr, reqBody)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 👇 DEBUG : afficher le header Authorization
|
||||
authHeader := "Bearer " + c.account.AccessToken
|
||||
log.Printf("➡️ Authorization Header: %s\n", authHeader)
|
||||
|
||||
req.Header.Set("Authorization", authHeader)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
resp, err := c.http.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode >= 400 {
|
||||
data, _ := io.ReadAll(resp.Body)
|
||||
return fmt.Errorf("HTTP error %d: %s", resp.StatusCode, string(data))
|
||||
}
|
||||
|
||||
if out != nil {
|
||||
return json.NewDecoder(resp.Body).Decode(out)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
// =========================== RSS ===========================
|
||||
type RSSFeed struct {
|
||||
ID string `json:"id" gorm:"column:id;primaryKey"`
|
||||
URL string `json:"url" gorm:"column:url"`
|
||||
Enabled bool `json:"enabled" gorm:"column:enabled"`
|
||||
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
|
||||
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
|
||||
}
|
||||
|
||||
type RSSItem struct {
|
||||
Title string `json:"title" gorm:"column:title"`
|
||||
Link string `json:"link" gorm:"column:link"`
|
||||
PubDate time.Time `json:"pubDate" gorm:"column:pub_date"`
|
||||
}
|
||||
func (c *Client) ListRSS(ctx context.Context) ([]RSSFeed, error) {
|
||||
var feeds []RSSFeed
|
||||
if err := c.doJSON(ctx, "GET", "rss", nil, nil, &feeds); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return feeds, nil
|
||||
}
|
||||
|
||||
func (c *Client) AddRSS(ctx context.Context, url string) (*RSSFeed, error) {
|
||||
var feed RSSFeed
|
||||
body := map[string]string{"url": url}
|
||||
if err := c.doJSON(ctx, "POST", "rss", nil, body, &feed); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &feed, nil
|
||||
}
|
||||
|
||||
func (c *Client) TestRSS(ctx context.Context, url string) ([]RSSItem, error) {
|
||||
var items []RSSItem
|
||||
body := map[string]string{"url": url}
|
||||
if err := c.doJSON(ctx, "POST", "rss/test", nil, body, &items); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
|
||||
func (c *Client) DeleteRSS(ctx context.Context, id string) error {
|
||||
return c.doJSON(ctx, "DELETE", fmt.Sprintf("rss/%s", id), nil, nil, nil)
|
||||
}
|
||||
|
||||
// =========================== Seedbox ===========================
|
||||
type Torrent struct {
|
||||
ID string `json:"id" gorm:"column:id;primaryKey"`
|
||||
Name string `json:"name" gorm:"column:name"`
|
||||
Status string `json:"status" gorm:"column:status"`
|
||||
Progress int `json:"progress" gorm:"column:progress"`
|
||||
Added time.Time `json:"added" gorm:"column:added"`
|
||||
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
|
||||
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
|
||||
}
|
||||
|
||||
func (c *Client) ListTorrents(ctx context.Context) ([]Torrent, error) {
|
||||
var torrents []Torrent
|
||||
if err := c.doJSON(ctx, "GET", "seedbox/torrents", nil, nil, &torrents); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return torrents, nil
|
||||
}
|
||||
|
||||
func (c *Client) AddTorrent(ctx context.Context, link string) (*Torrent, error) {
|
||||
var t Torrent
|
||||
body := map[string]string{"link": link}
|
||||
if err := c.doJSON(ctx, "POST", "seedbox/torrents", nil, body, &t); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &t, nil
|
||||
}
|
||||
|
||||
func (c *Client) RemoveTorrents(ctx context.Context, ids []string) error {
|
||||
body := map[string][]string{"ids": ids}
|
||||
return c.doJSON(ctx, "DELETE", "seedbox/torrents", nil, body, nil)
|
||||
}
|
||||
|
||||
// =========================== Downloader ===========================
|
||||
type Link struct {
|
||||
ID string `json:"id" gorm:"primaryKey;column:id"`
|
||||
Name string `json:"name" gorm:"column:name"`
|
||||
URL string `json:"url" gorm:"column:url"` // Lien d'origine
|
||||
DownloadURL string `json:"downloadUrl" gorm:"column:download_url"` // Lien débridé direct
|
||||
Host string `json:"host" gorm:"column:host"` // Nom de l'hébergeur
|
||||
Size int64 `json:"size" gorm:"column:size"` // Taille en octets
|
||||
Chunk int `json:"chunk" gorm:"column:chunk"` // Nombre de chunks
|
||||
Expired bool `json:"expired" gorm:"column:expired"` // Lien expiré ou non
|
||||
Created int64 `json:"created" gorm:"column:created"` // Timestamp
|
||||
CreatedAt time.Time `gorm:"autoCreateTime"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime"`
|
||||
}
|
||||
type StreamInfo struct {
|
||||
ID string `json:"id" gorm:"primaryKey;column:id"`
|
||||
StreamURL string `json:"streamUrl" gorm:"column:stream_url"`
|
||||
DownloadURL string `json:"downloadUrl" gorm:"column:download_url"`
|
||||
Type string `json:"type" gorm:"column:type"` // hls ou mp4
|
||||
MimeType string `json:"mimetype" gorm:"column:mimetype"` // ex: video/mp4
|
||||
Domain string `json:"domain" gorm:"column:domain"`
|
||||
|
||||
// Champs du fichier lié (ex : nom de la vidéo)
|
||||
FileID string `json:"-" gorm:"column:file_id"` // lien avec le champ File.ID ci-dessous
|
||||
FileName string `json:"-" gorm:"column:file_name"` // nom fichier
|
||||
FileSize int64 `json:"-" gorm:"column:file_size"` // taille fichier
|
||||
|
||||
CreatedAt time.Time `gorm:"autoCreateTime"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime"`
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (c *Client) ListLinks(ctx context.Context) ([]Link, error) {
|
||||
var links []Link
|
||||
if err := c.doJSON(ctx, "GET", "downloader/links", nil, nil, &links); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return links, nil
|
||||
}
|
||||
func (c *Client) AddLink(ctx context.Context, link string) ([]Link, error) {
|
||||
var envelope struct {
|
||||
Success bool `json:"success"`
|
||||
Value json.RawMessage `json:"value"`
|
||||
}
|
||||
|
||||
body := map[string]string{"url": link}
|
||||
|
||||
// Requête brute
|
||||
if err := c.doJSON(ctx, "POST", "downloader/add", nil, body, &envelope); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var links []Link
|
||||
|
||||
switch envelope.Value[0] {
|
||||
case '{':
|
||||
var single Link
|
||||
if err := json.Unmarshal(envelope.Value, &single); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
links = append(links, single)
|
||||
case '[':
|
||||
if err := json.Unmarshal(envelope.Value, &links); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
default:
|
||||
return nil, errors.New("format de réponse inattendu")
|
||||
}
|
||||
|
||||
return links, nil
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (c *Client) RemoveLinks(ctx context.Context, ids []string) error {
|
||||
body := map[string][]string{"ids": ids}
|
||||
return c.doJSON(ctx, "DELETE", "downloader/links", nil, body, nil)
|
||||
}
|
||||
|
||||
// =========================== Files ===========================
|
||||
type File struct {
|
||||
ID string `json:"id" gorm:"column:id;primaryKey"`
|
||||
Name string `json:"name" gorm:"column:name"`
|
||||
Size int64 `json:"size" gorm:"column:size"`
|
||||
Link string `json:"link" gorm:"column:link"`
|
||||
ParentID string `json:"parent_id" gorm:"column:parent_id"`
|
||||
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
|
||||
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
|
||||
}
|
||||
|
||||
|
||||
func (c *Client) ListFiles(ctx context.Context, parentID string) ([]File, error) {
|
||||
var files []File
|
||||
path := fmt.Sprintf("files/%s", parentID)
|
||||
if err := c.doJSON(ctx, "GET", path, nil, nil, &files); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return files, nil
|
||||
}
|
||||
|
||||
// =========================== Stream ===========================
|
||||
// func (c *Client) CreateTranscode(ctx context.Context, fileID, preset string) (string, error) {
|
||||
// var resp struct{ TranscodeID string `json:"transcodeId"` }
|
||||
// body := map[string]string{"fileId": fileID}
|
||||
// if err := c.doJSON(ctx, "POST", "stream/transcode", nil, body, &resp); err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
// return resp.TranscodeID, nil
|
||||
// }
|
||||
|
||||
func (c *Client) CreateTranscode(ctx context.Context, fileID string) (*StreamInfo, error) {
|
||||
body := map[string]string{"id": fileID}
|
||||
|
||||
var raw struct {
|
||||
Success bool `json:"success"`
|
||||
Value struct {
|
||||
ID string `json:"id"`
|
||||
StreamURL string `json:"streamUrl"`
|
||||
DownloadURL string `json:"downloadUrl"`
|
||||
Type string `json:"type"`
|
||||
MimeType string `json:"mimetype"`
|
||||
Domain string `json:"domain"`
|
||||
File struct {
|
||||
ID string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Size int64 `json:"size"`
|
||||
Source string `json:"source"`
|
||||
} `json:"file"`
|
||||
} `json:"value"`
|
||||
}
|
||||
|
||||
path := "stream/transcode/add"
|
||||
if err := c.doJSON(ctx, "POST", path, nil, body, &raw); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info := &StreamInfo{
|
||||
ID: raw.Value.ID,
|
||||
StreamURL: raw.Value.StreamURL,
|
||||
DownloadURL: raw.Value.DownloadURL,
|
||||
Type: raw.Value.Type,
|
||||
MimeType: raw.Value.MimeType,
|
||||
Domain: raw.Value.Domain,
|
||||
FileID: raw.Value.File.ID,
|
||||
FileName: raw.Value.File.Name,
|
||||
FileSize: raw.Value.File.Size,
|
||||
}
|
||||
return info, nil
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
BIN
internal/controllers/.DS_Store
vendored
Normal file
BIN
internal/controllers/.DS_Store
vendored
Normal file
Binary file not shown.
55
internal/controllers/authController.go
Normal file
55
internal/controllers/authController.go
Normal file
@ -0,0 +1,55 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/models"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/golang-jwt/jwt"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func Login(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
var authInput models.User
|
||||
var user =models.User{}
|
||||
if err := c.ShouldBindJSON(&authInput); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
|
||||
d :=db.Where("Email = ?", authInput.Email).First(&user)
|
||||
if d.Error != nil {
|
||||
fmt.Println("Erreur lors de la requête :", d.Error)
|
||||
} else {
|
||||
// Afficher les données récupérées
|
||||
fmt.Printf("Utilisateur trouvé : %+v\n", user)
|
||||
}
|
||||
|
||||
|
||||
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(authInput.Password)); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "failed to generate token"})
|
||||
// w.WriteHeader(http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
generateToken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
||||
"id": user.ID,
|
||||
"exp": time.Now().Add(time.Hour * 24).Unix(),
|
||||
})
|
||||
|
||||
token, err := generateToken.SignedString([]byte("SECRET"))
|
||||
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "failed to generate token"})
|
||||
}
|
||||
|
||||
c.JSON(200, gin.H{
|
||||
"token": token,
|
||||
})
|
||||
}}
|
||||
90
internal/controllers/clientController.go
Normal file
90
internal/controllers/clientController.go
Normal file
@ -0,0 +1,90 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/client"
|
||||
"context"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func PostDebridLogin(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
clt := client.NewClient(db)
|
||||
|
||||
var creds struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
}
|
||||
if err := c.ShouldBindJSON(&creds); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
|
||||
return
|
||||
}
|
||||
|
||||
deviceResp, err := clt.RequestDeviceCodeWithCredentials(c, creds.Username, creds.Password)
|
||||
if err != nil {
|
||||
log.Println("[OAuth2] Erreur device_code:", err)
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "OAuth error: " + err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
go func() {
|
||||
tokens, err := clt.PollDeviceToken(context.Background(), deviceResp.DeviceCode, deviceResp.Interval)
|
||||
if err != nil {
|
||||
log.Println("[OAuth2] Polling échoué:", err)
|
||||
return
|
||||
}
|
||||
|
||||
account := &client.DebridAccount{
|
||||
Host: "debrid-link.com",
|
||||
Username: creds.Username,
|
||||
Password: creds.Password,
|
||||
IsActive: true,
|
||||
AccessToken: tokens.AccessToken,
|
||||
RefreshToken: tokens.RefreshToken,
|
||||
ExpiresAt: time.Now().Add(time.Duration(tokens.ExpiresIn) * time.Second),
|
||||
}
|
||||
|
||||
if err := db.Create(account).Error; err != nil {
|
||||
log.Println("[DB] Sauvegarde échouée:", err)
|
||||
return
|
||||
}
|
||||
log.Println("[OAuth2] Compte sauvegardé")
|
||||
}()
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "Device code retrieved successfully",
|
||||
"user_code": deviceResp.UserCode,
|
||||
"verify_url": deviceResp.VerificationURL,
|
||||
"polling_delay": deviceResp.Interval,
|
||||
})
|
||||
}
|
||||
}
|
||||
func GetDebridAccounts(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
clt := client.NewClient(db)
|
||||
accounts, err := clt.ListDebridAccounts(c)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to list accounts"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"accounts": accounts,
|
||||
})
|
||||
}
|
||||
}
|
||||
func GetDebridStatus(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
username := c.Query("username")
|
||||
var account client.DebridAccount
|
||||
if err := db.Where("username = ? AND is_active = ?", username, true).First(&account).Error; err != nil {
|
||||
c.JSON(http.StatusOK, gin.H{"active": false})
|
||||
return
|
||||
}
|
||||
c.JSON(http.StatusOK, gin.H{"active": true})
|
||||
}
|
||||
}
|
||||
265
internal/controllers/downloadController.go
Normal file
265
internal/controllers/downloadController.go
Normal file
@ -0,0 +1,265 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/client"
|
||||
runner "canguidev/shelfy/internal/job"
|
||||
"canguidev/shelfy/internal/models"
|
||||
"context"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func sanitizeFileName(name string) string {
|
||||
return runner.SanitizeFileName(name)
|
||||
}
|
||||
var seriesRegex = regexp.MustCompile(`^(.+?)\.S\d{2}E\d{2}`)
|
||||
var (
|
||||
jobs = make(map[string]*runner.DownloadJob)
|
||||
jobsMu sync.Mutex
|
||||
)
|
||||
func HandleAddJobsMultiple(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
// 1. Parsing des champs du formulaire
|
||||
var form struct {
|
||||
Links string `json:"links" form:"links" binding:"required"`
|
||||
PathID string `json:"path_id" form:"path_id" binding:"required"`
|
||||
}
|
||||
|
||||
// On tente d'abord le bind JSON
|
||||
if err := c.ShouldBindJSON(&form); err != nil {
|
||||
log.Printf("[DEBUG] Reçu links=%q | path_id=%q", form.Links, form.PathID)
|
||||
// Si JSON échoue, on tente avec form-urlencoded
|
||||
if err := c.ShouldBind(&form); err != nil {
|
||||
log.Printf("[DEBUG] Reçu links=%q | path_id=%q", form.Links, form.PathID)
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Champs requis manquants ou invalides"})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
lines := strings.Split(form.Links, "\n")
|
||||
baseID, err := strconv.ParseInt(form.PathID, 10, 64)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "ID de chemin invalide"})
|
||||
return
|
||||
}
|
||||
|
||||
// 2. Vérification du dossier principal
|
||||
var basePath models.PathDownload
|
||||
if err := db.First(&basePath, baseID).Error; err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Dossier principal introuvable"})
|
||||
return
|
||||
}
|
||||
|
||||
// 3. Initialisation Debrid-Link
|
||||
ctx := context.Background()
|
||||
clt := client.NewClient(db)
|
||||
account := runner.GetFirstActiveAccount(clt)
|
||||
if account == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Aucun compte Debrid-Link actif"})
|
||||
return
|
||||
}
|
||||
clt.SetAccount(account)
|
||||
|
||||
// 4. Résultats à retourner
|
||||
var results []map[string]interface{}
|
||||
|
||||
// 5. Itération des liens
|
||||
for _, link := range lines {
|
||||
link = strings.TrimSpace(link)
|
||||
if link == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
links, err := clt.AddLink(ctx, link)
|
||||
if err != nil {
|
||||
log.Printf("Échec débridage de %s: %v", link, err)
|
||||
results = append(results, gin.H{"link": link, "status": "failed", "error": err.Error()})
|
||||
continue
|
||||
}
|
||||
|
||||
for _, l := range links {
|
||||
clean := sanitizeFileName(l.Name)
|
||||
series := clean
|
||||
if m := seriesRegex.FindStringSubmatch(clean); len(m) == 2 {
|
||||
series = m[1]
|
||||
}
|
||||
|
||||
assignID := int(basePath.ID)
|
||||
if series != "" {
|
||||
dirPath := filepath.Join(basePath.Path, series)
|
||||
if err := os.MkdirAll(dirPath, os.ModePerm); err != nil {
|
||||
log.Printf("Erreur création dossier %s: %v", dirPath, err)
|
||||
}
|
||||
|
||||
var sub models.PathDownload
|
||||
if err := db.Where("path = ?", dirPath).First(&sub).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
sub = models.PathDownload{Path: dirPath, PathName: series}
|
||||
if err := db.Create(&sub).Error; err != nil {
|
||||
log.Printf("Erreur création PathDownload: %v", err)
|
||||
}
|
||||
} else {
|
||||
log.Printf("Erreur lecture PathDownload: %v", err)
|
||||
}
|
||||
}
|
||||
assignID = int(sub.ID)
|
||||
}
|
||||
|
||||
// streamInfo, err := clt.CreateTranscode(ctx, l.ID)
|
||||
// if err != nil {
|
||||
// log.Printf("Erreur transcode pour %s: %v", l.ID, err)
|
||||
// }
|
||||
|
||||
job := &runner.DownloadJob{
|
||||
ID: l.ID,
|
||||
Link: l.DownloadURL,
|
||||
Name: l.Name,
|
||||
Status: "waiting",
|
||||
PathID: assignID,
|
||||
Size: l.Size,
|
||||
Host: l.Host,
|
||||
Progress: 0,
|
||||
StreamURL: "",
|
||||
}
|
||||
// if streamInfo != nil {
|
||||
// job.StreamURL = streamInfo.StreamURL
|
||||
// }
|
||||
|
||||
if err := runner.RegisterJobWithDB(job, db); err != nil {
|
||||
log.Printf("Erreur enregistrement job: %v", err)
|
||||
results = append(results, gin.H{"link": l.URL, "status": "failed", "error": err.Error()})
|
||||
continue
|
||||
}
|
||||
|
||||
results = append(results, gin.H{"link": l.URL, "status": "added", "name": job.Name})
|
||||
}
|
||||
}
|
||||
|
||||
// 6. Broadcast au frontend
|
||||
runner.Broadcast()
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "Traitement terminé",
|
||||
"results": results,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func HandleStartJob(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
log.Printf("[StartJob] ID = %s", id)
|
||||
|
||||
// 1. Vérifie si le job est déjà en mémoire
|
||||
jobsMu.Lock()
|
||||
job, exists := jobs[id]
|
||||
jobsMu.Unlock()
|
||||
|
||||
// 2. Sinon, récupère depuis la BDD
|
||||
if !exists {
|
||||
var j runner.DownloadJob
|
||||
if err := db.First(&j, "id = ?", id).Error; err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Job introuvable"})
|
||||
return
|
||||
}
|
||||
jobCopy := j
|
||||
jobsMu.Lock()
|
||||
jobs[id] = &jobCopy
|
||||
job = &jobCopy
|
||||
jobsMu.Unlock()
|
||||
}
|
||||
|
||||
clt:= client.NewClient(db)
|
||||
account := runner.GetFirstActiveAccount(clt)
|
||||
if account == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Aucun compte Debrid-Link actif"})
|
||||
return
|
||||
}
|
||||
clt.SetAccount(account)
|
||||
|
||||
go runner.StartDownload(job, job.Link, clt, db)
|
||||
runner.Broadcast()
|
||||
|
||||
c.Status(http.StatusNoContent)
|
||||
}
|
||||
}
|
||||
func HandlePauseJob() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
runner.UpdateJobStatus(id, "paused", nil)
|
||||
runner.Broadcast()
|
||||
|
||||
c.Status(http.StatusNoContent)
|
||||
}
|
||||
}
|
||||
func HandleResumeJob(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
|
||||
jobsMu.Lock()
|
||||
job, exists := jobs[id]
|
||||
jobsMu.Unlock()
|
||||
|
||||
if !exists {
|
||||
var j runner.DownloadJob
|
||||
if err := db.First(&j, "id = ?", id).Error; err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Job introuvable"})
|
||||
return
|
||||
}
|
||||
jobCopy := j
|
||||
jobsMu.Lock()
|
||||
jobs[id] = &jobCopy
|
||||
job = &jobCopy
|
||||
jobsMu.Unlock()
|
||||
}
|
||||
|
||||
clt := client.NewClient(db)
|
||||
account := runner.GetFirstActiveAccount(clt)
|
||||
if account == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Aucun compte actif"})
|
||||
return
|
||||
}
|
||||
clt.SetAccount(account)
|
||||
|
||||
go runner.StartDownload(job, job.Link, clt, db)
|
||||
runner.Broadcast()
|
||||
|
||||
c.Status(http.StatusNoContent)
|
||||
}
|
||||
}
|
||||
func HandleDeleteJob(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
runner.DeleteJob(id, db)
|
||||
go runner.Broadcast()
|
||||
|
||||
c.Status(http.StatusNoContent)
|
||||
}
|
||||
}
|
||||
func HandleListJobs(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
var jobs []runner.DownloadJob
|
||||
// Optionnel : filtrage (par user, status, etc.)
|
||||
if err := db.Find(&jobs).Error; err != nil {
|
||||
c.JSON(500, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
c.JSON(200, gin.H{
|
||||
"jobs": jobs,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
181
internal/controllers/folderController.go
Normal file
181
internal/controllers/folderController.go
Normal file
@ -0,0 +1,181 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/models"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
||||
type Entry struct {
|
||||
ID int64 `json:"ID"`
|
||||
Name, Path string
|
||||
IsDir bool
|
||||
ModTime time.Time
|
||||
Size int64
|
||||
Children []Entry `json:"Children,omitempty"`
|
||||
Url string `json:"Url,omitempty"` // <- Ajout ici
|
||||
|
||||
|
||||
}
|
||||
|
||||
func listEntries(base, rel string) ([]Entry, error) {
|
||||
dir := filepath.Join(base, rel)
|
||||
fis, err := os.ReadDir(dir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out := make([]Entry, 0, len(fis))
|
||||
for _, fi := range fis {
|
||||
info, _ := fi.Info()
|
||||
out = append(out, Entry{
|
||||
Name: fi.Name(),
|
||||
Path: filepath.ToSlash(filepath.Join(rel, fi.Name())),
|
||||
IsDir: fi.IsDir(),
|
||||
ModTime: info.ModTime(),
|
||||
Size: info.Size(),
|
||||
})
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func StreamHandler(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
base := "upload"
|
||||
cur := c.Query("path")
|
||||
|
||||
// Liste des dossiers du dossier racine
|
||||
rootEntries, err := listEntries(base, "")
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to list root entries"})
|
||||
return
|
||||
}
|
||||
|
||||
var dirs []Entry
|
||||
for _, e := range rootEntries {
|
||||
if e.IsDir {
|
||||
var pathDownload models.PathDownload
|
||||
// Recherche par PathName (== e.Name)
|
||||
db.Where("path_name = ?", e.Name).First(&pathDownload)
|
||||
e.ID = pathDownload.ID // 0 si non trouvé
|
||||
dirs = append(dirs, e)
|
||||
}
|
||||
}
|
||||
|
||||
// Liste du chemin courant
|
||||
entries, err := listEntries(base, cur)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to list entries"})
|
||||
return
|
||||
}
|
||||
|
||||
for i := range entries {
|
||||
var pathDownload models.PathDownload
|
||||
db.Where("path_name = ?", entries[i].Name).First(&pathDownload)
|
||||
entries[i].ID = pathDownload.ID // 0 si non trouvé
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"dirs": dirs,
|
||||
"entries": entries,
|
||||
"currentPath": cur,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
func DetailHandler() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
base := "upload"
|
||||
rel := c.Query("path")
|
||||
rel = filepath.Clean("/" + rel)
|
||||
rel = strings.TrimPrefix(rel, "/") // => chemin relatif à "upload"
|
||||
|
||||
absPath := filepath.Join(base, rel)
|
||||
absPath, err := filepath.Abs(absPath)
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"error": "Path error"})
|
||||
return
|
||||
}
|
||||
baseAbs, err := filepath.Abs(base)
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"error": "Base path error"})
|
||||
return
|
||||
}
|
||||
if !strings.HasPrefix(absPath, baseAbs) {
|
||||
c.JSON(403, gin.H{"error": "Access outside base directory is forbidden"})
|
||||
return
|
||||
}
|
||||
info, err := os.Stat(absPath)
|
||||
if err != nil {
|
||||
c.JSON(404, gin.H{"error": "Path not found"})
|
||||
return
|
||||
}
|
||||
|
||||
type Entry struct {
|
||||
ID int64 `json:"ID,omitempty"`
|
||||
Name string `json:"Name"`
|
||||
Path string `json:"Path"` // <--- Toujours RELATIF à "upload"
|
||||
IsDir bool `json:"IsDir"`
|
||||
ModTime time.Time `json:"ModTime"`
|
||||
Size int64 `json:"Size"`
|
||||
Children []Entry `json:"Children,omitempty"`
|
||||
Url string `json:"Url,omitempty"` // <--- Lien d'accès au fichier
|
||||
}
|
||||
|
||||
var buildTree func(absPath, relPath string, fi os.FileInfo) (Entry, error)
|
||||
buildTree = func(absPath, relPath string, fi os.FileInfo) (Entry, error) {
|
||||
entry := Entry{
|
||||
Name: fi.Name(),
|
||||
Path: relPath, // <-- toujours RELATIF à la racine upload
|
||||
IsDir: fi.IsDir(),
|
||||
ModTime: fi.ModTime(),
|
||||
Size: fi.Size(),
|
||||
}
|
||||
|
||||
if !fi.IsDir() {
|
||||
entry.Url = "/api/v1/folders/file?path=" + url.QueryEscape(relPath)
|
||||
}
|
||||
if fi.IsDir() {
|
||||
f, err := os.Open(absPath)
|
||||
if err != nil {
|
||||
return entry, err
|
||||
}
|
||||
defer f.Close()
|
||||
files, err := f.Readdir(0)
|
||||
if err != nil {
|
||||
return entry, err
|
||||
}
|
||||
for _, child := range files {
|
||||
childAbs := filepath.Join(absPath, child.Name())
|
||||
childRel := filepath.Join(relPath, child.Name())
|
||||
childEntry, err := buildTree(childAbs, childRel, child)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
entry.Children = append(entry.Children, childEntry)
|
||||
}
|
||||
}
|
||||
return entry, nil
|
||||
}
|
||||
|
||||
rootEntry, err := buildTree(absPath, rel, info)
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"error": "Tree error"})
|
||||
return
|
||||
}
|
||||
c.JSON(200, rootEntry)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
187
internal/controllers/pathController.go
Normal file
187
internal/controllers/pathController.go
Normal file
@ -0,0 +1,187 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/models"
|
||||
"errors"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func CreateSavePath(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
c.Header("Content-Type", "application/json")
|
||||
|
||||
var pathDownload models.PathDownload
|
||||
if err := c.ShouldBindJSON(&pathDownload); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
|
||||
return
|
||||
}
|
||||
|
||||
if pathDownload.PathName == "" {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "PathName cannot be empty"})
|
||||
return
|
||||
}
|
||||
|
||||
fullPath := "/app/upload/" + pathDownload.PathName
|
||||
if _, err := os.Stat(fullPath); err == nil {
|
||||
c.JSON(http.StatusConflict, gin.H{"error": "Path already exists"})
|
||||
return
|
||||
}
|
||||
|
||||
if err := os.MkdirAll(fullPath, 0755); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create directory"})
|
||||
return
|
||||
}
|
||||
|
||||
pathDownload.Path = fullPath
|
||||
if err := db.Create(&pathDownload).Error; err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save path"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "Path created successfully",
|
||||
"data": pathDownload,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func ReadAllSavePath(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
c.Header("Content-Type", "application/json")
|
||||
|
||||
var paths []models.PathDownload
|
||||
if err := db.Find(&paths).Error; err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to retrieve paths"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "Paths retrieved successfully",
|
||||
"data": paths,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// UpdateSavePath met à jour un chemin enregistré et renomme le dossier
|
||||
func UpdateSavePath(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
c.Header("Content-Type", "application/json")
|
||||
id := c.Param("id")
|
||||
|
||||
var pathDownload models.PathDownload
|
||||
if err := c.ShouldBindJSON(&pathDownload); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
|
||||
return
|
||||
}
|
||||
|
||||
var existingPath models.PathDownload
|
||||
if err := db.First(&existingPath, "id = ?", id).Error; err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Path not found"})
|
||||
return
|
||||
}
|
||||
|
||||
oldFullPath := "/app/upload/" + existingPath.PathName
|
||||
newFullPath := "/app/upload/" + pathDownload.PathName
|
||||
|
||||
if oldFullPath != newFullPath {
|
||||
if err := os.Rename(oldFullPath, newFullPath); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to rename directory"})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
existingPath.PathName = pathDownload.PathName
|
||||
existingPath.Path = newFullPath
|
||||
|
||||
if err := db.Save(&existingPath).Error; err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update path"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "Path updated successfully",
|
||||
"data": existingPath,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// DeleteSavePath supprime un chemin et son dossier
|
||||
func DeleteSavePath(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
|
||||
var pathDownload models.PathDownload
|
||||
if err := db.First(&pathDownload, "id = ?", id).Error; err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Path not found"})
|
||||
return
|
||||
}
|
||||
|
||||
fullPath := "/app/upload/" + pathDownload.PathName
|
||||
if err := os.RemoveAll(fullPath); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete directory"})
|
||||
return
|
||||
}
|
||||
|
||||
if err := db.Delete(&pathDownload).Error; err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete path"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "Path deleted successfully"})
|
||||
}
|
||||
}
|
||||
|
||||
// IsPathValid vérifie si un chemin est valide (nom et existence)
|
||||
func IsPathValid(pathName string) error {
|
||||
if pathName == "" {
|
||||
return errors.New("PathName cannot be empty")
|
||||
}
|
||||
if strings.Contains(pathName, "/") || strings.Contains(pathName, "\\") {
|
||||
return errors.New("PathName cannot contain '/' or '\\'")
|
||||
}
|
||||
fullPath := "/app/upload/" + pathName
|
||||
if _, err := os.Stat(fullPath); err == nil {
|
||||
return errors.New("Path already exists")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// PathValidationHandler vérifie la validité du chemin (POST uniquement)
|
||||
func PathValidationHandler(c *gin.Context) {
|
||||
if c.Request.Method != http.MethodPost {
|
||||
c.JSON(http.StatusMethodNotAllowed, gin.H{"error": "Invalid request method"})
|
||||
return
|
||||
}
|
||||
|
||||
var requestBody struct {
|
||||
PathName string `json:"pathName"`
|
||||
}
|
||||
|
||||
if err := c.ShouldBindJSON(&requestBody); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request body"})
|
||||
return
|
||||
}
|
||||
|
||||
err := IsPathValid(requestBody.PathName)
|
||||
|
||||
response := gin.H{
|
||||
"pathName": requestBody.PathName,
|
||||
"status": "valid",
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
response["status"] = "invalid"
|
||||
response["error"] = err.Error()
|
||||
c.JSON(http.StatusBadRequest, response)
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, response)
|
||||
}
|
||||
|
||||
16
internal/controllers/testController.go
Normal file
16
internal/controllers/testController.go
Normal file
@ -0,0 +1,16 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func TestPing()gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "pong",
|
||||
"service": "shelfy",
|
||||
"version": "1.0.0", // optionnel
|
||||
})
|
||||
|
||||
}}
|
||||
186
internal/controllers/userController.go
Normal file
186
internal/controllers/userController.go
Normal file
@ -0,0 +1,186 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/models"
|
||||
"canguidev/shelfy/query"
|
||||
"context"
|
||||
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
// CreateUser crée un nouvel utilisateur
|
||||
func CreateUser(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
c.Header("Content-Type", "application/json")
|
||||
|
||||
if c.Request.Body == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is empty"})
|
||||
return
|
||||
}
|
||||
|
||||
if c.ContentType() != "application/json" {
|
||||
c.JSON(http.StatusUnsupportedMediaType, gin.H{"error": "Content-Type must be application/json"})
|
||||
return
|
||||
}
|
||||
|
||||
var u models.User
|
||||
if err := c.ShouldBindJSON(&u); err != nil {
|
||||
log.Printf("Erreur JSON : %v", err)
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
|
||||
return
|
||||
}
|
||||
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
log.Printf("Erreur hachage mot de passe : %v", err)
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to hash password"})
|
||||
return
|
||||
}
|
||||
u.Password = string(hashedPassword)
|
||||
|
||||
q := query.Use(db)
|
||||
if err := q.User.Create(&u); err != nil {
|
||||
log.Printf("Erreur création utilisateur : %v", err)
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create user"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "User created successfully"})
|
||||
}
|
||||
}
|
||||
|
||||
// UpdateUser met à jour un utilisateur
|
||||
func UpdateUser(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
c.Header("Content-Type", "application/json")
|
||||
|
||||
if c.Request.Body == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is empty"})
|
||||
return
|
||||
}
|
||||
|
||||
if c.ContentType() != "application/json" {
|
||||
c.JSON(http.StatusUnsupportedMediaType, gin.H{"error": "Content-Type must be application/json"})
|
||||
return
|
||||
}
|
||||
|
||||
idStr := c.Param("id")
|
||||
id, err := strconv.Atoi(idStr)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"})
|
||||
return
|
||||
}
|
||||
|
||||
q := query.Use(db)
|
||||
u := q.User
|
||||
ctx := context.Background()
|
||||
|
||||
user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First()
|
||||
if err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
|
||||
return
|
||||
}
|
||||
|
||||
var usr models.User
|
||||
if err := c.ShouldBindJSON(&usr); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
|
||||
return
|
||||
}
|
||||
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(usr.Password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to hash password"})
|
||||
return
|
||||
}
|
||||
|
||||
user.Name = usr.Name
|
||||
user.Username = usr.Username
|
||||
user.Email = usr.Email
|
||||
user.Password = string(hashedPassword)
|
||||
|
||||
if err := u.Save(user); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update user"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "User updated successfully"})
|
||||
}
|
||||
}
|
||||
|
||||
// DeleteUser supprime un utilisateur
|
||||
func DeleteUser(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
c.Header("Content-Type", "application/json")
|
||||
|
||||
idStr := c.Param("id")
|
||||
id, err := strconv.Atoi(idStr)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"})
|
||||
return
|
||||
}
|
||||
|
||||
q := query.Use(db)
|
||||
u := q.User
|
||||
ctx := context.Background()
|
||||
|
||||
user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First()
|
||||
if err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
|
||||
return
|
||||
}
|
||||
|
||||
if _,err := u.Delete(user); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete user"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "User deleted successfully"})
|
||||
}
|
||||
}
|
||||
|
||||
// ReadAllUser retourne tous les utilisateurs
|
||||
func ReadAllUser(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
c.Header("Content-Type", "application/json")
|
||||
|
||||
q := query.Use(db)
|
||||
users, err := q.User.Find()
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch users"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, users)
|
||||
}
|
||||
}
|
||||
|
||||
// FindUserById retourne un utilisateur par son ID
|
||||
func FindUserById(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
c.Header("Content-Type", "application/json")
|
||||
|
||||
idStr := c.Param("id")
|
||||
id, err := strconv.Atoi(idStr)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"})
|
||||
return
|
||||
}
|
||||
|
||||
q := query.Use(db)
|
||||
u := q.User
|
||||
ctx := context.Background()
|
||||
|
||||
user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First()
|
||||
if err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, user)
|
||||
}
|
||||
}
|
||||
78
internal/db/db.go
Normal file
78
internal/db/db.go
Normal file
@ -0,0 +1,78 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/client"
|
||||
runner "canguidev/shelfy/internal/job"
|
||||
"canguidev/shelfy/internal/models"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
||||
|
||||
func InitDB() *gorm.DB {
|
||||
dbPath := "data/shelfly_db.db"
|
||||
|
||||
// Crée le dossier parent s'il n'existe pas
|
||||
if err := os.MkdirAll(filepath.Dir(dbPath), os.ModePerm); err != nil {
|
||||
panic(fmt.Sprintf("Erreur lors de la création du dossier : %v", err))
|
||||
}
|
||||
|
||||
// Connexion à SQLite
|
||||
db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("Échec de connexion à SQLite : %v", err))
|
||||
}
|
||||
|
||||
// Auto migration
|
||||
if err := db.AutoMigrate(&models.User{},&models.PathDownload{},&client.DebridAccount{},&runner.DownloadJob{}); err != nil {
|
||||
panic(fmt.Sprintf("Erreur d'auto-migration : %v", err))
|
||||
}
|
||||
|
||||
InitDefaultAdmin(db)
|
||||
fmt.Println("✅ SQLite initialisé correctement.")
|
||||
return db
|
||||
}
|
||||
|
||||
func InitDefaultAdmin(db *gorm.DB) {
|
||||
const email = "canguijc@gmail.com"
|
||||
const username = "admin"
|
||||
const name = "Admin"
|
||||
const password = "GHT30k7!"
|
||||
|
||||
var user models.User
|
||||
result := db.Where("email = ?", email).First(&user)
|
||||
|
||||
if result.Error == gorm.ErrRecordNotFound {
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
log.Fatalf("Erreur lors du hash du mot de passe: %v", err)
|
||||
}
|
||||
|
||||
newUser := models.User{
|
||||
Email: email,
|
||||
Username: username,
|
||||
Name: name,
|
||||
Password: string(hashedPassword),
|
||||
}
|
||||
|
||||
if err := db.Create(&newUser).Error; err != nil {
|
||||
log.Fatalf("Erreur lors de la création de l'utilisateur admin: %v", err)
|
||||
}
|
||||
|
||||
log.Println("✅ Utilisateur administrateur créé avec succès")
|
||||
} else if result.Error != nil {
|
||||
log.Fatalf("Erreur lors de la vérification de l'utilisateur admin: %v", result.Error)
|
||||
} else {
|
||||
log.Println("ℹ️ L'utilisateur administrateur existe déjà")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
566
internal/job/runner.go
Normal file
566
internal/job/runner.go
Normal file
@ -0,0 +1,566 @@
|
||||
package runner
|
||||
|
||||
import (
|
||||
"archive/zip"
|
||||
"canguidev/shelfy/internal/client"
|
||||
"canguidev/shelfy/internal/models"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type DownloadJob struct {
|
||||
ID string `gorm:"primaryKey;column:id"`
|
||||
Link string `gorm:"column:link"`
|
||||
Name string `gorm:"column:name"`
|
||||
Status string `gorm:"column:status"`
|
||||
PathID int `gorm:"column:path_id"` // 👈 int pas uint
|
||||
Size int64 `gorm:"column:size"`
|
||||
Host string `gorm:"column:host"`
|
||||
Progress int `gorm:"column:progress"` // 👈 int
|
||||
StreamURL string `gorm:"column:stream_url"`
|
||||
Speed int `gorm:"column:speed;default:0"` // vitesse en Ko/s
|
||||
CreatedAt time.Time `gorm:"autoCreateTime"`
|
||||
UpdatedAt time.Time `gorm:"autoUpdateTime"`
|
||||
}
|
||||
|
||||
var (
|
||||
jobs = make(map[string]*DownloadJob)
|
||||
jobsMu sync.Mutex
|
||||
)
|
||||
func GetFirstActiveAccount(client *client.Client) *client.DebridAccount {
|
||||
ctx := context.Background() // ✅ on remplace ici
|
||||
|
||||
accounts, err := client.ListDebridAccounts(ctx)
|
||||
if err != nil {
|
||||
log.Println("[ERROR] Impossible de récupérer les comptes :", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, acc := range accounts {
|
||||
if acc.IsActive {
|
||||
return &acc
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Enregistre un job en mémoire et en base
|
||||
func RegisterJobWithDB(job *DownloadJob, db *gorm.DB) error {
|
||||
var existing DownloadJob
|
||||
|
||||
// On cherche le job existant SANS les soft deletes si jamais ils sont activés par erreur
|
||||
err := db.Unscoped().First(&existing, "id = ?", job.ID).Error
|
||||
|
||||
if err == nil {
|
||||
// Le job existe déjà, on le met à jour
|
||||
log.Printf("[INFO] Mise à jour du job existant : %s\n", job.ID)
|
||||
|
||||
err = db.Model(&existing).Updates(map[string]interface{}{
|
||||
"link": job.Link,
|
||||
"name": job.Name,
|
||||
"status": job.Status,
|
||||
"path_id": job.PathID,
|
||||
"size": job.Size,
|
||||
"host": job.Host,
|
||||
"progress": job.Progress,
|
||||
"stream_url": job.StreamURL,
|
||||
"updated_at": time.Now(),
|
||||
}).Error
|
||||
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] Échec de la mise à jour : %v\n", err)
|
||||
return err
|
||||
}
|
||||
} else if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
// Le job n'existe pas, on le crée
|
||||
if err := db.Create(job).Error; err != nil {
|
||||
log.Printf("[ERROR] Insertion échouée : %v\n", err)
|
||||
return err
|
||||
}
|
||||
log.Printf("[INFO] Nouveau job enregistré : %s\n", job.ID)
|
||||
} else {
|
||||
// Une erreur inattendue
|
||||
log.Printf("[ERROR] Erreur inattendue lors de la recherche du job : %v\n", err)
|
||||
return err
|
||||
}
|
||||
|
||||
// Mise à jour en mémoire
|
||||
jobsMu.Lock()
|
||||
jobs[job.ID] = job
|
||||
jobsMu.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Charge tous les jobs depuis la base en mémoire (au démarrage)
|
||||
func InitJobsFromDB(db *gorm.DB) error {
|
||||
var jobList []DownloadJob
|
||||
if err := db.Find(&jobList).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
jobsMu.Lock()
|
||||
defer jobsMu.Unlock()
|
||||
|
||||
for _, j := range jobList {
|
||||
jobCopy := j
|
||||
jobs[j.ID] = &jobCopy
|
||||
}
|
||||
log.Printf("[JOB] %d jobs rechargés depuis la base\n", len(jobs))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Met à jour le status d’un job et le persiste
|
||||
func UpdateJobStatus(id string, status string, db *gorm.DB) {
|
||||
jobsMu.Lock()
|
||||
defer jobsMu.Unlock()
|
||||
|
||||
if job, ok := jobs[id]; ok {
|
||||
job.Status = status
|
||||
job.UpdatedAt = time.Now()
|
||||
if db != nil {
|
||||
_ = db.Save(job)
|
||||
}
|
||||
}
|
||||
Broadcast()
|
||||
}
|
||||
|
||||
// Met à jour la progression d’un job et le persiste
|
||||
func UpdateJobProgress(id string, progress int, db *gorm.DB) {
|
||||
jobsMu.Lock()
|
||||
defer jobsMu.Unlock()
|
||||
|
||||
if job, ok := jobs[id]; ok {
|
||||
job.Progress = progress
|
||||
job.UpdatedAt = time.Now()
|
||||
if db != nil {
|
||||
_ = db.Save(job)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Supprime un job (mémoire uniquement)
|
||||
func DeleteJob(id string, db *gorm.DB) error {
|
||||
// Supprime en mémoire
|
||||
jobsMu.Lock()
|
||||
delete(jobs, id)
|
||||
jobsMu.Unlock()
|
||||
|
||||
// Supprime en base
|
||||
if err := db.Delete(&DownloadJob{}, "id = ?", id).Error; err != nil {
|
||||
log.Printf("[ERROR] Échec de suppression du job en base : %v\n", err)
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("[JOB] Supprimé : %s\n", id)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Liste tous les jobs
|
||||
func ListJobs(db *gorm.DB) []*DownloadJob {
|
||||
var jobsFromDB []*DownloadJob
|
||||
if err := db.Order("created_at desc").Find(&jobsFromDB).Error; err != nil {
|
||||
log.Printf("[ERROR] Impossible de charger les jobs depuis la base : %v\n", err)
|
||||
return []*DownloadJob{}
|
||||
}
|
||||
return jobsFromDB
|
||||
}
|
||||
|
||||
|
||||
func StartDownload(job *DownloadJob, downloadURL string, client *client.Client, db *gorm.DB) {
|
||||
UpdateJobStatus(job.ID, "downloading", db)
|
||||
|
||||
var path models.PathDownload
|
||||
if err := db.First(&path, job.PathID).Error; err != nil {
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
|
||||
resp, err := http.Head(downloadURL)
|
||||
if err != nil || resp.StatusCode != http.StatusOK {
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
size := resp.ContentLength
|
||||
if size <= 0 {
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
|
||||
acceptRanges := resp.Header.Get("Accept-Ranges")
|
||||
if acceptRanges != "bytes" {
|
||||
log.Println("[INFO] Serveur ne supporte pas Range, fallback single thread")
|
||||
StartDownloadSingleThread(job, downloadURL, db, path.Path)
|
||||
return
|
||||
}
|
||||
|
||||
const numSegments = 4
|
||||
segmentSize := size / numSegments
|
||||
tmpFiles := make([]string, numSegments)
|
||||
wg := sync.WaitGroup{}
|
||||
progressChan := make(chan int64, 100)
|
||||
done := make(chan bool)
|
||||
|
||||
// Progression + Vitesse
|
||||
var downloaded int64
|
||||
go func() {
|
||||
var lastTotal int64 = 0
|
||||
lastUpdate := time.Now()
|
||||
|
||||
ticker := time.NewTicker(1 * time.Second)
|
||||
defer ticker.Stop()
|
||||
|
||||
for {
|
||||
select {
|
||||
case n := <-progressChan:
|
||||
downloaded += n
|
||||
case <-ticker.C:
|
||||
elapsed := time.Since(lastUpdate).Seconds()
|
||||
if elapsed > 0 {
|
||||
speed := int(float64(downloaded-lastTotal) / elapsed / 1024) // en Ko/s
|
||||
lastTotal = downloaded
|
||||
lastUpdate = time.Now()
|
||||
progress := int((downloaded * 100) / size)
|
||||
|
||||
// Update en base
|
||||
db.Model(&DownloadJob{}).Where("id = ?", job.ID).Updates(map[string]interface{}{
|
||||
"progress": progress,
|
||||
"speed": speed,
|
||||
})
|
||||
Broadcast()
|
||||
}
|
||||
case <-done:
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// Téléchargement parallèle
|
||||
for i := 0; i < numSegments; i++ {
|
||||
start := int64(i) * segmentSize
|
||||
end := start + segmentSize - 1
|
||||
if i == numSegments-1 {
|
||||
end = size - 1
|
||||
}
|
||||
|
||||
tmpPath := filepath.Join(os.TempDir(), fmt.Sprintf("%s.part%d", job.ID, i))
|
||||
tmpFiles[i] = tmpPath
|
||||
|
||||
wg.Add(1)
|
||||
go func(start, end int64, tmpPath string) {
|
||||
defer wg.Done()
|
||||
err := downloadSegment(downloadURL, start, end, tmpPath, progressChan)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] Segment %d-%d échoué : %v\n", start, end, err)
|
||||
}
|
||||
}(start, end, tmpPath)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
close(done)
|
||||
|
||||
// Fusion
|
||||
safeName := SanitizeFileName(job.Name)
|
||||
finalPath := generateUniqueFilePath(path.Path, safeName)
|
||||
|
||||
out, err := os.Create(finalPath)
|
||||
if err != nil {
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
for _, tmpPath := range tmpFiles {
|
||||
part, err := os.Open(tmpPath)
|
||||
if err != nil {
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
io.Copy(out, part)
|
||||
part.Close()
|
||||
os.Remove(tmpPath)
|
||||
}
|
||||
|
||||
ext := strings.ToLower(filepath.Ext(finalPath))
|
||||
videoExts := map[string]bool{".mkv": true, ".avi": true, ".mp4": true}
|
||||
|
||||
if !videoExts[ext] {
|
||||
switch ext {
|
||||
case ".zip":
|
||||
if err := unzip(finalPath, path.Path); err != nil {
|
||||
log.Printf("[ERROR] Décompression ZIP échouée : %v\n", err)
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
case ".rar":
|
||||
if err := unrarExtract(finalPath, path.Path); err != nil {
|
||||
log.Printf("[ERROR] Décompression RAR échouée : %v\n", err)
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
default:
|
||||
log.Printf("[INFO] Extension non gérée : %s\n", ext)
|
||||
}
|
||||
}
|
||||
|
||||
UpdateJobProgress(job.ID, 100, db)
|
||||
UpdateJobStatus(job.ID, "done", db)
|
||||
log.Printf("[OK] Fichier téléchargé : %s\n", finalPath)
|
||||
}
|
||||
|
||||
// generateUniqueFilePath ajoute un suffixe si le fichier existe déjà
|
||||
func generateUniqueFilePath(basePath, fileName string) string {
|
||||
finalPath := filepath.Join(basePath, fileName)
|
||||
if _, err := os.Stat(finalPath); os.IsNotExist(err) {
|
||||
return finalPath
|
||||
}
|
||||
|
||||
base := strings.TrimSuffix(fileName, filepath.Ext(fileName))
|
||||
ext := filepath.Ext(fileName)
|
||||
counter := 1
|
||||
|
||||
for {
|
||||
newName := fmt.Sprintf("%s (%d)%s", base, counter, ext)
|
||||
newPath := filepath.Join(basePath, newName)
|
||||
if _, err := os.Stat(newPath); os.IsNotExist(err) {
|
||||
return newPath
|
||||
}
|
||||
counter++
|
||||
}
|
||||
}
|
||||
|
||||
func StartDownloadSingleThread(job *DownloadJob, downloadURL string, db *gorm.DB, basePath string) {
|
||||
UpdateJobStatus(job.ID, "running", db)
|
||||
|
||||
resp, err := http.Get(downloadURL)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] Téléchargement échoué : %v\n", err)
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
log.Printf("[ERROR] Erreur HTTP : %s\n", resp.Status)
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
|
||||
// Créer le répertoire si nécessaire
|
||||
if err := os.MkdirAll(basePath, os.ModePerm); err != nil {
|
||||
log.Printf("[ERROR] Création du dossier %s échouée : %v\n", basePath, err)
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
|
||||
destPath := filepath.Join(basePath, SanitizeFileName(job.Name))
|
||||
outFile, err := os.Create(destPath)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] Impossible de créer le fichier : %v\n", err)
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
defer outFile.Close()
|
||||
|
||||
// Calcul taille totale
|
||||
totalSize := resp.ContentLength
|
||||
if totalSize <= 0 && job.Size > 0 {
|
||||
totalSize = job.Size
|
||||
}
|
||||
|
||||
buf := make([]byte, 32*1024) // 32KB
|
||||
var downloaded int64
|
||||
lastUpdate := time.Now()
|
||||
|
||||
for {
|
||||
n, err := resp.Body.Read(buf)
|
||||
if n > 0 {
|
||||
if _, writeErr := outFile.Write(buf[:n]); writeErr != nil {
|
||||
log.Printf("[ERROR] Écriture échouée : %v\n", writeErr)
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
downloaded += int64(n)
|
||||
}
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
log.Printf("[ERROR] Erreur de lecture : %v\n", err)
|
||||
UpdateJobStatus(job.ID, "failed", db)
|
||||
return
|
||||
}
|
||||
|
||||
// Mise à jour de la progression
|
||||
if time.Since(lastUpdate) > 500*time.Millisecond && totalSize > 0 {
|
||||
progress := int((downloaded * 100) / totalSize)
|
||||
UpdateJobProgress(job.ID, progress, db)
|
||||
lastUpdate = time.Now()
|
||||
}
|
||||
}
|
||||
|
||||
UpdateJobProgress(job.ID, 100, db)
|
||||
UpdateJobStatus(job.ID, "done", db)
|
||||
log.Printf("[OK] Fichier téléchargé (single) : %s\n", destPath)
|
||||
}
|
||||
|
||||
func downloadSegment(url string, start, end int64, dest string, progressChan chan<- int64) error {
|
||||
req, _ := http.NewRequest("GET", url, nil)
|
||||
req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", start, end))
|
||||
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
out, err := os.Create(dest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
buf := make([]byte, 32*1024)
|
||||
for {
|
||||
n, err := resp.Body.Read(buf)
|
||||
if n > 0 {
|
||||
if _, err := out.Write(buf[:n]); err != nil {
|
||||
return err
|
||||
}
|
||||
progressChan <- int64(n) // ← envoie progression
|
||||
}
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func SanitizeFileName(name string) string {
|
||||
re := regexp.MustCompile(`[^\w\-.]`)
|
||||
return re.ReplaceAllString(name, "_")
|
||||
}
|
||||
var (
|
||||
subscribers = make(map[chan struct{}]struct{})
|
||||
subscribersMu sync.Mutex
|
||||
)
|
||||
|
||||
// Subscribe renvoie un chan à fermer par le client SSE
|
||||
func Subscribe() chan struct{} {
|
||||
ch := make(chan struct{}, 1)
|
||||
subscribersMu.Lock()
|
||||
subscribers[ch] = struct{}{}
|
||||
subscribersMu.Unlock()
|
||||
return ch
|
||||
}
|
||||
|
||||
// Unsubscribe supprime le chan
|
||||
func Unsubscribe(ch chan struct{}) {
|
||||
subscribersMu.Lock()
|
||||
delete(subscribers, ch)
|
||||
subscribersMu.Unlock()
|
||||
close(ch)
|
||||
}
|
||||
|
||||
// Broadcast notifie tous les subscribers
|
||||
func Broadcast() {
|
||||
subscribersMu.Lock()
|
||||
defer subscribersMu.Unlock()
|
||||
|
||||
for ch := range subscribers {
|
||||
select {
|
||||
case ch <- struct{}{}:
|
||||
log.Println("Broadcast envoyé à un client")
|
||||
default:
|
||||
log.Println("Client bloqué, message ignoré")
|
||||
}
|
||||
}
|
||||
}
|
||||
func unzip(srcZip, destDir string) error {
|
||||
r, err := zip.OpenReader(srcZip)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer r.Close()
|
||||
|
||||
for _, f := range r.File {
|
||||
fpath := filepath.Join(destDir, f.Name)
|
||||
if f.FileInfo().IsDir() {
|
||||
os.MkdirAll(fpath, os.ModePerm)
|
||||
continue
|
||||
}
|
||||
if err := os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
|
||||
return err
|
||||
}
|
||||
in, err := f.Open()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer in.Close()
|
||||
|
||||
out, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
if _, err := io.Copy(out, in); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func unrarExtract(srcRar, destDir string) error {
|
||||
log.Printf("[DEBUG] Début de l’extraction RAR – src: %q, dest: %q", srcRar, destDir)
|
||||
|
||||
// 1) Tentative avec unrar
|
||||
cmdUnrar := exec.Command("unrar", "x", "-y", srcRar, destDir)
|
||||
log.Printf("[DEBUG] Exécution de la commande unrar : %s", strings.Join(cmdUnrar.Args, " "))
|
||||
outputUnrar, errUnrar := cmdUnrar.CombinedOutput()
|
||||
log.Printf("[DEBUG] Résultat unrar – err: %v, output:\n%s", errUnrar, string(outputUnrar))
|
||||
|
||||
if errUnrar == nil {
|
||||
log.Printf("[INFO] Extraction réussie avec unrar.")
|
||||
return nil
|
||||
}
|
||||
log.Printf("[WARN] Échec de unrar, passage à 7z.")
|
||||
|
||||
// 2) Repli sur 7z
|
||||
cmd7z := exec.Command("7z", "x", srcRar, "-y", "-o"+destDir)
|
||||
log.Printf("[DEBUG] Exécution de la commande 7z : %s", strings.Join(cmd7z.Args, " "))
|
||||
output7z, err7z := cmd7z.CombinedOutput()
|
||||
log.Printf("[DEBUG] Résultat 7z – err: %v, output:\n%s", err7z, string(output7z))
|
||||
|
||||
if err7z == nil {
|
||||
log.Printf("[INFO] Extraction réussie avec 7z.")
|
||||
return nil
|
||||
}
|
||||
|
||||
// 3) Les deux ont échoué
|
||||
errMsg := fmt.Errorf(
|
||||
"unrar a échoué : %v\nSortie unrar : %s\n\n7z a échoué : %v\nSortie 7z : %s",
|
||||
errUnrar, string(outputUnrar),
|
||||
err7z, string(output7z),
|
||||
)
|
||||
log.Printf("[ERROR] %v", errMsg)
|
||||
return errMsg
|
||||
}
|
||||
|
||||
77
internal/middlewares/checkAuth.go
Normal file
77
internal/middlewares/checkAuth.go
Normal file
@ -0,0 +1,77 @@
|
||||
package middlewares
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/models"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/golang-jwt/jwt/v4"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func CheckAuth(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
// 1. Récupère le token (header ou query string)
|
||||
authHeader := c.GetHeader("Authorization")
|
||||
var tokenString string
|
||||
|
||||
if authHeader != "" {
|
||||
// Mode classique : Authorization: Bearer xxxxx
|
||||
authToken := strings.Split(authHeader, " ")
|
||||
if len(authToken) != 2 || authToken[0] != "Bearer" {
|
||||
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token format"})
|
||||
c.AbortWithStatus(http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
tokenString = authToken[1]
|
||||
} else {
|
||||
// Mode web : token dans l’URL
|
||||
tokenString = c.Query("token")
|
||||
if tokenString == "" {
|
||||
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header is missing"})
|
||||
c.AbortWithStatus(http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Vérifie et parse le JWT
|
||||
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
|
||||
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
|
||||
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
|
||||
}
|
||||
return []byte("SECRET"), nil
|
||||
})
|
||||
if err != nil || !token.Valid {
|
||||
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid or expired token"})
|
||||
c.AbortWithStatus(http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
claims, ok := token.Claims.(jwt.MapClaims)
|
||||
if !ok {
|
||||
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"})
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
|
||||
if float64(time.Now().Unix()) > claims["exp"].(float64) {
|
||||
c.JSON(http.StatusUnauthorized, gin.H{"error": "token expired"})
|
||||
c.AbortWithStatus(http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
var user models.User
|
||||
var id = claims["id"]
|
||||
result := db.First(&user, id)
|
||||
if result.RowsAffected == 0 {
|
||||
c.AbortWithStatus(http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
c.Set("currentUser", user)
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
|
||||
97
internal/models/models.go
Normal file
97
internal/models/models.go
Normal file
@ -0,0 +1,97 @@
|
||||
package models
|
||||
|
||||
type User struct {
|
||||
ID uint `json:"id" gorm:"primaryKey"`
|
||||
Username string `json:"username" gorm:"size:255"`
|
||||
Name string `json:"name" gorm:"size:100"`
|
||||
Email string `json:"email" gorm:"unique"`
|
||||
Password string `json:"password" gorm:"size:255"`
|
||||
}
|
||||
|
||||
|
||||
type PathDownload struct{
|
||||
ID int64 `db:"id"`
|
||||
Path string `db:"path"`
|
||||
PathName string `db:"path_name"`
|
||||
}
|
||||
|
||||
type Files struct {
|
||||
ID uint `gorm:"primaryKey"`
|
||||
Name string `gorm:"size:255"`
|
||||
Comment string `gorm:"type:text"`
|
||||
Path string `gorm:"type:text"`
|
||||
}
|
||||
|
||||
|
||||
type LibrarySection struct {
|
||||
ID int64 `db:"id"`
|
||||
Name string `db:"name"`
|
||||
SectionType int64 `db:"section_type"`
|
||||
Language string `db:"language"`
|
||||
UUID string `db:"uuid"`
|
||||
CreatedAt string `db:"created_at"`
|
||||
UpdatedAt string `db:"updated_at"`
|
||||
}
|
||||
type SectionLocation struct {
|
||||
ID int64 `db:"id"`
|
||||
LibrarySectionID int64 `db:"library_section_id"`
|
||||
RootPath string `db:"root_path"`
|
||||
CreatedAt string `db:"created_at"`
|
||||
UpdatedAt string `db:"updated_at"`
|
||||
}
|
||||
type MetadataItem struct {
|
||||
ID int64 `db:"id"`
|
||||
LibrarySectionID int64 `db:"library_section_id"`
|
||||
ParentID int64 `db:"parent_id"`
|
||||
MetadataType int64 `db:"metadata_type"`
|
||||
GUID string `db:"guid"`
|
||||
Title string `db:"title"`
|
||||
TitleSort string `db:"title_sort"`
|
||||
OriginalTitle string `db:"original_title"`
|
||||
Studio string `db:"studio"`
|
||||
Rating float64 `db:"rating"`
|
||||
ContentRating string `db:"content_rating"`
|
||||
Tagline string `db:"tagline"`
|
||||
Summary string `db:"summary"`
|
||||
Index int64 `db:"index"`
|
||||
Duration int64 `db:"duration"`
|
||||
ReleaseDate string `db:"release_date"`
|
||||
CreatedAt string `db:"created_at"`
|
||||
UpdatedAt string `db:"updated_at"`
|
||||
UserThumbURL string `db:"user_thumb_url"`
|
||||
}
|
||||
type MediaItem struct {
|
||||
ID int64 `db:"id"`
|
||||
MetadataItemID int64 `db:"metadata_item_id"`
|
||||
Duration int64 `db:"duration"`
|
||||
Bitrate int64 `db:"bitrate"`
|
||||
Width int64 `db:"width"`
|
||||
Height int64 `db:"height"`
|
||||
AspectRatio float64 `db:"aspect_ratio"`
|
||||
AudioCodec string `db:"audio_codec"`
|
||||
VideoCodec string `db:"video_codec"`
|
||||
Container string `db:"container"`
|
||||
CreatedAt string `db:"created_at"`
|
||||
UpdatedAt string `db:"updated_at"`
|
||||
}
|
||||
type MediaPart struct {
|
||||
ID int64 `db:"id"`
|
||||
MediaItemID int64 `db:"media_item_id"`
|
||||
File string `db:"file"`
|
||||
Duration int64 `db:"duration"`
|
||||
Size int64 `db:"size"`
|
||||
Indexes string `db:"indexes"`
|
||||
CreatedAt string `db:"created_at"`
|
||||
UpdatedAt string `db:"updated_at"`
|
||||
}
|
||||
type Tag struct {
|
||||
ID int64 `db:"id"`
|
||||
Tag string `db:"tag"`
|
||||
TagType int64 `db:"tag_type"`
|
||||
}
|
||||
type Tagging struct {
|
||||
ID int64 `db:"id"`
|
||||
MetadataItemID int64 `db:"metadata_item_id"`
|
||||
TagID int64 `db:"tag_id"`
|
||||
Index int64 `db:"index"`
|
||||
}
|
||||
194
internal/routes/routes.go
Normal file
194
internal/routes/routes.go
Normal file
@ -0,0 +1,194 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/controllers"
|
||||
"canguidev/shelfy/internal/middlewares"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
||||
func AddRoutes(superRoute *gin.RouterGroup,db *gorm.DB) {
|
||||
userRoutes(superRoute,db)
|
||||
testAcces(superRoute)
|
||||
loginRoutes(superRoute,db)
|
||||
pathRoute(superRoute,db)
|
||||
folderRoute(superRoute,db)
|
||||
downloadRoute(superRoute,db)
|
||||
}
|
||||
func loginRoutes(superRoute *gin.RouterGroup,db *gorm.DB) {
|
||||
loginRouter := superRoute.Group("/login")
|
||||
{
|
||||
loginRouter.POST("/", controllers.Login(db))
|
||||
}
|
||||
}
|
||||
|
||||
func userRoutes( superRoute *gin.RouterGroup,db*gorm.DB){
|
||||
userRoutes := superRoute.Group("/users")
|
||||
{
|
||||
userRoutes.POST("/",middlewares.CheckAuth(db),controllers.CreateUser(db))
|
||||
userRoutes.GET("/", middlewares.CheckAuth(db),controllers.ReadAllUser(db))
|
||||
userRoutes.GET("/:id", middlewares.CheckAuth(db),controllers.FindUserById(db))
|
||||
userRoutes.PUT("/:id", middlewares.CheckAuth(db),controllers.UpdateUser(db))
|
||||
userRoutes.DELETE("/:id", middlewares.CheckAuth(db),controllers.DeleteUser(db))
|
||||
}
|
||||
}
|
||||
func testAcces(superRoute *gin.RouterGroup){
|
||||
test := superRoute.Group("/test")
|
||||
{
|
||||
test.GET("/",controllers.TestPing())
|
||||
}
|
||||
}
|
||||
|
||||
func pathRoute (superRoute *gin.RouterGroup,db *gorm.DB){
|
||||
pathRoutes := superRoute.Group("/path")
|
||||
{
|
||||
pathRoutes.POST("/save-path", middlewares.CheckAuth(db),controllers.CreateSavePath(db))
|
||||
pathRoutes.GET("/save-path", middlewares.CheckAuth(db),controllers.ReadAllSavePath(db))
|
||||
pathRoutes.PUT("/save-path/:id", middlewares.CheckAuth(db),controllers.UpdateSavePath(db))
|
||||
pathRoutes.DELETE("/save-path/:id", middlewares.CheckAuth(db),controllers.DeleteSavePath(db))
|
||||
pathRoutes.POST("/save-path/validate", middlewares.CheckAuth(db),controllers.PathValidationHandler)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func folderRoute (superRoute *gin.RouterGroup,db *gorm.DB){
|
||||
|
||||
folderRoutes :=superRoute.Group("/folders")
|
||||
{
|
||||
folderRoutes.GET("/",middlewares.CheckAuth(db),controllers.StreamHandler(db))
|
||||
folderRoutes.GET("/details",middlewares.CheckAuth(db),controllers.DetailHandler())
|
||||
folderRoutes.GET("/file", middlewares.CheckAuth(db), func(c *gin.Context) {
|
||||
path := c.Query("path")
|
||||
filePath := filepath.Join("upload", filepath.Clean("/"+path))
|
||||
|
||||
ext := strings.ToLower(filepath.Ext(filePath))
|
||||
if ext == ".mp4" || ext == ".mkv" || ext == ".webm" || ext == ".mp3" {
|
||||
streamFile(c, filePath)
|
||||
} else {
|
||||
c.File(filePath)
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
func downloadRoute (superRoute *gin.RouterGroup,db *gorm.DB){
|
||||
downloadRoutes := superRoute.Group("/download")
|
||||
|
||||
{
|
||||
|
||||
downloadRoutes.GET("/jobs", middlewares.CheckAuth(db), controllers.HandleListJobs(db))
|
||||
downloadRoutes.GET("/debrid-status",middlewares.CheckAuth(db),controllers.GetDebridStatus(db))
|
||||
downloadRoutes.POST("/account", middlewares.CheckAuth(db),controllers.PostDebridLogin(db))
|
||||
downloadRoutes.POST("/add", middlewares.CheckAuth(db),controllers.HandleAddJobsMultiple(db))
|
||||
downloadRoutes.POST("/jobs/:id/start", middlewares.CheckAuth(db),controllers.HandleStartJob(db))
|
||||
downloadRoutes.POST("/jobs/:id/pause", middlewares.CheckAuth(db),controllers.HandlePauseJob())
|
||||
downloadRoutes.POST("/jobs/:id/resume", middlewares.CheckAuth(db),controllers.HandleResumeJob(db))
|
||||
downloadRoutes.DELETE("/jobs/:id", middlewares.CheckAuth(db),controllers.HandleDeleteJob(db))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func streamFile(c *gin.Context, filePath string) {
|
||||
log.Printf("[STREAM] ➡️ Requête streaming sur %s", filePath)
|
||||
|
||||
f, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
log.Printf("[STREAM][ERREUR] Impossible d'ouvrir: %v", err)
|
||||
c.Status(http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
fileStat, err := f.Stat()
|
||||
if err != nil {
|
||||
log.Printf("[STREAM][ERREUR] Stat impossible: %v", err)
|
||||
c.Status(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
fileSize := fileStat.Size()
|
||||
log.Printf("[STREAM] Taille du fichier: %d octets", fileSize)
|
||||
c.Header("Accept-Ranges", "bytes")
|
||||
c.Header("Content-Type", mimeTypeByExt(filePath))
|
||||
|
||||
rangeHeader := c.GetHeader("Range")
|
||||
log.Printf("[STREAM] Range header reçu: %q", rangeHeader)
|
||||
|
||||
if rangeHeader == "" {
|
||||
// Pas de Range, tout le fichier
|
||||
c.Header("Content-Length", strconv.FormatInt(fileSize, 10))
|
||||
log.Printf("[STREAM] 📦 Pas de Range, envoi du fichier complet (200 OK)")
|
||||
http.ServeContent(c.Writer, c.Request, fileStat.Name(), fileStat.ModTime(), f)
|
||||
return
|
||||
}
|
||||
|
||||
// Analyse du Range
|
||||
var start, end int64
|
||||
start, end = 0, fileSize-1
|
||||
|
||||
if strings.HasPrefix(rangeHeader, "bytes=") {
|
||||
rangeParts := strings.Split(strings.TrimPrefix(rangeHeader, "bytes="), "-")
|
||||
if len(rangeParts) == 2 {
|
||||
if s, err := strconv.ParseInt(rangeParts[0], 10, 64); err == nil {
|
||||
start = s
|
||||
}
|
||||
if rangeParts[1] != "" {
|
||||
if e, err := strconv.ParseInt(rangeParts[1], 10, 64); err == nil {
|
||||
end = e
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
log.Printf("[STREAM] Parsed range: start=%d, end=%d", start, end)
|
||||
|
||||
if start > end || start < 0 || end >= fileSize {
|
||||
log.Printf("[STREAM][ERREUR] Range invalide: %d-%d sur %d", start, end, fileSize)
|
||||
c.Status(http.StatusRequestedRangeNotSatisfiable)
|
||||
return
|
||||
}
|
||||
|
||||
c.Status(http.StatusPartialContent)
|
||||
c.Header("Content-Range", "bytes "+strconv.FormatInt(start, 10)+"-"+strconv.FormatInt(end, 10)+"/"+strconv.FormatInt(fileSize, 10))
|
||||
c.Header("Content-Length", strconv.FormatInt(end-start+1, 10))
|
||||
|
||||
log.Printf("[STREAM] ▶️ Envoi bytes %d-%d sur %d [%s]", start, end, fileSize, filePath)
|
||||
f.Seek(start, io.SeekStart)
|
||||
n, err := io.CopyN(c.Writer, f, end-start+1)
|
||||
if err != nil {
|
||||
log.Printf("[STREAM][ERREUR] pendant l'envoi: %v", err)
|
||||
} else {
|
||||
log.Printf("[STREAM] ✔️ Fini, envoyé %d octets", n)
|
||||
}
|
||||
}
|
||||
|
||||
// Helper : extension → Content-Type (très basique)
|
||||
func mimeTypeByExt(filePath string) string {
|
||||
ext := strings.ToLower(filepath.Ext(filePath))
|
||||
switch ext {
|
||||
case ".mp4":
|
||||
return "video/mp4"
|
||||
case ".mkv":
|
||||
return "video/x-matroska"
|
||||
case ".webm":
|
||||
return "video/webm"
|
||||
case ".mp3":
|
||||
return "audio/mpeg"
|
||||
case ".pdf":
|
||||
return "application/pdf"
|
||||
default:
|
||||
return "application/octet-stream"
|
||||
}
|
||||
}
|
||||
38
internal/utils/lib.go
Normal file
38
internal/utils/lib.go
Normal file
@ -0,0 +1,38 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/models"
|
||||
"fmt"
|
||||
"os"
|
||||
"gorm.io/gorm"
|
||||
"canguidev/shelfy/query"
|
||||
|
||||
)
|
||||
|
||||
func CreateDefaultFolder(db *gorm.DB) {
|
||||
folders := []string{"Film", "Série", "Manga","Magazine"}
|
||||
|
||||
for _, name := range folders {
|
||||
path := "upload/" + name
|
||||
|
||||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||
err := os.MkdirAll(path, 0755) // MkdirAll au cas où des dossiers parents manquent
|
||||
if err != nil {
|
||||
fmt.Printf("Erreur lors de la création du dossier %s : %v\n", path, err)
|
||||
} else {
|
||||
pathDownload := models.PathDownload{
|
||||
Path: path,
|
||||
PathName: name,
|
||||
}
|
||||
q := query.Use(db)
|
||||
if err := q.PathDownload.Create(&pathDownload); err != nil {
|
||||
fmt.Printf(`{"error": "Failed to create path %%s\n"}`, err)
|
||||
return
|
||||
}
|
||||
fmt.Printf("Dossier créé : %s\n", path)
|
||||
}
|
||||
} else {
|
||||
fmt.Printf("Dossier déjà existant : %s\n", path)
|
||||
}
|
||||
}
|
||||
}
|
||||
118
main.go
Normal file
118
main.go
Normal file
@ -0,0 +1,118 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"canguidev/shelfy/internal/db"
|
||||
"canguidev/shelfy/internal/routes"
|
||||
"canguidev/shelfy/internal/utils"
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
ftpserverlib "github.com/fclairamb/ftpserverlib"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/spf13/afero"
|
||||
)
|
||||
|
||||
// ------------ FTP DRIVER ------------
|
||||
|
||||
type ftpMainDriver struct{}
|
||||
|
||||
type ftpClientDriver struct {
|
||||
fs afero.Fs
|
||||
}
|
||||
|
||||
func (d *ftpMainDriver) GetSettings() (*ftpserverlib.Settings, error) {
|
||||
return &ftpserverlib.Settings{
|
||||
ListenAddr: ":2121",
|
||||
IdleTimeout: 300,
|
||||
ConnectionTimeout: 60,
|
||||
Banner: "Bienvenue sur le FTP Go!",
|
||||
}, nil
|
||||
}
|
||||
func (d *ftpMainDriver) ClientConnected(cc ftpserverlib.ClientContext) (string, error) {
|
||||
return "Bienvenue ! utilisateur FTP : test / test", nil
|
||||
}
|
||||
func (d *ftpMainDriver) ClientDisconnected(cc ftpserverlib.ClientContext) {}
|
||||
func (d *ftpMainDriver) GetTLSConfig() (*tls.Config, error) { return nil, nil }
|
||||
func (d *ftpMainDriver) AuthUser(cc ftpserverlib.ClientContext, user, pass string) (ftpserverlib.ClientDriver, error) {
|
||||
if user == "test" && pass == "test" {
|
||||
os.MkdirAll("upload", 0755)
|
||||
base := filepath.Clean("upload")
|
||||
fs := afero.NewBasePathFs(afero.NewOsFs(), base)
|
||||
return &ftpClientDriver{fs: fs}, nil
|
||||
}
|
||||
return nil, errors.New("invalid login")}
|
||||
|
||||
func (c *ftpClientDriver) Name() string { return "aferofs" }
|
||||
func (c *ftpClientDriver) Create(name string) (afero.File, error) { return c.fs.Create(name) }
|
||||
func (c *ftpClientDriver) Mkdir(name string, perm os.FileMode) error { return c.fs.Mkdir(name, perm) }
|
||||
func (c *ftpClientDriver) MkdirAll(path string, perm os.FileMode) error { return c.fs.MkdirAll(path, perm) }
|
||||
func (c *ftpClientDriver) Open(name string) (afero.File, error) { return c.fs.Open(name) }
|
||||
func (c *ftpClientDriver) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) {
|
||||
return c.fs.OpenFile(name, flag, perm)
|
||||
}
|
||||
func (c *ftpClientDriver) Remove(name string) error { return c.fs.Remove(name) }
|
||||
func (c *ftpClientDriver) RemoveAll(path string) error { return c.fs.RemoveAll(path) }
|
||||
func (c *ftpClientDriver) Rename(old, new string) error { return c.fs.Rename(old, new) }
|
||||
func (c *ftpClientDriver) Stat(name string) (os.FileInfo, error) {
|
||||
return c.fs.Stat(name)
|
||||
}
|
||||
func (c *ftpClientDriver) LstatIfPossible(name string) (os.FileInfo, bool, error) {
|
||||
fi, err := c.fs.Stat(name)
|
||||
return fi, false, err
|
||||
}
|
||||
|
||||
// Implémentation Chmod pour FTP (utilise l'OS direct, ou ignore si non supporté)
|
||||
func (c *ftpClientDriver) Chmod(name string, mode os.FileMode) error {
|
||||
// Essayons d'utiliser OsFs (car BasePathFs ne l'exporte pas)
|
||||
fullPath := filepath.Join("upload", name)
|
||||
return os.Chmod(fullPath, mode)
|
||||
}
|
||||
|
||||
// Implémentation Chown pour FTP (non supportée en général)
|
||||
func (c *ftpClientDriver) Chown(name string, uid, gid int) error {
|
||||
// Optionnel, non supporté par OsFs sur Windows/Mac
|
||||
return nil
|
||||
}
|
||||
|
||||
// Implémentation Chtimes pour FTP (utilise l'OS direct)
|
||||
func (c *ftpClientDriver) Chtimes(name string, atime, mtime time.Time) error {
|
||||
fullPath := filepath.Join("upload", name)
|
||||
return os.Chtimes(fullPath, atime, mtime)
|
||||
}
|
||||
|
||||
// ------------ MAIN ------------
|
||||
|
||||
func main() {
|
||||
go func() {
|
||||
ftpSrv := ftpserverlib.NewFtpServer(&ftpMainDriver{})
|
||||
log.Println("[FTP] Serveur FTP sur ftp://test:test@localhost:2121 (upload/)")
|
||||
if err := ftpSrv.ListenAndServe(); err != nil {
|
||||
log.Fatal("[FTP] Erreur FTP :", err)
|
||||
}
|
||||
}()
|
||||
|
||||
// Serveur HTTP Gin
|
||||
bd := db.InitDB()
|
||||
app := gin.Default()
|
||||
|
||||
api := app.Group("/api/v1")
|
||||
routes.AddRoutes(api, bd)
|
||||
utils.CreateDefaultFolder(bd)
|
||||
|
||||
app.Static("/static", "./web")
|
||||
app.NoRoute(func(c *gin.Context) {
|
||||
if strings.HasPrefix(c.Request.URL.Path, "/api/") {
|
||||
c.JSON(404, gin.H{"error": "Not found"})
|
||||
return
|
||||
}
|
||||
c.File("./web/index.html")
|
||||
})
|
||||
|
||||
log.Println("[HTTP] Serveur Gin sur http://localhost:8080")
|
||||
app.Run(":8080")
|
||||
}
|
||||
417
query/files.gen.go
Normal file
417
query/files.gen.go
Normal file
@ -0,0 +1,417 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
|
||||
"canguidev/shelfy/internal/models"
|
||||
)
|
||||
|
||||
func newFiles(db *gorm.DB, opts ...gen.DOOption) files {
|
||||
_files := files{}
|
||||
|
||||
_files.filesDo.UseDB(db, opts...)
|
||||
_files.filesDo.UseModel(&models.Files{})
|
||||
|
||||
tableName := _files.filesDo.TableName()
|
||||
_files.ALL = field.NewAsterisk(tableName)
|
||||
_files.ID = field.NewUint(tableName, "id")
|
||||
_files.Name = field.NewString(tableName, "name")
|
||||
_files.Comment = field.NewString(tableName, "comment")
|
||||
_files.Path = field.NewString(tableName, "path")
|
||||
|
||||
_files.fillFieldMap()
|
||||
|
||||
return _files
|
||||
}
|
||||
|
||||
type files struct {
|
||||
filesDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Uint
|
||||
Name field.String
|
||||
Comment field.String
|
||||
Path field.String
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (f files) Table(newTableName string) *files {
|
||||
f.filesDo.UseTable(newTableName)
|
||||
return f.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (f files) As(alias string) *files {
|
||||
f.filesDo.DO = *(f.filesDo.As(alias).(*gen.DO))
|
||||
return f.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (f *files) updateTableName(table string) *files {
|
||||
f.ALL = field.NewAsterisk(table)
|
||||
f.ID = field.NewUint(table, "id")
|
||||
f.Name = field.NewString(table, "name")
|
||||
f.Comment = field.NewString(table, "comment")
|
||||
f.Path = field.NewString(table, "path")
|
||||
|
||||
f.fillFieldMap()
|
||||
|
||||
return f
|
||||
}
|
||||
|
||||
func (f *files) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := f.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
}
|
||||
_oe, ok := _f.(field.OrderExpr)
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (f *files) fillFieldMap() {
|
||||
f.fieldMap = make(map[string]field.Expr, 4)
|
||||
f.fieldMap["id"] = f.ID
|
||||
f.fieldMap["name"] = f.Name
|
||||
f.fieldMap["comment"] = f.Comment
|
||||
f.fieldMap["path"] = f.Path
|
||||
}
|
||||
|
||||
func (f files) clone(db *gorm.DB) files {
|
||||
f.filesDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return f
|
||||
}
|
||||
|
||||
func (f files) replaceDB(db *gorm.DB) files {
|
||||
f.filesDo.ReplaceDB(db)
|
||||
return f
|
||||
}
|
||||
|
||||
type filesDo struct{ gen.DO }
|
||||
|
||||
type IFilesDo interface {
|
||||
gen.SubQuery
|
||||
Debug() IFilesDo
|
||||
WithContext(ctx context.Context) IFilesDo
|
||||
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
|
||||
ReplaceDB(db *gorm.DB)
|
||||
ReadDB() IFilesDo
|
||||
WriteDB() IFilesDo
|
||||
As(alias string) gen.Dao
|
||||
Session(config *gorm.Session) IFilesDo
|
||||
Columns(cols ...field.Expr) gen.Columns
|
||||
Clauses(conds ...clause.Expression) IFilesDo
|
||||
Not(conds ...gen.Condition) IFilesDo
|
||||
Or(conds ...gen.Condition) IFilesDo
|
||||
Select(conds ...field.Expr) IFilesDo
|
||||
Where(conds ...gen.Condition) IFilesDo
|
||||
Order(conds ...field.Expr) IFilesDo
|
||||
Distinct(cols ...field.Expr) IFilesDo
|
||||
Omit(cols ...field.Expr) IFilesDo
|
||||
Join(table schema.Tabler, on ...field.Expr) IFilesDo
|
||||
LeftJoin(table schema.Tabler, on ...field.Expr) IFilesDo
|
||||
RightJoin(table schema.Tabler, on ...field.Expr) IFilesDo
|
||||
Group(cols ...field.Expr) IFilesDo
|
||||
Having(conds ...gen.Condition) IFilesDo
|
||||
Limit(limit int) IFilesDo
|
||||
Offset(offset int) IFilesDo
|
||||
Count() (count int64, err error)
|
||||
Scopes(funcs ...func(gen.Dao) gen.Dao) IFilesDo
|
||||
Unscoped() IFilesDo
|
||||
Create(values ...*models.Files) error
|
||||
CreateInBatches(values []*models.Files, batchSize int) error
|
||||
Save(values ...*models.Files) error
|
||||
First() (*models.Files, error)
|
||||
Take() (*models.Files, error)
|
||||
Last() (*models.Files, error)
|
||||
Find() ([]*models.Files, error)
|
||||
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Files, err error)
|
||||
FindInBatches(result *[]*models.Files, batchSize int, fc func(tx gen.Dao, batch int) error) error
|
||||
Pluck(column field.Expr, dest interface{}) error
|
||||
Delete(...*models.Files) (info gen.ResultInfo, err error)
|
||||
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
Updates(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateFrom(q gen.SubQuery) gen.Dao
|
||||
Attrs(attrs ...field.AssignExpr) IFilesDo
|
||||
Assign(attrs ...field.AssignExpr) IFilesDo
|
||||
Joins(fields ...field.RelationField) IFilesDo
|
||||
Preload(fields ...field.RelationField) IFilesDo
|
||||
FirstOrInit() (*models.Files, error)
|
||||
FirstOrCreate() (*models.Files, error)
|
||||
FindByPage(offset int, limit int) (result []*models.Files, count int64, err error)
|
||||
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
|
||||
Rows() (*sql.Rows, error)
|
||||
Row() *sql.Row
|
||||
Scan(result interface{}) (err error)
|
||||
Returning(value interface{}, columns ...string) IFilesDo
|
||||
UnderlyingDB() *gorm.DB
|
||||
schema.Tabler
|
||||
|
||||
FilterWithNameAndRole(name string, role string) (result []models.Files, err error)
|
||||
}
|
||||
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
func (f filesDo) FilterWithNameAndRole(name string, role string) (result []models.Files, err error) {
|
||||
var params []interface{}
|
||||
|
||||
var generateSQL strings.Builder
|
||||
params = append(params, name)
|
||||
generateSQL.WriteString("SELECT * FROM files WHERE name = ? ")
|
||||
if role != "" {
|
||||
params = append(params, role)
|
||||
generateSQL.WriteString("AND role = ? ")
|
||||
}
|
||||
|
||||
var executeSQL *gorm.DB
|
||||
executeSQL = f.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
|
||||
err = executeSQL.Error
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (f filesDo) Debug() IFilesDo {
|
||||
return f.withDO(f.DO.Debug())
|
||||
}
|
||||
|
||||
func (f filesDo) WithContext(ctx context.Context) IFilesDo {
|
||||
return f.withDO(f.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (f filesDo) ReadDB() IFilesDo {
|
||||
return f.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (f filesDo) WriteDB() IFilesDo {
|
||||
return f.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (f filesDo) Session(config *gorm.Session) IFilesDo {
|
||||
return f.withDO(f.DO.Session(config))
|
||||
}
|
||||
|
||||
func (f filesDo) Clauses(conds ...clause.Expression) IFilesDo {
|
||||
return f.withDO(f.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (f filesDo) Returning(value interface{}, columns ...string) IFilesDo {
|
||||
return f.withDO(f.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (f filesDo) Not(conds ...gen.Condition) IFilesDo {
|
||||
return f.withDO(f.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (f filesDo) Or(conds ...gen.Condition) IFilesDo {
|
||||
return f.withDO(f.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (f filesDo) Select(conds ...field.Expr) IFilesDo {
|
||||
return f.withDO(f.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (f filesDo) Where(conds ...gen.Condition) IFilesDo {
|
||||
return f.withDO(f.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (f filesDo) Order(conds ...field.Expr) IFilesDo {
|
||||
return f.withDO(f.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (f filesDo) Distinct(cols ...field.Expr) IFilesDo {
|
||||
return f.withDO(f.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (f filesDo) Omit(cols ...field.Expr) IFilesDo {
|
||||
return f.withDO(f.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (f filesDo) Join(table schema.Tabler, on ...field.Expr) IFilesDo {
|
||||
return f.withDO(f.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (f filesDo) LeftJoin(table schema.Tabler, on ...field.Expr) IFilesDo {
|
||||
return f.withDO(f.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (f filesDo) RightJoin(table schema.Tabler, on ...field.Expr) IFilesDo {
|
||||
return f.withDO(f.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (f filesDo) Group(cols ...field.Expr) IFilesDo {
|
||||
return f.withDO(f.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (f filesDo) Having(conds ...gen.Condition) IFilesDo {
|
||||
return f.withDO(f.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (f filesDo) Limit(limit int) IFilesDo {
|
||||
return f.withDO(f.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (f filesDo) Offset(offset int) IFilesDo {
|
||||
return f.withDO(f.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (f filesDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IFilesDo {
|
||||
return f.withDO(f.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (f filesDo) Unscoped() IFilesDo {
|
||||
return f.withDO(f.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (f filesDo) Create(values ...*models.Files) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return f.DO.Create(values)
|
||||
}
|
||||
|
||||
func (f filesDo) CreateInBatches(values []*models.Files, batchSize int) error {
|
||||
return f.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (f filesDo) Save(values ...*models.Files) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return f.DO.Save(values)
|
||||
}
|
||||
|
||||
func (f filesDo) First() (*models.Files, error) {
|
||||
if result, err := f.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Files), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (f filesDo) Take() (*models.Files, error) {
|
||||
if result, err := f.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Files), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (f filesDo) Last() (*models.Files, error) {
|
||||
if result, err := f.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Files), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (f filesDo) Find() ([]*models.Files, error) {
|
||||
result, err := f.DO.Find()
|
||||
return result.([]*models.Files), err
|
||||
}
|
||||
|
||||
func (f filesDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Files, err error) {
|
||||
buf := make([]*models.Files, 0, batchSize)
|
||||
err = f.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (f filesDo) FindInBatches(result *[]*models.Files, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return f.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (f filesDo) Attrs(attrs ...field.AssignExpr) IFilesDo {
|
||||
return f.withDO(f.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (f filesDo) Assign(attrs ...field.AssignExpr) IFilesDo {
|
||||
return f.withDO(f.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (f filesDo) Joins(fields ...field.RelationField) IFilesDo {
|
||||
for _, _f := range fields {
|
||||
f = *f.withDO(f.DO.Joins(_f))
|
||||
}
|
||||
return &f
|
||||
}
|
||||
|
||||
func (f filesDo) Preload(fields ...field.RelationField) IFilesDo {
|
||||
for _, _f := range fields {
|
||||
f = *f.withDO(f.DO.Preload(_f))
|
||||
}
|
||||
return &f
|
||||
}
|
||||
|
||||
func (f filesDo) FirstOrInit() (*models.Files, error) {
|
||||
if result, err := f.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Files), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (f filesDo) FirstOrCreate() (*models.Files, error) {
|
||||
if result, err := f.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Files), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (f filesDo) FindByPage(offset int, limit int) (result []*models.Files, count int64, err error) {
|
||||
result, err = f.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if size := len(result); 0 < limit && 0 < size && size < limit {
|
||||
count = int64(size + offset)
|
||||
return
|
||||
}
|
||||
|
||||
count, err = f.Offset(-1).Limit(-1).Count()
|
||||
return
|
||||
}
|
||||
|
||||
func (f filesDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = f.Count()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = f.Offset(offset).Limit(limit).Scan(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (f filesDo) Scan(result interface{}) (err error) {
|
||||
return f.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (f filesDo) Delete(models ...*models.Files) (result gen.ResultInfo, err error) {
|
||||
return f.DO.Delete(models)
|
||||
}
|
||||
|
||||
func (f *filesDo) withDO(do gen.Dao) *filesDo {
|
||||
f.DO = *do.(*gen.DO)
|
||||
return f
|
||||
}
|
||||
175
query/gen.go
Normal file
175
query/gen.go
Normal file
@ -0,0 +1,175 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
"gorm.io/gen"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
)
|
||||
|
||||
var (
|
||||
Q = new(Query)
|
||||
Files *files
|
||||
LibrarySection *librarySection
|
||||
MediaItem *mediaItem
|
||||
MediaPart *mediaPart
|
||||
MetadataItem *metadataItem
|
||||
PathDownload *pathDownload
|
||||
SectionLocation *sectionLocation
|
||||
Tag *tag
|
||||
Tagging *tagging
|
||||
User *user
|
||||
)
|
||||
|
||||
func SetDefault(db *gorm.DB, opts ...gen.DOOption) {
|
||||
*Q = *Use(db, opts...)
|
||||
Files = &Q.Files
|
||||
LibrarySection = &Q.LibrarySection
|
||||
MediaItem = &Q.MediaItem
|
||||
MediaPart = &Q.MediaPart
|
||||
MetadataItem = &Q.MetadataItem
|
||||
PathDownload = &Q.PathDownload
|
||||
SectionLocation = &Q.SectionLocation
|
||||
Tag = &Q.Tag
|
||||
Tagging = &Q.Tagging
|
||||
User = &Q.User
|
||||
}
|
||||
|
||||
func Use(db *gorm.DB, opts ...gen.DOOption) *Query {
|
||||
return &Query{
|
||||
db: db,
|
||||
Files: newFiles(db, opts...),
|
||||
LibrarySection: newLibrarySection(db, opts...),
|
||||
MediaItem: newMediaItem(db, opts...),
|
||||
MediaPart: newMediaPart(db, opts...),
|
||||
MetadataItem: newMetadataItem(db, opts...),
|
||||
PathDownload: newPathDownload(db, opts...),
|
||||
SectionLocation: newSectionLocation(db, opts...),
|
||||
Tag: newTag(db, opts...),
|
||||
Tagging: newTagging(db, opts...),
|
||||
User: newUser(db, opts...),
|
||||
}
|
||||
}
|
||||
|
||||
type Query struct {
|
||||
db *gorm.DB
|
||||
|
||||
Files files
|
||||
LibrarySection librarySection
|
||||
MediaItem mediaItem
|
||||
MediaPart mediaPart
|
||||
MetadataItem metadataItem
|
||||
PathDownload pathDownload
|
||||
SectionLocation sectionLocation
|
||||
Tag tag
|
||||
Tagging tagging
|
||||
User user
|
||||
}
|
||||
|
||||
func (q *Query) Available() bool { return q.db != nil }
|
||||
|
||||
func (q *Query) clone(db *gorm.DB) *Query {
|
||||
return &Query{
|
||||
db: db,
|
||||
Files: q.Files.clone(db),
|
||||
LibrarySection: q.LibrarySection.clone(db),
|
||||
MediaItem: q.MediaItem.clone(db),
|
||||
MediaPart: q.MediaPart.clone(db),
|
||||
MetadataItem: q.MetadataItem.clone(db),
|
||||
PathDownload: q.PathDownload.clone(db),
|
||||
SectionLocation: q.SectionLocation.clone(db),
|
||||
Tag: q.Tag.clone(db),
|
||||
Tagging: q.Tagging.clone(db),
|
||||
User: q.User.clone(db),
|
||||
}
|
||||
}
|
||||
|
||||
func (q *Query) ReadDB() *Query {
|
||||
return q.ReplaceDB(q.db.Clauses(dbresolver.Read))
|
||||
}
|
||||
|
||||
func (q *Query) WriteDB() *Query {
|
||||
return q.ReplaceDB(q.db.Clauses(dbresolver.Write))
|
||||
}
|
||||
|
||||
func (q *Query) ReplaceDB(db *gorm.DB) *Query {
|
||||
return &Query{
|
||||
db: db,
|
||||
Files: q.Files.replaceDB(db),
|
||||
LibrarySection: q.LibrarySection.replaceDB(db),
|
||||
MediaItem: q.MediaItem.replaceDB(db),
|
||||
MediaPart: q.MediaPart.replaceDB(db),
|
||||
MetadataItem: q.MetadataItem.replaceDB(db),
|
||||
PathDownload: q.PathDownload.replaceDB(db),
|
||||
SectionLocation: q.SectionLocation.replaceDB(db),
|
||||
Tag: q.Tag.replaceDB(db),
|
||||
Tagging: q.Tagging.replaceDB(db),
|
||||
User: q.User.replaceDB(db),
|
||||
}
|
||||
}
|
||||
|
||||
type queryCtx struct {
|
||||
Files IFilesDo
|
||||
LibrarySection ILibrarySectionDo
|
||||
MediaItem IMediaItemDo
|
||||
MediaPart IMediaPartDo
|
||||
MetadataItem IMetadataItemDo
|
||||
PathDownload IPathDownloadDo
|
||||
SectionLocation ISectionLocationDo
|
||||
Tag ITagDo
|
||||
Tagging ITaggingDo
|
||||
User IUserDo
|
||||
}
|
||||
|
||||
func (q *Query) WithContext(ctx context.Context) *queryCtx {
|
||||
return &queryCtx{
|
||||
Files: q.Files.WithContext(ctx),
|
||||
LibrarySection: q.LibrarySection.WithContext(ctx),
|
||||
MediaItem: q.MediaItem.WithContext(ctx),
|
||||
MediaPart: q.MediaPart.WithContext(ctx),
|
||||
MetadataItem: q.MetadataItem.WithContext(ctx),
|
||||
PathDownload: q.PathDownload.WithContext(ctx),
|
||||
SectionLocation: q.SectionLocation.WithContext(ctx),
|
||||
Tag: q.Tag.WithContext(ctx),
|
||||
Tagging: q.Tagging.WithContext(ctx),
|
||||
User: q.User.WithContext(ctx),
|
||||
}
|
||||
}
|
||||
|
||||
func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error {
|
||||
return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...)
|
||||
}
|
||||
|
||||
func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx {
|
||||
tx := q.db.Begin(opts...)
|
||||
return &QueryTx{Query: q.clone(tx), Error: tx.Error}
|
||||
}
|
||||
|
||||
type QueryTx struct {
|
||||
*Query
|
||||
Error error
|
||||
}
|
||||
|
||||
func (q *QueryTx) Commit() error {
|
||||
return q.db.Commit().Error
|
||||
}
|
||||
|
||||
func (q *QueryTx) Rollback() error {
|
||||
return q.db.Rollback().Error
|
||||
}
|
||||
|
||||
func (q *QueryTx) SavePoint(name string) error {
|
||||
return q.db.SavePoint(name).Error
|
||||
}
|
||||
|
||||
func (q *QueryTx) RollbackTo(name string) error {
|
||||
return q.db.RollbackTo(name).Error
|
||||
}
|
||||
429
query/library_sections.gen.go
Normal file
429
query/library_sections.gen.go
Normal file
@ -0,0 +1,429 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
|
||||
"canguidev/shelfy/internal/models"
|
||||
)
|
||||
|
||||
func newLibrarySection(db *gorm.DB, opts ...gen.DOOption) librarySection {
|
||||
_librarySection := librarySection{}
|
||||
|
||||
_librarySection.librarySectionDo.UseDB(db, opts...)
|
||||
_librarySection.librarySectionDo.UseModel(&models.LibrarySection{})
|
||||
|
||||
tableName := _librarySection.librarySectionDo.TableName()
|
||||
_librarySection.ALL = field.NewAsterisk(tableName)
|
||||
_librarySection.ID = field.NewInt64(tableName, "id")
|
||||
_librarySection.Name = field.NewString(tableName, "name")
|
||||
_librarySection.SectionType = field.NewInt64(tableName, "section_type")
|
||||
_librarySection.Language = field.NewString(tableName, "language")
|
||||
_librarySection.UUID = field.NewString(tableName, "uuid")
|
||||
_librarySection.CreatedAt = field.NewString(tableName, "created_at")
|
||||
_librarySection.UpdatedAt = field.NewString(tableName, "updated_at")
|
||||
|
||||
_librarySection.fillFieldMap()
|
||||
|
||||
return _librarySection
|
||||
}
|
||||
|
||||
type librarySection struct {
|
||||
librarySectionDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Int64
|
||||
Name field.String
|
||||
SectionType field.Int64
|
||||
Language field.String
|
||||
UUID field.String
|
||||
CreatedAt field.String
|
||||
UpdatedAt field.String
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (l librarySection) Table(newTableName string) *librarySection {
|
||||
l.librarySectionDo.UseTable(newTableName)
|
||||
return l.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (l librarySection) As(alias string) *librarySection {
|
||||
l.librarySectionDo.DO = *(l.librarySectionDo.As(alias).(*gen.DO))
|
||||
return l.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (l *librarySection) updateTableName(table string) *librarySection {
|
||||
l.ALL = field.NewAsterisk(table)
|
||||
l.ID = field.NewInt64(table, "id")
|
||||
l.Name = field.NewString(table, "name")
|
||||
l.SectionType = field.NewInt64(table, "section_type")
|
||||
l.Language = field.NewString(table, "language")
|
||||
l.UUID = field.NewString(table, "uuid")
|
||||
l.CreatedAt = field.NewString(table, "created_at")
|
||||
l.UpdatedAt = field.NewString(table, "updated_at")
|
||||
|
||||
l.fillFieldMap()
|
||||
|
||||
return l
|
||||
}
|
||||
|
||||
func (l *librarySection) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := l.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
}
|
||||
_oe, ok := _f.(field.OrderExpr)
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (l *librarySection) fillFieldMap() {
|
||||
l.fieldMap = make(map[string]field.Expr, 7)
|
||||
l.fieldMap["id"] = l.ID
|
||||
l.fieldMap["name"] = l.Name
|
||||
l.fieldMap["section_type"] = l.SectionType
|
||||
l.fieldMap["language"] = l.Language
|
||||
l.fieldMap["uuid"] = l.UUID
|
||||
l.fieldMap["created_at"] = l.CreatedAt
|
||||
l.fieldMap["updated_at"] = l.UpdatedAt
|
||||
}
|
||||
|
||||
func (l librarySection) clone(db *gorm.DB) librarySection {
|
||||
l.librarySectionDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return l
|
||||
}
|
||||
|
||||
func (l librarySection) replaceDB(db *gorm.DB) librarySection {
|
||||
l.librarySectionDo.ReplaceDB(db)
|
||||
return l
|
||||
}
|
||||
|
||||
type librarySectionDo struct{ gen.DO }
|
||||
|
||||
type ILibrarySectionDo interface {
|
||||
gen.SubQuery
|
||||
Debug() ILibrarySectionDo
|
||||
WithContext(ctx context.Context) ILibrarySectionDo
|
||||
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
|
||||
ReplaceDB(db *gorm.DB)
|
||||
ReadDB() ILibrarySectionDo
|
||||
WriteDB() ILibrarySectionDo
|
||||
As(alias string) gen.Dao
|
||||
Session(config *gorm.Session) ILibrarySectionDo
|
||||
Columns(cols ...field.Expr) gen.Columns
|
||||
Clauses(conds ...clause.Expression) ILibrarySectionDo
|
||||
Not(conds ...gen.Condition) ILibrarySectionDo
|
||||
Or(conds ...gen.Condition) ILibrarySectionDo
|
||||
Select(conds ...field.Expr) ILibrarySectionDo
|
||||
Where(conds ...gen.Condition) ILibrarySectionDo
|
||||
Order(conds ...field.Expr) ILibrarySectionDo
|
||||
Distinct(cols ...field.Expr) ILibrarySectionDo
|
||||
Omit(cols ...field.Expr) ILibrarySectionDo
|
||||
Join(table schema.Tabler, on ...field.Expr) ILibrarySectionDo
|
||||
LeftJoin(table schema.Tabler, on ...field.Expr) ILibrarySectionDo
|
||||
RightJoin(table schema.Tabler, on ...field.Expr) ILibrarySectionDo
|
||||
Group(cols ...field.Expr) ILibrarySectionDo
|
||||
Having(conds ...gen.Condition) ILibrarySectionDo
|
||||
Limit(limit int) ILibrarySectionDo
|
||||
Offset(offset int) ILibrarySectionDo
|
||||
Count() (count int64, err error)
|
||||
Scopes(funcs ...func(gen.Dao) gen.Dao) ILibrarySectionDo
|
||||
Unscoped() ILibrarySectionDo
|
||||
Create(values ...*models.LibrarySection) error
|
||||
CreateInBatches(values []*models.LibrarySection, batchSize int) error
|
||||
Save(values ...*models.LibrarySection) error
|
||||
First() (*models.LibrarySection, error)
|
||||
Take() (*models.LibrarySection, error)
|
||||
Last() (*models.LibrarySection, error)
|
||||
Find() ([]*models.LibrarySection, error)
|
||||
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.LibrarySection, err error)
|
||||
FindInBatches(result *[]*models.LibrarySection, batchSize int, fc func(tx gen.Dao, batch int) error) error
|
||||
Pluck(column field.Expr, dest interface{}) error
|
||||
Delete(...*models.LibrarySection) (info gen.ResultInfo, err error)
|
||||
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
Updates(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateFrom(q gen.SubQuery) gen.Dao
|
||||
Attrs(attrs ...field.AssignExpr) ILibrarySectionDo
|
||||
Assign(attrs ...field.AssignExpr) ILibrarySectionDo
|
||||
Joins(fields ...field.RelationField) ILibrarySectionDo
|
||||
Preload(fields ...field.RelationField) ILibrarySectionDo
|
||||
FirstOrInit() (*models.LibrarySection, error)
|
||||
FirstOrCreate() (*models.LibrarySection, error)
|
||||
FindByPage(offset int, limit int) (result []*models.LibrarySection, count int64, err error)
|
||||
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
|
||||
Rows() (*sql.Rows, error)
|
||||
Row() *sql.Row
|
||||
Scan(result interface{}) (err error)
|
||||
Returning(value interface{}, columns ...string) ILibrarySectionDo
|
||||
UnderlyingDB() *gorm.DB
|
||||
schema.Tabler
|
||||
|
||||
FilterWithNameAndRole(name string, role string) (result []models.LibrarySection, err error)
|
||||
}
|
||||
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
func (l librarySectionDo) FilterWithNameAndRole(name string, role string) (result []models.LibrarySection, err error) {
|
||||
var params []interface{}
|
||||
|
||||
var generateSQL strings.Builder
|
||||
params = append(params, name)
|
||||
generateSQL.WriteString("SELECT * FROM library_sections WHERE name = ? ")
|
||||
if role != "" {
|
||||
params = append(params, role)
|
||||
generateSQL.WriteString("AND role = ? ")
|
||||
}
|
||||
|
||||
var executeSQL *gorm.DB
|
||||
executeSQL = l.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
|
||||
err = executeSQL.Error
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Debug() ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Debug())
|
||||
}
|
||||
|
||||
func (l librarySectionDo) WithContext(ctx context.Context) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) ReadDB() ILibrarySectionDo {
|
||||
return l.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (l librarySectionDo) WriteDB() ILibrarySectionDo {
|
||||
return l.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Session(config *gorm.Session) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Session(config))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Clauses(conds ...clause.Expression) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Returning(value interface{}, columns ...string) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Not(conds ...gen.Condition) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Or(conds ...gen.Condition) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Select(conds ...field.Expr) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Where(conds ...gen.Condition) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Order(conds ...field.Expr) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Distinct(cols ...field.Expr) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Omit(cols ...field.Expr) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Join(table schema.Tabler, on ...field.Expr) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) LeftJoin(table schema.Tabler, on ...field.Expr) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) RightJoin(table schema.Tabler, on ...field.Expr) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Group(cols ...field.Expr) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Having(conds ...gen.Condition) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Limit(limit int) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Offset(offset int) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Unscoped() ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Create(values ...*models.LibrarySection) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return l.DO.Create(values)
|
||||
}
|
||||
|
||||
func (l librarySectionDo) CreateInBatches(values []*models.LibrarySection, batchSize int) error {
|
||||
return l.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (l librarySectionDo) Save(values ...*models.LibrarySection) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return l.DO.Save(values)
|
||||
}
|
||||
|
||||
func (l librarySectionDo) First() (*models.LibrarySection, error) {
|
||||
if result, err := l.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.LibrarySection), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Take() (*models.LibrarySection, error) {
|
||||
if result, err := l.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.LibrarySection), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Last() (*models.LibrarySection, error) {
|
||||
if result, err := l.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.LibrarySection), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Find() ([]*models.LibrarySection, error) {
|
||||
result, err := l.DO.Find()
|
||||
return result.([]*models.LibrarySection), err
|
||||
}
|
||||
|
||||
func (l librarySectionDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.LibrarySection, err error) {
|
||||
buf := make([]*models.LibrarySection, 0, batchSize)
|
||||
err = l.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (l librarySectionDo) FindInBatches(result *[]*models.LibrarySection, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return l.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Attrs(attrs ...field.AssignExpr) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Assign(attrs ...field.AssignExpr) ILibrarySectionDo {
|
||||
return l.withDO(l.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Joins(fields ...field.RelationField) ILibrarySectionDo {
|
||||
for _, _f := range fields {
|
||||
l = *l.withDO(l.DO.Joins(_f))
|
||||
}
|
||||
return &l
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Preload(fields ...field.RelationField) ILibrarySectionDo {
|
||||
for _, _f := range fields {
|
||||
l = *l.withDO(l.DO.Preload(_f))
|
||||
}
|
||||
return &l
|
||||
}
|
||||
|
||||
func (l librarySectionDo) FirstOrInit() (*models.LibrarySection, error) {
|
||||
if result, err := l.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.LibrarySection), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (l librarySectionDo) FirstOrCreate() (*models.LibrarySection, error) {
|
||||
if result, err := l.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.LibrarySection), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (l librarySectionDo) FindByPage(offset int, limit int) (result []*models.LibrarySection, count int64, err error) {
|
||||
result, err = l.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if size := len(result); 0 < limit && 0 < size && size < limit {
|
||||
count = int64(size + offset)
|
||||
return
|
||||
}
|
||||
|
||||
count, err = l.Offset(-1).Limit(-1).Count()
|
||||
return
|
||||
}
|
||||
|
||||
func (l librarySectionDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = l.Count()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = l.Offset(offset).Limit(limit).Scan(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Scan(result interface{}) (err error) {
|
||||
return l.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (l librarySectionDo) Delete(models ...*models.LibrarySection) (result gen.ResultInfo, err error) {
|
||||
return l.DO.Delete(models)
|
||||
}
|
||||
|
||||
func (l *librarySectionDo) withDO(do gen.Dao) *librarySectionDo {
|
||||
l.DO = *do.(*gen.DO)
|
||||
return l
|
||||
}
|
||||
449
query/media_items.gen.go
Normal file
449
query/media_items.gen.go
Normal file
@ -0,0 +1,449 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
|
||||
"canguidev/shelfy/internal/models"
|
||||
)
|
||||
|
||||
func newMediaItem(db *gorm.DB, opts ...gen.DOOption) mediaItem {
|
||||
_mediaItem := mediaItem{}
|
||||
|
||||
_mediaItem.mediaItemDo.UseDB(db, opts...)
|
||||
_mediaItem.mediaItemDo.UseModel(&models.MediaItem{})
|
||||
|
||||
tableName := _mediaItem.mediaItemDo.TableName()
|
||||
_mediaItem.ALL = field.NewAsterisk(tableName)
|
||||
_mediaItem.ID = field.NewInt64(tableName, "id")
|
||||
_mediaItem.MetadataItemID = field.NewInt64(tableName, "metadata_item_id")
|
||||
_mediaItem.Duration = field.NewInt64(tableName, "duration")
|
||||
_mediaItem.Bitrate = field.NewInt64(tableName, "bitrate")
|
||||
_mediaItem.Width = field.NewInt64(tableName, "width")
|
||||
_mediaItem.Height = field.NewInt64(tableName, "height")
|
||||
_mediaItem.AspectRatio = field.NewFloat64(tableName, "aspect_ratio")
|
||||
_mediaItem.AudioCodec = field.NewString(tableName, "audio_codec")
|
||||
_mediaItem.VideoCodec = field.NewString(tableName, "video_codec")
|
||||
_mediaItem.Container = field.NewString(tableName, "container")
|
||||
_mediaItem.CreatedAt = field.NewString(tableName, "created_at")
|
||||
_mediaItem.UpdatedAt = field.NewString(tableName, "updated_at")
|
||||
|
||||
_mediaItem.fillFieldMap()
|
||||
|
||||
return _mediaItem
|
||||
}
|
||||
|
||||
type mediaItem struct {
|
||||
mediaItemDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Int64
|
||||
MetadataItemID field.Int64
|
||||
Duration field.Int64
|
||||
Bitrate field.Int64
|
||||
Width field.Int64
|
||||
Height field.Int64
|
||||
AspectRatio field.Float64
|
||||
AudioCodec field.String
|
||||
VideoCodec field.String
|
||||
Container field.String
|
||||
CreatedAt field.String
|
||||
UpdatedAt field.String
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (m mediaItem) Table(newTableName string) *mediaItem {
|
||||
m.mediaItemDo.UseTable(newTableName)
|
||||
return m.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (m mediaItem) As(alias string) *mediaItem {
|
||||
m.mediaItemDo.DO = *(m.mediaItemDo.As(alias).(*gen.DO))
|
||||
return m.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (m *mediaItem) updateTableName(table string) *mediaItem {
|
||||
m.ALL = field.NewAsterisk(table)
|
||||
m.ID = field.NewInt64(table, "id")
|
||||
m.MetadataItemID = field.NewInt64(table, "metadata_item_id")
|
||||
m.Duration = field.NewInt64(table, "duration")
|
||||
m.Bitrate = field.NewInt64(table, "bitrate")
|
||||
m.Width = field.NewInt64(table, "width")
|
||||
m.Height = field.NewInt64(table, "height")
|
||||
m.AspectRatio = field.NewFloat64(table, "aspect_ratio")
|
||||
m.AudioCodec = field.NewString(table, "audio_codec")
|
||||
m.VideoCodec = field.NewString(table, "video_codec")
|
||||
m.Container = field.NewString(table, "container")
|
||||
m.CreatedAt = field.NewString(table, "created_at")
|
||||
m.UpdatedAt = field.NewString(table, "updated_at")
|
||||
|
||||
m.fillFieldMap()
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
func (m *mediaItem) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := m.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
}
|
||||
_oe, ok := _f.(field.OrderExpr)
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (m *mediaItem) fillFieldMap() {
|
||||
m.fieldMap = make(map[string]field.Expr, 12)
|
||||
m.fieldMap["id"] = m.ID
|
||||
m.fieldMap["metadata_item_id"] = m.MetadataItemID
|
||||
m.fieldMap["duration"] = m.Duration
|
||||
m.fieldMap["bitrate"] = m.Bitrate
|
||||
m.fieldMap["width"] = m.Width
|
||||
m.fieldMap["height"] = m.Height
|
||||
m.fieldMap["aspect_ratio"] = m.AspectRatio
|
||||
m.fieldMap["audio_codec"] = m.AudioCodec
|
||||
m.fieldMap["video_codec"] = m.VideoCodec
|
||||
m.fieldMap["container"] = m.Container
|
||||
m.fieldMap["created_at"] = m.CreatedAt
|
||||
m.fieldMap["updated_at"] = m.UpdatedAt
|
||||
}
|
||||
|
||||
func (m mediaItem) clone(db *gorm.DB) mediaItem {
|
||||
m.mediaItemDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return m
|
||||
}
|
||||
|
||||
func (m mediaItem) replaceDB(db *gorm.DB) mediaItem {
|
||||
m.mediaItemDo.ReplaceDB(db)
|
||||
return m
|
||||
}
|
||||
|
||||
type mediaItemDo struct{ gen.DO }
|
||||
|
||||
type IMediaItemDo interface {
|
||||
gen.SubQuery
|
||||
Debug() IMediaItemDo
|
||||
WithContext(ctx context.Context) IMediaItemDo
|
||||
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
|
||||
ReplaceDB(db *gorm.DB)
|
||||
ReadDB() IMediaItemDo
|
||||
WriteDB() IMediaItemDo
|
||||
As(alias string) gen.Dao
|
||||
Session(config *gorm.Session) IMediaItemDo
|
||||
Columns(cols ...field.Expr) gen.Columns
|
||||
Clauses(conds ...clause.Expression) IMediaItemDo
|
||||
Not(conds ...gen.Condition) IMediaItemDo
|
||||
Or(conds ...gen.Condition) IMediaItemDo
|
||||
Select(conds ...field.Expr) IMediaItemDo
|
||||
Where(conds ...gen.Condition) IMediaItemDo
|
||||
Order(conds ...field.Expr) IMediaItemDo
|
||||
Distinct(cols ...field.Expr) IMediaItemDo
|
||||
Omit(cols ...field.Expr) IMediaItemDo
|
||||
Join(table schema.Tabler, on ...field.Expr) IMediaItemDo
|
||||
LeftJoin(table schema.Tabler, on ...field.Expr) IMediaItemDo
|
||||
RightJoin(table schema.Tabler, on ...field.Expr) IMediaItemDo
|
||||
Group(cols ...field.Expr) IMediaItemDo
|
||||
Having(conds ...gen.Condition) IMediaItemDo
|
||||
Limit(limit int) IMediaItemDo
|
||||
Offset(offset int) IMediaItemDo
|
||||
Count() (count int64, err error)
|
||||
Scopes(funcs ...func(gen.Dao) gen.Dao) IMediaItemDo
|
||||
Unscoped() IMediaItemDo
|
||||
Create(values ...*models.MediaItem) error
|
||||
CreateInBatches(values []*models.MediaItem, batchSize int) error
|
||||
Save(values ...*models.MediaItem) error
|
||||
First() (*models.MediaItem, error)
|
||||
Take() (*models.MediaItem, error)
|
||||
Last() (*models.MediaItem, error)
|
||||
Find() ([]*models.MediaItem, error)
|
||||
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MediaItem, err error)
|
||||
FindInBatches(result *[]*models.MediaItem, batchSize int, fc func(tx gen.Dao, batch int) error) error
|
||||
Pluck(column field.Expr, dest interface{}) error
|
||||
Delete(...*models.MediaItem) (info gen.ResultInfo, err error)
|
||||
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
Updates(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateFrom(q gen.SubQuery) gen.Dao
|
||||
Attrs(attrs ...field.AssignExpr) IMediaItemDo
|
||||
Assign(attrs ...field.AssignExpr) IMediaItemDo
|
||||
Joins(fields ...field.RelationField) IMediaItemDo
|
||||
Preload(fields ...field.RelationField) IMediaItemDo
|
||||
FirstOrInit() (*models.MediaItem, error)
|
||||
FirstOrCreate() (*models.MediaItem, error)
|
||||
FindByPage(offset int, limit int) (result []*models.MediaItem, count int64, err error)
|
||||
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
|
||||
Rows() (*sql.Rows, error)
|
||||
Row() *sql.Row
|
||||
Scan(result interface{}) (err error)
|
||||
Returning(value interface{}, columns ...string) IMediaItemDo
|
||||
UnderlyingDB() *gorm.DB
|
||||
schema.Tabler
|
||||
|
||||
FilterWithNameAndRole(name string, role string) (result []models.MediaItem, err error)
|
||||
}
|
||||
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
func (m mediaItemDo) FilterWithNameAndRole(name string, role string) (result []models.MediaItem, err error) {
|
||||
var params []interface{}
|
||||
|
||||
var generateSQL strings.Builder
|
||||
params = append(params, name)
|
||||
generateSQL.WriteString("SELECT * FROM media_items WHERE name = ? ")
|
||||
if role != "" {
|
||||
params = append(params, role)
|
||||
generateSQL.WriteString("AND role = ? ")
|
||||
}
|
||||
|
||||
var executeSQL *gorm.DB
|
||||
executeSQL = m.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
|
||||
err = executeSQL.Error
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Debug() IMediaItemDo {
|
||||
return m.withDO(m.DO.Debug())
|
||||
}
|
||||
|
||||
func (m mediaItemDo) WithContext(ctx context.Context) IMediaItemDo {
|
||||
return m.withDO(m.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) ReadDB() IMediaItemDo {
|
||||
return m.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (m mediaItemDo) WriteDB() IMediaItemDo {
|
||||
return m.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Session(config *gorm.Session) IMediaItemDo {
|
||||
return m.withDO(m.DO.Session(config))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Clauses(conds ...clause.Expression) IMediaItemDo {
|
||||
return m.withDO(m.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Returning(value interface{}, columns ...string) IMediaItemDo {
|
||||
return m.withDO(m.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Not(conds ...gen.Condition) IMediaItemDo {
|
||||
return m.withDO(m.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Or(conds ...gen.Condition) IMediaItemDo {
|
||||
return m.withDO(m.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Select(conds ...field.Expr) IMediaItemDo {
|
||||
return m.withDO(m.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Where(conds ...gen.Condition) IMediaItemDo {
|
||||
return m.withDO(m.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Order(conds ...field.Expr) IMediaItemDo {
|
||||
return m.withDO(m.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Distinct(cols ...field.Expr) IMediaItemDo {
|
||||
return m.withDO(m.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Omit(cols ...field.Expr) IMediaItemDo {
|
||||
return m.withDO(m.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Join(table schema.Tabler, on ...field.Expr) IMediaItemDo {
|
||||
return m.withDO(m.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) LeftJoin(table schema.Tabler, on ...field.Expr) IMediaItemDo {
|
||||
return m.withDO(m.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) RightJoin(table schema.Tabler, on ...field.Expr) IMediaItemDo {
|
||||
return m.withDO(m.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Group(cols ...field.Expr) IMediaItemDo {
|
||||
return m.withDO(m.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Having(conds ...gen.Condition) IMediaItemDo {
|
||||
return m.withDO(m.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Limit(limit int) IMediaItemDo {
|
||||
return m.withDO(m.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Offset(offset int) IMediaItemDo {
|
||||
return m.withDO(m.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IMediaItemDo {
|
||||
return m.withDO(m.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Unscoped() IMediaItemDo {
|
||||
return m.withDO(m.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Create(values ...*models.MediaItem) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return m.DO.Create(values)
|
||||
}
|
||||
|
||||
func (m mediaItemDo) CreateInBatches(values []*models.MediaItem, batchSize int) error {
|
||||
return m.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (m mediaItemDo) Save(values ...*models.MediaItem) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return m.DO.Save(values)
|
||||
}
|
||||
|
||||
func (m mediaItemDo) First() (*models.MediaItem, error) {
|
||||
if result, err := m.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MediaItem), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Take() (*models.MediaItem, error) {
|
||||
if result, err := m.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MediaItem), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Last() (*models.MediaItem, error) {
|
||||
if result, err := m.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MediaItem), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Find() ([]*models.MediaItem, error) {
|
||||
result, err := m.DO.Find()
|
||||
return result.([]*models.MediaItem), err
|
||||
}
|
||||
|
||||
func (m mediaItemDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MediaItem, err error) {
|
||||
buf := make([]*models.MediaItem, 0, batchSize)
|
||||
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (m mediaItemDo) FindInBatches(result *[]*models.MediaItem, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return m.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Attrs(attrs ...field.AssignExpr) IMediaItemDo {
|
||||
return m.withDO(m.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Assign(attrs ...field.AssignExpr) IMediaItemDo {
|
||||
return m.withDO(m.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Joins(fields ...field.RelationField) IMediaItemDo {
|
||||
for _, _f := range fields {
|
||||
m = *m.withDO(m.DO.Joins(_f))
|
||||
}
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Preload(fields ...field.RelationField) IMediaItemDo {
|
||||
for _, _f := range fields {
|
||||
m = *m.withDO(m.DO.Preload(_f))
|
||||
}
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m mediaItemDo) FirstOrInit() (*models.MediaItem, error) {
|
||||
if result, err := m.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MediaItem), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaItemDo) FirstOrCreate() (*models.MediaItem, error) {
|
||||
if result, err := m.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MediaItem), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaItemDo) FindByPage(offset int, limit int) (result []*models.MediaItem, count int64, err error) {
|
||||
result, err = m.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if size := len(result); 0 < limit && 0 < size && size < limit {
|
||||
count = int64(size + offset)
|
||||
return
|
||||
}
|
||||
|
||||
count, err = m.Offset(-1).Limit(-1).Count()
|
||||
return
|
||||
}
|
||||
|
||||
func (m mediaItemDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = m.Count()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = m.Offset(offset).Limit(limit).Scan(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Scan(result interface{}) (err error) {
|
||||
return m.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (m mediaItemDo) Delete(models ...*models.MediaItem) (result gen.ResultInfo, err error) {
|
||||
return m.DO.Delete(models)
|
||||
}
|
||||
|
||||
func (m *mediaItemDo) withDO(do gen.Dao) *mediaItemDo {
|
||||
m.DO = *do.(*gen.DO)
|
||||
return m
|
||||
}
|
||||
433
query/media_parts.gen.go
Normal file
433
query/media_parts.gen.go
Normal file
@ -0,0 +1,433 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
|
||||
"canguidev/shelfy/internal/models"
|
||||
)
|
||||
|
||||
func newMediaPart(db *gorm.DB, opts ...gen.DOOption) mediaPart {
|
||||
_mediaPart := mediaPart{}
|
||||
|
||||
_mediaPart.mediaPartDo.UseDB(db, opts...)
|
||||
_mediaPart.mediaPartDo.UseModel(&models.MediaPart{})
|
||||
|
||||
tableName := _mediaPart.mediaPartDo.TableName()
|
||||
_mediaPart.ALL = field.NewAsterisk(tableName)
|
||||
_mediaPart.ID = field.NewInt64(tableName, "id")
|
||||
_mediaPart.MediaItemID = field.NewInt64(tableName, "media_item_id")
|
||||
_mediaPart.File = field.NewString(tableName, "file")
|
||||
_mediaPart.Duration = field.NewInt64(tableName, "duration")
|
||||
_mediaPart.Size = field.NewInt64(tableName, "size")
|
||||
_mediaPart.Indexes = field.NewString(tableName, "indexes")
|
||||
_mediaPart.CreatedAt = field.NewString(tableName, "created_at")
|
||||
_mediaPart.UpdatedAt = field.NewString(tableName, "updated_at")
|
||||
|
||||
_mediaPart.fillFieldMap()
|
||||
|
||||
return _mediaPart
|
||||
}
|
||||
|
||||
type mediaPart struct {
|
||||
mediaPartDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Int64
|
||||
MediaItemID field.Int64
|
||||
File field.String
|
||||
Duration field.Int64
|
||||
Size field.Int64
|
||||
Indexes field.String
|
||||
CreatedAt field.String
|
||||
UpdatedAt field.String
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (m mediaPart) Table(newTableName string) *mediaPart {
|
||||
m.mediaPartDo.UseTable(newTableName)
|
||||
return m.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (m mediaPart) As(alias string) *mediaPart {
|
||||
m.mediaPartDo.DO = *(m.mediaPartDo.As(alias).(*gen.DO))
|
||||
return m.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (m *mediaPart) updateTableName(table string) *mediaPart {
|
||||
m.ALL = field.NewAsterisk(table)
|
||||
m.ID = field.NewInt64(table, "id")
|
||||
m.MediaItemID = field.NewInt64(table, "media_item_id")
|
||||
m.File = field.NewString(table, "file")
|
||||
m.Duration = field.NewInt64(table, "duration")
|
||||
m.Size = field.NewInt64(table, "size")
|
||||
m.Indexes = field.NewString(table, "indexes")
|
||||
m.CreatedAt = field.NewString(table, "created_at")
|
||||
m.UpdatedAt = field.NewString(table, "updated_at")
|
||||
|
||||
m.fillFieldMap()
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
func (m *mediaPart) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := m.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
}
|
||||
_oe, ok := _f.(field.OrderExpr)
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (m *mediaPart) fillFieldMap() {
|
||||
m.fieldMap = make(map[string]field.Expr, 8)
|
||||
m.fieldMap["id"] = m.ID
|
||||
m.fieldMap["media_item_id"] = m.MediaItemID
|
||||
m.fieldMap["file"] = m.File
|
||||
m.fieldMap["duration"] = m.Duration
|
||||
m.fieldMap["size"] = m.Size
|
||||
m.fieldMap["indexes"] = m.Indexes
|
||||
m.fieldMap["created_at"] = m.CreatedAt
|
||||
m.fieldMap["updated_at"] = m.UpdatedAt
|
||||
}
|
||||
|
||||
func (m mediaPart) clone(db *gorm.DB) mediaPart {
|
||||
m.mediaPartDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return m
|
||||
}
|
||||
|
||||
func (m mediaPart) replaceDB(db *gorm.DB) mediaPart {
|
||||
m.mediaPartDo.ReplaceDB(db)
|
||||
return m
|
||||
}
|
||||
|
||||
type mediaPartDo struct{ gen.DO }
|
||||
|
||||
type IMediaPartDo interface {
|
||||
gen.SubQuery
|
||||
Debug() IMediaPartDo
|
||||
WithContext(ctx context.Context) IMediaPartDo
|
||||
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
|
||||
ReplaceDB(db *gorm.DB)
|
||||
ReadDB() IMediaPartDo
|
||||
WriteDB() IMediaPartDo
|
||||
As(alias string) gen.Dao
|
||||
Session(config *gorm.Session) IMediaPartDo
|
||||
Columns(cols ...field.Expr) gen.Columns
|
||||
Clauses(conds ...clause.Expression) IMediaPartDo
|
||||
Not(conds ...gen.Condition) IMediaPartDo
|
||||
Or(conds ...gen.Condition) IMediaPartDo
|
||||
Select(conds ...field.Expr) IMediaPartDo
|
||||
Where(conds ...gen.Condition) IMediaPartDo
|
||||
Order(conds ...field.Expr) IMediaPartDo
|
||||
Distinct(cols ...field.Expr) IMediaPartDo
|
||||
Omit(cols ...field.Expr) IMediaPartDo
|
||||
Join(table schema.Tabler, on ...field.Expr) IMediaPartDo
|
||||
LeftJoin(table schema.Tabler, on ...field.Expr) IMediaPartDo
|
||||
RightJoin(table schema.Tabler, on ...field.Expr) IMediaPartDo
|
||||
Group(cols ...field.Expr) IMediaPartDo
|
||||
Having(conds ...gen.Condition) IMediaPartDo
|
||||
Limit(limit int) IMediaPartDo
|
||||
Offset(offset int) IMediaPartDo
|
||||
Count() (count int64, err error)
|
||||
Scopes(funcs ...func(gen.Dao) gen.Dao) IMediaPartDo
|
||||
Unscoped() IMediaPartDo
|
||||
Create(values ...*models.MediaPart) error
|
||||
CreateInBatches(values []*models.MediaPart, batchSize int) error
|
||||
Save(values ...*models.MediaPart) error
|
||||
First() (*models.MediaPart, error)
|
||||
Take() (*models.MediaPart, error)
|
||||
Last() (*models.MediaPart, error)
|
||||
Find() ([]*models.MediaPart, error)
|
||||
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MediaPart, err error)
|
||||
FindInBatches(result *[]*models.MediaPart, batchSize int, fc func(tx gen.Dao, batch int) error) error
|
||||
Pluck(column field.Expr, dest interface{}) error
|
||||
Delete(...*models.MediaPart) (info gen.ResultInfo, err error)
|
||||
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
Updates(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateFrom(q gen.SubQuery) gen.Dao
|
||||
Attrs(attrs ...field.AssignExpr) IMediaPartDo
|
||||
Assign(attrs ...field.AssignExpr) IMediaPartDo
|
||||
Joins(fields ...field.RelationField) IMediaPartDo
|
||||
Preload(fields ...field.RelationField) IMediaPartDo
|
||||
FirstOrInit() (*models.MediaPart, error)
|
||||
FirstOrCreate() (*models.MediaPart, error)
|
||||
FindByPage(offset int, limit int) (result []*models.MediaPart, count int64, err error)
|
||||
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
|
||||
Rows() (*sql.Rows, error)
|
||||
Row() *sql.Row
|
||||
Scan(result interface{}) (err error)
|
||||
Returning(value interface{}, columns ...string) IMediaPartDo
|
||||
UnderlyingDB() *gorm.DB
|
||||
schema.Tabler
|
||||
|
||||
FilterWithNameAndRole(name string, role string) (result []models.MediaPart, err error)
|
||||
}
|
||||
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
func (m mediaPartDo) FilterWithNameAndRole(name string, role string) (result []models.MediaPart, err error) {
|
||||
var params []interface{}
|
||||
|
||||
var generateSQL strings.Builder
|
||||
params = append(params, name)
|
||||
generateSQL.WriteString("SELECT * FROM media_parts WHERE name = ? ")
|
||||
if role != "" {
|
||||
params = append(params, role)
|
||||
generateSQL.WriteString("AND role = ? ")
|
||||
}
|
||||
|
||||
var executeSQL *gorm.DB
|
||||
executeSQL = m.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
|
||||
err = executeSQL.Error
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Debug() IMediaPartDo {
|
||||
return m.withDO(m.DO.Debug())
|
||||
}
|
||||
|
||||
func (m mediaPartDo) WithContext(ctx context.Context) IMediaPartDo {
|
||||
return m.withDO(m.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) ReadDB() IMediaPartDo {
|
||||
return m.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (m mediaPartDo) WriteDB() IMediaPartDo {
|
||||
return m.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Session(config *gorm.Session) IMediaPartDo {
|
||||
return m.withDO(m.DO.Session(config))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Clauses(conds ...clause.Expression) IMediaPartDo {
|
||||
return m.withDO(m.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Returning(value interface{}, columns ...string) IMediaPartDo {
|
||||
return m.withDO(m.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Not(conds ...gen.Condition) IMediaPartDo {
|
||||
return m.withDO(m.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Or(conds ...gen.Condition) IMediaPartDo {
|
||||
return m.withDO(m.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Select(conds ...field.Expr) IMediaPartDo {
|
||||
return m.withDO(m.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Where(conds ...gen.Condition) IMediaPartDo {
|
||||
return m.withDO(m.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Order(conds ...field.Expr) IMediaPartDo {
|
||||
return m.withDO(m.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Distinct(cols ...field.Expr) IMediaPartDo {
|
||||
return m.withDO(m.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Omit(cols ...field.Expr) IMediaPartDo {
|
||||
return m.withDO(m.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Join(table schema.Tabler, on ...field.Expr) IMediaPartDo {
|
||||
return m.withDO(m.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) LeftJoin(table schema.Tabler, on ...field.Expr) IMediaPartDo {
|
||||
return m.withDO(m.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) RightJoin(table schema.Tabler, on ...field.Expr) IMediaPartDo {
|
||||
return m.withDO(m.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Group(cols ...field.Expr) IMediaPartDo {
|
||||
return m.withDO(m.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Having(conds ...gen.Condition) IMediaPartDo {
|
||||
return m.withDO(m.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Limit(limit int) IMediaPartDo {
|
||||
return m.withDO(m.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Offset(offset int) IMediaPartDo {
|
||||
return m.withDO(m.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IMediaPartDo {
|
||||
return m.withDO(m.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Unscoped() IMediaPartDo {
|
||||
return m.withDO(m.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Create(values ...*models.MediaPart) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return m.DO.Create(values)
|
||||
}
|
||||
|
||||
func (m mediaPartDo) CreateInBatches(values []*models.MediaPart, batchSize int) error {
|
||||
return m.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (m mediaPartDo) Save(values ...*models.MediaPart) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return m.DO.Save(values)
|
||||
}
|
||||
|
||||
func (m mediaPartDo) First() (*models.MediaPart, error) {
|
||||
if result, err := m.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MediaPart), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Take() (*models.MediaPart, error) {
|
||||
if result, err := m.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MediaPart), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Last() (*models.MediaPart, error) {
|
||||
if result, err := m.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MediaPart), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Find() ([]*models.MediaPart, error) {
|
||||
result, err := m.DO.Find()
|
||||
return result.([]*models.MediaPart), err
|
||||
}
|
||||
|
||||
func (m mediaPartDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MediaPart, err error) {
|
||||
buf := make([]*models.MediaPart, 0, batchSize)
|
||||
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (m mediaPartDo) FindInBatches(result *[]*models.MediaPart, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return m.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Attrs(attrs ...field.AssignExpr) IMediaPartDo {
|
||||
return m.withDO(m.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Assign(attrs ...field.AssignExpr) IMediaPartDo {
|
||||
return m.withDO(m.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Joins(fields ...field.RelationField) IMediaPartDo {
|
||||
for _, _f := range fields {
|
||||
m = *m.withDO(m.DO.Joins(_f))
|
||||
}
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Preload(fields ...field.RelationField) IMediaPartDo {
|
||||
for _, _f := range fields {
|
||||
m = *m.withDO(m.DO.Preload(_f))
|
||||
}
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m mediaPartDo) FirstOrInit() (*models.MediaPart, error) {
|
||||
if result, err := m.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MediaPart), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaPartDo) FirstOrCreate() (*models.MediaPart, error) {
|
||||
if result, err := m.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MediaPart), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaPartDo) FindByPage(offset int, limit int) (result []*models.MediaPart, count int64, err error) {
|
||||
result, err = m.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if size := len(result); 0 < limit && 0 < size && size < limit {
|
||||
count = int64(size + offset)
|
||||
return
|
||||
}
|
||||
|
||||
count, err = m.Offset(-1).Limit(-1).Count()
|
||||
return
|
||||
}
|
||||
|
||||
func (m mediaPartDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = m.Count()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = m.Offset(offset).Limit(limit).Scan(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Scan(result interface{}) (err error) {
|
||||
return m.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (m mediaPartDo) Delete(models ...*models.MediaPart) (result gen.ResultInfo, err error) {
|
||||
return m.DO.Delete(models)
|
||||
}
|
||||
|
||||
func (m *mediaPartDo) withDO(do gen.Dao) *mediaPartDo {
|
||||
m.DO = *do.(*gen.DO)
|
||||
return m
|
||||
}
|
||||
477
query/metadata_items.gen.go
Normal file
477
query/metadata_items.gen.go
Normal file
@ -0,0 +1,477 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
|
||||
"canguidev/shelfy/internal/models"
|
||||
)
|
||||
|
||||
func newMetadataItem(db *gorm.DB, opts ...gen.DOOption) metadataItem {
|
||||
_metadataItem := metadataItem{}
|
||||
|
||||
_metadataItem.metadataItemDo.UseDB(db, opts...)
|
||||
_metadataItem.metadataItemDo.UseModel(&models.MetadataItem{})
|
||||
|
||||
tableName := _metadataItem.metadataItemDo.TableName()
|
||||
_metadataItem.ALL = field.NewAsterisk(tableName)
|
||||
_metadataItem.ID = field.NewInt64(tableName, "id")
|
||||
_metadataItem.LibrarySectionID = field.NewInt64(tableName, "library_section_id")
|
||||
_metadataItem.ParentID = field.NewInt64(tableName, "parent_id")
|
||||
_metadataItem.MetadataType = field.NewInt64(tableName, "metadata_type")
|
||||
_metadataItem.GUID = field.NewString(tableName, "guid")
|
||||
_metadataItem.Title = field.NewString(tableName, "title")
|
||||
_metadataItem.TitleSort = field.NewString(tableName, "title_sort")
|
||||
_metadataItem.OriginalTitle = field.NewString(tableName, "original_title")
|
||||
_metadataItem.Studio = field.NewString(tableName, "studio")
|
||||
_metadataItem.Rating = field.NewFloat64(tableName, "rating")
|
||||
_metadataItem.ContentRating = field.NewString(tableName, "content_rating")
|
||||
_metadataItem.Tagline = field.NewString(tableName, "tagline")
|
||||
_metadataItem.Summary = field.NewString(tableName, "summary")
|
||||
_metadataItem.Index = field.NewInt64(tableName, "index")
|
||||
_metadataItem.Duration = field.NewInt64(tableName, "duration")
|
||||
_metadataItem.ReleaseDate = field.NewString(tableName, "release_date")
|
||||
_metadataItem.CreatedAt = field.NewString(tableName, "created_at")
|
||||
_metadataItem.UpdatedAt = field.NewString(tableName, "updated_at")
|
||||
_metadataItem.UserThumbURL = field.NewString(tableName, "user_thumb_url")
|
||||
|
||||
_metadataItem.fillFieldMap()
|
||||
|
||||
return _metadataItem
|
||||
}
|
||||
|
||||
type metadataItem struct {
|
||||
metadataItemDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Int64
|
||||
LibrarySectionID field.Int64
|
||||
ParentID field.Int64
|
||||
MetadataType field.Int64
|
||||
GUID field.String
|
||||
Title field.String
|
||||
TitleSort field.String
|
||||
OriginalTitle field.String
|
||||
Studio field.String
|
||||
Rating field.Float64
|
||||
ContentRating field.String
|
||||
Tagline field.String
|
||||
Summary field.String
|
||||
Index field.Int64
|
||||
Duration field.Int64
|
||||
ReleaseDate field.String
|
||||
CreatedAt field.String
|
||||
UpdatedAt field.String
|
||||
UserThumbURL field.String
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (m metadataItem) Table(newTableName string) *metadataItem {
|
||||
m.metadataItemDo.UseTable(newTableName)
|
||||
return m.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (m metadataItem) As(alias string) *metadataItem {
|
||||
m.metadataItemDo.DO = *(m.metadataItemDo.As(alias).(*gen.DO))
|
||||
return m.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (m *metadataItem) updateTableName(table string) *metadataItem {
|
||||
m.ALL = field.NewAsterisk(table)
|
||||
m.ID = field.NewInt64(table, "id")
|
||||
m.LibrarySectionID = field.NewInt64(table, "library_section_id")
|
||||
m.ParentID = field.NewInt64(table, "parent_id")
|
||||
m.MetadataType = field.NewInt64(table, "metadata_type")
|
||||
m.GUID = field.NewString(table, "guid")
|
||||
m.Title = field.NewString(table, "title")
|
||||
m.TitleSort = field.NewString(table, "title_sort")
|
||||
m.OriginalTitle = field.NewString(table, "original_title")
|
||||
m.Studio = field.NewString(table, "studio")
|
||||
m.Rating = field.NewFloat64(table, "rating")
|
||||
m.ContentRating = field.NewString(table, "content_rating")
|
||||
m.Tagline = field.NewString(table, "tagline")
|
||||
m.Summary = field.NewString(table, "summary")
|
||||
m.Index = field.NewInt64(table, "index")
|
||||
m.Duration = field.NewInt64(table, "duration")
|
||||
m.ReleaseDate = field.NewString(table, "release_date")
|
||||
m.CreatedAt = field.NewString(table, "created_at")
|
||||
m.UpdatedAt = field.NewString(table, "updated_at")
|
||||
m.UserThumbURL = field.NewString(table, "user_thumb_url")
|
||||
|
||||
m.fillFieldMap()
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
func (m *metadataItem) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := m.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
}
|
||||
_oe, ok := _f.(field.OrderExpr)
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (m *metadataItem) fillFieldMap() {
|
||||
m.fieldMap = make(map[string]field.Expr, 19)
|
||||
m.fieldMap["id"] = m.ID
|
||||
m.fieldMap["library_section_id"] = m.LibrarySectionID
|
||||
m.fieldMap["parent_id"] = m.ParentID
|
||||
m.fieldMap["metadata_type"] = m.MetadataType
|
||||
m.fieldMap["guid"] = m.GUID
|
||||
m.fieldMap["title"] = m.Title
|
||||
m.fieldMap["title_sort"] = m.TitleSort
|
||||
m.fieldMap["original_title"] = m.OriginalTitle
|
||||
m.fieldMap["studio"] = m.Studio
|
||||
m.fieldMap["rating"] = m.Rating
|
||||
m.fieldMap["content_rating"] = m.ContentRating
|
||||
m.fieldMap["tagline"] = m.Tagline
|
||||
m.fieldMap["summary"] = m.Summary
|
||||
m.fieldMap["index"] = m.Index
|
||||
m.fieldMap["duration"] = m.Duration
|
||||
m.fieldMap["release_date"] = m.ReleaseDate
|
||||
m.fieldMap["created_at"] = m.CreatedAt
|
||||
m.fieldMap["updated_at"] = m.UpdatedAt
|
||||
m.fieldMap["user_thumb_url"] = m.UserThumbURL
|
||||
}
|
||||
|
||||
func (m metadataItem) clone(db *gorm.DB) metadataItem {
|
||||
m.metadataItemDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return m
|
||||
}
|
||||
|
||||
func (m metadataItem) replaceDB(db *gorm.DB) metadataItem {
|
||||
m.metadataItemDo.ReplaceDB(db)
|
||||
return m
|
||||
}
|
||||
|
||||
type metadataItemDo struct{ gen.DO }
|
||||
|
||||
type IMetadataItemDo interface {
|
||||
gen.SubQuery
|
||||
Debug() IMetadataItemDo
|
||||
WithContext(ctx context.Context) IMetadataItemDo
|
||||
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
|
||||
ReplaceDB(db *gorm.DB)
|
||||
ReadDB() IMetadataItemDo
|
||||
WriteDB() IMetadataItemDo
|
||||
As(alias string) gen.Dao
|
||||
Session(config *gorm.Session) IMetadataItemDo
|
||||
Columns(cols ...field.Expr) gen.Columns
|
||||
Clauses(conds ...clause.Expression) IMetadataItemDo
|
||||
Not(conds ...gen.Condition) IMetadataItemDo
|
||||
Or(conds ...gen.Condition) IMetadataItemDo
|
||||
Select(conds ...field.Expr) IMetadataItemDo
|
||||
Where(conds ...gen.Condition) IMetadataItemDo
|
||||
Order(conds ...field.Expr) IMetadataItemDo
|
||||
Distinct(cols ...field.Expr) IMetadataItemDo
|
||||
Omit(cols ...field.Expr) IMetadataItemDo
|
||||
Join(table schema.Tabler, on ...field.Expr) IMetadataItemDo
|
||||
LeftJoin(table schema.Tabler, on ...field.Expr) IMetadataItemDo
|
||||
RightJoin(table schema.Tabler, on ...field.Expr) IMetadataItemDo
|
||||
Group(cols ...field.Expr) IMetadataItemDo
|
||||
Having(conds ...gen.Condition) IMetadataItemDo
|
||||
Limit(limit int) IMetadataItemDo
|
||||
Offset(offset int) IMetadataItemDo
|
||||
Count() (count int64, err error)
|
||||
Scopes(funcs ...func(gen.Dao) gen.Dao) IMetadataItemDo
|
||||
Unscoped() IMetadataItemDo
|
||||
Create(values ...*models.MetadataItem) error
|
||||
CreateInBatches(values []*models.MetadataItem, batchSize int) error
|
||||
Save(values ...*models.MetadataItem) error
|
||||
First() (*models.MetadataItem, error)
|
||||
Take() (*models.MetadataItem, error)
|
||||
Last() (*models.MetadataItem, error)
|
||||
Find() ([]*models.MetadataItem, error)
|
||||
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MetadataItem, err error)
|
||||
FindInBatches(result *[]*models.MetadataItem, batchSize int, fc func(tx gen.Dao, batch int) error) error
|
||||
Pluck(column field.Expr, dest interface{}) error
|
||||
Delete(...*models.MetadataItem) (info gen.ResultInfo, err error)
|
||||
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
Updates(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateFrom(q gen.SubQuery) gen.Dao
|
||||
Attrs(attrs ...field.AssignExpr) IMetadataItemDo
|
||||
Assign(attrs ...field.AssignExpr) IMetadataItemDo
|
||||
Joins(fields ...field.RelationField) IMetadataItemDo
|
||||
Preload(fields ...field.RelationField) IMetadataItemDo
|
||||
FirstOrInit() (*models.MetadataItem, error)
|
||||
FirstOrCreate() (*models.MetadataItem, error)
|
||||
FindByPage(offset int, limit int) (result []*models.MetadataItem, count int64, err error)
|
||||
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
|
||||
Rows() (*sql.Rows, error)
|
||||
Row() *sql.Row
|
||||
Scan(result interface{}) (err error)
|
||||
Returning(value interface{}, columns ...string) IMetadataItemDo
|
||||
UnderlyingDB() *gorm.DB
|
||||
schema.Tabler
|
||||
|
||||
FilterWithNameAndRole(name string, role string) (result []models.MetadataItem, err error)
|
||||
}
|
||||
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
func (m metadataItemDo) FilterWithNameAndRole(name string, role string) (result []models.MetadataItem, err error) {
|
||||
var params []interface{}
|
||||
|
||||
var generateSQL strings.Builder
|
||||
params = append(params, name)
|
||||
generateSQL.WriteString("SELECT * FROM metadata_items WHERE name = ? ")
|
||||
if role != "" {
|
||||
params = append(params, role)
|
||||
generateSQL.WriteString("AND role = ? ")
|
||||
}
|
||||
|
||||
var executeSQL *gorm.DB
|
||||
executeSQL = m.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
|
||||
err = executeSQL.Error
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Debug() IMetadataItemDo {
|
||||
return m.withDO(m.DO.Debug())
|
||||
}
|
||||
|
||||
func (m metadataItemDo) WithContext(ctx context.Context) IMetadataItemDo {
|
||||
return m.withDO(m.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) ReadDB() IMetadataItemDo {
|
||||
return m.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (m metadataItemDo) WriteDB() IMetadataItemDo {
|
||||
return m.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Session(config *gorm.Session) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Session(config))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Clauses(conds ...clause.Expression) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Returning(value interface{}, columns ...string) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Not(conds ...gen.Condition) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Or(conds ...gen.Condition) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Select(conds ...field.Expr) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Where(conds ...gen.Condition) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Order(conds ...field.Expr) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Distinct(cols ...field.Expr) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Omit(cols ...field.Expr) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Join(table schema.Tabler, on ...field.Expr) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) LeftJoin(table schema.Tabler, on ...field.Expr) IMetadataItemDo {
|
||||
return m.withDO(m.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) RightJoin(table schema.Tabler, on ...field.Expr) IMetadataItemDo {
|
||||
return m.withDO(m.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Group(cols ...field.Expr) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Having(conds ...gen.Condition) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Limit(limit int) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Offset(offset int) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Unscoped() IMetadataItemDo {
|
||||
return m.withDO(m.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Create(values ...*models.MetadataItem) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return m.DO.Create(values)
|
||||
}
|
||||
|
||||
func (m metadataItemDo) CreateInBatches(values []*models.MetadataItem, batchSize int) error {
|
||||
return m.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (m metadataItemDo) Save(values ...*models.MetadataItem) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return m.DO.Save(values)
|
||||
}
|
||||
|
||||
func (m metadataItemDo) First() (*models.MetadataItem, error) {
|
||||
if result, err := m.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MetadataItem), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Take() (*models.MetadataItem, error) {
|
||||
if result, err := m.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MetadataItem), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Last() (*models.MetadataItem, error) {
|
||||
if result, err := m.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MetadataItem), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Find() ([]*models.MetadataItem, error) {
|
||||
result, err := m.DO.Find()
|
||||
return result.([]*models.MetadataItem), err
|
||||
}
|
||||
|
||||
func (m metadataItemDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.MetadataItem, err error) {
|
||||
buf := make([]*models.MetadataItem, 0, batchSize)
|
||||
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (m metadataItemDo) FindInBatches(result *[]*models.MetadataItem, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return m.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Attrs(attrs ...field.AssignExpr) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Assign(attrs ...field.AssignExpr) IMetadataItemDo {
|
||||
return m.withDO(m.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Joins(fields ...field.RelationField) IMetadataItemDo {
|
||||
for _, _f := range fields {
|
||||
m = *m.withDO(m.DO.Joins(_f))
|
||||
}
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Preload(fields ...field.RelationField) IMetadataItemDo {
|
||||
for _, _f := range fields {
|
||||
m = *m.withDO(m.DO.Preload(_f))
|
||||
}
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m metadataItemDo) FirstOrInit() (*models.MetadataItem, error) {
|
||||
if result, err := m.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MetadataItem), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m metadataItemDo) FirstOrCreate() (*models.MetadataItem, error) {
|
||||
if result, err := m.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.MetadataItem), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m metadataItemDo) FindByPage(offset int, limit int) (result []*models.MetadataItem, count int64, err error) {
|
||||
result, err = m.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if size := len(result); 0 < limit && 0 < size && size < limit {
|
||||
count = int64(size + offset)
|
||||
return
|
||||
}
|
||||
|
||||
count, err = m.Offset(-1).Limit(-1).Count()
|
||||
return
|
||||
}
|
||||
|
||||
func (m metadataItemDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = m.Count()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = m.Offset(offset).Limit(limit).Scan(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Scan(result interface{}) (err error) {
|
||||
return m.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (m metadataItemDo) Delete(models ...*models.MetadataItem) (result gen.ResultInfo, err error) {
|
||||
return m.DO.Delete(models)
|
||||
}
|
||||
|
||||
func (m *metadataItemDo) withDO(do gen.Dao) *metadataItemDo {
|
||||
m.DO = *do.(*gen.DO)
|
||||
return m
|
||||
}
|
||||
413
query/path_downloads.gen.go
Normal file
413
query/path_downloads.gen.go
Normal file
@ -0,0 +1,413 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
|
||||
"canguidev/shelfy/internal/models"
|
||||
)
|
||||
|
||||
func newPathDownload(db *gorm.DB, opts ...gen.DOOption) pathDownload {
|
||||
_pathDownload := pathDownload{}
|
||||
|
||||
_pathDownload.pathDownloadDo.UseDB(db, opts...)
|
||||
_pathDownload.pathDownloadDo.UseModel(&models.PathDownload{})
|
||||
|
||||
tableName := _pathDownload.pathDownloadDo.TableName()
|
||||
_pathDownload.ALL = field.NewAsterisk(tableName)
|
||||
_pathDownload.ID = field.NewInt64(tableName, "id")
|
||||
_pathDownload.Path = field.NewString(tableName, "path")
|
||||
_pathDownload.PathName = field.NewString(tableName, "path_name")
|
||||
|
||||
_pathDownload.fillFieldMap()
|
||||
|
||||
return _pathDownload
|
||||
}
|
||||
|
||||
type pathDownload struct {
|
||||
pathDownloadDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Int64
|
||||
Path field.String
|
||||
PathName field.String
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (p pathDownload) Table(newTableName string) *pathDownload {
|
||||
p.pathDownloadDo.UseTable(newTableName)
|
||||
return p.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (p pathDownload) As(alias string) *pathDownload {
|
||||
p.pathDownloadDo.DO = *(p.pathDownloadDo.As(alias).(*gen.DO))
|
||||
return p.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (p *pathDownload) updateTableName(table string) *pathDownload {
|
||||
p.ALL = field.NewAsterisk(table)
|
||||
p.ID = field.NewInt64(table, "id")
|
||||
p.Path = field.NewString(table, "path")
|
||||
p.PathName = field.NewString(table, "path_name")
|
||||
|
||||
p.fillFieldMap()
|
||||
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *pathDownload) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := p.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
}
|
||||
_oe, ok := _f.(field.OrderExpr)
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (p *pathDownload) fillFieldMap() {
|
||||
p.fieldMap = make(map[string]field.Expr, 3)
|
||||
p.fieldMap["id"] = p.ID
|
||||
p.fieldMap["path"] = p.Path
|
||||
p.fieldMap["path_name"] = p.PathName
|
||||
}
|
||||
|
||||
func (p pathDownload) clone(db *gorm.DB) pathDownload {
|
||||
p.pathDownloadDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return p
|
||||
}
|
||||
|
||||
func (p pathDownload) replaceDB(db *gorm.DB) pathDownload {
|
||||
p.pathDownloadDo.ReplaceDB(db)
|
||||
return p
|
||||
}
|
||||
|
||||
type pathDownloadDo struct{ gen.DO }
|
||||
|
||||
type IPathDownloadDo interface {
|
||||
gen.SubQuery
|
||||
Debug() IPathDownloadDo
|
||||
WithContext(ctx context.Context) IPathDownloadDo
|
||||
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
|
||||
ReplaceDB(db *gorm.DB)
|
||||
ReadDB() IPathDownloadDo
|
||||
WriteDB() IPathDownloadDo
|
||||
As(alias string) gen.Dao
|
||||
Session(config *gorm.Session) IPathDownloadDo
|
||||
Columns(cols ...field.Expr) gen.Columns
|
||||
Clauses(conds ...clause.Expression) IPathDownloadDo
|
||||
Not(conds ...gen.Condition) IPathDownloadDo
|
||||
Or(conds ...gen.Condition) IPathDownloadDo
|
||||
Select(conds ...field.Expr) IPathDownloadDo
|
||||
Where(conds ...gen.Condition) IPathDownloadDo
|
||||
Order(conds ...field.Expr) IPathDownloadDo
|
||||
Distinct(cols ...field.Expr) IPathDownloadDo
|
||||
Omit(cols ...field.Expr) IPathDownloadDo
|
||||
Join(table schema.Tabler, on ...field.Expr) IPathDownloadDo
|
||||
LeftJoin(table schema.Tabler, on ...field.Expr) IPathDownloadDo
|
||||
RightJoin(table schema.Tabler, on ...field.Expr) IPathDownloadDo
|
||||
Group(cols ...field.Expr) IPathDownloadDo
|
||||
Having(conds ...gen.Condition) IPathDownloadDo
|
||||
Limit(limit int) IPathDownloadDo
|
||||
Offset(offset int) IPathDownloadDo
|
||||
Count() (count int64, err error)
|
||||
Scopes(funcs ...func(gen.Dao) gen.Dao) IPathDownloadDo
|
||||
Unscoped() IPathDownloadDo
|
||||
Create(values ...*models.PathDownload) error
|
||||
CreateInBatches(values []*models.PathDownload, batchSize int) error
|
||||
Save(values ...*models.PathDownload) error
|
||||
First() (*models.PathDownload, error)
|
||||
Take() (*models.PathDownload, error)
|
||||
Last() (*models.PathDownload, error)
|
||||
Find() ([]*models.PathDownload, error)
|
||||
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.PathDownload, err error)
|
||||
FindInBatches(result *[]*models.PathDownload, batchSize int, fc func(tx gen.Dao, batch int) error) error
|
||||
Pluck(column field.Expr, dest interface{}) error
|
||||
Delete(...*models.PathDownload) (info gen.ResultInfo, err error)
|
||||
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
Updates(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateFrom(q gen.SubQuery) gen.Dao
|
||||
Attrs(attrs ...field.AssignExpr) IPathDownloadDo
|
||||
Assign(attrs ...field.AssignExpr) IPathDownloadDo
|
||||
Joins(fields ...field.RelationField) IPathDownloadDo
|
||||
Preload(fields ...field.RelationField) IPathDownloadDo
|
||||
FirstOrInit() (*models.PathDownload, error)
|
||||
FirstOrCreate() (*models.PathDownload, error)
|
||||
FindByPage(offset int, limit int) (result []*models.PathDownload, count int64, err error)
|
||||
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
|
||||
Rows() (*sql.Rows, error)
|
||||
Row() *sql.Row
|
||||
Scan(result interface{}) (err error)
|
||||
Returning(value interface{}, columns ...string) IPathDownloadDo
|
||||
UnderlyingDB() *gorm.DB
|
||||
schema.Tabler
|
||||
|
||||
FilterWithNameAndRole(name string, role string) (result []models.PathDownload, err error)
|
||||
}
|
||||
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
func (p pathDownloadDo) FilterWithNameAndRole(name string, role string) (result []models.PathDownload, err error) {
|
||||
var params []interface{}
|
||||
|
||||
var generateSQL strings.Builder
|
||||
params = append(params, name)
|
||||
generateSQL.WriteString("SELECT * FROM path_downloads WHERE name = ? ")
|
||||
if role != "" {
|
||||
params = append(params, role)
|
||||
generateSQL.WriteString("AND role = ? ")
|
||||
}
|
||||
|
||||
var executeSQL *gorm.DB
|
||||
executeSQL = p.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
|
||||
err = executeSQL.Error
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Debug() IPathDownloadDo {
|
||||
return p.withDO(p.DO.Debug())
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) WithContext(ctx context.Context) IPathDownloadDo {
|
||||
return p.withDO(p.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) ReadDB() IPathDownloadDo {
|
||||
return p.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) WriteDB() IPathDownloadDo {
|
||||
return p.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Session(config *gorm.Session) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Session(config))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Clauses(conds ...clause.Expression) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Returning(value interface{}, columns ...string) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Not(conds ...gen.Condition) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Or(conds ...gen.Condition) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Select(conds ...field.Expr) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Where(conds ...gen.Condition) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Order(conds ...field.Expr) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Distinct(cols ...field.Expr) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Omit(cols ...field.Expr) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Join(table schema.Tabler, on ...field.Expr) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) LeftJoin(table schema.Tabler, on ...field.Expr) IPathDownloadDo {
|
||||
return p.withDO(p.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) RightJoin(table schema.Tabler, on ...field.Expr) IPathDownloadDo {
|
||||
return p.withDO(p.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Group(cols ...field.Expr) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Having(conds ...gen.Condition) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Limit(limit int) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Offset(offset int) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Unscoped() IPathDownloadDo {
|
||||
return p.withDO(p.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Create(values ...*models.PathDownload) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return p.DO.Create(values)
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) CreateInBatches(values []*models.PathDownload, batchSize int) error {
|
||||
return p.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (p pathDownloadDo) Save(values ...*models.PathDownload) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return p.DO.Save(values)
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) First() (*models.PathDownload, error) {
|
||||
if result, err := p.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.PathDownload), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Take() (*models.PathDownload, error) {
|
||||
if result, err := p.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.PathDownload), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Last() (*models.PathDownload, error) {
|
||||
if result, err := p.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.PathDownload), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Find() ([]*models.PathDownload, error) {
|
||||
result, err := p.DO.Find()
|
||||
return result.([]*models.PathDownload), err
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.PathDownload, err error) {
|
||||
buf := make([]*models.PathDownload, 0, batchSize)
|
||||
err = p.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) FindInBatches(result *[]*models.PathDownload, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return p.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Attrs(attrs ...field.AssignExpr) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Assign(attrs ...field.AssignExpr) IPathDownloadDo {
|
||||
return p.withDO(p.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Joins(fields ...field.RelationField) IPathDownloadDo {
|
||||
for _, _f := range fields {
|
||||
p = *p.withDO(p.DO.Joins(_f))
|
||||
}
|
||||
return &p
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Preload(fields ...field.RelationField) IPathDownloadDo {
|
||||
for _, _f := range fields {
|
||||
p = *p.withDO(p.DO.Preload(_f))
|
||||
}
|
||||
return &p
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) FirstOrInit() (*models.PathDownload, error) {
|
||||
if result, err := p.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.PathDownload), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) FirstOrCreate() (*models.PathDownload, error) {
|
||||
if result, err := p.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.PathDownload), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) FindByPage(offset int, limit int) (result []*models.PathDownload, count int64, err error) {
|
||||
result, err = p.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if size := len(result); 0 < limit && 0 < size && size < limit {
|
||||
count = int64(size + offset)
|
||||
return
|
||||
}
|
||||
|
||||
count, err = p.Offset(-1).Limit(-1).Count()
|
||||
return
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = p.Count()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = p.Offset(offset).Limit(limit).Scan(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Scan(result interface{}) (err error) {
|
||||
return p.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (p pathDownloadDo) Delete(models ...*models.PathDownload) (result gen.ResultInfo, err error) {
|
||||
return p.DO.Delete(models)
|
||||
}
|
||||
|
||||
func (p *pathDownloadDo) withDO(do gen.Dao) *pathDownloadDo {
|
||||
p.DO = *do.(*gen.DO)
|
||||
return p
|
||||
}
|
||||
421
query/section_locations.gen.go
Normal file
421
query/section_locations.gen.go
Normal file
@ -0,0 +1,421 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
|
||||
"canguidev/shelfy/internal/models"
|
||||
)
|
||||
|
||||
func newSectionLocation(db *gorm.DB, opts ...gen.DOOption) sectionLocation {
|
||||
_sectionLocation := sectionLocation{}
|
||||
|
||||
_sectionLocation.sectionLocationDo.UseDB(db, opts...)
|
||||
_sectionLocation.sectionLocationDo.UseModel(&models.SectionLocation{})
|
||||
|
||||
tableName := _sectionLocation.sectionLocationDo.TableName()
|
||||
_sectionLocation.ALL = field.NewAsterisk(tableName)
|
||||
_sectionLocation.ID = field.NewInt64(tableName, "id")
|
||||
_sectionLocation.LibrarySectionID = field.NewInt64(tableName, "library_section_id")
|
||||
_sectionLocation.RootPath = field.NewString(tableName, "root_path")
|
||||
_sectionLocation.CreatedAt = field.NewString(tableName, "created_at")
|
||||
_sectionLocation.UpdatedAt = field.NewString(tableName, "updated_at")
|
||||
|
||||
_sectionLocation.fillFieldMap()
|
||||
|
||||
return _sectionLocation
|
||||
}
|
||||
|
||||
type sectionLocation struct {
|
||||
sectionLocationDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Int64
|
||||
LibrarySectionID field.Int64
|
||||
RootPath field.String
|
||||
CreatedAt field.String
|
||||
UpdatedAt field.String
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (s sectionLocation) Table(newTableName string) *sectionLocation {
|
||||
s.sectionLocationDo.UseTable(newTableName)
|
||||
return s.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (s sectionLocation) As(alias string) *sectionLocation {
|
||||
s.sectionLocationDo.DO = *(s.sectionLocationDo.As(alias).(*gen.DO))
|
||||
return s.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (s *sectionLocation) updateTableName(table string) *sectionLocation {
|
||||
s.ALL = field.NewAsterisk(table)
|
||||
s.ID = field.NewInt64(table, "id")
|
||||
s.LibrarySectionID = field.NewInt64(table, "library_section_id")
|
||||
s.RootPath = field.NewString(table, "root_path")
|
||||
s.CreatedAt = field.NewString(table, "created_at")
|
||||
s.UpdatedAt = field.NewString(table, "updated_at")
|
||||
|
||||
s.fillFieldMap()
|
||||
|
||||
return s
|
||||
}
|
||||
|
||||
func (s *sectionLocation) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := s.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
}
|
||||
_oe, ok := _f.(field.OrderExpr)
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (s *sectionLocation) fillFieldMap() {
|
||||
s.fieldMap = make(map[string]field.Expr, 5)
|
||||
s.fieldMap["id"] = s.ID
|
||||
s.fieldMap["library_section_id"] = s.LibrarySectionID
|
||||
s.fieldMap["root_path"] = s.RootPath
|
||||
s.fieldMap["created_at"] = s.CreatedAt
|
||||
s.fieldMap["updated_at"] = s.UpdatedAt
|
||||
}
|
||||
|
||||
func (s sectionLocation) clone(db *gorm.DB) sectionLocation {
|
||||
s.sectionLocationDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return s
|
||||
}
|
||||
|
||||
func (s sectionLocation) replaceDB(db *gorm.DB) sectionLocation {
|
||||
s.sectionLocationDo.ReplaceDB(db)
|
||||
return s
|
||||
}
|
||||
|
||||
type sectionLocationDo struct{ gen.DO }
|
||||
|
||||
type ISectionLocationDo interface {
|
||||
gen.SubQuery
|
||||
Debug() ISectionLocationDo
|
||||
WithContext(ctx context.Context) ISectionLocationDo
|
||||
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
|
||||
ReplaceDB(db *gorm.DB)
|
||||
ReadDB() ISectionLocationDo
|
||||
WriteDB() ISectionLocationDo
|
||||
As(alias string) gen.Dao
|
||||
Session(config *gorm.Session) ISectionLocationDo
|
||||
Columns(cols ...field.Expr) gen.Columns
|
||||
Clauses(conds ...clause.Expression) ISectionLocationDo
|
||||
Not(conds ...gen.Condition) ISectionLocationDo
|
||||
Or(conds ...gen.Condition) ISectionLocationDo
|
||||
Select(conds ...field.Expr) ISectionLocationDo
|
||||
Where(conds ...gen.Condition) ISectionLocationDo
|
||||
Order(conds ...field.Expr) ISectionLocationDo
|
||||
Distinct(cols ...field.Expr) ISectionLocationDo
|
||||
Omit(cols ...field.Expr) ISectionLocationDo
|
||||
Join(table schema.Tabler, on ...field.Expr) ISectionLocationDo
|
||||
LeftJoin(table schema.Tabler, on ...field.Expr) ISectionLocationDo
|
||||
RightJoin(table schema.Tabler, on ...field.Expr) ISectionLocationDo
|
||||
Group(cols ...field.Expr) ISectionLocationDo
|
||||
Having(conds ...gen.Condition) ISectionLocationDo
|
||||
Limit(limit int) ISectionLocationDo
|
||||
Offset(offset int) ISectionLocationDo
|
||||
Count() (count int64, err error)
|
||||
Scopes(funcs ...func(gen.Dao) gen.Dao) ISectionLocationDo
|
||||
Unscoped() ISectionLocationDo
|
||||
Create(values ...*models.SectionLocation) error
|
||||
CreateInBatches(values []*models.SectionLocation, batchSize int) error
|
||||
Save(values ...*models.SectionLocation) error
|
||||
First() (*models.SectionLocation, error)
|
||||
Take() (*models.SectionLocation, error)
|
||||
Last() (*models.SectionLocation, error)
|
||||
Find() ([]*models.SectionLocation, error)
|
||||
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.SectionLocation, err error)
|
||||
FindInBatches(result *[]*models.SectionLocation, batchSize int, fc func(tx gen.Dao, batch int) error) error
|
||||
Pluck(column field.Expr, dest interface{}) error
|
||||
Delete(...*models.SectionLocation) (info gen.ResultInfo, err error)
|
||||
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
Updates(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateFrom(q gen.SubQuery) gen.Dao
|
||||
Attrs(attrs ...field.AssignExpr) ISectionLocationDo
|
||||
Assign(attrs ...field.AssignExpr) ISectionLocationDo
|
||||
Joins(fields ...field.RelationField) ISectionLocationDo
|
||||
Preload(fields ...field.RelationField) ISectionLocationDo
|
||||
FirstOrInit() (*models.SectionLocation, error)
|
||||
FirstOrCreate() (*models.SectionLocation, error)
|
||||
FindByPage(offset int, limit int) (result []*models.SectionLocation, count int64, err error)
|
||||
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
|
||||
Rows() (*sql.Rows, error)
|
||||
Row() *sql.Row
|
||||
Scan(result interface{}) (err error)
|
||||
Returning(value interface{}, columns ...string) ISectionLocationDo
|
||||
UnderlyingDB() *gorm.DB
|
||||
schema.Tabler
|
||||
|
||||
FilterWithNameAndRole(name string, role string) (result []models.SectionLocation, err error)
|
||||
}
|
||||
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
func (s sectionLocationDo) FilterWithNameAndRole(name string, role string) (result []models.SectionLocation, err error) {
|
||||
var params []interface{}
|
||||
|
||||
var generateSQL strings.Builder
|
||||
params = append(params, name)
|
||||
generateSQL.WriteString("SELECT * FROM section_locations WHERE name = ? ")
|
||||
if role != "" {
|
||||
params = append(params, role)
|
||||
generateSQL.WriteString("AND role = ? ")
|
||||
}
|
||||
|
||||
var executeSQL *gorm.DB
|
||||
executeSQL = s.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
|
||||
err = executeSQL.Error
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Debug() ISectionLocationDo {
|
||||
return s.withDO(s.DO.Debug())
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) WithContext(ctx context.Context) ISectionLocationDo {
|
||||
return s.withDO(s.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) ReadDB() ISectionLocationDo {
|
||||
return s.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) WriteDB() ISectionLocationDo {
|
||||
return s.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Session(config *gorm.Session) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Session(config))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Clauses(conds ...clause.Expression) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Returning(value interface{}, columns ...string) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Not(conds ...gen.Condition) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Or(conds ...gen.Condition) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Select(conds ...field.Expr) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Where(conds ...gen.Condition) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Order(conds ...field.Expr) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Distinct(cols ...field.Expr) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Omit(cols ...field.Expr) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Join(table schema.Tabler, on ...field.Expr) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) LeftJoin(table schema.Tabler, on ...field.Expr) ISectionLocationDo {
|
||||
return s.withDO(s.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) RightJoin(table schema.Tabler, on ...field.Expr) ISectionLocationDo {
|
||||
return s.withDO(s.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Group(cols ...field.Expr) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Having(conds ...gen.Condition) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Limit(limit int) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Offset(offset int) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Unscoped() ISectionLocationDo {
|
||||
return s.withDO(s.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Create(values ...*models.SectionLocation) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return s.DO.Create(values)
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) CreateInBatches(values []*models.SectionLocation, batchSize int) error {
|
||||
return s.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (s sectionLocationDo) Save(values ...*models.SectionLocation) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return s.DO.Save(values)
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) First() (*models.SectionLocation, error) {
|
||||
if result, err := s.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.SectionLocation), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Take() (*models.SectionLocation, error) {
|
||||
if result, err := s.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.SectionLocation), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Last() (*models.SectionLocation, error) {
|
||||
if result, err := s.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.SectionLocation), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Find() ([]*models.SectionLocation, error) {
|
||||
result, err := s.DO.Find()
|
||||
return result.([]*models.SectionLocation), err
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.SectionLocation, err error) {
|
||||
buf := make([]*models.SectionLocation, 0, batchSize)
|
||||
err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) FindInBatches(result *[]*models.SectionLocation, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return s.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Attrs(attrs ...field.AssignExpr) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Assign(attrs ...field.AssignExpr) ISectionLocationDo {
|
||||
return s.withDO(s.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Joins(fields ...field.RelationField) ISectionLocationDo {
|
||||
for _, _f := range fields {
|
||||
s = *s.withDO(s.DO.Joins(_f))
|
||||
}
|
||||
return &s
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Preload(fields ...field.RelationField) ISectionLocationDo {
|
||||
for _, _f := range fields {
|
||||
s = *s.withDO(s.DO.Preload(_f))
|
||||
}
|
||||
return &s
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) FirstOrInit() (*models.SectionLocation, error) {
|
||||
if result, err := s.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.SectionLocation), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) FirstOrCreate() (*models.SectionLocation, error) {
|
||||
if result, err := s.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.SectionLocation), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) FindByPage(offset int, limit int) (result []*models.SectionLocation, count int64, err error) {
|
||||
result, err = s.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if size := len(result); 0 < limit && 0 < size && size < limit {
|
||||
count = int64(size + offset)
|
||||
return
|
||||
}
|
||||
|
||||
count, err = s.Offset(-1).Limit(-1).Count()
|
||||
return
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = s.Count()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = s.Offset(offset).Limit(limit).Scan(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Scan(result interface{}) (err error) {
|
||||
return s.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (s sectionLocationDo) Delete(models ...*models.SectionLocation) (result gen.ResultInfo, err error) {
|
||||
return s.DO.Delete(models)
|
||||
}
|
||||
|
||||
func (s *sectionLocationDo) withDO(do gen.Dao) *sectionLocationDo {
|
||||
s.DO = *do.(*gen.DO)
|
||||
return s
|
||||
}
|
||||
417
query/taggings.gen.go
Normal file
417
query/taggings.gen.go
Normal file
@ -0,0 +1,417 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
|
||||
"canguidev/shelfy/internal/models"
|
||||
)
|
||||
|
||||
func newTagging(db *gorm.DB, opts ...gen.DOOption) tagging {
|
||||
_tagging := tagging{}
|
||||
|
||||
_tagging.taggingDo.UseDB(db, opts...)
|
||||
_tagging.taggingDo.UseModel(&models.Tagging{})
|
||||
|
||||
tableName := _tagging.taggingDo.TableName()
|
||||
_tagging.ALL = field.NewAsterisk(tableName)
|
||||
_tagging.ID = field.NewInt64(tableName, "id")
|
||||
_tagging.MetadataItemID = field.NewInt64(tableName, "metadata_item_id")
|
||||
_tagging.TagID = field.NewInt64(tableName, "tag_id")
|
||||
_tagging.Index = field.NewInt64(tableName, "index")
|
||||
|
||||
_tagging.fillFieldMap()
|
||||
|
||||
return _tagging
|
||||
}
|
||||
|
||||
type tagging struct {
|
||||
taggingDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Int64
|
||||
MetadataItemID field.Int64
|
||||
TagID field.Int64
|
||||
Index field.Int64
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (t tagging) Table(newTableName string) *tagging {
|
||||
t.taggingDo.UseTable(newTableName)
|
||||
return t.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (t tagging) As(alias string) *tagging {
|
||||
t.taggingDo.DO = *(t.taggingDo.As(alias).(*gen.DO))
|
||||
return t.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (t *tagging) updateTableName(table string) *tagging {
|
||||
t.ALL = field.NewAsterisk(table)
|
||||
t.ID = field.NewInt64(table, "id")
|
||||
t.MetadataItemID = field.NewInt64(table, "metadata_item_id")
|
||||
t.TagID = field.NewInt64(table, "tag_id")
|
||||
t.Index = field.NewInt64(table, "index")
|
||||
|
||||
t.fillFieldMap()
|
||||
|
||||
return t
|
||||
}
|
||||
|
||||
func (t *tagging) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := t.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
}
|
||||
_oe, ok := _f.(field.OrderExpr)
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (t *tagging) fillFieldMap() {
|
||||
t.fieldMap = make(map[string]field.Expr, 4)
|
||||
t.fieldMap["id"] = t.ID
|
||||
t.fieldMap["metadata_item_id"] = t.MetadataItemID
|
||||
t.fieldMap["tag_id"] = t.TagID
|
||||
t.fieldMap["index"] = t.Index
|
||||
}
|
||||
|
||||
func (t tagging) clone(db *gorm.DB) tagging {
|
||||
t.taggingDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return t
|
||||
}
|
||||
|
||||
func (t tagging) replaceDB(db *gorm.DB) tagging {
|
||||
t.taggingDo.ReplaceDB(db)
|
||||
return t
|
||||
}
|
||||
|
||||
type taggingDo struct{ gen.DO }
|
||||
|
||||
type ITaggingDo interface {
|
||||
gen.SubQuery
|
||||
Debug() ITaggingDo
|
||||
WithContext(ctx context.Context) ITaggingDo
|
||||
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
|
||||
ReplaceDB(db *gorm.DB)
|
||||
ReadDB() ITaggingDo
|
||||
WriteDB() ITaggingDo
|
||||
As(alias string) gen.Dao
|
||||
Session(config *gorm.Session) ITaggingDo
|
||||
Columns(cols ...field.Expr) gen.Columns
|
||||
Clauses(conds ...clause.Expression) ITaggingDo
|
||||
Not(conds ...gen.Condition) ITaggingDo
|
||||
Or(conds ...gen.Condition) ITaggingDo
|
||||
Select(conds ...field.Expr) ITaggingDo
|
||||
Where(conds ...gen.Condition) ITaggingDo
|
||||
Order(conds ...field.Expr) ITaggingDo
|
||||
Distinct(cols ...field.Expr) ITaggingDo
|
||||
Omit(cols ...field.Expr) ITaggingDo
|
||||
Join(table schema.Tabler, on ...field.Expr) ITaggingDo
|
||||
LeftJoin(table schema.Tabler, on ...field.Expr) ITaggingDo
|
||||
RightJoin(table schema.Tabler, on ...field.Expr) ITaggingDo
|
||||
Group(cols ...field.Expr) ITaggingDo
|
||||
Having(conds ...gen.Condition) ITaggingDo
|
||||
Limit(limit int) ITaggingDo
|
||||
Offset(offset int) ITaggingDo
|
||||
Count() (count int64, err error)
|
||||
Scopes(funcs ...func(gen.Dao) gen.Dao) ITaggingDo
|
||||
Unscoped() ITaggingDo
|
||||
Create(values ...*models.Tagging) error
|
||||
CreateInBatches(values []*models.Tagging, batchSize int) error
|
||||
Save(values ...*models.Tagging) error
|
||||
First() (*models.Tagging, error)
|
||||
Take() (*models.Tagging, error)
|
||||
Last() (*models.Tagging, error)
|
||||
Find() ([]*models.Tagging, error)
|
||||
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Tagging, err error)
|
||||
FindInBatches(result *[]*models.Tagging, batchSize int, fc func(tx gen.Dao, batch int) error) error
|
||||
Pluck(column field.Expr, dest interface{}) error
|
||||
Delete(...*models.Tagging) (info gen.ResultInfo, err error)
|
||||
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
Updates(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateFrom(q gen.SubQuery) gen.Dao
|
||||
Attrs(attrs ...field.AssignExpr) ITaggingDo
|
||||
Assign(attrs ...field.AssignExpr) ITaggingDo
|
||||
Joins(fields ...field.RelationField) ITaggingDo
|
||||
Preload(fields ...field.RelationField) ITaggingDo
|
||||
FirstOrInit() (*models.Tagging, error)
|
||||
FirstOrCreate() (*models.Tagging, error)
|
||||
FindByPage(offset int, limit int) (result []*models.Tagging, count int64, err error)
|
||||
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
|
||||
Rows() (*sql.Rows, error)
|
||||
Row() *sql.Row
|
||||
Scan(result interface{}) (err error)
|
||||
Returning(value interface{}, columns ...string) ITaggingDo
|
||||
UnderlyingDB() *gorm.DB
|
||||
schema.Tabler
|
||||
|
||||
FilterWithNameAndRole(name string, role string) (result []models.Tagging, err error)
|
||||
}
|
||||
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
func (t taggingDo) FilterWithNameAndRole(name string, role string) (result []models.Tagging, err error) {
|
||||
var params []interface{}
|
||||
|
||||
var generateSQL strings.Builder
|
||||
params = append(params, name)
|
||||
generateSQL.WriteString("SELECT * FROM taggings WHERE name = ? ")
|
||||
if role != "" {
|
||||
params = append(params, role)
|
||||
generateSQL.WriteString("AND role = ? ")
|
||||
}
|
||||
|
||||
var executeSQL *gorm.DB
|
||||
executeSQL = t.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
|
||||
err = executeSQL.Error
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (t taggingDo) Debug() ITaggingDo {
|
||||
return t.withDO(t.DO.Debug())
|
||||
}
|
||||
|
||||
func (t taggingDo) WithContext(ctx context.Context) ITaggingDo {
|
||||
return t.withDO(t.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (t taggingDo) ReadDB() ITaggingDo {
|
||||
return t.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (t taggingDo) WriteDB() ITaggingDo {
|
||||
return t.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (t taggingDo) Session(config *gorm.Session) ITaggingDo {
|
||||
return t.withDO(t.DO.Session(config))
|
||||
}
|
||||
|
||||
func (t taggingDo) Clauses(conds ...clause.Expression) ITaggingDo {
|
||||
return t.withDO(t.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Returning(value interface{}, columns ...string) ITaggingDo {
|
||||
return t.withDO(t.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Not(conds ...gen.Condition) ITaggingDo {
|
||||
return t.withDO(t.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Or(conds ...gen.Condition) ITaggingDo {
|
||||
return t.withDO(t.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Select(conds ...field.Expr) ITaggingDo {
|
||||
return t.withDO(t.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Where(conds ...gen.Condition) ITaggingDo {
|
||||
return t.withDO(t.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Order(conds ...field.Expr) ITaggingDo {
|
||||
return t.withDO(t.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Distinct(cols ...field.Expr) ITaggingDo {
|
||||
return t.withDO(t.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Omit(cols ...field.Expr) ITaggingDo {
|
||||
return t.withDO(t.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Join(table schema.Tabler, on ...field.Expr) ITaggingDo {
|
||||
return t.withDO(t.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (t taggingDo) LeftJoin(table schema.Tabler, on ...field.Expr) ITaggingDo {
|
||||
return t.withDO(t.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (t taggingDo) RightJoin(table schema.Tabler, on ...field.Expr) ITaggingDo {
|
||||
return t.withDO(t.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Group(cols ...field.Expr) ITaggingDo {
|
||||
return t.withDO(t.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Having(conds ...gen.Condition) ITaggingDo {
|
||||
return t.withDO(t.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Limit(limit int) ITaggingDo {
|
||||
return t.withDO(t.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (t taggingDo) Offset(offset int) ITaggingDo {
|
||||
return t.withDO(t.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (t taggingDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ITaggingDo {
|
||||
return t.withDO(t.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Unscoped() ITaggingDo {
|
||||
return t.withDO(t.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (t taggingDo) Create(values ...*models.Tagging) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return t.DO.Create(values)
|
||||
}
|
||||
|
||||
func (t taggingDo) CreateInBatches(values []*models.Tagging, batchSize int) error {
|
||||
return t.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (t taggingDo) Save(values ...*models.Tagging) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return t.DO.Save(values)
|
||||
}
|
||||
|
||||
func (t taggingDo) First() (*models.Tagging, error) {
|
||||
if result, err := t.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Tagging), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t taggingDo) Take() (*models.Tagging, error) {
|
||||
if result, err := t.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Tagging), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t taggingDo) Last() (*models.Tagging, error) {
|
||||
if result, err := t.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Tagging), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t taggingDo) Find() ([]*models.Tagging, error) {
|
||||
result, err := t.DO.Find()
|
||||
return result.([]*models.Tagging), err
|
||||
}
|
||||
|
||||
func (t taggingDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Tagging, err error) {
|
||||
buf := make([]*models.Tagging, 0, batchSize)
|
||||
err = t.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (t taggingDo) FindInBatches(result *[]*models.Tagging, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return t.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (t taggingDo) Attrs(attrs ...field.AssignExpr) ITaggingDo {
|
||||
return t.withDO(t.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Assign(attrs ...field.AssignExpr) ITaggingDo {
|
||||
return t.withDO(t.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (t taggingDo) Joins(fields ...field.RelationField) ITaggingDo {
|
||||
for _, _f := range fields {
|
||||
t = *t.withDO(t.DO.Joins(_f))
|
||||
}
|
||||
return &t
|
||||
}
|
||||
|
||||
func (t taggingDo) Preload(fields ...field.RelationField) ITaggingDo {
|
||||
for _, _f := range fields {
|
||||
t = *t.withDO(t.DO.Preload(_f))
|
||||
}
|
||||
return &t
|
||||
}
|
||||
|
||||
func (t taggingDo) FirstOrInit() (*models.Tagging, error) {
|
||||
if result, err := t.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Tagging), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t taggingDo) FirstOrCreate() (*models.Tagging, error) {
|
||||
if result, err := t.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Tagging), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t taggingDo) FindByPage(offset int, limit int) (result []*models.Tagging, count int64, err error) {
|
||||
result, err = t.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if size := len(result); 0 < limit && 0 < size && size < limit {
|
||||
count = int64(size + offset)
|
||||
return
|
||||
}
|
||||
|
||||
count, err = t.Offset(-1).Limit(-1).Count()
|
||||
return
|
||||
}
|
||||
|
||||
func (t taggingDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = t.Count()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = t.Offset(offset).Limit(limit).Scan(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (t taggingDo) Scan(result interface{}) (err error) {
|
||||
return t.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (t taggingDo) Delete(models ...*models.Tagging) (result gen.ResultInfo, err error) {
|
||||
return t.DO.Delete(models)
|
||||
}
|
||||
|
||||
func (t *taggingDo) withDO(do gen.Dao) *taggingDo {
|
||||
t.DO = *do.(*gen.DO)
|
||||
return t
|
||||
}
|
||||
413
query/tags.gen.go
Normal file
413
query/tags.gen.go
Normal file
@ -0,0 +1,413 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
|
||||
"canguidev/shelfy/internal/models"
|
||||
)
|
||||
|
||||
func newTag(db *gorm.DB, opts ...gen.DOOption) tag {
|
||||
_tag := tag{}
|
||||
|
||||
_tag.tagDo.UseDB(db, opts...)
|
||||
_tag.tagDo.UseModel(&models.Tag{})
|
||||
|
||||
tableName := _tag.tagDo.TableName()
|
||||
_tag.ALL = field.NewAsterisk(tableName)
|
||||
_tag.ID = field.NewInt64(tableName, "id")
|
||||
_tag.Tag = field.NewString(tableName, "tag")
|
||||
_tag.TagType = field.NewInt64(tableName, "tag_type")
|
||||
|
||||
_tag.fillFieldMap()
|
||||
|
||||
return _tag
|
||||
}
|
||||
|
||||
type tag struct {
|
||||
tagDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Int64
|
||||
Tag field.String
|
||||
TagType field.Int64
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (t tag) Table(newTableName string) *tag {
|
||||
t.tagDo.UseTable(newTableName)
|
||||
return t.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (t tag) As(alias string) *tag {
|
||||
t.tagDo.DO = *(t.tagDo.As(alias).(*gen.DO))
|
||||
return t.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (t *tag) updateTableName(table string) *tag {
|
||||
t.ALL = field.NewAsterisk(table)
|
||||
t.ID = field.NewInt64(table, "id")
|
||||
t.Tag = field.NewString(table, "tag")
|
||||
t.TagType = field.NewInt64(table, "tag_type")
|
||||
|
||||
t.fillFieldMap()
|
||||
|
||||
return t
|
||||
}
|
||||
|
||||
func (t *tag) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := t.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
}
|
||||
_oe, ok := _f.(field.OrderExpr)
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (t *tag) fillFieldMap() {
|
||||
t.fieldMap = make(map[string]field.Expr, 3)
|
||||
t.fieldMap["id"] = t.ID
|
||||
t.fieldMap["tag"] = t.Tag
|
||||
t.fieldMap["tag_type"] = t.TagType
|
||||
}
|
||||
|
||||
func (t tag) clone(db *gorm.DB) tag {
|
||||
t.tagDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return t
|
||||
}
|
||||
|
||||
func (t tag) replaceDB(db *gorm.DB) tag {
|
||||
t.tagDo.ReplaceDB(db)
|
||||
return t
|
||||
}
|
||||
|
||||
type tagDo struct{ gen.DO }
|
||||
|
||||
type ITagDo interface {
|
||||
gen.SubQuery
|
||||
Debug() ITagDo
|
||||
WithContext(ctx context.Context) ITagDo
|
||||
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
|
||||
ReplaceDB(db *gorm.DB)
|
||||
ReadDB() ITagDo
|
||||
WriteDB() ITagDo
|
||||
As(alias string) gen.Dao
|
||||
Session(config *gorm.Session) ITagDo
|
||||
Columns(cols ...field.Expr) gen.Columns
|
||||
Clauses(conds ...clause.Expression) ITagDo
|
||||
Not(conds ...gen.Condition) ITagDo
|
||||
Or(conds ...gen.Condition) ITagDo
|
||||
Select(conds ...field.Expr) ITagDo
|
||||
Where(conds ...gen.Condition) ITagDo
|
||||
Order(conds ...field.Expr) ITagDo
|
||||
Distinct(cols ...field.Expr) ITagDo
|
||||
Omit(cols ...field.Expr) ITagDo
|
||||
Join(table schema.Tabler, on ...field.Expr) ITagDo
|
||||
LeftJoin(table schema.Tabler, on ...field.Expr) ITagDo
|
||||
RightJoin(table schema.Tabler, on ...field.Expr) ITagDo
|
||||
Group(cols ...field.Expr) ITagDo
|
||||
Having(conds ...gen.Condition) ITagDo
|
||||
Limit(limit int) ITagDo
|
||||
Offset(offset int) ITagDo
|
||||
Count() (count int64, err error)
|
||||
Scopes(funcs ...func(gen.Dao) gen.Dao) ITagDo
|
||||
Unscoped() ITagDo
|
||||
Create(values ...*models.Tag) error
|
||||
CreateInBatches(values []*models.Tag, batchSize int) error
|
||||
Save(values ...*models.Tag) error
|
||||
First() (*models.Tag, error)
|
||||
Take() (*models.Tag, error)
|
||||
Last() (*models.Tag, error)
|
||||
Find() ([]*models.Tag, error)
|
||||
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Tag, err error)
|
||||
FindInBatches(result *[]*models.Tag, batchSize int, fc func(tx gen.Dao, batch int) error) error
|
||||
Pluck(column field.Expr, dest interface{}) error
|
||||
Delete(...*models.Tag) (info gen.ResultInfo, err error)
|
||||
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
Updates(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateFrom(q gen.SubQuery) gen.Dao
|
||||
Attrs(attrs ...field.AssignExpr) ITagDo
|
||||
Assign(attrs ...field.AssignExpr) ITagDo
|
||||
Joins(fields ...field.RelationField) ITagDo
|
||||
Preload(fields ...field.RelationField) ITagDo
|
||||
FirstOrInit() (*models.Tag, error)
|
||||
FirstOrCreate() (*models.Tag, error)
|
||||
FindByPage(offset int, limit int) (result []*models.Tag, count int64, err error)
|
||||
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
|
||||
Rows() (*sql.Rows, error)
|
||||
Row() *sql.Row
|
||||
Scan(result interface{}) (err error)
|
||||
Returning(value interface{}, columns ...string) ITagDo
|
||||
UnderlyingDB() *gorm.DB
|
||||
schema.Tabler
|
||||
|
||||
FilterWithNameAndRole(name string, role string) (result []models.Tag, err error)
|
||||
}
|
||||
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
func (t tagDo) FilterWithNameAndRole(name string, role string) (result []models.Tag, err error) {
|
||||
var params []interface{}
|
||||
|
||||
var generateSQL strings.Builder
|
||||
params = append(params, name)
|
||||
generateSQL.WriteString("SELECT * FROM tags WHERE name = ? ")
|
||||
if role != "" {
|
||||
params = append(params, role)
|
||||
generateSQL.WriteString("AND role = ? ")
|
||||
}
|
||||
|
||||
var executeSQL *gorm.DB
|
||||
executeSQL = t.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
|
||||
err = executeSQL.Error
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (t tagDo) Debug() ITagDo {
|
||||
return t.withDO(t.DO.Debug())
|
||||
}
|
||||
|
||||
func (t tagDo) WithContext(ctx context.Context) ITagDo {
|
||||
return t.withDO(t.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (t tagDo) ReadDB() ITagDo {
|
||||
return t.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (t tagDo) WriteDB() ITagDo {
|
||||
return t.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (t tagDo) Session(config *gorm.Session) ITagDo {
|
||||
return t.withDO(t.DO.Session(config))
|
||||
}
|
||||
|
||||
func (t tagDo) Clauses(conds ...clause.Expression) ITagDo {
|
||||
return t.withDO(t.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (t tagDo) Returning(value interface{}, columns ...string) ITagDo {
|
||||
return t.withDO(t.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (t tagDo) Not(conds ...gen.Condition) ITagDo {
|
||||
return t.withDO(t.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (t tagDo) Or(conds ...gen.Condition) ITagDo {
|
||||
return t.withDO(t.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (t tagDo) Select(conds ...field.Expr) ITagDo {
|
||||
return t.withDO(t.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (t tagDo) Where(conds ...gen.Condition) ITagDo {
|
||||
return t.withDO(t.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (t tagDo) Order(conds ...field.Expr) ITagDo {
|
||||
return t.withDO(t.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (t tagDo) Distinct(cols ...field.Expr) ITagDo {
|
||||
return t.withDO(t.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (t tagDo) Omit(cols ...field.Expr) ITagDo {
|
||||
return t.withDO(t.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (t tagDo) Join(table schema.Tabler, on ...field.Expr) ITagDo {
|
||||
return t.withDO(t.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (t tagDo) LeftJoin(table schema.Tabler, on ...field.Expr) ITagDo {
|
||||
return t.withDO(t.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (t tagDo) RightJoin(table schema.Tabler, on ...field.Expr) ITagDo {
|
||||
return t.withDO(t.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (t tagDo) Group(cols ...field.Expr) ITagDo {
|
||||
return t.withDO(t.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (t tagDo) Having(conds ...gen.Condition) ITagDo {
|
||||
return t.withDO(t.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (t tagDo) Limit(limit int) ITagDo {
|
||||
return t.withDO(t.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (t tagDo) Offset(offset int) ITagDo {
|
||||
return t.withDO(t.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (t tagDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ITagDo {
|
||||
return t.withDO(t.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (t tagDo) Unscoped() ITagDo {
|
||||
return t.withDO(t.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (t tagDo) Create(values ...*models.Tag) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return t.DO.Create(values)
|
||||
}
|
||||
|
||||
func (t tagDo) CreateInBatches(values []*models.Tag, batchSize int) error {
|
||||
return t.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (t tagDo) Save(values ...*models.Tag) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return t.DO.Save(values)
|
||||
}
|
||||
|
||||
func (t tagDo) First() (*models.Tag, error) {
|
||||
if result, err := t.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Tag), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t tagDo) Take() (*models.Tag, error) {
|
||||
if result, err := t.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Tag), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t tagDo) Last() (*models.Tag, error) {
|
||||
if result, err := t.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Tag), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t tagDo) Find() ([]*models.Tag, error) {
|
||||
result, err := t.DO.Find()
|
||||
return result.([]*models.Tag), err
|
||||
}
|
||||
|
||||
func (t tagDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Tag, err error) {
|
||||
buf := make([]*models.Tag, 0, batchSize)
|
||||
err = t.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (t tagDo) FindInBatches(result *[]*models.Tag, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return t.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (t tagDo) Attrs(attrs ...field.AssignExpr) ITagDo {
|
||||
return t.withDO(t.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (t tagDo) Assign(attrs ...field.AssignExpr) ITagDo {
|
||||
return t.withDO(t.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (t tagDo) Joins(fields ...field.RelationField) ITagDo {
|
||||
for _, _f := range fields {
|
||||
t = *t.withDO(t.DO.Joins(_f))
|
||||
}
|
||||
return &t
|
||||
}
|
||||
|
||||
func (t tagDo) Preload(fields ...field.RelationField) ITagDo {
|
||||
for _, _f := range fields {
|
||||
t = *t.withDO(t.DO.Preload(_f))
|
||||
}
|
||||
return &t
|
||||
}
|
||||
|
||||
func (t tagDo) FirstOrInit() (*models.Tag, error) {
|
||||
if result, err := t.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Tag), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t tagDo) FirstOrCreate() (*models.Tag, error) {
|
||||
if result, err := t.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.Tag), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (t tagDo) FindByPage(offset int, limit int) (result []*models.Tag, count int64, err error) {
|
||||
result, err = t.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if size := len(result); 0 < limit && 0 < size && size < limit {
|
||||
count = int64(size + offset)
|
||||
return
|
||||
}
|
||||
|
||||
count, err = t.Offset(-1).Limit(-1).Count()
|
||||
return
|
||||
}
|
||||
|
||||
func (t tagDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = t.Count()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = t.Offset(offset).Limit(limit).Scan(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (t tagDo) Scan(result interface{}) (err error) {
|
||||
return t.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (t tagDo) Delete(models ...*models.Tag) (result gen.ResultInfo, err error) {
|
||||
return t.DO.Delete(models)
|
||||
}
|
||||
|
||||
func (t *tagDo) withDO(do gen.Dao) *tagDo {
|
||||
t.DO = *do.(*gen.DO)
|
||||
return t
|
||||
}
|
||||
421
query/users.gen.go
Normal file
421
query/users.gen.go
Normal file
@ -0,0 +1,421 @@
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
// Code generated by gorm.io/gen. DO NOT EDIT.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"gorm.io/gorm/schema"
|
||||
|
||||
"gorm.io/gen"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"gorm.io/plugin/dbresolver"
|
||||
|
||||
"canguidev/shelfy/internal/models"
|
||||
)
|
||||
|
||||
func newUser(db *gorm.DB, opts ...gen.DOOption) user {
|
||||
_user := user{}
|
||||
|
||||
_user.userDo.UseDB(db, opts...)
|
||||
_user.userDo.UseModel(&models.User{})
|
||||
|
||||
tableName := _user.userDo.TableName()
|
||||
_user.ALL = field.NewAsterisk(tableName)
|
||||
_user.ID = field.NewUint(tableName, "id")
|
||||
_user.Username = field.NewString(tableName, "username")
|
||||
_user.Name = field.NewString(tableName, "name")
|
||||
_user.Email = field.NewString(tableName, "email")
|
||||
_user.Password = field.NewString(tableName, "password")
|
||||
|
||||
_user.fillFieldMap()
|
||||
|
||||
return _user
|
||||
}
|
||||
|
||||
type user struct {
|
||||
userDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Uint
|
||||
Username field.String
|
||||
Name field.String
|
||||
Email field.String
|
||||
Password field.String
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (u user) Table(newTableName string) *user {
|
||||
u.userDo.UseTable(newTableName)
|
||||
return u.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (u user) As(alias string) *user {
|
||||
u.userDo.DO = *(u.userDo.As(alias).(*gen.DO))
|
||||
return u.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (u *user) updateTableName(table string) *user {
|
||||
u.ALL = field.NewAsterisk(table)
|
||||
u.ID = field.NewUint(table, "id")
|
||||
u.Username = field.NewString(table, "username")
|
||||
u.Name = field.NewString(table, "name")
|
||||
u.Email = field.NewString(table, "email")
|
||||
u.Password = field.NewString(table, "password")
|
||||
|
||||
u.fillFieldMap()
|
||||
|
||||
return u
|
||||
}
|
||||
|
||||
func (u *user) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := u.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
}
|
||||
_oe, ok := _f.(field.OrderExpr)
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (u *user) fillFieldMap() {
|
||||
u.fieldMap = make(map[string]field.Expr, 5)
|
||||
u.fieldMap["id"] = u.ID
|
||||
u.fieldMap["username"] = u.Username
|
||||
u.fieldMap["name"] = u.Name
|
||||
u.fieldMap["email"] = u.Email
|
||||
u.fieldMap["password"] = u.Password
|
||||
}
|
||||
|
||||
func (u user) clone(db *gorm.DB) user {
|
||||
u.userDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return u
|
||||
}
|
||||
|
||||
func (u user) replaceDB(db *gorm.DB) user {
|
||||
u.userDo.ReplaceDB(db)
|
||||
return u
|
||||
}
|
||||
|
||||
type userDo struct{ gen.DO }
|
||||
|
||||
type IUserDo interface {
|
||||
gen.SubQuery
|
||||
Debug() IUserDo
|
||||
WithContext(ctx context.Context) IUserDo
|
||||
WithResult(fc func(tx gen.Dao)) gen.ResultInfo
|
||||
ReplaceDB(db *gorm.DB)
|
||||
ReadDB() IUserDo
|
||||
WriteDB() IUserDo
|
||||
As(alias string) gen.Dao
|
||||
Session(config *gorm.Session) IUserDo
|
||||
Columns(cols ...field.Expr) gen.Columns
|
||||
Clauses(conds ...clause.Expression) IUserDo
|
||||
Not(conds ...gen.Condition) IUserDo
|
||||
Or(conds ...gen.Condition) IUserDo
|
||||
Select(conds ...field.Expr) IUserDo
|
||||
Where(conds ...gen.Condition) IUserDo
|
||||
Order(conds ...field.Expr) IUserDo
|
||||
Distinct(cols ...field.Expr) IUserDo
|
||||
Omit(cols ...field.Expr) IUserDo
|
||||
Join(table schema.Tabler, on ...field.Expr) IUserDo
|
||||
LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo
|
||||
RightJoin(table schema.Tabler, on ...field.Expr) IUserDo
|
||||
Group(cols ...field.Expr) IUserDo
|
||||
Having(conds ...gen.Condition) IUserDo
|
||||
Limit(limit int) IUserDo
|
||||
Offset(offset int) IUserDo
|
||||
Count() (count int64, err error)
|
||||
Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo
|
||||
Unscoped() IUserDo
|
||||
Create(values ...*models.User) error
|
||||
CreateInBatches(values []*models.User, batchSize int) error
|
||||
Save(values ...*models.User) error
|
||||
First() (*models.User, error)
|
||||
Take() (*models.User, error)
|
||||
Last() (*models.User, error)
|
||||
Find() ([]*models.User, error)
|
||||
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.User, err error)
|
||||
FindInBatches(result *[]*models.User, batchSize int, fc func(tx gen.Dao, batch int) error) error
|
||||
Pluck(column field.Expr, dest interface{}) error
|
||||
Delete(...*models.User) (info gen.ResultInfo, err error)
|
||||
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
Updates(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
|
||||
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
|
||||
UpdateFrom(q gen.SubQuery) gen.Dao
|
||||
Attrs(attrs ...field.AssignExpr) IUserDo
|
||||
Assign(attrs ...field.AssignExpr) IUserDo
|
||||
Joins(fields ...field.RelationField) IUserDo
|
||||
Preload(fields ...field.RelationField) IUserDo
|
||||
FirstOrInit() (*models.User, error)
|
||||
FirstOrCreate() (*models.User, error)
|
||||
FindByPage(offset int, limit int) (result []*models.User, count int64, err error)
|
||||
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
|
||||
Rows() (*sql.Rows, error)
|
||||
Row() *sql.Row
|
||||
Scan(result interface{}) (err error)
|
||||
Returning(value interface{}, columns ...string) IUserDo
|
||||
UnderlyingDB() *gorm.DB
|
||||
schema.Tabler
|
||||
|
||||
FilterWithNameAndRole(name string, role string) (result []models.User, err error)
|
||||
}
|
||||
|
||||
// SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
|
||||
func (u userDo) FilterWithNameAndRole(name string, role string) (result []models.User, err error) {
|
||||
var params []interface{}
|
||||
|
||||
var generateSQL strings.Builder
|
||||
params = append(params, name)
|
||||
generateSQL.WriteString("SELECT * FROM users WHERE name = ? ")
|
||||
if role != "" {
|
||||
params = append(params, role)
|
||||
generateSQL.WriteString("AND role = ? ")
|
||||
}
|
||||
|
||||
var executeSQL *gorm.DB
|
||||
executeSQL = u.UnderlyingDB().Raw(generateSQL.String(), params...).Find(&result) // ignore_security_alert
|
||||
err = executeSQL.Error
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (u userDo) Debug() IUserDo {
|
||||
return u.withDO(u.DO.Debug())
|
||||
}
|
||||
|
||||
func (u userDo) WithContext(ctx context.Context) IUserDo {
|
||||
return u.withDO(u.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (u userDo) ReadDB() IUserDo {
|
||||
return u.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (u userDo) WriteDB() IUserDo {
|
||||
return u.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (u userDo) Session(config *gorm.Session) IUserDo {
|
||||
return u.withDO(u.DO.Session(config))
|
||||
}
|
||||
|
||||
func (u userDo) Clauses(conds ...clause.Expression) IUserDo {
|
||||
return u.withDO(u.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (u userDo) Returning(value interface{}, columns ...string) IUserDo {
|
||||
return u.withDO(u.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (u userDo) Not(conds ...gen.Condition) IUserDo {
|
||||
return u.withDO(u.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (u userDo) Or(conds ...gen.Condition) IUserDo {
|
||||
return u.withDO(u.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (u userDo) Select(conds ...field.Expr) IUserDo {
|
||||
return u.withDO(u.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (u userDo) Where(conds ...gen.Condition) IUserDo {
|
||||
return u.withDO(u.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (u userDo) Order(conds ...field.Expr) IUserDo {
|
||||
return u.withDO(u.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (u userDo) Distinct(cols ...field.Expr) IUserDo {
|
||||
return u.withDO(u.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (u userDo) Omit(cols ...field.Expr) IUserDo {
|
||||
return u.withDO(u.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (u userDo) Join(table schema.Tabler, on ...field.Expr) IUserDo {
|
||||
return u.withDO(u.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (u userDo) LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo {
|
||||
return u.withDO(u.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (u userDo) RightJoin(table schema.Tabler, on ...field.Expr) IUserDo {
|
||||
return u.withDO(u.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (u userDo) Group(cols ...field.Expr) IUserDo {
|
||||
return u.withDO(u.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (u userDo) Having(conds ...gen.Condition) IUserDo {
|
||||
return u.withDO(u.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (u userDo) Limit(limit int) IUserDo {
|
||||
return u.withDO(u.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (u userDo) Offset(offset int) IUserDo {
|
||||
return u.withDO(u.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (u userDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo {
|
||||
return u.withDO(u.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (u userDo) Unscoped() IUserDo {
|
||||
return u.withDO(u.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (u userDo) Create(values ...*models.User) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return u.DO.Create(values)
|
||||
}
|
||||
|
||||
func (u userDo) CreateInBatches(values []*models.User, batchSize int) error {
|
||||
return u.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (u userDo) Save(values ...*models.User) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return u.DO.Save(values)
|
||||
}
|
||||
|
||||
func (u userDo) First() (*models.User, error) {
|
||||
if result, err := u.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.User), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (u userDo) Take() (*models.User, error) {
|
||||
if result, err := u.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.User), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (u userDo) Last() (*models.User, error) {
|
||||
if result, err := u.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.User), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (u userDo) Find() ([]*models.User, error) {
|
||||
result, err := u.DO.Find()
|
||||
return result.([]*models.User), err
|
||||
}
|
||||
|
||||
func (u userDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.User, err error) {
|
||||
buf := make([]*models.User, 0, batchSize)
|
||||
err = u.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (u userDo) FindInBatches(result *[]*models.User, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return u.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (u userDo) Attrs(attrs ...field.AssignExpr) IUserDo {
|
||||
return u.withDO(u.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (u userDo) Assign(attrs ...field.AssignExpr) IUserDo {
|
||||
return u.withDO(u.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (u userDo) Joins(fields ...field.RelationField) IUserDo {
|
||||
for _, _f := range fields {
|
||||
u = *u.withDO(u.DO.Joins(_f))
|
||||
}
|
||||
return &u
|
||||
}
|
||||
|
||||
func (u userDo) Preload(fields ...field.RelationField) IUserDo {
|
||||
for _, _f := range fields {
|
||||
u = *u.withDO(u.DO.Preload(_f))
|
||||
}
|
||||
return &u
|
||||
}
|
||||
|
||||
func (u userDo) FirstOrInit() (*models.User, error) {
|
||||
if result, err := u.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.User), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (u userDo) FirstOrCreate() (*models.User, error) {
|
||||
if result, err := u.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*models.User), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (u userDo) FindByPage(offset int, limit int) (result []*models.User, count int64, err error) {
|
||||
result, err = u.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if size := len(result); 0 < limit && 0 < size && size < limit {
|
||||
count = int64(size + offset)
|
||||
return
|
||||
}
|
||||
|
||||
count, err = u.Offset(-1).Limit(-1).Count()
|
||||
return
|
||||
}
|
||||
|
||||
func (u userDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = u.Count()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = u.Offset(offset).Limit(limit).Scan(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (u userDo) Scan(result interface{}) (err error) {
|
||||
return u.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (u userDo) Delete(models ...*models.User) (result gen.ResultInfo, err error) {
|
||||
return u.DO.Delete(models)
|
||||
}
|
||||
|
||||
func (u *userDo) withDO(do gen.Dao) *userDo {
|
||||
u.DO = *do.(*gen.DO)
|
||||
return u
|
||||
}
|
||||
1
web/.last_build_id
Normal file
1
web/.last_build_id
Normal file
@ -0,0 +1 @@
|
||||
e81c39b9cd57a0a3f3893af7805594cb
|
||||
1
web/assets/AssetManifest.bin
Normal file
1
web/assets/AssetManifest.bin
Normal file
@ -0,0 +1 @@
|
||||
2packages/cupertino_icons/assets/CupertinoIcons.ttf
asset2packages/cupertino_icons/assets/CupertinoIcons.ttf*packages/media_kit/assets/web/hls1.4.10.js
asset*packages/media_kit/assets/web/hls1.4.10.js)packages/wakelock_plus/assets/no_sleep.js
asset)packages/wakelock_plus/assets/no_sleep.js
|
||||
1
web/assets/AssetManifest.bin.json
Normal file
1
web/assets/AssetManifest.bin.json
Normal file
@ -0,0 +1 @@
|
||||
"DQMHMnBhY2thZ2VzL2N1cGVydGlub19pY29ucy9hc3NldHMvQ3VwZXJ0aW5vSWNvbnMudHRmDAENAQcFYXNzZXQHMnBhY2thZ2VzL2N1cGVydGlub19pY29ucy9hc3NldHMvQ3VwZXJ0aW5vSWNvbnMudHRmBypwYWNrYWdlcy9tZWRpYV9raXQvYXNzZXRzL3dlYi9obHMxLjQuMTAuanMMAQ0BBwVhc3NldAcqcGFja2FnZXMvbWVkaWFfa2l0L2Fzc2V0cy93ZWIvaGxzMS40LjEwLmpzBylwYWNrYWdlcy93YWtlbG9ja19wbHVzL2Fzc2V0cy9ub19zbGVlcC5qcwwBDQEHBWFzc2V0BylwYWNrYWdlcy93YWtlbG9ja19wbHVzL2Fzc2V0cy9ub19zbGVlcC5qcw=="
|
||||
1
web/assets/AssetManifest.json
Normal file
1
web/assets/AssetManifest.json
Normal file
@ -0,0 +1 @@
|
||||
{"packages/cupertino_icons/assets/CupertinoIcons.ttf":["packages/cupertino_icons/assets/CupertinoIcons.ttf"],"packages/media_kit/assets/web/hls1.4.10.js":["packages/media_kit/assets/web/hls1.4.10.js"],"packages/wakelock_plus/assets/no_sleep.js":["packages/wakelock_plus/assets/no_sleep.js"]}
|
||||
1
web/assets/FontManifest.json
Normal file
1
web/assets/FontManifest.json
Normal file
@ -0,0 +1 @@
|
||||
[{"family":"MaterialIcons","fonts":[{"asset":"fonts/MaterialIcons-Regular.otf"}]},{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]}]
|
||||
34774
web/assets/NOTICES
Normal file
34774
web/assets/NOTICES
Normal file
File diff suppressed because it is too large
Load Diff
BIN
web/assets/fonts/MaterialIcons-Regular.otf
Normal file
BIN
web/assets/fonts/MaterialIcons-Regular.otf
Normal file
Binary file not shown.
BIN
web/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf
Normal file
BIN
web/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf
Normal file
Binary file not shown.
2
web/assets/packages/media_kit/assets/web/hls1.4.10.js
Normal file
2
web/assets/packages/media_kit/assets/web/hls1.4.10.js
Normal file
File diff suppressed because one or more lines are too long
230
web/assets/packages/wakelock_plus/assets/no_sleep.js
Normal file
230
web/assets/packages/wakelock_plus/assets/no_sleep.js
Normal file
File diff suppressed because one or more lines are too long
126
web/assets/shaders/ink_sparkle.frag
Normal file
126
web/assets/shaders/ink_sparkle.frag
Normal file
File diff suppressed because one or more lines are too long
192
web/canvaskit/canvaskit.js
Normal file
192
web/canvaskit/canvaskit.js
Normal file
@ -0,0 +1,192 @@
|
||||
|
||||
var CanvasKitInit = (() => {
|
||||
var _scriptName = import.meta.url;
|
||||
|
||||
return (
|
||||
function(moduleArg = {}) {
|
||||
var moduleRtn;
|
||||
|
||||
var r=moduleArg,ba,ca,da=new Promise((a,b)=>{ba=a;ca=b}),fa="object"==typeof window,ia="function"==typeof importScripts;
|
||||
(function(a){a.ce=a.ce||[];a.ce.push(function(){a.MakeSWCanvasSurface=function(b){var c=b,e="undefined"!==typeof OffscreenCanvas&&c instanceof OffscreenCanvas;if(!("undefined"!==typeof HTMLCanvasElement&&c instanceof HTMLCanvasElement||e||(c=document.getElementById(b),c)))throw"Canvas with id "+b+" was not found";if(b=a.MakeSurface(c.width,c.height))b.Ae=c;return b};a.MakeCanvasSurface||(a.MakeCanvasSurface=a.MakeSWCanvasSurface);a.MakeSurface=function(b,c){var e={width:b,height:c,colorType:a.ColorType.RGBA_8888,
|
||||
alphaType:a.AlphaType.Unpremul,colorSpace:a.ColorSpace.SRGB},f=b*c*4,k=a._malloc(f);if(e=a.Surface._makeRasterDirect(e,k,4*b))e.Ae=null,e.$e=b,e.Xe=c,e.Ye=f,e.He=k,e.getCanvas().clear(a.TRANSPARENT);return e};a.MakeRasterDirectSurface=function(b,c,e){return a.Surface._makeRasterDirect(b,c.byteOffset,e)};a.Surface.prototype.flush=function(b){a.$d(this.Zd);this._flush();if(this.Ae){var c=new Uint8ClampedArray(a.HEAPU8.buffer,this.He,this.Ye);c=new ImageData(c,this.$e,this.Xe);b?this.Ae.getContext("2d").putImageData(c,
|
||||
0,0,b[0],b[1],b[2]-b[0],b[3]-b[1]):this.Ae.getContext("2d").putImageData(c,0,0)}};a.Surface.prototype.dispose=function(){this.He&&a._free(this.He);this.delete()};a.$d=a.$d||function(){};a.Be=a.Be||function(){return null}})})(r);
|
||||
(function(a){a.ce=a.ce||[];a.ce.push(function(){function b(l,p,v){return l&&l.hasOwnProperty(p)?l[p]:v}function c(l){var p=ja(ka);ka[p]=l;return p}function e(l){return l.naturalHeight||l.videoHeight||l.displayHeight||l.height}function f(l){return l.naturalWidth||l.videoWidth||l.displayWidth||l.width}function k(l,p,v,w){l.bindTexture(l.TEXTURE_2D,p);w||v.alphaType!==a.AlphaType.Premul||l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0);return p}function n(l,p,v){v||p.alphaType!==a.AlphaType.Premul||
|
||||
l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1);l.bindTexture(l.TEXTURE_2D,null)}a.GetWebGLContext=function(l,p){if(!l)throw"null canvas passed into makeWebGLContext";var v={alpha:b(p,"alpha",1),depth:b(p,"depth",1),stencil:b(p,"stencil",8),antialias:b(p,"antialias",0),premultipliedAlpha:b(p,"premultipliedAlpha",1),preserveDrawingBuffer:b(p,"preserveDrawingBuffer",0),preferLowPowerToHighPerformance:b(p,"preferLowPowerToHighPerformance",0),failIfMajorPerformanceCaveat:b(p,"failIfMajorPerformanceCaveat",
|
||||
0),enableExtensionsByDefault:b(p,"enableExtensionsByDefault",1),explicitSwapControl:b(p,"explicitSwapControl",0),renderViaOffscreenBackBuffer:b(p,"renderViaOffscreenBackBuffer",0)};v.majorVersion=p&&p.majorVersion?p.majorVersion:"undefined"!==typeof WebGL2RenderingContext?2:1;if(v.explicitSwapControl)throw"explicitSwapControl is not supported";l=na(l,v);if(!l)return 0;oa(l);z.le.getExtension("WEBGL_debug_renderer_info");return l};a.deleteContext=function(l){z===pa[l]&&(z=null);"object"==typeof JSEvents&&
|
||||
JSEvents.Af(pa[l].le.canvas);pa[l]&&pa[l].le.canvas&&(pa[l].le.canvas.Ve=void 0);pa[l]=null};a._setTextureCleanup({deleteTexture:function(l,p){var v=ka[p];v&&pa[l].le.deleteTexture(v);ka[p]=null}});a.MakeWebGLContext=function(l){if(!this.$d(l))return null;var p=this._MakeGrContext();if(!p)return null;p.Zd=l;var v=p.delete.bind(p);p["delete"]=function(){a.$d(this.Zd);v()}.bind(p);return z.Je=p};a.MakeGrContext=a.MakeWebGLContext;a.GrDirectContext.prototype.getResourceCacheLimitBytes=function(){a.$d(this.Zd);
|
||||
this._getResourceCacheLimitBytes()};a.GrDirectContext.prototype.getResourceCacheUsageBytes=function(){a.$d(this.Zd);this._getResourceCacheUsageBytes()};a.GrDirectContext.prototype.releaseResourcesAndAbandonContext=function(){a.$d(this.Zd);this._releaseResourcesAndAbandonContext()};a.GrDirectContext.prototype.setResourceCacheLimitBytes=function(l){a.$d(this.Zd);this._setResourceCacheLimitBytes(l)};a.MakeOnScreenGLSurface=function(l,p,v,w,A,D){if(!this.$d(l.Zd))return null;p=void 0===A||void 0===D?
|
||||
this._MakeOnScreenGLSurface(l,p,v,w):this._MakeOnScreenGLSurface(l,p,v,w,A,D);if(!p)return null;p.Zd=l.Zd;return p};a.MakeRenderTarget=function(){var l=arguments[0];if(!this.$d(l.Zd))return null;if(3===arguments.length){var p=this._MakeRenderTargetWH(l,arguments[1],arguments[2]);if(!p)return null}else if(2===arguments.length){if(p=this._MakeRenderTargetII(l,arguments[1]),!p)return null}else return null;p.Zd=l.Zd;return p};a.MakeWebGLCanvasSurface=function(l,p,v){p=p||null;var w=l,A="undefined"!==
|
||||
typeof OffscreenCanvas&&w instanceof OffscreenCanvas;if(!("undefined"!==typeof HTMLCanvasElement&&w instanceof HTMLCanvasElement||A||(w=document.getElementById(l),w)))throw"Canvas with id "+l+" was not found";l=this.GetWebGLContext(w,v);if(!l||0>l)throw"failed to create webgl context: err "+l;l=this.MakeWebGLContext(l);p=this.MakeOnScreenGLSurface(l,w.width,w.height,p);return p?p:(p=w.cloneNode(!0),w.parentNode.replaceChild(p,w),p.classList.add("ck-replaced"),a.MakeSWCanvasSurface(p))};a.MakeCanvasSurface=
|
||||
a.MakeWebGLCanvasSurface;a.Surface.prototype.makeImageFromTexture=function(l,p){a.$d(this.Zd);l=c(l);if(p=this._makeImageFromTexture(this.Zd,l,p))p.ue=l;return p};a.Surface.prototype.makeImageFromTextureSource=function(l,p,v){p||={height:e(l),width:f(l),colorType:a.ColorType.RGBA_8888,alphaType:v?a.AlphaType.Premul:a.AlphaType.Unpremul};p.colorSpace||(p.colorSpace=a.ColorSpace.SRGB);a.$d(this.Zd);var w=z.le;v=k(w,w.createTexture(),p,v);2===z.version?w.texImage2D(w.TEXTURE_2D,0,w.RGBA,p.width,p.height,
|
||||
0,w.RGBA,w.UNSIGNED_BYTE,l):w.texImage2D(w.TEXTURE_2D,0,w.RGBA,w.RGBA,w.UNSIGNED_BYTE,l);n(w,p);this._resetContext();return this.makeImageFromTexture(v,p)};a.Surface.prototype.updateTextureFromSource=function(l,p,v){if(l.ue){a.$d(this.Zd);var w=l.getImageInfo(),A=z.le,D=k(A,ka[l.ue],w,v);2===z.version?A.texImage2D(A.TEXTURE_2D,0,A.RGBA,f(p),e(p),0,A.RGBA,A.UNSIGNED_BYTE,p):A.texImage2D(A.TEXTURE_2D,0,A.RGBA,A.RGBA,A.UNSIGNED_BYTE,p);n(A,w,v);this._resetContext();ka[l.ue]=null;l.ue=c(D);w.colorSpace=
|
||||
l.getColorSpace();p=this._makeImageFromTexture(this.Zd,l.ue,w);v=l.Yd.ae;A=l.Yd.ee;l.Yd.ae=p.Yd.ae;l.Yd.ee=p.Yd.ee;p.Yd.ae=v;p.Yd.ee=A;p.delete();w.colorSpace.delete()}};a.MakeLazyImageFromTextureSource=function(l,p,v){p||={height:e(l),width:f(l),colorType:a.ColorType.RGBA_8888,alphaType:v?a.AlphaType.Premul:a.AlphaType.Unpremul};p.colorSpace||(p.colorSpace=a.ColorSpace.SRGB);var w={makeTexture:function(){var A=z,D=A.le,I=k(D,D.createTexture(),p,v);2===A.version?D.texImage2D(D.TEXTURE_2D,0,D.RGBA,
|
||||
p.width,p.height,0,D.RGBA,D.UNSIGNED_BYTE,l):D.texImage2D(D.TEXTURE_2D,0,D.RGBA,D.RGBA,D.UNSIGNED_BYTE,l);n(D,p,v);return c(I)},freeSrc:function(){}};"VideoFrame"===l.constructor.name&&(w.freeSrc=function(){l.close()});return a.Image._makeFromGenerator(p,w)};a.$d=function(l){return l?oa(l):!1};a.Be=function(){return z&&z.Je&&!z.Je.isDeleted()?z.Je:null}})})(r);
|
||||
(function(a){function b(g){return(f(255*g[3])<<24|f(255*g[0])<<16|f(255*g[1])<<8|f(255*g[2])<<0)>>>0}function c(g){if(g&&g._ck)return g;if(g instanceof Float32Array){for(var d=Math.floor(g.length/4),h=new Uint32Array(d),m=0;m<d;m++)h[m]=b(g.slice(4*m,4*(m+1)));return h}if(g instanceof Uint32Array)return g;if(g instanceof Array&&g[0]instanceof Float32Array)return g.map(b)}function e(g){if(void 0===g)return 1;var d=parseFloat(g);return g&&-1!==g.indexOf("%")?d/100:d}function f(g){return Math.round(Math.max(0,
|
||||
Math.min(g||0,255)))}function k(g,d){d&&d._ck||a._free(g)}function n(g,d,h){if(!g||!g.length)return 0;if(g&&g._ck)return g.byteOffset;var m=a[d].BYTES_PER_ELEMENT;h||=a._malloc(g.length*m);a[d].set(g,h/m);return h}function l(g){var d={he:0,count:g.length,colorType:a.ColorType.RGBA_F32};if(g instanceof Float32Array)d.he=n(g,"HEAPF32"),d.count=g.length/4;else if(g instanceof Uint32Array)d.he=n(g,"HEAPU32"),d.colorType=a.ColorType.RGBA_8888;else if(g instanceof Array){if(g&&g.length){for(var h=a._malloc(16*
|
||||
g.length),m=0,t=h/4,u=0;u<g.length;u++)for(var x=0;4>x;x++)a.HEAPF32[t+m]=g[u][x],m++;g=h}else g=0;d.he=g}else throw"Invalid argument to copyFlexibleColorArray, Not a color array "+typeof g;return d}function p(g){if(!g)return 0;var d=aa.toTypedArray();if(g.length){if(6===g.length||9===g.length)return n(g,"HEAPF32",P),6===g.length&&a.HEAPF32.set(Vc,6+P/4),P;if(16===g.length)return d[0]=g[0],d[1]=g[1],d[2]=g[3],d[3]=g[4],d[4]=g[5],d[5]=g[7],d[6]=g[12],d[7]=g[13],d[8]=g[15],P;throw"invalid matrix size";
|
||||
}if(void 0===g.m11)throw"invalid matrix argument";d[0]=g.m11;d[1]=g.m21;d[2]=g.m41;d[3]=g.m12;d[4]=g.m22;d[5]=g.m42;d[6]=g.m14;d[7]=g.m24;d[8]=g.m44;return P}function v(g){if(!g)return 0;var d=X.toTypedArray();if(g.length){if(16!==g.length&&6!==g.length&&9!==g.length)throw"invalid matrix size";if(16===g.length)return n(g,"HEAPF32",la);d.fill(0);d[0]=g[0];d[1]=g[1];d[3]=g[2];d[4]=g[3];d[5]=g[4];d[7]=g[5];d[10]=1;d[12]=g[6];d[13]=g[7];d[15]=g[8];6===g.length&&(d[12]=0,d[13]=0,d[15]=1);return la}if(void 0===
|
||||
g.m11)throw"invalid matrix argument";d[0]=g.m11;d[1]=g.m21;d[2]=g.m31;d[3]=g.m41;d[4]=g.m12;d[5]=g.m22;d[6]=g.m32;d[7]=g.m42;d[8]=g.m13;d[9]=g.m23;d[10]=g.m33;d[11]=g.m43;d[12]=g.m14;d[13]=g.m24;d[14]=g.m34;d[15]=g.m44;return la}function w(g,d){return n(g,"HEAPF32",d||ha)}function A(g,d,h,m){var t=Ea.toTypedArray();t[0]=g;t[1]=d;t[2]=h;t[3]=m;return ha}function D(g){for(var d=new Float32Array(4),h=0;4>h;h++)d[h]=a.HEAPF32[g/4+h];return d}function I(g,d){return n(g,"HEAPF32",d||V)}function Q(g,d){return n(g,
|
||||
"HEAPF32",d||tb)}a.Color=function(g,d,h,m){void 0===m&&(m=1);return a.Color4f(f(g)/255,f(d)/255,f(h)/255,m)};a.ColorAsInt=function(g,d,h,m){void 0===m&&(m=255);return(f(m)<<24|f(g)<<16|f(d)<<8|f(h)<<0&268435455)>>>0};a.Color4f=function(g,d,h,m){void 0===m&&(m=1);return Float32Array.of(g,d,h,m)};Object.defineProperty(a,"TRANSPARENT",{get:function(){return a.Color4f(0,0,0,0)}});Object.defineProperty(a,"BLACK",{get:function(){return a.Color4f(0,0,0,1)}});Object.defineProperty(a,"WHITE",{get:function(){return a.Color4f(1,
|
||||
1,1,1)}});Object.defineProperty(a,"RED",{get:function(){return a.Color4f(1,0,0,1)}});Object.defineProperty(a,"GREEN",{get:function(){return a.Color4f(0,1,0,1)}});Object.defineProperty(a,"BLUE",{get:function(){return a.Color4f(0,0,1,1)}});Object.defineProperty(a,"YELLOW",{get:function(){return a.Color4f(1,1,0,1)}});Object.defineProperty(a,"CYAN",{get:function(){return a.Color4f(0,1,1,1)}});Object.defineProperty(a,"MAGENTA",{get:function(){return a.Color4f(1,0,1,1)}});a.getColorComponents=function(g){return[Math.floor(255*
|
||||
g[0]),Math.floor(255*g[1]),Math.floor(255*g[2]),g[3]]};a.parseColorString=function(g,d){g=g.toLowerCase();if(g.startsWith("#")){d=255;switch(g.length){case 9:d=parseInt(g.slice(7,9),16);case 7:var h=parseInt(g.slice(1,3),16);var m=parseInt(g.slice(3,5),16);var t=parseInt(g.slice(5,7),16);break;case 5:d=17*parseInt(g.slice(4,5),16);case 4:h=17*parseInt(g.slice(1,2),16),m=17*parseInt(g.slice(2,3),16),t=17*parseInt(g.slice(3,4),16)}return a.Color(h,m,t,d/255)}return g.startsWith("rgba")?(g=g.slice(5,
|
||||
-1),g=g.split(","),a.Color(+g[0],+g[1],+g[2],e(g[3]))):g.startsWith("rgb")?(g=g.slice(4,-1),g=g.split(","),a.Color(+g[0],+g[1],+g[2],e(g[3]))):g.startsWith("gray(")||g.startsWith("hsl")||!d||(g=d[g],void 0===g)?a.BLACK:g};a.multiplyByAlpha=function(g,d){g=g.slice();g[3]=Math.max(0,Math.min(g[3]*d,1));return g};a.Malloc=function(g,d){var h=a._malloc(d*g.BYTES_PER_ELEMENT);return{_ck:!0,length:d,byteOffset:h,qe:null,subarray:function(m,t){m=this.toTypedArray().subarray(m,t);m._ck=!0;return m},toTypedArray:function(){if(this.qe&&
|
||||
this.qe.length)return this.qe;this.qe=new g(a.HEAPU8.buffer,h,d);this.qe._ck=!0;return this.qe}}};a.Free=function(g){a._free(g.byteOffset);g.byteOffset=0;g.toTypedArray=null;g.qe=null};var P=0,aa,la=0,X,ha=0,Ea,ea,V=0,Ub,Aa=0,Vb,ub=0,Wb,vb=0,$a,Ma=0,Xb,tb=0,Yb,Zb=0,Vc=Float32Array.of(0,0,1);a.onRuntimeInitialized=function(){function g(d,h,m,t,u,x,C){x||(x=4*t.width,t.colorType===a.ColorType.RGBA_F16?x*=2:t.colorType===a.ColorType.RGBA_F32&&(x*=4));var G=x*t.height;var F=u?u.byteOffset:a._malloc(G);
|
||||
if(C?!d._readPixels(t,F,x,h,m,C):!d._readPixels(t,F,x,h,m))return u||a._free(F),null;if(u)return u.toTypedArray();switch(t.colorType){case a.ColorType.RGBA_8888:case a.ColorType.RGBA_F16:d=(new Uint8Array(a.HEAPU8.buffer,F,G)).slice();break;case a.ColorType.RGBA_F32:d=(new Float32Array(a.HEAPU8.buffer,F,G)).slice();break;default:return null}a._free(F);return d}Ea=a.Malloc(Float32Array,4);ha=Ea.byteOffset;X=a.Malloc(Float32Array,16);la=X.byteOffset;aa=a.Malloc(Float32Array,9);P=aa.byteOffset;Xb=a.Malloc(Float32Array,
|
||||
12);tb=Xb.byteOffset;Yb=a.Malloc(Float32Array,12);Zb=Yb.byteOffset;ea=a.Malloc(Float32Array,4);V=ea.byteOffset;Ub=a.Malloc(Float32Array,4);Aa=Ub.byteOffset;Vb=a.Malloc(Float32Array,3);ub=Vb.byteOffset;Wb=a.Malloc(Float32Array,3);vb=Wb.byteOffset;$a=a.Malloc(Int32Array,4);Ma=$a.byteOffset;a.ColorSpace.SRGB=a.ColorSpace._MakeSRGB();a.ColorSpace.DISPLAY_P3=a.ColorSpace._MakeDisplayP3();a.ColorSpace.ADOBE_RGB=a.ColorSpace._MakeAdobeRGB();a.GlyphRunFlags={IsWhiteSpace:a._GlyphRunFlags_isWhiteSpace};a.Path.MakeFromCmds=
|
||||
function(d){var h=n(d,"HEAPF32"),m=a.Path._MakeFromCmds(h,d.length);k(h,d);return m};a.Path.MakeFromVerbsPointsWeights=function(d,h,m){var t=n(d,"HEAPU8"),u=n(h,"HEAPF32"),x=n(m,"HEAPF32"),C=a.Path._MakeFromVerbsPointsWeights(t,d.length,u,h.length,x,m&&m.length||0);k(t,d);k(u,h);k(x,m);return C};a.Path.prototype.addArc=function(d,h,m){d=I(d);this._addArc(d,h,m);return this};a.Path.prototype.addCircle=function(d,h,m,t){this._addCircle(d,h,m,!!t);return this};a.Path.prototype.addOval=function(d,h,m){void 0===
|
||||
m&&(m=1);d=I(d);this._addOval(d,!!h,m);return this};a.Path.prototype.addPath=function(){var d=Array.prototype.slice.call(arguments),h=d[0],m=!1;"boolean"===typeof d[d.length-1]&&(m=d.pop());if(1===d.length)this._addPath(h,1,0,0,0,1,0,0,0,1,m);else if(2===d.length)d=d[1],this._addPath(h,d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1,m);else if(7===d.length||10===d.length)this._addPath(h,d[1],d[2],d[3],d[4],d[5],d[6],d[7]||0,d[8]||0,d[9]||1,m);else return null;return this};a.Path.prototype.addPoly=
|
||||
function(d,h){var m=n(d,"HEAPF32");this._addPoly(m,d.length/2,h);k(m,d);return this};a.Path.prototype.addRect=function(d,h){d=I(d);this._addRect(d,!!h);return this};a.Path.prototype.addRRect=function(d,h){d=Q(d);this._addRRect(d,!!h);return this};a.Path.prototype.addVerbsPointsWeights=function(d,h,m){var t=n(d,"HEAPU8"),u=n(h,"HEAPF32"),x=n(m,"HEAPF32");this._addVerbsPointsWeights(t,d.length,u,h.length,x,m&&m.length||0);k(t,d);k(u,h);k(x,m)};a.Path.prototype.arc=function(d,h,m,t,u,x){d=a.LTRBRect(d-
|
||||
m,h-m,d+m,h+m);u=(u-t)/Math.PI*180-360*!!x;x=new a.Path;x.addArc(d,t/Math.PI*180,u);this.addPath(x,!0);x.delete();return this};a.Path.prototype.arcToOval=function(d,h,m,t){d=I(d);this._arcToOval(d,h,m,t);return this};a.Path.prototype.arcToRotated=function(d,h,m,t,u,x,C){this._arcToRotated(d,h,m,!!t,!!u,x,C);return this};a.Path.prototype.arcToTangent=function(d,h,m,t,u){this._arcToTangent(d,h,m,t,u);return this};a.Path.prototype.close=function(){this._close();return this};a.Path.prototype.conicTo=
|
||||
function(d,h,m,t,u){this._conicTo(d,h,m,t,u);return this};a.Path.prototype.computeTightBounds=function(d){this._computeTightBounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.Path.prototype.cubicTo=function(d,h,m,t,u,x){this._cubicTo(d,h,m,t,u,x);return this};a.Path.prototype.dash=function(d,h,m){return this._dash(d,h,m)?this:null};a.Path.prototype.getBounds=function(d){this._getBounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.Path.prototype.lineTo=function(d,
|
||||
h){this._lineTo(d,h);return this};a.Path.prototype.moveTo=function(d,h){this._moveTo(d,h);return this};a.Path.prototype.offset=function(d,h){this._transform(1,0,d,0,1,h,0,0,1);return this};a.Path.prototype.quadTo=function(d,h,m,t){this._quadTo(d,h,m,t);return this};a.Path.prototype.rArcTo=function(d,h,m,t,u,x,C){this._rArcTo(d,h,m,t,u,x,C);return this};a.Path.prototype.rConicTo=function(d,h,m,t,u){this._rConicTo(d,h,m,t,u);return this};a.Path.prototype.rCubicTo=function(d,h,m,t,u,x){this._rCubicTo(d,
|
||||
h,m,t,u,x);return this};a.Path.prototype.rLineTo=function(d,h){this._rLineTo(d,h);return this};a.Path.prototype.rMoveTo=function(d,h){this._rMoveTo(d,h);return this};a.Path.prototype.rQuadTo=function(d,h,m,t){this._rQuadTo(d,h,m,t);return this};a.Path.prototype.stroke=function(d){d=d||{};d.width=d.width||1;d.miter_limit=d.miter_limit||4;d.cap=d.cap||a.StrokeCap.Butt;d.join=d.join||a.StrokeJoin.Miter;d.precision=d.precision||1;return this._stroke(d)?this:null};a.Path.prototype.transform=function(){if(1===
|
||||
arguments.length){var d=arguments[0];this._transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1)}else if(6===arguments.length||9===arguments.length)d=arguments,this._transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1);else throw"transform expected to take 1 or 9 arguments. Got "+arguments.length;return this};a.Path.prototype.trim=function(d,h,m){return this._trim(d,h,!!m)?this:null};a.Image.prototype.encodeToBytes=function(d,h){var m=a.Be();d=d||a.ImageFormat.PNG;h=h||100;
|
||||
return m?this._encodeToBytes(d,h,m):this._encodeToBytes(d,h)};a.Image.prototype.makeShaderCubic=function(d,h,m,t,u){u=p(u);return this._makeShaderCubic(d,h,m,t,u)};a.Image.prototype.makeShaderOptions=function(d,h,m,t,u){u=p(u);return this._makeShaderOptions(d,h,m,t,u)};a.Image.prototype.readPixels=function(d,h,m,t,u){var x=a.Be();return g(this,d,h,m,t,u,x)};a.Canvas.prototype.clear=function(d){a.$d(this.Zd);d=w(d);this._clear(d)};a.Canvas.prototype.clipRRect=function(d,h,m){a.$d(this.Zd);d=Q(d);this._clipRRect(d,
|
||||
h,m)};a.Canvas.prototype.clipRect=function(d,h,m){a.$d(this.Zd);d=I(d);this._clipRect(d,h,m)};a.Canvas.prototype.concat=function(d){a.$d(this.Zd);d=v(d);this._concat(d)};a.Canvas.prototype.drawArc=function(d,h,m,t,u){a.$d(this.Zd);d=I(d);this._drawArc(d,h,m,t,u)};a.Canvas.prototype.drawAtlas=function(d,h,m,t,u,x,C){if(d&&t&&h&&m&&h.length===m.length){a.$d(this.Zd);u||(u=a.BlendMode.SrcOver);var G=n(h,"HEAPF32"),F=n(m,"HEAPF32"),S=m.length/4,T=n(c(x),"HEAPU32");if(C&&"B"in C&&"C"in C)this._drawAtlasCubic(d,
|
||||
F,G,T,S,u,C.B,C.C,t);else{let q=a.FilterMode.Linear,y=a.MipmapMode.None;C&&(q=C.filter,"mipmap"in C&&(y=C.mipmap));this._drawAtlasOptions(d,F,G,T,S,u,q,y,t)}k(G,h);k(F,m);k(T,x)}};a.Canvas.prototype.drawCircle=function(d,h,m,t){a.$d(this.Zd);this._drawCircle(d,h,m,t)};a.Canvas.prototype.drawColor=function(d,h){a.$d(this.Zd);d=w(d);void 0!==h?this._drawColor(d,h):this._drawColor(d)};a.Canvas.prototype.drawColorInt=function(d,h){a.$d(this.Zd);this._drawColorInt(d,h||a.BlendMode.SrcOver)};a.Canvas.prototype.drawColorComponents=
|
||||
function(d,h,m,t,u){a.$d(this.Zd);d=A(d,h,m,t);void 0!==u?this._drawColor(d,u):this._drawColor(d)};a.Canvas.prototype.drawDRRect=function(d,h,m){a.$d(this.Zd);d=Q(d,tb);h=Q(h,Zb);this._drawDRRect(d,h,m)};a.Canvas.prototype.drawImage=function(d,h,m,t){a.$d(this.Zd);this._drawImage(d,h,m,t||null)};a.Canvas.prototype.drawImageCubic=function(d,h,m,t,u,x){a.$d(this.Zd);this._drawImageCubic(d,h,m,t,u,x||null)};a.Canvas.prototype.drawImageOptions=function(d,h,m,t,u,x){a.$d(this.Zd);this._drawImageOptions(d,
|
||||
h,m,t,u,x||null)};a.Canvas.prototype.drawImageNine=function(d,h,m,t,u){a.$d(this.Zd);h=n(h,"HEAP32",Ma);m=I(m);this._drawImageNine(d,h,m,t,u||null)};a.Canvas.prototype.drawImageRect=function(d,h,m,t,u){a.$d(this.Zd);I(h,V);I(m,Aa);this._drawImageRect(d,V,Aa,t,!!u)};a.Canvas.prototype.drawImageRectCubic=function(d,h,m,t,u,x){a.$d(this.Zd);I(h,V);I(m,Aa);this._drawImageRectCubic(d,V,Aa,t,u,x||null)};a.Canvas.prototype.drawImageRectOptions=function(d,h,m,t,u,x){a.$d(this.Zd);I(h,V);I(m,Aa);this._drawImageRectOptions(d,
|
||||
V,Aa,t,u,x||null)};a.Canvas.prototype.drawLine=function(d,h,m,t,u){a.$d(this.Zd);this._drawLine(d,h,m,t,u)};a.Canvas.prototype.drawOval=function(d,h){a.$d(this.Zd);d=I(d);this._drawOval(d,h)};a.Canvas.prototype.drawPaint=function(d){a.$d(this.Zd);this._drawPaint(d)};a.Canvas.prototype.drawParagraph=function(d,h,m){a.$d(this.Zd);this._drawParagraph(d,h,m)};a.Canvas.prototype.drawPatch=function(d,h,m,t,u){if(24>d.length)throw"Need 12 cubic points";if(h&&4>h.length)throw"Need 4 colors";if(m&&8>m.length)throw"Need 4 shader coordinates";
|
||||
a.$d(this.Zd);const x=n(d,"HEAPF32"),C=h?n(c(h),"HEAPU32"):0,G=m?n(m,"HEAPF32"):0;t||(t=a.BlendMode.Modulate);this._drawPatch(x,C,G,t,u);k(G,m);k(C,h);k(x,d)};a.Canvas.prototype.drawPath=function(d,h){a.$d(this.Zd);this._drawPath(d,h)};a.Canvas.prototype.drawPicture=function(d){a.$d(this.Zd);this._drawPicture(d)};a.Canvas.prototype.drawPoints=function(d,h,m){a.$d(this.Zd);var t=n(h,"HEAPF32");this._drawPoints(d,t,h.length/2,m);k(t,h)};a.Canvas.prototype.drawRRect=function(d,h){a.$d(this.Zd);d=Q(d);
|
||||
this._drawRRect(d,h)};a.Canvas.prototype.drawRect=function(d,h){a.$d(this.Zd);d=I(d);this._drawRect(d,h)};a.Canvas.prototype.drawRect4f=function(d,h,m,t,u){a.$d(this.Zd);this._drawRect4f(d,h,m,t,u)};a.Canvas.prototype.drawShadow=function(d,h,m,t,u,x,C){a.$d(this.Zd);var G=n(u,"HEAPF32"),F=n(x,"HEAPF32");h=n(h,"HEAPF32",ub);m=n(m,"HEAPF32",vb);this._drawShadow(d,h,m,t,G,F,C);k(G,u);k(F,x)};a.getShadowLocalBounds=function(d,h,m,t,u,x,C){d=p(d);m=n(m,"HEAPF32",ub);t=n(t,"HEAPF32",vb);if(!this._getShadowLocalBounds(d,
|
||||
h,m,t,u,x,V))return null;h=ea.toTypedArray();return C?(C.set(h),C):h.slice()};a.Canvas.prototype.drawTextBlob=function(d,h,m,t){a.$d(this.Zd);this._drawTextBlob(d,h,m,t)};a.Canvas.prototype.drawVertices=function(d,h,m){a.$d(this.Zd);this._drawVertices(d,h,m)};a.Canvas.prototype.getDeviceClipBounds=function(d){this._getDeviceClipBounds(Ma);var h=$a.toTypedArray();d?d.set(h):d=h.slice();return d};a.Canvas.prototype.quickReject=function(d){d=I(d);return this._quickReject(d)};a.Canvas.prototype.getLocalToDevice=
|
||||
function(){this._getLocalToDevice(la);for(var d=la,h=Array(16),m=0;16>m;m++)h[m]=a.HEAPF32[d/4+m];return h};a.Canvas.prototype.getTotalMatrix=function(){this._getTotalMatrix(P);for(var d=Array(9),h=0;9>h;h++)d[h]=a.HEAPF32[P/4+h];return d};a.Canvas.prototype.makeSurface=function(d){d=this._makeSurface(d);d.Zd=this.Zd;return d};a.Canvas.prototype.readPixels=function(d,h,m,t,u){a.$d(this.Zd);return g(this,d,h,m,t,u)};a.Canvas.prototype.saveLayer=function(d,h,m,t,u){h=I(h);return this._saveLayer(d||
|
||||
null,h,m||null,t||0,u||a.TileMode.Clamp)};a.Canvas.prototype.writePixels=function(d,h,m,t,u,x,C,G){if(d.byteLength%(h*m))throw"pixels length must be a multiple of the srcWidth * srcHeight";a.$d(this.Zd);var F=d.byteLength/(h*m);x=x||a.AlphaType.Unpremul;C=C||a.ColorType.RGBA_8888;G=G||a.ColorSpace.SRGB;var S=F*h;F=n(d,"HEAPU8");h=this._writePixels({width:h,height:m,colorType:C,alphaType:x,colorSpace:G},F,S,t,u);k(F,d);return h};a.ColorFilter.MakeBlend=function(d,h,m){d=w(d);m=m||a.ColorSpace.SRGB;
|
||||
return a.ColorFilter._MakeBlend(d,h,m)};a.ColorFilter.MakeMatrix=function(d){if(!d||20!==d.length)throw"invalid color matrix";var h=n(d,"HEAPF32"),m=a.ColorFilter._makeMatrix(h);k(h,d);return m};a.ContourMeasure.prototype.getPosTan=function(d,h){this._getPosTan(d,V);d=ea.toTypedArray();return h?(h.set(d),h):d.slice()};a.ImageFilter.prototype.getOutputBounds=function(d,h,m){d=I(d,V);h=p(h);this._getOutputBounds(d,h,Ma);h=$a.toTypedArray();return m?(m.set(h),m):h.slice()};a.ImageFilter.MakeDropShadow=
|
||||
function(d,h,m,t,u,x){u=w(u,ha);return a.ImageFilter._MakeDropShadow(d,h,m,t,u,x)};a.ImageFilter.MakeDropShadowOnly=function(d,h,m,t,u,x){u=w(u,ha);return a.ImageFilter._MakeDropShadowOnly(d,h,m,t,u,x)};a.ImageFilter.MakeImage=function(d,h,m,t){m=I(m,V);t=I(t,Aa);if("B"in h&&"C"in h)return a.ImageFilter._MakeImageCubic(d,h.B,h.C,m,t);const u=h.filter;let x=a.MipmapMode.None;"mipmap"in h&&(x=h.mipmap);return a.ImageFilter._MakeImageOptions(d,u,x,m,t)};a.ImageFilter.MakeMatrixTransform=function(d,h,
|
||||
m){d=p(d);if("B"in h&&"C"in h)return a.ImageFilter._MakeMatrixTransformCubic(d,h.B,h.C,m);const t=h.filter;let u=a.MipmapMode.None;"mipmap"in h&&(u=h.mipmap);return a.ImageFilter._MakeMatrixTransformOptions(d,t,u,m)};a.Paint.prototype.getColor=function(){this._getColor(ha);return D(ha)};a.Paint.prototype.setColor=function(d,h){h=h||null;d=w(d);this._setColor(d,h)};a.Paint.prototype.setColorComponents=function(d,h,m,t,u){u=u||null;d=A(d,h,m,t);this._setColor(d,u)};a.Path.prototype.getPoint=function(d,
|
||||
h){this._getPoint(d,V);d=ea.toTypedArray();return h?(h[0]=d[0],h[1]=d[1],h):d.slice(0,2)};a.Picture.prototype.makeShader=function(d,h,m,t,u){t=p(t);u=I(u);return this._makeShader(d,h,m,t,u)};a.Picture.prototype.cullRect=function(d){this._cullRect(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.PictureRecorder.prototype.beginRecording=function(d,h){d=I(d);return this._beginRecording(d,!!h)};a.Surface.prototype.getCanvas=function(){var d=this._getCanvas();d.Zd=this.Zd;return d};a.Surface.prototype.makeImageSnapshot=
|
||||
function(d){a.$d(this.Zd);d=n(d,"HEAP32",Ma);return this._makeImageSnapshot(d)};a.Surface.prototype.makeSurface=function(d){a.$d(this.Zd);d=this._makeSurface(d);d.Zd=this.Zd;return d};a.Surface.prototype.Ze=function(d,h){this.te||(this.te=this.getCanvas());return requestAnimationFrame(function(){a.$d(this.Zd);d(this.te);this.flush(h)}.bind(this))};a.Surface.prototype.requestAnimationFrame||(a.Surface.prototype.requestAnimationFrame=a.Surface.prototype.Ze);a.Surface.prototype.We=function(d,h){this.te||
|
||||
(this.te=this.getCanvas());requestAnimationFrame(function(){a.$d(this.Zd);d(this.te);this.flush(h);this.dispose()}.bind(this))};a.Surface.prototype.drawOnce||(a.Surface.prototype.drawOnce=a.Surface.prototype.We);a.PathEffect.MakeDash=function(d,h){h||=0;if(!d.length||1===d.length%2)throw"Intervals array must have even length";var m=n(d,"HEAPF32");h=a.PathEffect._MakeDash(m,d.length,h);k(m,d);return h};a.PathEffect.MakeLine2D=function(d,h){h=p(h);return a.PathEffect._MakeLine2D(d,h)};a.PathEffect.MakePath2D=
|
||||
function(d,h){d=p(d);return a.PathEffect._MakePath2D(d,h)};a.Shader.MakeColor=function(d,h){h=h||null;d=w(d);return a.Shader._MakeColor(d,h)};a.Shader.Blend=a.Shader.MakeBlend;a.Shader.Color=a.Shader.MakeColor;a.Shader.MakeLinearGradient=function(d,h,m,t,u,x,C,G){G=G||null;var F=l(m),S=n(t,"HEAPF32");C=C||0;x=p(x);var T=ea.toTypedArray();T.set(d);T.set(h,2);d=a.Shader._MakeLinearGradient(V,F.he,F.colorType,S,F.count,u,C,x,G);k(F.he,m);t&&k(S,t);return d};a.Shader.MakeRadialGradient=function(d,h,m,
|
||||
t,u,x,C,G){G=G||null;var F=l(m),S=n(t,"HEAPF32");C=C||0;x=p(x);d=a.Shader._MakeRadialGradient(d[0],d[1],h,F.he,F.colorType,S,F.count,u,C,x,G);k(F.he,m);t&&k(S,t);return d};a.Shader.MakeSweepGradient=function(d,h,m,t,u,x,C,G,F,S){S=S||null;var T=l(m),q=n(t,"HEAPF32");C=C||0;G=G||0;F=F||360;x=p(x);d=a.Shader._MakeSweepGradient(d,h,T.he,T.colorType,q,T.count,u,G,F,C,x,S);k(T.he,m);t&&k(q,t);return d};a.Shader.MakeTwoPointConicalGradient=function(d,h,m,t,u,x,C,G,F,S){S=S||null;var T=l(u),q=n(x,"HEAPF32");
|
||||
F=F||0;G=p(G);var y=ea.toTypedArray();y.set(d);y.set(m,2);d=a.Shader._MakeTwoPointConicalGradient(V,h,t,T.he,T.colorType,q,T.count,C,F,G,S);k(T.he,u);x&&k(q,x);return d};a.Vertices.prototype.bounds=function(d){this._bounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.ce&&a.ce.forEach(function(d){d()})};a.computeTonalColors=function(g){var d=n(g.ambient,"HEAPF32"),h=n(g.spot,"HEAPF32");this._computeTonalColors(d,h);var m={ambient:D(d),spot:D(h)};k(d,g.ambient);k(h,g.spot);return m};
|
||||
a.LTRBRect=function(g,d,h,m){return Float32Array.of(g,d,h,m)};a.XYWHRect=function(g,d,h,m){return Float32Array.of(g,d,g+h,d+m)};a.LTRBiRect=function(g,d,h,m){return Int32Array.of(g,d,h,m)};a.XYWHiRect=function(g,d,h,m){return Int32Array.of(g,d,g+h,d+m)};a.RRectXY=function(g,d,h){return Float32Array.of(g[0],g[1],g[2],g[3],d,h,d,h,d,h,d,h)};a.MakeAnimatedImageFromEncoded=function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._decodeAnimatedImage(d,g.byteLength))?
|
||||
g:null};a.MakeImageFromEncoded=function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._decodeImage(d,g.byteLength))?g:null};var ab=null;a.MakeImageFromCanvasImageSource=function(g){var d=g.width,h=g.height;ab||=document.createElement("canvas");ab.width=d;ab.height=h;var m=ab.getContext("2d",{willReadFrequently:!0});m.drawImage(g,0,0);g=m.getImageData(0,0,d,h);return a.MakeImage({width:d,height:h,alphaType:a.AlphaType.Unpremul,colorType:a.ColorType.RGBA_8888,colorSpace:a.ColorSpace.SRGB},
|
||||
g.data,4*d)};a.MakeImage=function(g,d,h){var m=a._malloc(d.length);a.HEAPU8.set(d,m);return a._MakeImage(g,m,d.length,h)};a.MakeVertices=function(g,d,h,m,t,u){var x=t&&t.length||0,C=0;h&&h.length&&(C|=1);m&&m.length&&(C|=2);void 0===u||u||(C|=4);g=new a._VerticesBuilder(g,d.length/2,x,C);n(d,"HEAPF32",g.positions());g.texCoords()&&n(h,"HEAPF32",g.texCoords());g.colors()&&n(c(m),"HEAPU32",g.colors());g.indices()&&n(t,"HEAPU16",g.indices());return g.detach()};(function(g){g.ce=g.ce||[];g.ce.push(function(){function d(q){q&&
|
||||
(q.dir=0===q.dir?g.TextDirection.RTL:g.TextDirection.LTR);return q}function h(q){if(!q||!q.length)return[];for(var y=[],M=0;M<q.length;M+=5){var W=g.LTRBRect(q[M],q[M+1],q[M+2],q[M+3]),wa=g.TextDirection.LTR;0===q[M+4]&&(wa=g.TextDirection.RTL);y.push({rect:W,dir:wa})}g._free(q.byteOffset);return y}function m(q){q=q||{};void 0===q.weight&&(q.weight=g.FontWeight.Normal);q.width=q.width||g.FontWidth.Normal;q.slant=q.slant||g.FontSlant.Upright;return q}function t(q){if(!q||!q.length)return 0;for(var y=
|
||||
[],M=0;M<q.length;M++){var W=u(q[M]);y.push(W)}return n(y,"HEAPU32")}function u(q){if(G[q])return G[q];var y=qa(q)+1,M=g._malloc(y);ra(q,M,y);return G[q]=M}function x(q){q._colorPtr=w(q.color);q._foregroundColorPtr=0;q._backgroundColorPtr=0;q._decorationColorPtr=0;q.foregroundColor&&(q._foregroundColorPtr=w(q.foregroundColor,F));q.backgroundColor&&(q._backgroundColorPtr=w(q.backgroundColor,S));q.decorationColor&&(q._decorationColorPtr=w(q.decorationColor,T));Array.isArray(q.fontFamilies)&&q.fontFamilies.length?
|
||||
(q._fontFamiliesPtr=t(q.fontFamilies),q._fontFamiliesLen=q.fontFamilies.length):(q._fontFamiliesPtr=0,q._fontFamiliesLen=0);if(q.locale){var y=q.locale;q._localePtr=u(y);q._localeLen=qa(y)}else q._localePtr=0,q._localeLen=0;if(Array.isArray(q.shadows)&&q.shadows.length){y=q.shadows;var M=y.map(function(ma){return ma.color||g.BLACK}),W=y.map(function(ma){return ma.blurRadius||0});q._shadowLen=y.length;for(var wa=g._malloc(8*y.length),wb=wa/4,xb=0;xb<y.length;xb++){var $b=y[xb].offset||[0,0];g.HEAPF32[wb]=
|
||||
$b[0];g.HEAPF32[wb+1]=$b[1];wb+=2}q._shadowColorsPtr=l(M).he;q._shadowOffsetsPtr=wa;q._shadowBlurRadiiPtr=n(W,"HEAPF32")}else q._shadowLen=0,q._shadowColorsPtr=0,q._shadowOffsetsPtr=0,q._shadowBlurRadiiPtr=0;Array.isArray(q.fontFeatures)&&q.fontFeatures.length?(y=q.fontFeatures,M=y.map(function(ma){return ma.name}),W=y.map(function(ma){return ma.value}),q._fontFeatureLen=y.length,q._fontFeatureNamesPtr=t(M),q._fontFeatureValuesPtr=n(W,"HEAPU32")):(q._fontFeatureLen=0,q._fontFeatureNamesPtr=0,q._fontFeatureValuesPtr=
|
||||
0);Array.isArray(q.fontVariations)&&q.fontVariations.length?(y=q.fontVariations,M=y.map(function(ma){return ma.axis}),W=y.map(function(ma){return ma.value}),q._fontVariationLen=y.length,q._fontVariationAxesPtr=t(M),q._fontVariationValuesPtr=n(W,"HEAPF32")):(q._fontVariationLen=0,q._fontVariationAxesPtr=0,q._fontVariationValuesPtr=0)}function C(q){g._free(q._fontFamiliesPtr);g._free(q._shadowColorsPtr);g._free(q._shadowOffsetsPtr);g._free(q._shadowBlurRadiiPtr);g._free(q._fontFeatureNamesPtr);g._free(q._fontFeatureValuesPtr);
|
||||
g._free(q._fontVariationAxesPtr);g._free(q._fontVariationValuesPtr)}g.Paragraph.prototype.getRectsForRange=function(q,y,M,W){q=this._getRectsForRange(q,y,M,W);return h(q)};g.Paragraph.prototype.getRectsForPlaceholders=function(){var q=this._getRectsForPlaceholders();return h(q)};g.Paragraph.prototype.getGlyphInfoAt=function(q){return d(this._getGlyphInfoAt(q))};g.Paragraph.prototype.getClosestGlyphInfoAtCoordinate=function(q,y){return d(this._getClosestGlyphInfoAtCoordinate(q,y))};g.TypefaceFontProvider.prototype.registerFont=
|
||||
function(q,y){q=g.Typeface.MakeTypefaceFromData(q);if(!q)return null;y=u(y);this._registerFont(q,y);q.delete()};g.ParagraphStyle=function(q){q.disableHinting=q.disableHinting||!1;if(q.ellipsis){var y=q.ellipsis;q._ellipsisPtr=u(y);q._ellipsisLen=qa(y)}else q._ellipsisPtr=0,q._ellipsisLen=0;null==q.heightMultiplier&&(q.heightMultiplier=-1);q.maxLines=q.maxLines||0;q.replaceTabCharacters=q.replaceTabCharacters||!1;y=(y=q.strutStyle)||{};y.strutEnabled=y.strutEnabled||!1;y.strutEnabled&&Array.isArray(y.fontFamilies)&&
|
||||
y.fontFamilies.length?(y._fontFamiliesPtr=t(y.fontFamilies),y._fontFamiliesLen=y.fontFamilies.length):(y._fontFamiliesPtr=0,y._fontFamiliesLen=0);y.fontStyle=m(y.fontStyle);null==y.fontSize&&(y.fontSize=-1);null==y.heightMultiplier&&(y.heightMultiplier=-1);y.halfLeading=y.halfLeading||!1;y.leading=y.leading||0;y.forceStrutHeight=y.forceStrutHeight||!1;q.strutStyle=y;q.textAlign=q.textAlign||g.TextAlign.Start;q.textDirection=q.textDirection||g.TextDirection.LTR;q.textHeightBehavior=q.textHeightBehavior||
|
||||
g.TextHeightBehavior.All;q.textStyle=g.TextStyle(q.textStyle);q.applyRoundingHack=!1!==q.applyRoundingHack;return q};g.TextStyle=function(q){q.color||(q.color=g.BLACK);q.decoration=q.decoration||0;q.decorationThickness=q.decorationThickness||0;q.decorationStyle=q.decorationStyle||g.DecorationStyle.Solid;q.textBaseline=q.textBaseline||g.TextBaseline.Alphabetic;null==q.fontSize&&(q.fontSize=-1);q.letterSpacing=q.letterSpacing||0;q.wordSpacing=q.wordSpacing||0;null==q.heightMultiplier&&(q.heightMultiplier=
|
||||
-1);q.halfLeading=q.halfLeading||!1;q.fontStyle=m(q.fontStyle);return q};var G={},F=g._malloc(16),S=g._malloc(16),T=g._malloc(16);g.ParagraphBuilder.Make=function(q,y){x(q.textStyle);y=g.ParagraphBuilder._Make(q,y);C(q.textStyle);return y};g.ParagraphBuilder.MakeFromFontProvider=function(q,y){x(q.textStyle);y=g.ParagraphBuilder._MakeFromFontProvider(q,y);C(q.textStyle);return y};g.ParagraphBuilder.MakeFromFontCollection=function(q,y){x(q.textStyle);y=g.ParagraphBuilder._MakeFromFontCollection(q,y);
|
||||
C(q.textStyle);return y};g.ParagraphBuilder.ShapeText=function(q,y,M){let W=0;for(const wa of y)W+=wa.length;if(W!==q.length)throw"Accumulated block lengths must equal text.length";return g.ParagraphBuilder._ShapeText(q,y,M)};g.ParagraphBuilder.prototype.pushStyle=function(q){x(q);this._pushStyle(q);C(q)};g.ParagraphBuilder.prototype.pushPaintStyle=function(q,y,M){x(q);this._pushPaintStyle(q,y,M);C(q)};g.ParagraphBuilder.prototype.addPlaceholder=function(q,y,M,W,wa){M=M||g.PlaceholderAlignment.Baseline;
|
||||
W=W||g.TextBaseline.Alphabetic;this._addPlaceholder(q||0,y||0,M,W,wa||0)};g.ParagraphBuilder.prototype.setWordsUtf8=function(q){var y=n(q,"HEAPU32");this._setWordsUtf8(y,q&&q.length||0);k(y,q)};g.ParagraphBuilder.prototype.setWordsUtf16=function(q){var y=n(q,"HEAPU32");this._setWordsUtf16(y,q&&q.length||0);k(y,q)};g.ParagraphBuilder.prototype.setGraphemeBreaksUtf8=function(q){var y=n(q,"HEAPU32");this._setGraphemeBreaksUtf8(y,q&&q.length||0);k(y,q)};g.ParagraphBuilder.prototype.setGraphemeBreaksUtf16=
|
||||
function(q){var y=n(q,"HEAPU32");this._setGraphemeBreaksUtf16(y,q&&q.length||0);k(y,q)};g.ParagraphBuilder.prototype.setLineBreaksUtf8=function(q){var y=n(q,"HEAPU32");this._setLineBreaksUtf8(y,q&&q.length||0);k(y,q)};g.ParagraphBuilder.prototype.setLineBreaksUtf16=function(q){var y=n(q,"HEAPU32");this._setLineBreaksUtf16(y,q&&q.length||0);k(y,q)}})})(r);a.ce=a.ce||[];a.ce.push(function(){a.Path.prototype.op=function(g,d){return this._op(g,d)?this:null};a.Path.prototype.simplify=function(){return this._simplify()?
|
||||
this:null}});a.ce=a.ce||[];a.ce.push(function(){a.Canvas.prototype.drawText=function(g,d,h,m,t){var u=qa(g),x=a._malloc(u+1);ra(g,x,u+1);this._drawSimpleText(x,u,d,h,t,m);a._free(x)};a.Canvas.prototype.drawGlyphs=function(g,d,h,m,t,u){if(!(2*g.length<=d.length))throw"Not enough positions for the array of gyphs";a.$d(this.Zd);const x=n(g,"HEAPU16"),C=n(d,"HEAPF32");this._drawGlyphs(g.length,x,C,h,m,t,u);k(C,d);k(x,g)};a.Font.prototype.getGlyphBounds=function(g,d,h){var m=n(g,"HEAPU16"),t=a._malloc(16*
|
||||
g.length);this._getGlyphWidthBounds(m,g.length,0,t,d||null);d=new Float32Array(a.HEAPU8.buffer,t,4*g.length);k(m,g);if(h)return h.set(d),a._free(t),h;g=Float32Array.from(d);a._free(t);return g};a.Font.prototype.getGlyphIDs=function(g,d,h){d||(d=g.length);var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=a._malloc(2*d);d=this._getGlyphIDs(t,m-1,d,g);a._free(t);if(0>d)return a._free(g),null;t=new Uint16Array(a.HEAPU8.buffer,g,d);if(h)return h.set(t),a._free(g),h;h=Uint16Array.from(t);a._free(g);return h};a.Font.prototype.getGlyphIntercepts=
|
||||
function(g,d,h,m){var t=n(g,"HEAPU16"),u=n(d,"HEAPF32");return this._getGlyphIntercepts(t,g.length,!(g&&g._ck),u,d.length,!(d&&d._ck),h,m)};a.Font.prototype.getGlyphWidths=function(g,d,h){var m=n(g,"HEAPU16"),t=a._malloc(4*g.length);this._getGlyphWidthBounds(m,g.length,t,0,d||null);d=new Float32Array(a.HEAPU8.buffer,t,g.length);k(m,g);if(h)return h.set(d),a._free(t),h;g=Float32Array.from(d);a._free(t);return g};a.FontMgr.FromData=function(){if(!arguments.length)return null;var g=arguments;1===g.length&&
|
||||
Array.isArray(g[0])&&(g=arguments[0]);if(!g.length)return null;for(var d=[],h=[],m=0;m<g.length;m++){var t=new Uint8Array(g[m]),u=n(t,"HEAPU8");d.push(u);h.push(t.byteLength)}d=n(d,"HEAPU32");h=n(h,"HEAPU32");g=a.FontMgr._fromData(d,h,g.length);a._free(d);a._free(h);return g};a.Typeface.MakeTypefaceFromData=function(g){g=new Uint8Array(g);var d=n(g,"HEAPU8");return(g=a.Typeface._MakeTypefaceFromData(d,g.byteLength))?g:null};a.Typeface.MakeFreeTypeFaceFromData=a.Typeface.MakeTypefaceFromData;a.Typeface.prototype.getGlyphIDs=
|
||||
function(g,d,h){d||(d=g.length);var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=a._malloc(2*d);d=this._getGlyphIDs(t,m-1,d,g);a._free(t);if(0>d)return a._free(g),null;t=new Uint16Array(a.HEAPU8.buffer,g,d);if(h)return h.set(t),a._free(g),h;h=Uint16Array.from(t);a._free(g);return h};a.TextBlob.MakeOnPath=function(g,d,h,m){if(g&&g.length&&d&&d.countPoints()){if(1===d.countPoints())return this.MakeFromText(g,h);m||=0;var t=h.getGlyphIDs(g);t=h.getGlyphWidths(t);var u=[];d=new a.ContourMeasureIter(d,!1,1);for(var x=
|
||||
d.next(),C=new Float32Array(4),G=0;G<g.length&&x;G++){var F=t[G];m+=F/2;if(m>x.length()){x.delete();x=d.next();if(!x){g=g.substring(0,G);break}m=F/2}x.getPosTan(m,C);var S=C[2],T=C[3];u.push(S,T,C[0]-F/2*S,C[1]-F/2*T);m+=F/2}g=this.MakeFromRSXform(g,u,h);x&&x.delete();d.delete();return g}};a.TextBlob.MakeFromRSXform=function(g,d,h){var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=n(d,"HEAPF32");h=a.TextBlob._MakeFromRSXform(t,m-1,g,h);a._free(t);return h?h:null};a.TextBlob.MakeFromRSXformGlyphs=function(g,
|
||||
d,h){var m=n(g,"HEAPU16");d=n(d,"HEAPF32");h=a.TextBlob._MakeFromRSXformGlyphs(m,2*g.length,d,h);k(m,g);return h?h:null};a.TextBlob.MakeFromGlyphs=function(g,d){var h=n(g,"HEAPU16");d=a.TextBlob._MakeFromGlyphs(h,2*g.length,d);k(h,g);return d?d:null};a.TextBlob.MakeFromText=function(g,d){var h=qa(g)+1,m=a._malloc(h);ra(g,m,h);g=a.TextBlob._MakeFromText(m,h-1,d);a._free(m);return g?g:null};a.MallocGlyphIDs=function(g){return a.Malloc(Uint16Array,g)}});a.ce=a.ce||[];a.ce.push(function(){a.MakePicture=
|
||||
function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._MakePicture(d,g.byteLength))?g:null}});a.ce=a.ce||[];a.ce.push(function(){a.RuntimeEffect.Make=function(g,d){return a.RuntimeEffect._Make(g,{onError:d||function(h){console.log("RuntimeEffect error",h)}})};a.RuntimeEffect.MakeForBlender=function(g,d){return a.RuntimeEffect._MakeForBlender(g,{onError:d||function(h){console.log("RuntimeEffect error",h)}})};a.RuntimeEffect.prototype.makeShader=function(g,d){var h=
|
||||
!g._ck,m=n(g,"HEAPF32");d=p(d);return this._makeShader(m,4*g.length,h,d)};a.RuntimeEffect.prototype.makeShaderWithChildren=function(g,d,h){var m=!g._ck,t=n(g,"HEAPF32");h=p(h);for(var u=[],x=0;x<d.length;x++)u.push(d[x].Yd.ae);d=n(u,"HEAPU32");return this._makeShaderWithChildren(t,4*g.length,m,d,u.length,h)};a.RuntimeEffect.prototype.makeBlender=function(g){var d=!g._ck,h=n(g,"HEAPF32");return this._makeBlender(h,4*g.length,d)}})})(r);var sa=Object.assign({},r),ta="",ua,va;
|
||||
if(fa||ia)ia?ta=self.location.href:"undefined"!=typeof document&&document.currentScript&&(ta=document.currentScript.src),_scriptName&&(ta=_scriptName),ta.startsWith("blob:")?ta="":ta=ta.substr(0,ta.replace(/[?#].*/,"").lastIndexOf("/")+1),ia&&(va=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),ua=a=>fetch(a,{credentials:"same-origin"}).then(b=>b.ok?b.arrayBuffer():Promise.reject(Error(b.status+" : "+b.url)));
|
||||
var xa=console.log.bind(console),ya=console.error.bind(console);Object.assign(r,sa);sa=null;var za,Ba=!1,Ca,B,Da,Fa,E,H,J,Ga;function Ha(){var a=za.buffer;r.HEAP8=Ca=new Int8Array(a);r.HEAP16=Da=new Int16Array(a);r.HEAPU8=B=new Uint8Array(a);r.HEAPU16=Fa=new Uint16Array(a);r.HEAP32=E=new Int32Array(a);r.HEAPU32=H=new Uint32Array(a);r.HEAPF32=J=new Float32Array(a);r.HEAPF64=Ga=new Float64Array(a)}var Ia=[],Ja=[],Ka=[],La=0,Na=null,Oa=null;
|
||||
function Pa(a){a="Aborted("+a+")";ya(a);Ba=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");ca(a);throw a;}var Qa=a=>a.startsWith("data:application/octet-stream;base64,"),Ra;function Sa(a){return ua(a).then(b=>new Uint8Array(b),()=>{if(va)var b=va(a);else throw"both async and sync fetching of the wasm failed";return b})}function Ta(a,b,c){return Sa(a).then(e=>WebAssembly.instantiate(e,b)).then(c,e=>{ya(`failed to asynchronously prepare wasm: ${e}`);Pa(e)})}
|
||||
function Ua(a,b){var c=Ra;return"function"!=typeof WebAssembly.instantiateStreaming||Qa(c)||"function"!=typeof fetch?Ta(c,a,b):fetch(c,{credentials:"same-origin"}).then(e=>WebAssembly.instantiateStreaming(e,a).then(b,function(f){ya(`wasm streaming compile failed: ${f}`);ya("falling back to ArrayBuffer instantiation");return Ta(c,a,b)}))}function Va(a){this.name="ExitStatus";this.message=`Program terminated with exit(${a})`;this.status=a}var Wa=a=>{a.forEach(b=>b(r))},Xa=r.noExitRuntime||!0;
|
||||
class Ya{constructor(a){this.ae=a-24}}
|
||||
var Za=0,bb=0,cb="undefined"!=typeof TextDecoder?new TextDecoder:void 0,db=(a,b=0,c=NaN)=>{var e=b+c;for(c=b;a[c]&&!(c>=e);)++c;if(16<c-b&&a.buffer&&cb)return cb.decode(a.subarray(b,c));for(e="";b<c;){var f=a[b++];if(f&128){var k=a[b++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|k);else{var n=a[b++]&63;f=224==(f&240)?(f&15)<<12|k<<6|n:(f&7)<<18|k<<12|n<<6|a[b++]&63;65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e},
|
||||
eb={},fb=a=>{for(;a.length;){var b=a.pop();a.pop()(b)}};function gb(a){return this.fromWireType(H[a>>2])}
|
||||
var hb={},ib={},jb={},kb,mb=(a,b,c)=>{function e(l){l=c(l);if(l.length!==a.length)throw new kb("Mismatched type converter count");for(var p=0;p<a.length;++p)lb(a[p],l[p])}a.forEach(l=>jb[l]=b);var f=Array(b.length),k=[],n=0;b.forEach((l,p)=>{ib.hasOwnProperty(l)?f[p]=ib[l]:(k.push(l),hb.hasOwnProperty(l)||(hb[l]=[]),hb[l].push(()=>{f[p]=ib[l];++n;n===k.length&&e(f)}))});0===k.length&&e(f)},nb,K=a=>{for(var b="";B[a];)b+=nb[B[a++]];return b},L;
|
||||
function ob(a,b,c={}){var e=b.name;if(!a)throw new L(`type "${e}" must have a positive integer typeid pointer`);if(ib.hasOwnProperty(a)){if(c.lf)return;throw new L(`Cannot register type '${e}' twice`);}ib[a]=b;delete jb[a];hb.hasOwnProperty(a)&&(b=hb[a],delete hb[a],b.forEach(f=>f()))}function lb(a,b,c={}){return ob(a,b,c)}
|
||||
var pb=a=>{throw new L(a.Yd.de.be.name+" instance already deleted");},qb=!1,rb=()=>{},sb=(a,b,c)=>{if(b===c)return a;if(void 0===c.ge)return null;a=sb(a,b,c.ge);return null===a?null:c.cf(a)},yb={},zb={},Ab=(a,b)=>{if(void 0===b)throw new L("ptr should not be undefined");for(;a.ge;)b=a.ye(b),a=a.ge;return zb[b]},Cb=(a,b)=>{if(!b.de||!b.ae)throw new kb("makeClassHandle requires ptr and ptrType");if(!!b.ie!==!!b.ee)throw new kb("Both smartPtrType and smartPtr must be specified");b.count={value:1};return Bb(Object.create(a,
|
||||
{Yd:{value:b,writable:!0}}))},Bb=a=>{if("undefined"===typeof FinalizationRegistry)return Bb=b=>b,a;qb=new FinalizationRegistry(b=>{b=b.Yd;--b.count.value;0===b.count.value&&(b.ee?b.ie.ne(b.ee):b.de.be.ne(b.ae))});Bb=b=>{var c=b.Yd;c.ee&&qb.register(b,{Yd:c},b);return b};rb=b=>{qb.unregister(b)};return Bb(a)},Db=[];function Eb(){}
|
||||
var Fb=(a,b)=>Object.defineProperty(b,"name",{value:a}),Gb=(a,b,c)=>{if(void 0===a[b].fe){var e=a[b];a[b]=function(...f){if(!a[b].fe.hasOwnProperty(f.length))throw new L(`Function '${c}' called with an invalid number of arguments (${f.length}) - expects one of (${a[b].fe})!`);return a[b].fe[f.length].apply(this,f)};a[b].fe=[];a[b].fe[e.oe]=e}},Hb=(a,b,c)=>{if(r.hasOwnProperty(a)){if(void 0===c||void 0!==r[a].fe&&void 0!==r[a].fe[c])throw new L(`Cannot register public name '${a}' twice`);Gb(r,a,a);
|
||||
if(r[a].fe.hasOwnProperty(c))throw new L(`Cannot register multiple overloads of a function with the same number of arguments (${c})!`);r[a].fe[c]=b}else r[a]=b,r[a].oe=c},Ib=a=>{a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?`_${a}`:a};function Jb(a,b,c,e,f,k,n,l){this.name=a;this.constructor=b;this.se=c;this.ne=e;this.ge=f;this.ff=k;this.ye=n;this.cf=l;this.pf=[]}
|
||||
var Kb=(a,b,c)=>{for(;b!==c;){if(!b.ye)throw new L(`Expected null or instance of ${c.name}, got an instance of ${b.name}`);a=b.ye(a);b=b.ge}return a};function Lb(a,b){if(null===b){if(this.Ke)throw new L(`null is not a valid ${this.name}`);return 0}if(!b.Yd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Yd.ae)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);return Kb(b.Yd.ae,b.Yd.de.be,this.be)}
|
||||
function Nb(a,b){if(null===b){if(this.Ke)throw new L(`null is not a valid ${this.name}`);if(this.De){var c=this.Le();null!==a&&a.push(this.ne,c);return c}return 0}if(!b||!b.Yd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Yd.ae)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);if(!this.Ce&&b.Yd.de.Ce)throw new L(`Cannot convert argument of type ${b.Yd.ie?b.Yd.ie.name:b.Yd.de.name} to parameter type ${this.name}`);c=Kb(b.Yd.ae,b.Yd.de.be,this.be);if(this.De){if(void 0===
|
||||
b.Yd.ee)throw new L("Passing raw pointer to smart pointer is illegal");switch(this.uf){case 0:if(b.Yd.ie===this)c=b.Yd.ee;else throw new L(`Cannot convert argument of type ${b.Yd.ie?b.Yd.ie.name:b.Yd.de.name} to parameter type ${this.name}`);break;case 1:c=b.Yd.ee;break;case 2:if(b.Yd.ie===this)c=b.Yd.ee;else{var e=b.clone();c=this.qf(c,Ob(()=>e["delete"]()));null!==a&&a.push(this.ne,c)}break;default:throw new L("Unsupporting sharing policy");}}return c}
|
||||
function Pb(a,b){if(null===b){if(this.Ke)throw new L(`null is not a valid ${this.name}`);return 0}if(!b.Yd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Yd.ae)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);if(b.Yd.de.Ce)throw new L(`Cannot convert argument of type ${b.Yd.de.name} to parameter type ${this.name}`);return Kb(b.Yd.ae,b.Yd.de.be,this.be)}
|
||||
function Qb(a,b,c,e,f,k,n,l,p,v,w){this.name=a;this.be=b;this.Ke=c;this.Ce=e;this.De=f;this.nf=k;this.uf=n;this.Se=l;this.Le=p;this.qf=v;this.ne=w;f||void 0!==b.ge?this.toWireType=Nb:(this.toWireType=e?Lb:Pb,this.ke=null)}
|
||||
var Rb=(a,b,c)=>{if(!r.hasOwnProperty(a))throw new kb("Replacing nonexistent public symbol");void 0!==r[a].fe&&void 0!==c?r[a].fe[c]=b:(r[a]=b,r[a].oe=c)},N,Sb=(a,b,c=[])=>{a.includes("j")?(a=a.replace(/p/g,"i"),b=(0,r["dynCall_"+a])(b,...c)):b=N.get(b)(...c);return b},Tb=(a,b)=>(...c)=>Sb(a,b,c),O=(a,b)=>{a=K(a);var c=a.includes("j")?Tb(a,b):N.get(b);if("function"!=typeof c)throw new L(`unknown function pointer with signature ${a}: ${b}`);return c},ac,dc=a=>{a=bc(a);var b=K(a);cc(a);return b},ec=
|
||||
(a,b)=>{function c(k){f[k]||ib[k]||(jb[k]?jb[k].forEach(c):(e.push(k),f[k]=!0))}var e=[],f={};b.forEach(c);throw new ac(`${a}: `+e.map(dc).join([", "]));};function fc(a){for(var b=1;b<a.length;++b)if(null!==a[b]&&void 0===a[b].ke)return!0;return!1}
|
||||
function gc(a,b,c,e,f){var k=b.length;if(2>k)throw new L("argTypes array size mismatch! Must at least get return value and 'this' types!");var n=null!==b[1]&&null!==c,l=fc(b),p="void"!==b[0].name,v=k-2,w=Array(v),A=[],D=[];return Fb(a,function(...I){D.length=0;A.length=n?2:1;A[0]=f;if(n){var Q=b[1].toWireType(D,this);A[1]=Q}for(var P=0;P<v;++P)w[P]=b[P+2].toWireType(D,I[P]),A.push(w[P]);I=e(...A);if(l)fb(D);else for(P=n?1:2;P<b.length;P++){var aa=1===P?Q:w[P-2];null!==b[P].ke&&b[P].ke(aa)}Q=p?b[0].fromWireType(I):
|
||||
void 0;return Q})}
|
||||
var hc=(a,b)=>{for(var c=[],e=0;e<a;e++)c.push(H[b+4*e>>2]);return c},ic=a=>{a=a.trim();const b=a.indexOf("(");return-1!==b?a.substr(0,b):a},jc=[],kc=[],lc=a=>{9<a&&0===--kc[a+1]&&(kc[a]=void 0,jc.push(a))},mc=a=>{if(!a)throw new L("Cannot use deleted val. handle = "+a);return kc[a]},Ob=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=jc.pop()||kc.length;kc[b]=a;kc[b+1]=1;return b}},nc={name:"emscripten::val",fromWireType:a=>{var b=mc(a);lc(a);
|
||||
return b},toWireType:(a,b)=>Ob(b),je:8,readValueFromPointer:gb,ke:null},oc=(a,b,c)=>{switch(b){case 1:return c?function(e){return this.fromWireType(Ca[e])}:function(e){return this.fromWireType(B[e])};case 2:return c?function(e){return this.fromWireType(Da[e>>1])}:function(e){return this.fromWireType(Fa[e>>1])};case 4:return c?function(e){return this.fromWireType(E[e>>2])}:function(e){return this.fromWireType(H[e>>2])};default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},pc=(a,b)=>
|
||||
{var c=ib[a];if(void 0===c)throw a=`${b} has unknown type ${dc(a)}`,new L(a);return c},Mb=a=>{if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a},qc=(a,b)=>{switch(b){case 4:return function(c){return this.fromWireType(J[c>>2])};case 8:return function(c){return this.fromWireType(Ga[c>>3])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}},rc=(a,b,c)=>{switch(b){case 1:return c?e=>Ca[e]:e=>B[e];case 2:return c?e=>Da[e>>1]:e=>Fa[e>>
|
||||
1];case 4:return c?e=>E[e>>2]:e=>H[e>>2];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},ra=(a,b,c)=>{var e=B;if(!(0<c))return 0;var f=b;c=b+c-1;for(var k=0;k<a.length;++k){var n=a.charCodeAt(k);if(55296<=n&&57343>=n){var l=a.charCodeAt(++k);n=65536+((n&1023)<<10)|l&1023}if(127>=n){if(b>=c)break;e[b++]=n}else{if(2047>=n){if(b+1>=c)break;e[b++]=192|n>>6}else{if(65535>=n){if(b+2>=c)break;e[b++]=224|n>>12}else{if(b+3>=c)break;e[b++]=240|n>>18;e[b++]=128|n>>12&63}e[b++]=128|n>>6&
|
||||
63}e[b++]=128|n&63}}e[b]=0;return b-f},qa=a=>{for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);127>=e?b++:2047>=e?b+=2:55296<=e&&57343>=e?(b+=4,++c):b+=3}return b},sc="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0,tc=(a,b)=>{var c=a>>1;for(var e=c+b/2;!(c>=e)&&Fa[c];)++c;c<<=1;if(32<c-a&&sc)return sc.decode(B.subarray(a,c));c="";for(e=0;!(e>=b/2);++e){var f=Da[a+2*e>>1];if(0==f)break;c+=String.fromCharCode(f)}return c},uc=(a,b,c)=>{c??=2147483647;if(2>c)return 0;c-=2;var e=
|
||||
b;c=c<2*a.length?c/2:a.length;for(var f=0;f<c;++f)Da[b>>1]=a.charCodeAt(f),b+=2;Da[b>>1]=0;return b-e},vc=a=>2*a.length,wc=(a,b)=>{for(var c=0,e="";!(c>=b/4);){var f=E[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e},xc=(a,b,c)=>{c??=2147483647;if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f<a.length;++f){var k=a.charCodeAt(f);if(55296<=k&&57343>=k){var n=a.charCodeAt(++f);k=65536+((k&1023)<<10)|n&1023}E[b>>2]=k;b+=
|
||||
4;if(b+4>c)break}E[b>>2]=0;return b-e},yc=a=>{for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);55296<=e&&57343>=e&&++c;b+=4}return b},zc=(a,b,c)=>{var e=[];a=a.toWireType(e,c);e.length&&(H[b>>2]=Ob(e));return a},Ac=[],Bc={},Cc=a=>{var b=Bc[a];return void 0===b?K(a):b},Dc=()=>{function a(b){b.$$$embind_global$$$=b;var c="object"==typeof $$$embind_global$$$&&b.$$$embind_global$$$==b;c||delete b.$$$embind_global$$$;return c}if("object"==typeof globalThis)return globalThis;if("object"==typeof $$$embind_global$$$)return $$$embind_global$$$;
|
||||
"object"==typeof global&&a(global)?$$$embind_global$$$=global:"object"==typeof self&&a(self)&&($$$embind_global$$$=self);if("object"==typeof $$$embind_global$$$)return $$$embind_global$$$;throw Error("unable to get global object.");},Ec=a=>{var b=Ac.length;Ac.push(a);return b},Fc=(a,b)=>{for(var c=Array(a),e=0;e<a;++e)c[e]=pc(H[b+4*e>>2],"parameter "+e);return c},Gc=Reflect.construct,R,Hc=a=>{var b=a.getExtension("ANGLE_instanced_arrays");b&&(a.vertexAttribDivisor=(c,e)=>b.vertexAttribDivisorANGLE(c,
|
||||
e),a.drawArraysInstanced=(c,e,f,k)=>b.drawArraysInstancedANGLE(c,e,f,k),a.drawElementsInstanced=(c,e,f,k,n)=>b.drawElementsInstancedANGLE(c,e,f,k,n))},Ic=a=>{var b=a.getExtension("OES_vertex_array_object");b&&(a.createVertexArray=()=>b.createVertexArrayOES(),a.deleteVertexArray=c=>b.deleteVertexArrayOES(c),a.bindVertexArray=c=>b.bindVertexArrayOES(c),a.isVertexArray=c=>b.isVertexArrayOES(c))},Jc=a=>{var b=a.getExtension("WEBGL_draw_buffers");b&&(a.drawBuffers=(c,e)=>b.drawBuffersWEBGL(c,e))},Kc=a=>
|
||||
{var b="ANGLE_instanced_arrays EXT_blend_minmax EXT_disjoint_timer_query EXT_frag_depth EXT_shader_texture_lod EXT_sRGB OES_element_index_uint OES_fbo_render_mipmap OES_standard_derivatives OES_texture_float OES_texture_half_float OES_texture_half_float_linear OES_vertex_array_object WEBGL_color_buffer_float WEBGL_depth_texture WEBGL_draw_buffers EXT_color_buffer_float EXT_conservative_depth EXT_disjoint_timer_query_webgl2 EXT_texture_norm16 NV_shader_noperspective_interpolation WEBGL_clip_cull_distance EXT_clip_control EXT_color_buffer_half_float EXT_depth_clamp EXT_float_blend EXT_polygon_offset_clamp EXT_texture_compression_bptc EXT_texture_compression_rgtc EXT_texture_filter_anisotropic KHR_parallel_shader_compile OES_texture_float_linear WEBGL_blend_func_extended WEBGL_compressed_texture_astc WEBGL_compressed_texture_etc WEBGL_compressed_texture_etc1 WEBGL_compressed_texture_s3tc WEBGL_compressed_texture_s3tc_srgb WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_lose_context WEBGL_multi_draw WEBGL_polygon_mode".split(" ");
|
||||
return(a.getSupportedExtensions()||[]).filter(c=>b.includes(c))},Lc=1,Mc=[],Nc=[],Oc=[],Pc=[],ka=[],Qc=[],Rc=[],pa=[],Sc=[],Tc=[],Uc=[],Wc={},Xc={},Yc=4,Zc=0,ja=a=>{for(var b=Lc++,c=a.length;c<b;c++)a[c]=null;return b},$c=(a,b,c,e)=>{for(var f=0;f<a;f++){var k=R[c](),n=k&&ja(e);k?(k.name=n,e[n]=k):U||=1282;E[b+4*f>>2]=n}},na=(a,b)=>{a.Ne||(a.Ne=a.getContext,a.getContext=function(e,f){f=a.Ne(e,f);return"webgl"==e==f instanceof WebGLRenderingContext?f:null});var c=1<b.majorVersion?a.getContext("webgl2",
|
||||
b):a.getContext("webgl",b);return c?ad(c,b):0},ad=(a,b)=>{var c=ja(pa),e={handle:c,attributes:b,version:b.majorVersion,le:a};a.canvas&&(a.canvas.Ve=e);pa[c]=e;("undefined"==typeof b.df||b.df)&&bd(e);return c},oa=a=>{z=pa[a];r.vf=R=z?.le;return!(a&&!R)},bd=a=>{a||=z;if(!a.mf){a.mf=!0;var b=a.le;b.zf=b.getExtension("WEBGL_multi_draw");b.xf=b.getExtension("EXT_polygon_offset_clamp");b.wf=b.getExtension("EXT_clip_control");b.Bf=b.getExtension("WEBGL_polygon_mode");Hc(b);Ic(b);Jc(b);b.Pe=b.getExtension("WEBGL_draw_instanced_base_vertex_base_instance");
|
||||
b.Re=b.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance");2<=a.version&&(b.me=b.getExtension("EXT_disjoint_timer_query_webgl2"));if(2>a.version||!b.me)b.me=b.getExtension("EXT_disjoint_timer_query");Kc(b).forEach(c=>{c.includes("lose_context")||c.includes("debug")||b.getExtension(c)})}},z,U,cd=(a,b)=>{R.bindFramebuffer(a,Oc[b])},dd=a=>{R.bindVertexArray(Rc[a])},ed=a=>R.clear(a),fd=(a,b,c,e)=>R.clearColor(a,b,c,e),gd=a=>R.clearStencil(a),hd=(a,b)=>{for(var c=0;c<a;c++){var e=E[b+
|
||||
4*c>>2];R.deleteVertexArray(Rc[e]);Rc[e]=null}},jd=[],kd=(a,b)=>{$c(a,b,"createVertexArray",Rc)};function ld(){var a=Kc(R);return a=a.concat(a.map(b=>"GL_"+b))}
|
||||
var md=(a,b,c)=>{if(b){var e=void 0;switch(a){case 36346:e=1;break;case 36344:0!=c&&1!=c&&(U||=1280);return;case 34814:case 36345:e=0;break;case 34466:var f=R.getParameter(34467);e=f?f.length:0;break;case 33309:if(2>z.version){U||=1282;return}e=ld().length;break;case 33307:case 33308:if(2>z.version){U||=1280;return}e=33307==a?3:0}if(void 0===e)switch(f=R.getParameter(a),typeof f){case "number":e=f;break;case "boolean":e=f?1:0;break;case "string":U||=1280;return;case "object":if(null===f)switch(a){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:e=
|
||||
0;break;default:U||=1280;return}else{if(f instanceof Float32Array||f instanceof Uint32Array||f instanceof Int32Array||f instanceof Array){for(a=0;a<f.length;++a)switch(c){case 0:E[b+4*a>>2]=f[a];break;case 2:J[b+4*a>>2]=f[a];break;case 4:Ca[b+a]=f[a]?1:0}return}try{e=f.name|0}catch(k){U||=1280;ya(`GL_INVALID_ENUM in glGet${c}v: Unknown object returned from WebGL getParameter(${a})! (error: ${k})`);return}}break;default:U||=1280;ya(`GL_INVALID_ENUM in glGet${c}v: Native code calling glGet${c}v(${a}) and it returns ${f} of type ${typeof f}!`);
|
||||
return}switch(c){case 1:c=e;H[b>>2]=c;H[b+4>>2]=(c-H[b>>2])/4294967296;break;case 0:E[b>>2]=e;break;case 2:J[b>>2]=e;break;case 4:Ca[b]=e?1:0}}else U||=1281},nd=(a,b)=>md(a,b,0),od=(a,b,c)=>{if(c){a=Sc[a];b=2>z.version?R.me.getQueryObjectEXT(a,b):R.getQueryParameter(a,b);var e;"boolean"==typeof b?e=b?1:0:e=b;H[c>>2]=e;H[c+4>>2]=(e-H[c>>2])/4294967296}else U||=1281},qd=a=>{var b=qa(a)+1,c=pd(b);c&&ra(a,c,b);return c},rd=a=>{var b=Wc[a];if(!b){switch(a){case 7939:b=qd(ld().join(" "));break;case 7936:case 7937:case 37445:case 37446:(b=
|
||||
R.getParameter(a))||(U||=1280);b=b?qd(b):0;break;case 7938:b=R.getParameter(7938);var c=`OpenGL ES 2.0 (${b})`;2<=z.version&&(c=`OpenGL ES 3.0 (${b})`);b=qd(c);break;case 35724:b=R.getParameter(35724);c=b.match(/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/);null!==c&&(3==c[1].length&&(c[1]+="0"),b=`OpenGL ES GLSL ES ${c[1]} (${b})`);b=qd(b);break;default:U||=1280}Wc[a]=b}return b},sd=(a,b)=>{if(2>z.version)return U||=1282,0;var c=Xc[a];if(c)return 0>b||b>=c.length?(U||=1281,0):c[b];switch(a){case 7939:return c=
|
||||
ld().map(qd),c=Xc[a]=c,0>b||b>=c.length?(U||=1281,0):c[b];default:return U||=1280,0}},td=a=>"]"==a.slice(-1)&&a.lastIndexOf("["),ud=a=>{a-=5120;return 0==a?Ca:1==a?B:2==a?Da:4==a?E:6==a?J:5==a||28922==a||28520==a||30779==a||30782==a?H:Fa},vd=(a,b,c,e,f)=>{a=ud(a);b=e*((Zc||c)*({5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4}[b-6402]||1)*a.BYTES_PER_ELEMENT+Yc-1&-Yc);return a.subarray(f>>>31-Math.clz32(a.BYTES_PER_ELEMENT),f+b>>>31-Math.clz32(a.BYTES_PER_ELEMENT))},Y=a=>{var b=R.bf;if(b){var c=
|
||||
b.xe[a];"number"==typeof c&&(b.xe[a]=c=R.getUniformLocation(b,b.Te[a]+(0<c?`[${c}]`:"")));return c}U||=1282},wd=[],xd=[],yd={},Ad=()=>{if(!zd){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"},b;for(b in yd)void 0===yd[b]?delete a[b]:a[b]=yd[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);zd=c}return zd},zd,Bd=[null,[],[]];
|
||||
kb=r.InternalError=class extends Error{constructor(a){super(a);this.name="InternalError"}};for(var Cd=Array(256),Dd=0;256>Dd;++Dd)Cd[Dd]=String.fromCharCode(Dd);nb=Cd;L=r.BindingError=class extends Error{constructor(a){super(a);this.name="BindingError"}};
|
||||
Object.assign(Eb.prototype,{isAliasOf:function(a){if(!(this instanceof Eb&&a instanceof Eb))return!1;var b=this.Yd.de.be,c=this.Yd.ae;a.Yd=a.Yd;var e=a.Yd.de.be;for(a=a.Yd.ae;b.ge;)c=b.ye(c),b=b.ge;for(;e.ge;)a=e.ye(a),e=e.ge;return b===e&&c===a},clone:function(){this.Yd.ae||pb(this);if(this.Yd.we)return this.Yd.count.value+=1,this;var a=Bb,b=Object,c=b.create,e=Object.getPrototypeOf(this),f=this.Yd;a=a(c.call(b,e,{Yd:{value:{count:f.count,ve:f.ve,we:f.we,ae:f.ae,de:f.de,ee:f.ee,ie:f.ie}}}));a.Yd.count.value+=
|
||||
1;a.Yd.ve=!1;return a},["delete"](){this.Yd.ae||pb(this);if(this.Yd.ve&&!this.Yd.we)throw new L("Object already scheduled for deletion");rb(this);var a=this.Yd;--a.count.value;0===a.count.value&&(a.ee?a.ie.ne(a.ee):a.de.be.ne(a.ae));this.Yd.we||(this.Yd.ee=void 0,this.Yd.ae=void 0)},isDeleted:function(){return!this.Yd.ae},deleteLater:function(){this.Yd.ae||pb(this);if(this.Yd.ve&&!this.Yd.we)throw new L("Object already scheduled for deletion");Db.push(this);this.Yd.ve=!0;return this}});
|
||||
Object.assign(Qb.prototype,{gf(a){this.Se&&(a=this.Se(a));return a},Oe(a){this.ne?.(a)},je:8,readValueFromPointer:gb,fromWireType:function(a){function b(){return this.De?Cb(this.be.se,{de:this.nf,ae:c,ie:this,ee:a}):Cb(this.be.se,{de:this,ae:a})}var c=this.gf(a);if(!c)return this.Oe(a),null;var e=Ab(this.be,c);if(void 0!==e){if(0===e.Yd.count.value)return e.Yd.ae=c,e.Yd.ee=a,e.clone();e=e.clone();this.Oe(a);return e}e=this.be.ff(c);e=yb[e];if(!e)return b.call(this);e=this.Ce?e.af:e.pointerType;var f=
|
||||
sb(c,this.be,e.be);return null===f?b.call(this):this.De?Cb(e.be.se,{de:e,ae:f,ie:this,ee:a}):Cb(e.be.se,{de:e,ae:f})}});ac=r.UnboundTypeError=((a,b)=>{var c=Fb(b,function(e){this.name=b;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(a.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:`${this.name}: ${this.message}`};return c})(Error,"UnboundTypeError");
|
||||
kc.push(0,1,void 0,1,null,1,!0,1,!1,1);r.count_emval_handles=()=>kc.length/2-5-jc.length;for(var Ed=0;32>Ed;++Ed)jd.push(Array(Ed));var Fd=new Float32Array(288);for(Ed=0;288>=Ed;++Ed)wd[Ed]=Fd.subarray(0,Ed);var Gd=new Int32Array(288);for(Ed=0;288>=Ed;++Ed)xd[Ed]=Gd.subarray(0,Ed);
|
||||
var Vd={F:(a,b,c)=>{var e=new Ya(a);H[e.ae+16>>2]=0;H[e.ae+4>>2]=b;H[e.ae+8>>2]=c;Za=a;bb++;throw Za;},V:function(){return 0},vd:()=>{},ud:function(){return 0},td:()=>{},sd:()=>{},U:function(){},rd:()=>{},nd:()=>{Pa("")},B:a=>{var b=eb[a];delete eb[a];var c=b.Le,e=b.ne,f=b.Qe,k=f.map(n=>n.kf).concat(f.map(n=>n.sf));mb([a],k,n=>{var l={};f.forEach((p,v)=>{var w=n[v],A=p.hf,D=p.jf,I=n[v+f.length],Q=p.rf,P=p.tf;l[p.ef]={read:aa=>w.fromWireType(A(D,aa)),write:(aa,la)=>{var X=[];Q(P,aa,I.toWireType(X,
|
||||
la));fb(X)}}});return[{name:b.name,fromWireType:p=>{var v={},w;for(w in l)v[w]=l[w].read(p);e(p);return v},toWireType:(p,v)=>{for(var w in l)if(!(w in v))throw new TypeError(`Missing field: "${w}"`);var A=c();for(w in l)l[w].write(A,v[w]);null!==p&&p.push(e,A);return A},je:8,readValueFromPointer:gb,ke:e}]})},Y:()=>{},md:(a,b,c,e)=>{b=K(b);lb(a,{name:b,fromWireType:function(f){return!!f},toWireType:function(f,k){return k?c:e},je:8,readValueFromPointer:function(f){return this.fromWireType(B[f])},ke:null})},
|
||||
k:(a,b,c,e,f,k,n,l,p,v,w,A,D)=>{w=K(w);k=O(f,k);l&&=O(n,l);v&&=O(p,v);D=O(A,D);var I=Ib(w);Hb(I,function(){ec(`Cannot construct ${w} due to unbound types`,[e])});mb([a,b,c],e?[e]:[],Q=>{Q=Q[0];if(e){var P=Q.be;var aa=P.se}else aa=Eb.prototype;Q=Fb(w,function(...Ea){if(Object.getPrototypeOf(this)!==la)throw new L("Use 'new' to construct "+w);if(void 0===X.pe)throw new L(w+" has no accessible constructor");var ea=X.pe[Ea.length];if(void 0===ea)throw new L(`Tried to invoke ctor of ${w} with invalid number of parameters (${Ea.length}) - expected (${Object.keys(X.pe).toString()}) parameters instead!`);
|
||||
return ea.apply(this,Ea)});var la=Object.create(aa,{constructor:{value:Q}});Q.prototype=la;var X=new Jb(w,Q,la,D,P,k,l,v);if(X.ge){var ha;(ha=X.ge).ze??(ha.ze=[]);X.ge.ze.push(X)}P=new Qb(w,X,!0,!1,!1);ha=new Qb(w+"*",X,!1,!1,!1);aa=new Qb(w+" const*",X,!1,!0,!1);yb[a]={pointerType:ha,af:aa};Rb(I,Q);return[P,ha,aa]})},e:(a,b,c,e,f,k,n)=>{var l=hc(c,e);b=K(b);b=ic(b);k=O(f,k);mb([],[a],p=>{function v(){ec(`Cannot call ${w} due to unbound types`,l)}p=p[0];var w=`${p.name}.${b}`;b.startsWith("@@")&&
|
||||
(b=Symbol[b.substring(2)]);var A=p.be.constructor;void 0===A[b]?(v.oe=c-1,A[b]=v):(Gb(A,b,w),A[b].fe[c-1]=v);mb([],l,D=>{D=[D[0],null].concat(D.slice(1));D=gc(w,D,null,k,n);void 0===A[b].fe?(D.oe=c-1,A[b]=D):A[b].fe[c-1]=D;if(p.be.ze)for(const I of p.be.ze)I.constructor.hasOwnProperty(b)||(I.constructor[b]=D);return[]});return[]})},z:(a,b,c,e,f,k)=>{var n=hc(b,c);f=O(e,f);mb([],[a],l=>{l=l[0];var p=`constructor ${l.name}`;void 0===l.be.pe&&(l.be.pe=[]);if(void 0!==l.be.pe[b-1])throw new L(`Cannot register multiple constructors with identical number of parameters (${b-
|
||||
1}) for class '${l.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);l.be.pe[b-1]=()=>{ec(`Cannot construct ${l.name} due to unbound types`,n)};mb([],n,v=>{v.splice(1,0,null);l.be.pe[b-1]=gc(p,v,null,f,k);return[]});return[]})},a:(a,b,c,e,f,k,n,l)=>{var p=hc(c,e);b=K(b);b=ic(b);k=O(f,k);mb([],[a],v=>{function w(){ec(`Cannot call ${A} due to unbound types`,p)}v=v[0];var A=`${v.name}.${b}`;b.startsWith("@@")&&(b=Symbol[b.substring(2)]);l&&v.be.pf.push(b);
|
||||
var D=v.be.se,I=D[b];void 0===I||void 0===I.fe&&I.className!==v.name&&I.oe===c-2?(w.oe=c-2,w.className=v.name,D[b]=w):(Gb(D,b,A),D[b].fe[c-2]=w);mb([],p,Q=>{Q=gc(A,Q,v,k,n);void 0===D[b].fe?(Q.oe=c-2,D[b]=Q):D[b].fe[c-2]=Q;return[]});return[]})},q:(a,b,c)=>{a=K(a);mb([],[b],e=>{e=e[0];r[a]=e.fromWireType(c);return[]})},ld:a=>lb(a,nc),i:(a,b,c,e)=>{function f(){}b=K(b);f.values={};lb(a,{name:b,constructor:f,fromWireType:function(k){return this.constructor.values[k]},toWireType:(k,n)=>n.value,je:8,
|
||||
readValueFromPointer:oc(b,c,e),ke:null});Hb(b,f)},b:(a,b,c)=>{var e=pc(a,"enum");b=K(b);a=e.constructor;e=Object.create(e.constructor.prototype,{value:{value:c},constructor:{value:Fb(`${e.name}_${b}`,function(){})}});a.values[c]=e;a[b]=e},S:(a,b,c)=>{b=K(b);lb(a,{name:b,fromWireType:e=>e,toWireType:(e,f)=>f,je:8,readValueFromPointer:qc(b,c),ke:null})},w:(a,b,c,e,f,k)=>{var n=hc(b,c);a=K(a);a=ic(a);f=O(e,f);Hb(a,function(){ec(`Cannot call ${a} due to unbound types`,n)},b-1);mb([],n,l=>{l=[l[0],null].concat(l.slice(1));
|
||||
Rb(a,gc(a,l,null,f,k),b-1);return[]})},C:(a,b,c,e,f)=>{b=K(b);-1===f&&(f=4294967295);f=l=>l;if(0===e){var k=32-8*c;f=l=>l<<k>>>k}var n=b.includes("unsigned")?function(l,p){return p>>>0}:function(l,p){return p};lb(a,{name:b,fromWireType:f,toWireType:n,je:8,readValueFromPointer:rc(b,c,0!==e),ke:null})},p:(a,b,c)=>{function e(k){return new f(Ca.buffer,H[k+4>>2],H[k>>2])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=K(c);lb(a,{name:c,fromWireType:e,
|
||||
je:8,readValueFromPointer:e},{lf:!0})},o:(a,b,c,e,f,k,n,l,p,v,w,A)=>{c=K(c);k=O(f,k);l=O(n,l);v=O(p,v);A=O(w,A);mb([a],[b],D=>{D=D[0];return[new Qb(c,D.be,!1,!1,!0,D,e,k,l,v,A)]})},R:(a,b)=>{b=K(b);var c="std::string"===b;lb(a,{name:b,fromWireType:function(e){var f=H[e>>2],k=e+4;if(c)for(var n=k,l=0;l<=f;++l){var p=k+l;if(l==f||0==B[p]){n=n?db(B,n,p-n):"";if(void 0===v)var v=n;else v+=String.fromCharCode(0),v+=n;n=p+1}}else{v=Array(f);for(l=0;l<f;++l)v[l]=String.fromCharCode(B[k+l]);v=v.join("")}cc(e);
|
||||
return v},toWireType:function(e,f){f instanceof ArrayBuffer&&(f=new Uint8Array(f));var k="string"==typeof f;if(!(k||f instanceof Uint8Array||f instanceof Uint8ClampedArray||f instanceof Int8Array))throw new L("Cannot pass non-string to std::string");var n=c&&k?qa(f):f.length;var l=pd(4+n+1),p=l+4;H[l>>2]=n;if(c&&k)ra(f,p,n+1);else if(k)for(k=0;k<n;++k){var v=f.charCodeAt(k);if(255<v)throw cc(p),new L("String has UTF-16 code units that do not fit in 8 bits");B[p+k]=v}else for(k=0;k<n;++k)B[p+k]=f[k];
|
||||
null!==e&&e.push(cc,l);return l},je:8,readValueFromPointer:gb,ke(e){cc(e)}})},M:(a,b,c)=>{c=K(c);if(2===b){var e=tc;var f=uc;var k=vc;var n=l=>Fa[l>>1]}else 4===b&&(e=wc,f=xc,k=yc,n=l=>H[l>>2]);lb(a,{name:c,fromWireType:l=>{for(var p=H[l>>2],v,w=l+4,A=0;A<=p;++A){var D=l+4+A*b;if(A==p||0==n(D))w=e(w,D-w),void 0===v?v=w:(v+=String.fromCharCode(0),v+=w),w=D+b}cc(l);return v},toWireType:(l,p)=>{if("string"!=typeof p)throw new L(`Cannot pass non-string to C++ string type ${c}`);var v=k(p),w=pd(4+v+b);
|
||||
H[w>>2]=v/b;f(p,w+4,v+b);null!==l&&l.push(cc,w);return w},je:8,readValueFromPointer:gb,ke(l){cc(l)}})},A:(a,b,c,e,f,k)=>{eb[a]={name:K(b),Le:O(c,e),ne:O(f,k),Qe:[]}},d:(a,b,c,e,f,k,n,l,p,v)=>{eb[a].Qe.push({ef:K(b),kf:c,hf:O(e,f),jf:k,sf:n,rf:O(l,p),tf:v})},kd:(a,b)=>{b=K(b);lb(a,{yf:!0,name:b,je:0,fromWireType:()=>{},toWireType:()=>{}})},jd:()=>1,id:()=>{throw Infinity;},E:(a,b,c)=>{a=mc(a);b=pc(b,"emval::as");return zc(b,c,a)},L:(a,b,c,e)=>{a=Ac[a];b=mc(b);return a(null,b,c,e)},t:(a,b,c,e,f)=>{a=
|
||||
Ac[a];b=mc(b);c=Cc(c);return a(b,b[c],e,f)},c:lc,K:a=>{if(0===a)return Ob(Dc());a=Cc(a);return Ob(Dc()[a])},n:(a,b,c)=>{var e=Fc(a,b),f=e.shift();a--;var k=Array(a);b=`methodCaller<(${e.map(n=>n.name).join(", ")}) => ${f.name}>`;return Ec(Fb(b,(n,l,p,v)=>{for(var w=0,A=0;A<a;++A)k[A]=e[A].readValueFromPointer(v+w),w+=e[A].je;n=1===c?Gc(l,k):l.apply(n,k);return zc(f,p,n)}))},y:(a,b)=>{a=mc(a);b=mc(b);return Ob(a[b])},H:a=>{9<a&&(kc[a+1]+=1)},G:()=>Ob([]),f:a=>Ob(Cc(a)),D:()=>Ob({}),hd:a=>{a=mc(a);
|
||||
return!a},l:a=>{var b=mc(a);fb(b);lc(a)},h:(a,b,c)=>{a=mc(a);b=mc(b);c=mc(c);a[b]=c},g:(a,b)=>{a=pc(a,"_emval_take_value");a=a.readValueFromPointer(b);return Ob(a)},X:function(){return-52},W:function(){},gd:(a,b,c,e)=>{var f=(new Date).getFullYear(),k=(new Date(f,0,1)).getTimezoneOffset();f=(new Date(f,6,1)).getTimezoneOffset();H[a>>2]=60*Math.max(k,f);E[b>>2]=Number(k!=f);b=n=>{var l=Math.abs(n);return`UTC${0<=n?"-":"+"}${String(Math.floor(l/60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};
|
||||
a=b(k);b=b(f);f<k?(ra(a,c,17),ra(b,e,17)):(ra(a,e,17),ra(b,c,17))},fd:()=>performance.now(),ed:a=>R.activeTexture(a),dd:(a,b)=>{R.attachShader(Nc[a],Qc[b])},cd:(a,b)=>{R.beginQuery(a,Sc[b])},bd:(a,b)=>{R.me.beginQueryEXT(a,Sc[b])},ad:(a,b,c)=>{R.bindAttribLocation(Nc[a],b,c?db(B,c):"")},$c:(a,b)=>{35051==a?R.Ie=b:35052==a&&(R.re=b);R.bindBuffer(a,Mc[b])},_c:cd,Zc:(a,b)=>{R.bindRenderbuffer(a,Pc[b])},Yc:(a,b)=>{R.bindSampler(a,Tc[b])},Xc:(a,b)=>{R.bindTexture(a,ka[b])},Wc:dd,Vc:dd,Uc:(a,b,c,e)=>R.blendColor(a,
|
||||
b,c,e),Tc:a=>R.blendEquation(a),Sc:(a,b)=>R.blendFunc(a,b),Rc:(a,b,c,e,f,k,n,l,p,v)=>R.blitFramebuffer(a,b,c,e,f,k,n,l,p,v),Qc:(a,b,c,e)=>{2<=z.version?c&&b?R.bufferData(a,B,e,c,b):R.bufferData(a,b,e):R.bufferData(a,c?B.subarray(c,c+b):b,e)},Pc:(a,b,c,e)=>{2<=z.version?c&&R.bufferSubData(a,b,B,e,c):R.bufferSubData(a,b,B.subarray(e,e+c))},Oc:a=>R.checkFramebufferStatus(a),Nc:ed,Mc:fd,Lc:gd,Kc:(a,b,c,e)=>R.clientWaitSync(Uc[a],b,(c>>>0)+4294967296*e),Jc:(a,b,c,e)=>{R.colorMask(!!a,!!b,!!c,!!e)},Ic:a=>
|
||||
{R.compileShader(Qc[a])},Hc:(a,b,c,e,f,k,n,l)=>{2<=z.version?R.re||!n?R.compressedTexImage2D(a,b,c,e,f,k,n,l):R.compressedTexImage2D(a,b,c,e,f,k,B,l,n):R.compressedTexImage2D(a,b,c,e,f,k,B.subarray(l,l+n))},Gc:(a,b,c,e,f,k,n,l,p)=>{2<=z.version?R.re||!l?R.compressedTexSubImage2D(a,b,c,e,f,k,n,l,p):R.compressedTexSubImage2D(a,b,c,e,f,k,n,B,p,l):R.compressedTexSubImage2D(a,b,c,e,f,k,n,B.subarray(p,p+l))},Fc:(a,b,c,e,f)=>R.copyBufferSubData(a,b,c,e,f),Ec:(a,b,c,e,f,k,n,l)=>R.copyTexSubImage2D(a,b,c,
|
||||
e,f,k,n,l),Dc:()=>{var a=ja(Nc),b=R.createProgram();b.name=a;b.Ge=b.Ee=b.Fe=0;b.Me=1;Nc[a]=b;return a},Cc:a=>{var b=ja(Qc);Qc[b]=R.createShader(a);return b},Bc:a=>R.cullFace(a),Ac:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Mc[e];f&&(R.deleteBuffer(f),f.name=0,Mc[e]=null,e==R.Ie&&(R.Ie=0),e==R.re&&(R.re=0))}},zc:(a,b)=>{for(var c=0;c<a;++c){var e=E[b+4*c>>2],f=Oc[e];f&&(R.deleteFramebuffer(f),f.name=0,Oc[e]=null)}},yc:a=>{if(a){var b=Nc[a];b?(R.deleteProgram(b),b.name=0,Nc[a]=null):U||=1281}},
|
||||
xc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Sc[e];f&&(R.deleteQuery(f),Sc[e]=null)}},wc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Sc[e];f&&(R.me.deleteQueryEXT(f),Sc[e]=null)}},vc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Pc[e];f&&(R.deleteRenderbuffer(f),f.name=0,Pc[e]=null)}},uc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Tc[e];f&&(R.deleteSampler(f),f.name=0,Tc[e]=null)}},tc:a=>{if(a){var b=Qc[a];b?(R.deleteShader(b),Qc[a]=null):U||=1281}},sc:a=>{if(a){var b=Uc[a];b?
|
||||
(R.deleteSync(b),b.name=0,Uc[a]=null):U||=1281}},rc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=ka[e];f&&(R.deleteTexture(f),f.name=0,ka[e]=null)}},qc:hd,pc:hd,oc:a=>{R.depthMask(!!a)},nc:a=>R.disable(a),mc:a=>{R.disableVertexAttribArray(a)},lc:(a,b,c)=>{R.drawArrays(a,b,c)},kc:(a,b,c,e)=>{R.drawArraysInstanced(a,b,c,e)},jc:(a,b,c,e,f)=>{R.Pe.drawArraysInstancedBaseInstanceWEBGL(a,b,c,e,f)},ic:(a,b)=>{for(var c=jd[a],e=0;e<a;e++)c[e]=E[b+4*e>>2];R.drawBuffers(c)},hc:(a,b,c,e)=>{R.drawElements(a,
|
||||
b,c,e)},gc:(a,b,c,e,f)=>{R.drawElementsInstanced(a,b,c,e,f)},fc:(a,b,c,e,f,k,n)=>{R.Pe.drawElementsInstancedBaseVertexBaseInstanceWEBGL(a,b,c,e,f,k,n)},ec:(a,b,c,e,f,k)=>{R.drawElements(a,e,f,k)},dc:a=>R.enable(a),cc:a=>{R.enableVertexAttribArray(a)},bc:a=>R.endQuery(a),ac:a=>{R.me.endQueryEXT(a)},$b:(a,b)=>(a=R.fenceSync(a,b))?(b=ja(Uc),a.name=b,Uc[b]=a,b):0,_b:()=>R.finish(),Zb:()=>R.flush(),Yb:(a,b,c,e)=>{R.framebufferRenderbuffer(a,b,c,Pc[e])},Xb:(a,b,c,e,f)=>{R.framebufferTexture2D(a,b,c,ka[e],
|
||||
f)},Wb:a=>R.frontFace(a),Vb:(a,b)=>{$c(a,b,"createBuffer",Mc)},Ub:(a,b)=>{$c(a,b,"createFramebuffer",Oc)},Tb:(a,b)=>{$c(a,b,"createQuery",Sc)},Sb:(a,b)=>{for(var c=0;c<a;c++){var e=R.me.createQueryEXT();if(!e){for(U||=1282;c<a;)E[b+4*c++>>2]=0;break}var f=ja(Sc);e.name=f;Sc[f]=e;E[b+4*c>>2]=f}},Rb:(a,b)=>{$c(a,b,"createRenderbuffer",Pc)},Qb:(a,b)=>{$c(a,b,"createSampler",Tc)},Pb:(a,b)=>{$c(a,b,"createTexture",ka)},Ob:kd,Nb:kd,Mb:a=>R.generateMipmap(a),Lb:(a,b,c)=>{c?E[c>>2]=R.getBufferParameter(a,
|
||||
b):U||=1281},Kb:()=>{var a=R.getError()||U;U=0;return a},Jb:(a,b)=>md(a,b,2),Ib:(a,b,c,e)=>{a=R.getFramebufferAttachmentParameter(a,b,c);if(a instanceof WebGLRenderbuffer||a instanceof WebGLTexture)a=a.name|0;E[e>>2]=a},Hb:nd,Gb:(a,b,c,e)=>{a=R.getProgramInfoLog(Nc[a]);null===a&&(a="(unknown error)");b=0<b&&e?ra(a,e,b):0;c&&(E[c>>2]=b)},Fb:(a,b,c)=>{if(c)if(a>=Lc)U||=1281;else if(a=Nc[a],35716==b)a=R.getProgramInfoLog(a),null===a&&(a="(unknown error)"),E[c>>2]=a.length+1;else if(35719==b){if(!a.Ge){var e=
|
||||
R.getProgramParameter(a,35718);for(b=0;b<e;++b)a.Ge=Math.max(a.Ge,R.getActiveUniform(a,b).name.length+1)}E[c>>2]=a.Ge}else if(35722==b){if(!a.Ee)for(e=R.getProgramParameter(a,35721),b=0;b<e;++b)a.Ee=Math.max(a.Ee,R.getActiveAttrib(a,b).name.length+1);E[c>>2]=a.Ee}else if(35381==b){if(!a.Fe)for(e=R.getProgramParameter(a,35382),b=0;b<e;++b)a.Fe=Math.max(a.Fe,R.getActiveUniformBlockName(a,b).length+1);E[c>>2]=a.Fe}else E[c>>2]=R.getProgramParameter(a,b);else U||=1281},Eb:od,Db:od,Cb:(a,b,c)=>{if(c){a=
|
||||
R.getQueryParameter(Sc[a],b);var e;"boolean"==typeof a?e=a?1:0:e=a;E[c>>2]=e}else U||=1281},Bb:(a,b,c)=>{if(c){a=R.me.getQueryObjectEXT(Sc[a],b);var e;"boolean"==typeof a?e=a?1:0:e=a;E[c>>2]=e}else U||=1281},Ab:(a,b,c)=>{c?E[c>>2]=R.getQuery(a,b):U||=1281},zb:(a,b,c)=>{c?E[c>>2]=R.me.getQueryEXT(a,b):U||=1281},yb:(a,b,c)=>{c?E[c>>2]=R.getRenderbufferParameter(a,b):U||=1281},xb:(a,b,c,e)=>{a=R.getShaderInfoLog(Qc[a]);null===a&&(a="(unknown error)");b=0<b&&e?ra(a,e,b):0;c&&(E[c>>2]=b)},wb:(a,b,c,e)=>
|
||||
{a=R.getShaderPrecisionFormat(a,b);E[c>>2]=a.rangeMin;E[c+4>>2]=a.rangeMax;E[e>>2]=a.precision},vb:(a,b,c)=>{c?35716==b?(a=R.getShaderInfoLog(Qc[a]),null===a&&(a="(unknown error)"),E[c>>2]=a?a.length+1:0):35720==b?(a=R.getShaderSource(Qc[a]),E[c>>2]=a?a.length+1:0):E[c>>2]=R.getShaderParameter(Qc[a],b):U||=1281},ub:rd,tb:sd,sb:(a,b)=>{b=b?db(B,b):"";if(a=Nc[a]){var c=a,e=c.xe,f=c.Ue,k;if(!e){c.xe=e={};c.Te={};var n=R.getProgramParameter(c,35718);for(k=0;k<n;++k){var l=R.getActiveUniform(c,k);var p=
|
||||
l.name;l=l.size;var v=td(p);v=0<v?p.slice(0,v):p;var w=c.Me;c.Me+=l;f[v]=[l,w];for(p=0;p<l;++p)e[w]=p,c.Te[w++]=v}}c=a.xe;e=0;f=b;k=td(b);0<k&&(e=parseInt(b.slice(k+1))>>>0,f=b.slice(0,k));if((f=a.Ue[f])&&e<f[0]&&(e+=f[1],c[e]=c[e]||R.getUniformLocation(a,b)))return e}else U||=1281;return-1},rb:(a,b,c)=>{for(var e=jd[b],f=0;f<b;f++)e[f]=E[c+4*f>>2];R.invalidateFramebuffer(a,e)},qb:(a,b,c,e,f,k,n)=>{for(var l=jd[b],p=0;p<b;p++)l[p]=E[c+4*p>>2];R.invalidateSubFramebuffer(a,l,e,f,k,n)},pb:a=>R.isSync(Uc[a]),
|
||||
ob:a=>(a=ka[a])?R.isTexture(a):0,nb:a=>R.lineWidth(a),mb:a=>{a=Nc[a];R.linkProgram(a);a.xe=0;a.Ue={}},lb:(a,b,c,e,f,k)=>{R.Re.multiDrawArraysInstancedBaseInstanceWEBGL(a,E,b>>2,E,c>>2,E,e>>2,H,f>>2,k)},kb:(a,b,c,e,f,k,n,l)=>{R.Re.multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL(a,E,b>>2,c,E,e>>2,E,f>>2,E,k>>2,H,n>>2,l)},jb:(a,b)=>{3317==a?Yc=b:3314==a&&(Zc=b);R.pixelStorei(a,b)},ib:(a,b)=>{R.me.queryCounterEXT(Sc[a],b)},hb:a=>R.readBuffer(a),gb:(a,b,c,e,f,k,n)=>{if(2<=z.version)if(R.Ie)R.readPixels(a,
|
||||
b,c,e,f,k,n);else{var l=ud(k);n>>>=31-Math.clz32(l.BYTES_PER_ELEMENT);R.readPixels(a,b,c,e,f,k,l,n)}else(l=vd(k,f,c,e,n))?R.readPixels(a,b,c,e,f,k,l):U||=1280},fb:(a,b,c,e)=>R.renderbufferStorage(a,b,c,e),eb:(a,b,c,e,f)=>R.renderbufferStorageMultisample(a,b,c,e,f),db:(a,b,c)=>{R.samplerParameterf(Tc[a],b,c)},cb:(a,b,c)=>{R.samplerParameteri(Tc[a],b,c)},bb:(a,b,c)=>{R.samplerParameteri(Tc[a],b,E[c>>2])},ab:(a,b,c,e)=>R.scissor(a,b,c,e),$a:(a,b,c,e)=>{for(var f="",k=0;k<b;++k){var n=(n=H[c+4*k>>2])?
|
||||
db(B,n,e?H[e+4*k>>2]:void 0):"";f+=n}R.shaderSource(Qc[a],f)},_a:(a,b,c)=>R.stencilFunc(a,b,c),Za:(a,b,c,e)=>R.stencilFuncSeparate(a,b,c,e),Ya:a=>R.stencilMask(a),Xa:(a,b)=>R.stencilMaskSeparate(a,b),Wa:(a,b,c)=>R.stencilOp(a,b,c),Va:(a,b,c,e)=>R.stencilOpSeparate(a,b,c,e),Ua:(a,b,c,e,f,k,n,l,p)=>{if(2<=z.version){if(R.re){R.texImage2D(a,b,c,e,f,k,n,l,p);return}if(p){var v=ud(l);p>>>=31-Math.clz32(v.BYTES_PER_ELEMENT);R.texImage2D(a,b,c,e,f,k,n,l,v,p);return}}v=p?vd(l,n,e,f,p):null;R.texImage2D(a,
|
||||
b,c,e,f,k,n,l,v)},Ta:(a,b,c)=>R.texParameterf(a,b,c),Sa:(a,b,c)=>{R.texParameterf(a,b,J[c>>2])},Ra:(a,b,c)=>R.texParameteri(a,b,c),Qa:(a,b,c)=>{R.texParameteri(a,b,E[c>>2])},Pa:(a,b,c,e,f)=>R.texStorage2D(a,b,c,e,f),Oa:(a,b,c,e,f,k,n,l,p)=>{if(2<=z.version){if(R.re){R.texSubImage2D(a,b,c,e,f,k,n,l,p);return}if(p){var v=ud(l);R.texSubImage2D(a,b,c,e,f,k,n,l,v,p>>>31-Math.clz32(v.BYTES_PER_ELEMENT));return}}p=p?vd(l,n,f,k,p):null;R.texSubImage2D(a,b,c,e,f,k,n,l,p)},Na:(a,b)=>{R.uniform1f(Y(a),b)},Ma:(a,
|
||||
b,c)=>{if(2<=z.version)b&&R.uniform1fv(Y(a),J,c>>2,b);else{if(288>=b)for(var e=wd[b],f=0;f<b;++f)e[f]=J[c+4*f>>2];else e=J.subarray(c>>2,c+4*b>>2);R.uniform1fv(Y(a),e)}},La:(a,b)=>{R.uniform1i(Y(a),b)},Ka:(a,b,c)=>{if(2<=z.version)b&&R.uniform1iv(Y(a),E,c>>2,b);else{if(288>=b)for(var e=xd[b],f=0;f<b;++f)e[f]=E[c+4*f>>2];else e=E.subarray(c>>2,c+4*b>>2);R.uniform1iv(Y(a),e)}},Ja:(a,b,c)=>{R.uniform2f(Y(a),b,c)},Ia:(a,b,c)=>{if(2<=z.version)b&&R.uniform2fv(Y(a),J,c>>2,2*b);else{if(144>=b){b*=2;for(var e=
|
||||
wd[b],f=0;f<b;f+=2)e[f]=J[c+4*f>>2],e[f+1]=J[c+(4*f+4)>>2]}else e=J.subarray(c>>2,c+8*b>>2);R.uniform2fv(Y(a),e)}},Ha:(a,b,c)=>{R.uniform2i(Y(a),b,c)},Ga:(a,b,c)=>{if(2<=z.version)b&&R.uniform2iv(Y(a),E,c>>2,2*b);else{if(144>=b){b*=2;for(var e=xd[b],f=0;f<b;f+=2)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2]}else e=E.subarray(c>>2,c+8*b>>2);R.uniform2iv(Y(a),e)}},Fa:(a,b,c,e)=>{R.uniform3f(Y(a),b,c,e)},Ea:(a,b,c)=>{if(2<=z.version)b&&R.uniform3fv(Y(a),J,c>>2,3*b);else{if(96>=b){b*=3;for(var e=wd[b],f=0;f<
|
||||
b;f+=3)e[f]=J[c+4*f>>2],e[f+1]=J[c+(4*f+4)>>2],e[f+2]=J[c+(4*f+8)>>2]}else e=J.subarray(c>>2,c+12*b>>2);R.uniform3fv(Y(a),e)}},Da:(a,b,c,e)=>{R.uniform3i(Y(a),b,c,e)},Ca:(a,b,c)=>{if(2<=z.version)b&&R.uniform3iv(Y(a),E,c>>2,3*b);else{if(96>=b){b*=3;for(var e=xd[b],f=0;f<b;f+=3)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2],e[f+2]=E[c+(4*f+8)>>2]}else e=E.subarray(c>>2,c+12*b>>2);R.uniform3iv(Y(a),e)}},Ba:(a,b,c,e,f)=>{R.uniform4f(Y(a),b,c,e,f)},Aa:(a,b,c)=>{if(2<=z.version)b&&R.uniform4fv(Y(a),J,c>>2,4*
|
||||
b);else{if(72>=b){var e=wd[4*b],f=J;c>>=2;b*=4;for(var k=0;k<b;k+=4){var n=c+k;e[k]=f[n];e[k+1]=f[n+1];e[k+2]=f[n+2];e[k+3]=f[n+3]}}else e=J.subarray(c>>2,c+16*b>>2);R.uniform4fv(Y(a),e)}},za:(a,b,c,e,f)=>{R.uniform4i(Y(a),b,c,e,f)},ya:(a,b,c)=>{if(2<=z.version)b&&R.uniform4iv(Y(a),E,c>>2,4*b);else{if(72>=b){b*=4;for(var e=xd[b],f=0;f<b;f+=4)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2],e[f+2]=E[c+(4*f+8)>>2],e[f+3]=E[c+(4*f+12)>>2]}else e=E.subarray(c>>2,c+16*b>>2);R.uniform4iv(Y(a),e)}},xa:(a,b,c,e)=>
|
||||
{if(2<=z.version)b&&R.uniformMatrix2fv(Y(a),!!c,J,e>>2,4*b);else{if(72>=b){b*=4;for(var f=wd[b],k=0;k<b;k+=4)f[k]=J[e+4*k>>2],f[k+1]=J[e+(4*k+4)>>2],f[k+2]=J[e+(4*k+8)>>2],f[k+3]=J[e+(4*k+12)>>2]}else f=J.subarray(e>>2,e+16*b>>2);R.uniformMatrix2fv(Y(a),!!c,f)}},wa:(a,b,c,e)=>{if(2<=z.version)b&&R.uniformMatrix3fv(Y(a),!!c,J,e>>2,9*b);else{if(32>=b){b*=9;for(var f=wd[b],k=0;k<b;k+=9)f[k]=J[e+4*k>>2],f[k+1]=J[e+(4*k+4)>>2],f[k+2]=J[e+(4*k+8)>>2],f[k+3]=J[e+(4*k+12)>>2],f[k+4]=J[e+(4*k+16)>>2],f[k+
|
||||
5]=J[e+(4*k+20)>>2],f[k+6]=J[e+(4*k+24)>>2],f[k+7]=J[e+(4*k+28)>>2],f[k+8]=J[e+(4*k+32)>>2]}else f=J.subarray(e>>2,e+36*b>>2);R.uniformMatrix3fv(Y(a),!!c,f)}},va:(a,b,c,e)=>{if(2<=z.version)b&&R.uniformMatrix4fv(Y(a),!!c,J,e>>2,16*b);else{if(18>=b){var f=wd[16*b],k=J;e>>=2;b*=16;for(var n=0;n<b;n+=16){var l=e+n;f[n]=k[l];f[n+1]=k[l+1];f[n+2]=k[l+2];f[n+3]=k[l+3];f[n+4]=k[l+4];f[n+5]=k[l+5];f[n+6]=k[l+6];f[n+7]=k[l+7];f[n+8]=k[l+8];f[n+9]=k[l+9];f[n+10]=k[l+10];f[n+11]=k[l+11];f[n+12]=k[l+12];f[n+
|
||||
13]=k[l+13];f[n+14]=k[l+14];f[n+15]=k[l+15]}}else f=J.subarray(e>>2,e+64*b>>2);R.uniformMatrix4fv(Y(a),!!c,f)}},ua:a=>{a=Nc[a];R.useProgram(a);R.bf=a},ta:(a,b)=>R.vertexAttrib1f(a,b),sa:(a,b)=>{R.vertexAttrib2f(a,J[b>>2],J[b+4>>2])},ra:(a,b)=>{R.vertexAttrib3f(a,J[b>>2],J[b+4>>2],J[b+8>>2])},qa:(a,b)=>{R.vertexAttrib4f(a,J[b>>2],J[b+4>>2],J[b+8>>2],J[b+12>>2])},pa:(a,b)=>{R.vertexAttribDivisor(a,b)},oa:(a,b,c,e,f)=>{R.vertexAttribIPointer(a,b,c,e,f)},na:(a,b,c,e,f,k)=>{R.vertexAttribPointer(a,b,c,
|
||||
!!e,f,k)},ma:(a,b,c,e)=>R.viewport(a,b,c,e),la:(a,b,c,e)=>{R.waitSync(Uc[a],b,(c>>>0)+4294967296*e)},ka:a=>{var b=B.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var e=b*(1+1/c);e=Math.min(e,a+100663296);a:{e=(Math.min(2147483648,65536*Math.ceil(Math.max(a,e)/65536))-za.buffer.byteLength+65535)/65536|0;try{za.grow(e);Ha();var f=1;break a}catch(k){}f=void 0}if(f)return!0}return!1},ja:()=>z?z.handle:0,qd:(a,b)=>{var c=0;Ad().forEach((e,f)=>{var k=b+c;f=H[a+4*f>>2]=k;for(k=0;k<e.length;++k)Ca[f++]=
|
||||
e.charCodeAt(k);Ca[f]=0;c+=e.length+1});return 0},pd:(a,b)=>{var c=Ad();H[a>>2]=c.length;var e=0;c.forEach(f=>e+=f.length+1);H[b>>2]=e;return 0},ia:a=>{Xa||(Ba=!0);throw new Va(a);},N:()=>52,_:function(){return 52},od:()=>52,Z:function(){return 70},T:(a,b,c,e)=>{for(var f=0,k=0;k<c;k++){var n=H[b>>2],l=H[b+4>>2];b+=8;for(var p=0;p<l;p++){var v=B[n+p],w=Bd[a];0===v||10===v?((1===a?xa:ya)(db(w)),w.length=0):w.push(v)}f+=l}H[e>>2]=f;return 0},ha:cd,ga:ed,fa:fd,ea:gd,J:nd,Q:rd,da:sd,j:Hd,v:Id,m:Jd,I:Kd,
|
||||
ca:Ld,P:Md,O:Nd,s:Od,x:Pd,r:Qd,u:Rd,ba:Sd,aa:Td,$:Ud},Z=function(){function a(c){Z=c.exports;za=Z.wd;Ha();N=Z.zd;Ja.unshift(Z.xd);La--;0==La&&(null!==Na&&(clearInterval(Na),Na=null),Oa&&(c=Oa,Oa=null,c()));return Z}var b={a:Vd};La++;if(r.instantiateWasm)try{return r.instantiateWasm(b,a)}catch(c){ya(`Module.instantiateWasm callback failed with error: ${c}`),ca(c)}Ra??=r.locateFile?Qa("canvaskit.wasm")?"canvaskit.wasm":ta+"canvaskit.wasm":(new URL("canvaskit.wasm",import.meta.url)).href;
|
||||
Ua(b,function(c){a(c.instance)}).catch(ca);return{}}(),bc=a=>(bc=Z.yd)(a),pd=r._malloc=a=>(pd=r._malloc=Z.Ad)(a),cc=r._free=a=>(cc=r._free=Z.Bd)(a),Wd=(a,b)=>(Wd=Z.Cd)(a,b),Xd=a=>(Xd=Z.Dd)(a),Yd=()=>(Yd=Z.Ed)();r.dynCall_viji=(a,b,c,e,f)=>(r.dynCall_viji=Z.Fd)(a,b,c,e,f);r.dynCall_vijiii=(a,b,c,e,f,k,n)=>(r.dynCall_vijiii=Z.Gd)(a,b,c,e,f,k,n);r.dynCall_viiiiij=(a,b,c,e,f,k,n,l)=>(r.dynCall_viiiiij=Z.Hd)(a,b,c,e,f,k,n,l);r.dynCall_iiiji=(a,b,c,e,f,k)=>(r.dynCall_iiiji=Z.Id)(a,b,c,e,f,k);
|
||||
r.dynCall_jii=(a,b,c)=>(r.dynCall_jii=Z.Jd)(a,b,c);r.dynCall_vij=(a,b,c,e)=>(r.dynCall_vij=Z.Kd)(a,b,c,e);r.dynCall_jiiiiii=(a,b,c,e,f,k,n)=>(r.dynCall_jiiiiii=Z.Ld)(a,b,c,e,f,k,n);r.dynCall_jiiiiji=(a,b,c,e,f,k,n,l)=>(r.dynCall_jiiiiji=Z.Md)(a,b,c,e,f,k,n,l);r.dynCall_ji=(a,b)=>(r.dynCall_ji=Z.Nd)(a,b);r.dynCall_iijj=(a,b,c,e,f,k)=>(r.dynCall_iijj=Z.Od)(a,b,c,e,f,k);r.dynCall_iiji=(a,b,c,e,f)=>(r.dynCall_iiji=Z.Pd)(a,b,c,e,f);
|
||||
r.dynCall_iijjiii=(a,b,c,e,f,k,n,l,p)=>(r.dynCall_iijjiii=Z.Qd)(a,b,c,e,f,k,n,l,p);r.dynCall_iij=(a,b,c,e)=>(r.dynCall_iij=Z.Rd)(a,b,c,e);r.dynCall_vijjjii=(a,b,c,e,f,k,n,l,p,v)=>(r.dynCall_vijjjii=Z.Sd)(a,b,c,e,f,k,n,l,p,v);r.dynCall_jiji=(a,b,c,e,f)=>(r.dynCall_jiji=Z.Td)(a,b,c,e,f);r.dynCall_viijii=(a,b,c,e,f,k,n)=>(r.dynCall_viijii=Z.Ud)(a,b,c,e,f,k,n);r.dynCall_iiiiij=(a,b,c,e,f,k,n)=>(r.dynCall_iiiiij=Z.Vd)(a,b,c,e,f,k,n);
|
||||
r.dynCall_iiiiijj=(a,b,c,e,f,k,n,l,p)=>(r.dynCall_iiiiijj=Z.Wd)(a,b,c,e,f,k,n,l,p);r.dynCall_iiiiiijj=(a,b,c,e,f,k,n,l,p,v)=>(r.dynCall_iiiiiijj=Z.Xd)(a,b,c,e,f,k,n,l,p,v);function Rd(a,b,c,e,f){var k=Yd();try{N.get(a)(b,c,e,f)}catch(n){Xd(k);if(n!==n+0)throw n;Wd(1,0)}}function Id(a,b,c){var e=Yd();try{return N.get(a)(b,c)}catch(f){Xd(e);if(f!==f+0)throw f;Wd(1,0)}}function Pd(a,b,c){var e=Yd();try{N.get(a)(b,c)}catch(f){Xd(e);if(f!==f+0)throw f;Wd(1,0)}}
|
||||
function Hd(a,b){var c=Yd();try{return N.get(a)(b)}catch(e){Xd(c);if(e!==e+0)throw e;Wd(1,0)}}function Od(a,b){var c=Yd();try{N.get(a)(b)}catch(e){Xd(c);if(e!==e+0)throw e;Wd(1,0)}}function Jd(a,b,c,e){var f=Yd();try{return N.get(a)(b,c,e)}catch(k){Xd(f);if(k!==k+0)throw k;Wd(1,0)}}function Ud(a,b,c,e,f,k,n,l,p,v){var w=Yd();try{N.get(a)(b,c,e,f,k,n,l,p,v)}catch(A){Xd(w);if(A!==A+0)throw A;Wd(1,0)}}function Qd(a,b,c,e){var f=Yd();try{N.get(a)(b,c,e)}catch(k){Xd(f);if(k!==k+0)throw k;Wd(1,0)}}
|
||||
function Td(a,b,c,e,f,k,n){var l=Yd();try{N.get(a)(b,c,e,f,k,n)}catch(p){Xd(l);if(p!==p+0)throw p;Wd(1,0)}}function Md(a,b,c,e,f,k,n,l){var p=Yd();try{return N.get(a)(b,c,e,f,k,n,l)}catch(v){Xd(p);if(v!==v+0)throw v;Wd(1,0)}}function Sd(a,b,c,e,f,k){var n=Yd();try{N.get(a)(b,c,e,f,k)}catch(l){Xd(n);if(l!==l+0)throw l;Wd(1,0)}}function Kd(a,b,c,e,f){var k=Yd();try{return N.get(a)(b,c,e,f)}catch(n){Xd(k);if(n!==n+0)throw n;Wd(1,0)}}
|
||||
function Nd(a,b,c,e,f,k,n,l,p,v){var w=Yd();try{return N.get(a)(b,c,e,f,k,n,l,p,v)}catch(A){Xd(w);if(A!==A+0)throw A;Wd(1,0)}}function Ld(a,b,c,e,f,k,n){var l=Yd();try{return N.get(a)(b,c,e,f,k,n)}catch(p){Xd(l);if(p!==p+0)throw p;Wd(1,0)}}var Zd,$d;Oa=function ae(){Zd||be();Zd||(Oa=ae)};function be(){if(!(0<La)){if(!$d&&($d=1,Wa(Ia),0<La))return;Zd||(Zd=1,r.calledRun=1,Ba||(Wa(Ja),ba(r),r.onRuntimeInitialized?.(),Wa(Ka)))}}be();moduleRtn=da;
|
||||
|
||||
|
||||
return moduleRtn;
|
||||
}
|
||||
);
|
||||
})();
|
||||
export default CanvasKitInit;
|
||||
12098
web/canvaskit/canvaskit.js.symbols
Normal file
12098
web/canvaskit/canvaskit.js.symbols
Normal file
File diff suppressed because one or more lines are too long
BIN
web/canvaskit/canvaskit.wasm
Executable file
BIN
web/canvaskit/canvaskit.wasm
Executable file
Binary file not shown.
192
web/canvaskit/chromium/canvaskit.js
Normal file
192
web/canvaskit/chromium/canvaskit.js
Normal file
@ -0,0 +1,192 @@
|
||||
|
||||
var CanvasKitInit = (() => {
|
||||
var _scriptName = import.meta.url;
|
||||
|
||||
return (
|
||||
function(moduleArg = {}) {
|
||||
var moduleRtn;
|
||||
|
||||
var r=moduleArg,ba,ca,da=new Promise((a,b)=>{ba=a;ca=b}),fa="object"==typeof window,ia="function"==typeof importScripts;
|
||||
(function(a){a.Xd=a.Xd||[];a.Xd.push(function(){a.MakeSWCanvasSurface=function(b){var c=b,e="undefined"!==typeof OffscreenCanvas&&c instanceof OffscreenCanvas;if(!("undefined"!==typeof HTMLCanvasElement&&c instanceof HTMLCanvasElement||e||(c=document.getElementById(b),c)))throw"Canvas with id "+b+" was not found";if(b=a.MakeSurface(c.width,c.height))b.ue=c;return b};a.MakeCanvasSurface||(a.MakeCanvasSurface=a.MakeSWCanvasSurface);a.MakeSurface=function(b,c){var e={width:b,height:c,colorType:a.ColorType.RGBA_8888,
|
||||
alphaType:a.AlphaType.Unpremul,colorSpace:a.ColorSpace.SRGB},f=b*c*4,k=a._malloc(f);if(e=a.Surface._makeRasterDirect(e,k,4*b))e.ue=null,e.Ue=b,e.Re=c,e.Se=f,e.Be=k,e.getCanvas().clear(a.TRANSPARENT);return e};a.MakeRasterDirectSurface=function(b,c,e){return a.Surface._makeRasterDirect(b,c.byteOffset,e)};a.Surface.prototype.flush=function(b){a.Ud(this.Td);this._flush();if(this.ue){var c=new Uint8ClampedArray(a.HEAPU8.buffer,this.Be,this.Se);c=new ImageData(c,this.Ue,this.Re);b?this.ue.getContext("2d").putImageData(c,
|
||||
0,0,b[0],b[1],b[2]-b[0],b[3]-b[1]):this.ue.getContext("2d").putImageData(c,0,0)}};a.Surface.prototype.dispose=function(){this.Be&&a._free(this.Be);this.delete()};a.Ud=a.Ud||function(){};a.ve=a.ve||function(){return null}})})(r);
|
||||
(function(a){a.Xd=a.Xd||[];a.Xd.push(function(){function b(l,q,v){return l&&l.hasOwnProperty(q)?l[q]:v}function c(l){var q=ja(ka);ka[q]=l;return q}function e(l){return l.naturalHeight||l.videoHeight||l.displayHeight||l.height}function f(l){return l.naturalWidth||l.videoWidth||l.displayWidth||l.width}function k(l,q,v,w){l.bindTexture(l.TEXTURE_2D,q);w||v.alphaType!==a.AlphaType.Premul||l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0);return q}function n(l,q,v){v||q.alphaType!==a.AlphaType.Premul||
|
||||
l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1);l.bindTexture(l.TEXTURE_2D,null)}a.GetWebGLContext=function(l,q){if(!l)throw"null canvas passed into makeWebGLContext";var v={alpha:b(q,"alpha",1),depth:b(q,"depth",1),stencil:b(q,"stencil",8),antialias:b(q,"antialias",0),premultipliedAlpha:b(q,"premultipliedAlpha",1),preserveDrawingBuffer:b(q,"preserveDrawingBuffer",0),preferLowPowerToHighPerformance:b(q,"preferLowPowerToHighPerformance",0),failIfMajorPerformanceCaveat:b(q,"failIfMajorPerformanceCaveat",
|
||||
0),enableExtensionsByDefault:b(q,"enableExtensionsByDefault",1),explicitSwapControl:b(q,"explicitSwapControl",0),renderViaOffscreenBackBuffer:b(q,"renderViaOffscreenBackBuffer",0)};v.majorVersion=q&&q.majorVersion?q.majorVersion:"undefined"!==typeof WebGL2RenderingContext?2:1;if(v.explicitSwapControl)throw"explicitSwapControl is not supported";l=na(l,v);if(!l)return 0;oa(l);z.fe.getExtension("WEBGL_debug_renderer_info");return l};a.deleteContext=function(l){z===pa[l]&&(z=null);"object"==typeof JSEvents&&
|
||||
JSEvents.uf(pa[l].fe.canvas);pa[l]&&pa[l].fe.canvas&&(pa[l].fe.canvas.Pe=void 0);pa[l]=null};a._setTextureCleanup({deleteTexture:function(l,q){var v=ka[q];v&&pa[l].fe.deleteTexture(v);ka[q]=null}});a.MakeWebGLContext=function(l){if(!this.Ud(l))return null;var q=this._MakeGrContext();if(!q)return null;q.Td=l;var v=q.delete.bind(q);q["delete"]=function(){a.Ud(this.Td);v()}.bind(q);return z.De=q};a.MakeGrContext=a.MakeWebGLContext;a.GrDirectContext.prototype.getResourceCacheLimitBytes=function(){a.Ud(this.Td);
|
||||
this._getResourceCacheLimitBytes()};a.GrDirectContext.prototype.getResourceCacheUsageBytes=function(){a.Ud(this.Td);this._getResourceCacheUsageBytes()};a.GrDirectContext.prototype.releaseResourcesAndAbandonContext=function(){a.Ud(this.Td);this._releaseResourcesAndAbandonContext()};a.GrDirectContext.prototype.setResourceCacheLimitBytes=function(l){a.Ud(this.Td);this._setResourceCacheLimitBytes(l)};a.MakeOnScreenGLSurface=function(l,q,v,w,A,D){if(!this.Ud(l.Td))return null;q=void 0===A||void 0===D?
|
||||
this._MakeOnScreenGLSurface(l,q,v,w):this._MakeOnScreenGLSurface(l,q,v,w,A,D);if(!q)return null;q.Td=l.Td;return q};a.MakeRenderTarget=function(){var l=arguments[0];if(!this.Ud(l.Td))return null;if(3===arguments.length){var q=this._MakeRenderTargetWH(l,arguments[1],arguments[2]);if(!q)return null}else if(2===arguments.length){if(q=this._MakeRenderTargetII(l,arguments[1]),!q)return null}else return null;q.Td=l.Td;return q};a.MakeWebGLCanvasSurface=function(l,q,v){q=q||null;var w=l,A="undefined"!==
|
||||
typeof OffscreenCanvas&&w instanceof OffscreenCanvas;if(!("undefined"!==typeof HTMLCanvasElement&&w instanceof HTMLCanvasElement||A||(w=document.getElementById(l),w)))throw"Canvas with id "+l+" was not found";l=this.GetWebGLContext(w,v);if(!l||0>l)throw"failed to create webgl context: err "+l;l=this.MakeWebGLContext(l);q=this.MakeOnScreenGLSurface(l,w.width,w.height,q);return q?q:(q=w.cloneNode(!0),w.parentNode.replaceChild(q,w),q.classList.add("ck-replaced"),a.MakeSWCanvasSurface(q))};a.MakeCanvasSurface=
|
||||
a.MakeWebGLCanvasSurface;a.Surface.prototype.makeImageFromTexture=function(l,q){a.Ud(this.Td);l=c(l);if(q=this._makeImageFromTexture(this.Td,l,q))q.oe=l;return q};a.Surface.prototype.makeImageFromTextureSource=function(l,q,v){q||={height:e(l),width:f(l),colorType:a.ColorType.RGBA_8888,alphaType:v?a.AlphaType.Premul:a.AlphaType.Unpremul};q.colorSpace||(q.colorSpace=a.ColorSpace.SRGB);a.Ud(this.Td);var w=z.fe;v=k(w,w.createTexture(),q,v);2===z.version?w.texImage2D(w.TEXTURE_2D,0,w.RGBA,q.width,q.height,
|
||||
0,w.RGBA,w.UNSIGNED_BYTE,l):w.texImage2D(w.TEXTURE_2D,0,w.RGBA,w.RGBA,w.UNSIGNED_BYTE,l);n(w,q);this._resetContext();return this.makeImageFromTexture(v,q)};a.Surface.prototype.updateTextureFromSource=function(l,q,v){if(l.oe){a.Ud(this.Td);var w=l.getImageInfo(),A=z.fe,D=k(A,ka[l.oe],w,v);2===z.version?A.texImage2D(A.TEXTURE_2D,0,A.RGBA,f(q),e(q),0,A.RGBA,A.UNSIGNED_BYTE,q):A.texImage2D(A.TEXTURE_2D,0,A.RGBA,A.RGBA,A.UNSIGNED_BYTE,q);n(A,w,v);this._resetContext();ka[l.oe]=null;l.oe=c(D);w.colorSpace=
|
||||
l.getColorSpace();q=this._makeImageFromTexture(this.Td,l.oe,w);v=l.Sd.Vd;A=l.Sd.Zd;l.Sd.Vd=q.Sd.Vd;l.Sd.Zd=q.Sd.Zd;q.Sd.Vd=v;q.Sd.Zd=A;q.delete();w.colorSpace.delete()}};a.MakeLazyImageFromTextureSource=function(l,q,v){q||={height:e(l),width:f(l),colorType:a.ColorType.RGBA_8888,alphaType:v?a.AlphaType.Premul:a.AlphaType.Unpremul};q.colorSpace||(q.colorSpace=a.ColorSpace.SRGB);var w={makeTexture:function(){var A=z,D=A.fe,I=k(D,D.createTexture(),q,v);2===A.version?D.texImage2D(D.TEXTURE_2D,0,D.RGBA,
|
||||
q.width,q.height,0,D.RGBA,D.UNSIGNED_BYTE,l):D.texImage2D(D.TEXTURE_2D,0,D.RGBA,D.RGBA,D.UNSIGNED_BYTE,l);n(D,q,v);return c(I)},freeSrc:function(){}};"VideoFrame"===l.constructor.name&&(w.freeSrc=function(){l.close()});return a.Image._makeFromGenerator(q,w)};a.Ud=function(l){return l?oa(l):!1};a.ve=function(){return z&&z.De&&!z.De.isDeleted()?z.De:null}})})(r);
|
||||
(function(a){function b(g){return(f(255*g[3])<<24|f(255*g[0])<<16|f(255*g[1])<<8|f(255*g[2])<<0)>>>0}function c(g){if(g&&g._ck)return g;if(g instanceof Float32Array){for(var d=Math.floor(g.length/4),h=new Uint32Array(d),m=0;m<d;m++)h[m]=b(g.slice(4*m,4*(m+1)));return h}if(g instanceof Uint32Array)return g;if(g instanceof Array&&g[0]instanceof Float32Array)return g.map(b)}function e(g){if(void 0===g)return 1;var d=parseFloat(g);return g&&-1!==g.indexOf("%")?d/100:d}function f(g){return Math.round(Math.max(0,
|
||||
Math.min(g||0,255)))}function k(g,d){d&&d._ck||a._free(g)}function n(g,d,h){if(!g||!g.length)return 0;if(g&&g._ck)return g.byteOffset;var m=a[d].BYTES_PER_ELEMENT;h||=a._malloc(g.length*m);a[d].set(g,h/m);return h}function l(g){var d={be:0,count:g.length,colorType:a.ColorType.RGBA_F32};if(g instanceof Float32Array)d.be=n(g,"HEAPF32"),d.count=g.length/4;else if(g instanceof Uint32Array)d.be=n(g,"HEAPU32"),d.colorType=a.ColorType.RGBA_8888;else if(g instanceof Array){if(g&&g.length){for(var h=a._malloc(16*
|
||||
g.length),m=0,t=h/4,u=0;u<g.length;u++)for(var x=0;4>x;x++)a.HEAPF32[t+m]=g[u][x],m++;g=h}else g=0;d.be=g}else throw"Invalid argument to copyFlexibleColorArray, Not a color array "+typeof g;return d}function q(g){if(!g)return 0;var d=aa.toTypedArray();if(g.length){if(6===g.length||9===g.length)return n(g,"HEAPF32",O),6===g.length&&a.HEAPF32.set(Vc,6+O/4),O;if(16===g.length)return d[0]=g[0],d[1]=g[1],d[2]=g[3],d[3]=g[4],d[4]=g[5],d[5]=g[7],d[6]=g[12],d[7]=g[13],d[8]=g[15],O;throw"invalid matrix size";
|
||||
}if(void 0===g.m11)throw"invalid matrix argument";d[0]=g.m11;d[1]=g.m21;d[2]=g.m41;d[3]=g.m12;d[4]=g.m22;d[5]=g.m42;d[6]=g.m14;d[7]=g.m24;d[8]=g.m44;return O}function v(g){if(!g)return 0;var d=X.toTypedArray();if(g.length){if(16!==g.length&&6!==g.length&&9!==g.length)throw"invalid matrix size";if(16===g.length)return n(g,"HEAPF32",la);d.fill(0);d[0]=g[0];d[1]=g[1];d[3]=g[2];d[4]=g[3];d[5]=g[4];d[7]=g[5];d[10]=1;d[12]=g[6];d[13]=g[7];d[15]=g[8];6===g.length&&(d[12]=0,d[13]=0,d[15]=1);return la}if(void 0===
|
||||
g.m11)throw"invalid matrix argument";d[0]=g.m11;d[1]=g.m21;d[2]=g.m31;d[3]=g.m41;d[4]=g.m12;d[5]=g.m22;d[6]=g.m32;d[7]=g.m42;d[8]=g.m13;d[9]=g.m23;d[10]=g.m33;d[11]=g.m43;d[12]=g.m14;d[13]=g.m24;d[14]=g.m34;d[15]=g.m44;return la}function w(g,d){return n(g,"HEAPF32",d||ha)}function A(g,d,h,m){var t=Ea.toTypedArray();t[0]=g;t[1]=d;t[2]=h;t[3]=m;return ha}function D(g){for(var d=new Float32Array(4),h=0;4>h;h++)d[h]=a.HEAPF32[g/4+h];return d}function I(g,d){return n(g,"HEAPF32",d||V)}function P(g,d){return n(g,
|
||||
"HEAPF32",d||tb)}a.Color=function(g,d,h,m){void 0===m&&(m=1);return a.Color4f(f(g)/255,f(d)/255,f(h)/255,m)};a.ColorAsInt=function(g,d,h,m){void 0===m&&(m=255);return(f(m)<<24|f(g)<<16|f(d)<<8|f(h)<<0&268435455)>>>0};a.Color4f=function(g,d,h,m){void 0===m&&(m=1);return Float32Array.of(g,d,h,m)};Object.defineProperty(a,"TRANSPARENT",{get:function(){return a.Color4f(0,0,0,0)}});Object.defineProperty(a,"BLACK",{get:function(){return a.Color4f(0,0,0,1)}});Object.defineProperty(a,"WHITE",{get:function(){return a.Color4f(1,
|
||||
1,1,1)}});Object.defineProperty(a,"RED",{get:function(){return a.Color4f(1,0,0,1)}});Object.defineProperty(a,"GREEN",{get:function(){return a.Color4f(0,1,0,1)}});Object.defineProperty(a,"BLUE",{get:function(){return a.Color4f(0,0,1,1)}});Object.defineProperty(a,"YELLOW",{get:function(){return a.Color4f(1,1,0,1)}});Object.defineProperty(a,"CYAN",{get:function(){return a.Color4f(0,1,1,1)}});Object.defineProperty(a,"MAGENTA",{get:function(){return a.Color4f(1,0,1,1)}});a.getColorComponents=function(g){return[Math.floor(255*
|
||||
g[0]),Math.floor(255*g[1]),Math.floor(255*g[2]),g[3]]};a.parseColorString=function(g,d){g=g.toLowerCase();if(g.startsWith("#")){d=255;switch(g.length){case 9:d=parseInt(g.slice(7,9),16);case 7:var h=parseInt(g.slice(1,3),16);var m=parseInt(g.slice(3,5),16);var t=parseInt(g.slice(5,7),16);break;case 5:d=17*parseInt(g.slice(4,5),16);case 4:h=17*parseInt(g.slice(1,2),16),m=17*parseInt(g.slice(2,3),16),t=17*parseInt(g.slice(3,4),16)}return a.Color(h,m,t,d/255)}return g.startsWith("rgba")?(g=g.slice(5,
|
||||
-1),g=g.split(","),a.Color(+g[0],+g[1],+g[2],e(g[3]))):g.startsWith("rgb")?(g=g.slice(4,-1),g=g.split(","),a.Color(+g[0],+g[1],+g[2],e(g[3]))):g.startsWith("gray(")||g.startsWith("hsl")||!d||(g=d[g],void 0===g)?a.BLACK:g};a.multiplyByAlpha=function(g,d){g=g.slice();g[3]=Math.max(0,Math.min(g[3]*d,1));return g};a.Malloc=function(g,d){var h=a._malloc(d*g.BYTES_PER_ELEMENT);return{_ck:!0,length:d,byteOffset:h,ke:null,subarray:function(m,t){m=this.toTypedArray().subarray(m,t);m._ck=!0;return m},toTypedArray:function(){if(this.ke&&
|
||||
this.ke.length)return this.ke;this.ke=new g(a.HEAPU8.buffer,h,d);this.ke._ck=!0;return this.ke}}};a.Free=function(g){a._free(g.byteOffset);g.byteOffset=0;g.toTypedArray=null;g.ke=null};var O=0,aa,la=0,X,ha=0,Ea,ea,V=0,Ub,Aa=0,Vb,ub=0,Wb,vb=0,$a,Ma=0,Xb,tb=0,Yb,Zb=0,Vc=Float32Array.of(0,0,1);a.onRuntimeInitialized=function(){function g(d,h,m,t,u,x,C){x||(x=4*t.width,t.colorType===a.ColorType.RGBA_F16?x*=2:t.colorType===a.ColorType.RGBA_F32&&(x*=4));var G=x*t.height;var F=u?u.byteOffset:a._malloc(G);
|
||||
if(C?!d._readPixels(t,F,x,h,m,C):!d._readPixels(t,F,x,h,m))return u||a._free(F),null;if(u)return u.toTypedArray();switch(t.colorType){case a.ColorType.RGBA_8888:case a.ColorType.RGBA_F16:d=(new Uint8Array(a.HEAPU8.buffer,F,G)).slice();break;case a.ColorType.RGBA_F32:d=(new Float32Array(a.HEAPU8.buffer,F,G)).slice();break;default:return null}a._free(F);return d}Ea=a.Malloc(Float32Array,4);ha=Ea.byteOffset;X=a.Malloc(Float32Array,16);la=X.byteOffset;aa=a.Malloc(Float32Array,9);O=aa.byteOffset;Xb=a.Malloc(Float32Array,
|
||||
12);tb=Xb.byteOffset;Yb=a.Malloc(Float32Array,12);Zb=Yb.byteOffset;ea=a.Malloc(Float32Array,4);V=ea.byteOffset;Ub=a.Malloc(Float32Array,4);Aa=Ub.byteOffset;Vb=a.Malloc(Float32Array,3);ub=Vb.byteOffset;Wb=a.Malloc(Float32Array,3);vb=Wb.byteOffset;$a=a.Malloc(Int32Array,4);Ma=$a.byteOffset;a.ColorSpace.SRGB=a.ColorSpace._MakeSRGB();a.ColorSpace.DISPLAY_P3=a.ColorSpace._MakeDisplayP3();a.ColorSpace.ADOBE_RGB=a.ColorSpace._MakeAdobeRGB();a.GlyphRunFlags={IsWhiteSpace:a._GlyphRunFlags_isWhiteSpace};a.Path.MakeFromCmds=
|
||||
function(d){var h=n(d,"HEAPF32"),m=a.Path._MakeFromCmds(h,d.length);k(h,d);return m};a.Path.MakeFromVerbsPointsWeights=function(d,h,m){var t=n(d,"HEAPU8"),u=n(h,"HEAPF32"),x=n(m,"HEAPF32"),C=a.Path._MakeFromVerbsPointsWeights(t,d.length,u,h.length,x,m&&m.length||0);k(t,d);k(u,h);k(x,m);return C};a.Path.prototype.addArc=function(d,h,m){d=I(d);this._addArc(d,h,m);return this};a.Path.prototype.addCircle=function(d,h,m,t){this._addCircle(d,h,m,!!t);return this};a.Path.prototype.addOval=function(d,h,m){void 0===
|
||||
m&&(m=1);d=I(d);this._addOval(d,!!h,m);return this};a.Path.prototype.addPath=function(){var d=Array.prototype.slice.call(arguments),h=d[0],m=!1;"boolean"===typeof d[d.length-1]&&(m=d.pop());if(1===d.length)this._addPath(h,1,0,0,0,1,0,0,0,1,m);else if(2===d.length)d=d[1],this._addPath(h,d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1,m);else if(7===d.length||10===d.length)this._addPath(h,d[1],d[2],d[3],d[4],d[5],d[6],d[7]||0,d[8]||0,d[9]||1,m);else return null;return this};a.Path.prototype.addPoly=
|
||||
function(d,h){var m=n(d,"HEAPF32");this._addPoly(m,d.length/2,h);k(m,d);return this};a.Path.prototype.addRect=function(d,h){d=I(d);this._addRect(d,!!h);return this};a.Path.prototype.addRRect=function(d,h){d=P(d);this._addRRect(d,!!h);return this};a.Path.prototype.addVerbsPointsWeights=function(d,h,m){var t=n(d,"HEAPU8"),u=n(h,"HEAPF32"),x=n(m,"HEAPF32");this._addVerbsPointsWeights(t,d.length,u,h.length,x,m&&m.length||0);k(t,d);k(u,h);k(x,m)};a.Path.prototype.arc=function(d,h,m,t,u,x){d=a.LTRBRect(d-
|
||||
m,h-m,d+m,h+m);u=(u-t)/Math.PI*180-360*!!x;x=new a.Path;x.addArc(d,t/Math.PI*180,u);this.addPath(x,!0);x.delete();return this};a.Path.prototype.arcToOval=function(d,h,m,t){d=I(d);this._arcToOval(d,h,m,t);return this};a.Path.prototype.arcToRotated=function(d,h,m,t,u,x,C){this._arcToRotated(d,h,m,!!t,!!u,x,C);return this};a.Path.prototype.arcToTangent=function(d,h,m,t,u){this._arcToTangent(d,h,m,t,u);return this};a.Path.prototype.close=function(){this._close();return this};a.Path.prototype.conicTo=
|
||||
function(d,h,m,t,u){this._conicTo(d,h,m,t,u);return this};a.Path.prototype.computeTightBounds=function(d){this._computeTightBounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.Path.prototype.cubicTo=function(d,h,m,t,u,x){this._cubicTo(d,h,m,t,u,x);return this};a.Path.prototype.dash=function(d,h,m){return this._dash(d,h,m)?this:null};a.Path.prototype.getBounds=function(d){this._getBounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.Path.prototype.lineTo=function(d,
|
||||
h){this._lineTo(d,h);return this};a.Path.prototype.moveTo=function(d,h){this._moveTo(d,h);return this};a.Path.prototype.offset=function(d,h){this._transform(1,0,d,0,1,h,0,0,1);return this};a.Path.prototype.quadTo=function(d,h,m,t){this._quadTo(d,h,m,t);return this};a.Path.prototype.rArcTo=function(d,h,m,t,u,x,C){this._rArcTo(d,h,m,t,u,x,C);return this};a.Path.prototype.rConicTo=function(d,h,m,t,u){this._rConicTo(d,h,m,t,u);return this};a.Path.prototype.rCubicTo=function(d,h,m,t,u,x){this._rCubicTo(d,
|
||||
h,m,t,u,x);return this};a.Path.prototype.rLineTo=function(d,h){this._rLineTo(d,h);return this};a.Path.prototype.rMoveTo=function(d,h){this._rMoveTo(d,h);return this};a.Path.prototype.rQuadTo=function(d,h,m,t){this._rQuadTo(d,h,m,t);return this};a.Path.prototype.stroke=function(d){d=d||{};d.width=d.width||1;d.miter_limit=d.miter_limit||4;d.cap=d.cap||a.StrokeCap.Butt;d.join=d.join||a.StrokeJoin.Miter;d.precision=d.precision||1;return this._stroke(d)?this:null};a.Path.prototype.transform=function(){if(1===
|
||||
arguments.length){var d=arguments[0];this._transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1)}else if(6===arguments.length||9===arguments.length)d=arguments,this._transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6]||0,d[7]||0,d[8]||1);else throw"transform expected to take 1 or 9 arguments. Got "+arguments.length;return this};a.Path.prototype.trim=function(d,h,m){return this._trim(d,h,!!m)?this:null};a.Image.prototype.encodeToBytes=function(d,h){var m=a.ve();d=d||a.ImageFormat.PNG;h=h||100;
|
||||
return m?this._encodeToBytes(d,h,m):this._encodeToBytes(d,h)};a.Image.prototype.makeShaderCubic=function(d,h,m,t,u){u=q(u);return this._makeShaderCubic(d,h,m,t,u)};a.Image.prototype.makeShaderOptions=function(d,h,m,t,u){u=q(u);return this._makeShaderOptions(d,h,m,t,u)};a.Image.prototype.readPixels=function(d,h,m,t,u){var x=a.ve();return g(this,d,h,m,t,u,x)};a.Canvas.prototype.clear=function(d){a.Ud(this.Td);d=w(d);this._clear(d)};a.Canvas.prototype.clipRRect=function(d,h,m){a.Ud(this.Td);d=P(d);this._clipRRect(d,
|
||||
h,m)};a.Canvas.prototype.clipRect=function(d,h,m){a.Ud(this.Td);d=I(d);this._clipRect(d,h,m)};a.Canvas.prototype.concat=function(d){a.Ud(this.Td);d=v(d);this._concat(d)};a.Canvas.prototype.drawArc=function(d,h,m,t,u){a.Ud(this.Td);d=I(d);this._drawArc(d,h,m,t,u)};a.Canvas.prototype.drawAtlas=function(d,h,m,t,u,x,C){if(d&&t&&h&&m&&h.length===m.length){a.Ud(this.Td);u||(u=a.BlendMode.SrcOver);var G=n(h,"HEAPF32"),F=n(m,"HEAPF32"),S=m.length/4,T=n(c(x),"HEAPU32");if(C&&"B"in C&&"C"in C)this._drawAtlasCubic(d,
|
||||
F,G,T,S,u,C.B,C.C,t);else{let p=a.FilterMode.Linear,y=a.MipmapMode.None;C&&(p=C.filter,"mipmap"in C&&(y=C.mipmap));this._drawAtlasOptions(d,F,G,T,S,u,p,y,t)}k(G,h);k(F,m);k(T,x)}};a.Canvas.prototype.drawCircle=function(d,h,m,t){a.Ud(this.Td);this._drawCircle(d,h,m,t)};a.Canvas.prototype.drawColor=function(d,h){a.Ud(this.Td);d=w(d);void 0!==h?this._drawColor(d,h):this._drawColor(d)};a.Canvas.prototype.drawColorInt=function(d,h){a.Ud(this.Td);this._drawColorInt(d,h||a.BlendMode.SrcOver)};a.Canvas.prototype.drawColorComponents=
|
||||
function(d,h,m,t,u){a.Ud(this.Td);d=A(d,h,m,t);void 0!==u?this._drawColor(d,u):this._drawColor(d)};a.Canvas.prototype.drawDRRect=function(d,h,m){a.Ud(this.Td);d=P(d,tb);h=P(h,Zb);this._drawDRRect(d,h,m)};a.Canvas.prototype.drawImage=function(d,h,m,t){a.Ud(this.Td);this._drawImage(d,h,m,t||null)};a.Canvas.prototype.drawImageCubic=function(d,h,m,t,u,x){a.Ud(this.Td);this._drawImageCubic(d,h,m,t,u,x||null)};a.Canvas.prototype.drawImageOptions=function(d,h,m,t,u,x){a.Ud(this.Td);this._drawImageOptions(d,
|
||||
h,m,t,u,x||null)};a.Canvas.prototype.drawImageNine=function(d,h,m,t,u){a.Ud(this.Td);h=n(h,"HEAP32",Ma);m=I(m);this._drawImageNine(d,h,m,t,u||null)};a.Canvas.prototype.drawImageRect=function(d,h,m,t,u){a.Ud(this.Td);I(h,V);I(m,Aa);this._drawImageRect(d,V,Aa,t,!!u)};a.Canvas.prototype.drawImageRectCubic=function(d,h,m,t,u,x){a.Ud(this.Td);I(h,V);I(m,Aa);this._drawImageRectCubic(d,V,Aa,t,u,x||null)};a.Canvas.prototype.drawImageRectOptions=function(d,h,m,t,u,x){a.Ud(this.Td);I(h,V);I(m,Aa);this._drawImageRectOptions(d,
|
||||
V,Aa,t,u,x||null)};a.Canvas.prototype.drawLine=function(d,h,m,t,u){a.Ud(this.Td);this._drawLine(d,h,m,t,u)};a.Canvas.prototype.drawOval=function(d,h){a.Ud(this.Td);d=I(d);this._drawOval(d,h)};a.Canvas.prototype.drawPaint=function(d){a.Ud(this.Td);this._drawPaint(d)};a.Canvas.prototype.drawParagraph=function(d,h,m){a.Ud(this.Td);this._drawParagraph(d,h,m)};a.Canvas.prototype.drawPatch=function(d,h,m,t,u){if(24>d.length)throw"Need 12 cubic points";if(h&&4>h.length)throw"Need 4 colors";if(m&&8>m.length)throw"Need 4 shader coordinates";
|
||||
a.Ud(this.Td);const x=n(d,"HEAPF32"),C=h?n(c(h),"HEAPU32"):0,G=m?n(m,"HEAPF32"):0;t||(t=a.BlendMode.Modulate);this._drawPatch(x,C,G,t,u);k(G,m);k(C,h);k(x,d)};a.Canvas.prototype.drawPath=function(d,h){a.Ud(this.Td);this._drawPath(d,h)};a.Canvas.prototype.drawPicture=function(d){a.Ud(this.Td);this._drawPicture(d)};a.Canvas.prototype.drawPoints=function(d,h,m){a.Ud(this.Td);var t=n(h,"HEAPF32");this._drawPoints(d,t,h.length/2,m);k(t,h)};a.Canvas.prototype.drawRRect=function(d,h){a.Ud(this.Td);d=P(d);
|
||||
this._drawRRect(d,h)};a.Canvas.prototype.drawRect=function(d,h){a.Ud(this.Td);d=I(d);this._drawRect(d,h)};a.Canvas.prototype.drawRect4f=function(d,h,m,t,u){a.Ud(this.Td);this._drawRect4f(d,h,m,t,u)};a.Canvas.prototype.drawShadow=function(d,h,m,t,u,x,C){a.Ud(this.Td);var G=n(u,"HEAPF32"),F=n(x,"HEAPF32");h=n(h,"HEAPF32",ub);m=n(m,"HEAPF32",vb);this._drawShadow(d,h,m,t,G,F,C);k(G,u);k(F,x)};a.getShadowLocalBounds=function(d,h,m,t,u,x,C){d=q(d);m=n(m,"HEAPF32",ub);t=n(t,"HEAPF32",vb);if(!this._getShadowLocalBounds(d,
|
||||
h,m,t,u,x,V))return null;h=ea.toTypedArray();return C?(C.set(h),C):h.slice()};a.Canvas.prototype.drawTextBlob=function(d,h,m,t){a.Ud(this.Td);this._drawTextBlob(d,h,m,t)};a.Canvas.prototype.drawVertices=function(d,h,m){a.Ud(this.Td);this._drawVertices(d,h,m)};a.Canvas.prototype.getDeviceClipBounds=function(d){this._getDeviceClipBounds(Ma);var h=$a.toTypedArray();d?d.set(h):d=h.slice();return d};a.Canvas.prototype.quickReject=function(d){d=I(d);return this._quickReject(d)};a.Canvas.prototype.getLocalToDevice=
|
||||
function(){this._getLocalToDevice(la);for(var d=la,h=Array(16),m=0;16>m;m++)h[m]=a.HEAPF32[d/4+m];return h};a.Canvas.prototype.getTotalMatrix=function(){this._getTotalMatrix(O);for(var d=Array(9),h=0;9>h;h++)d[h]=a.HEAPF32[O/4+h];return d};a.Canvas.prototype.makeSurface=function(d){d=this._makeSurface(d);d.Td=this.Td;return d};a.Canvas.prototype.readPixels=function(d,h,m,t,u){a.Ud(this.Td);return g(this,d,h,m,t,u)};a.Canvas.prototype.saveLayer=function(d,h,m,t,u){h=I(h);return this._saveLayer(d||
|
||||
null,h,m||null,t||0,u||a.TileMode.Clamp)};a.Canvas.prototype.writePixels=function(d,h,m,t,u,x,C,G){if(d.byteLength%(h*m))throw"pixels length must be a multiple of the srcWidth * srcHeight";a.Ud(this.Td);var F=d.byteLength/(h*m);x=x||a.AlphaType.Unpremul;C=C||a.ColorType.RGBA_8888;G=G||a.ColorSpace.SRGB;var S=F*h;F=n(d,"HEAPU8");h=this._writePixels({width:h,height:m,colorType:C,alphaType:x,colorSpace:G},F,S,t,u);k(F,d);return h};a.ColorFilter.MakeBlend=function(d,h,m){d=w(d);m=m||a.ColorSpace.SRGB;
|
||||
return a.ColorFilter._MakeBlend(d,h,m)};a.ColorFilter.MakeMatrix=function(d){if(!d||20!==d.length)throw"invalid color matrix";var h=n(d,"HEAPF32"),m=a.ColorFilter._makeMatrix(h);k(h,d);return m};a.ContourMeasure.prototype.getPosTan=function(d,h){this._getPosTan(d,V);d=ea.toTypedArray();return h?(h.set(d),h):d.slice()};a.ImageFilter.prototype.getOutputBounds=function(d,h,m){d=I(d,V);h=q(h);this._getOutputBounds(d,h,Ma);h=$a.toTypedArray();return m?(m.set(h),m):h.slice()};a.ImageFilter.MakeDropShadow=
|
||||
function(d,h,m,t,u,x){u=w(u,ha);return a.ImageFilter._MakeDropShadow(d,h,m,t,u,x)};a.ImageFilter.MakeDropShadowOnly=function(d,h,m,t,u,x){u=w(u,ha);return a.ImageFilter._MakeDropShadowOnly(d,h,m,t,u,x)};a.ImageFilter.MakeImage=function(d,h,m,t){m=I(m,V);t=I(t,Aa);if("B"in h&&"C"in h)return a.ImageFilter._MakeImageCubic(d,h.B,h.C,m,t);const u=h.filter;let x=a.MipmapMode.None;"mipmap"in h&&(x=h.mipmap);return a.ImageFilter._MakeImageOptions(d,u,x,m,t)};a.ImageFilter.MakeMatrixTransform=function(d,h,
|
||||
m){d=q(d);if("B"in h&&"C"in h)return a.ImageFilter._MakeMatrixTransformCubic(d,h.B,h.C,m);const t=h.filter;let u=a.MipmapMode.None;"mipmap"in h&&(u=h.mipmap);return a.ImageFilter._MakeMatrixTransformOptions(d,t,u,m)};a.Paint.prototype.getColor=function(){this._getColor(ha);return D(ha)};a.Paint.prototype.setColor=function(d,h){h=h||null;d=w(d);this._setColor(d,h)};a.Paint.prototype.setColorComponents=function(d,h,m,t,u){u=u||null;d=A(d,h,m,t);this._setColor(d,u)};a.Path.prototype.getPoint=function(d,
|
||||
h){this._getPoint(d,V);d=ea.toTypedArray();return h?(h[0]=d[0],h[1]=d[1],h):d.slice(0,2)};a.Picture.prototype.makeShader=function(d,h,m,t,u){t=q(t);u=I(u);return this._makeShader(d,h,m,t,u)};a.Picture.prototype.cullRect=function(d){this._cullRect(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.PictureRecorder.prototype.beginRecording=function(d,h){d=I(d);return this._beginRecording(d,!!h)};a.Surface.prototype.getCanvas=function(){var d=this._getCanvas();d.Td=this.Td;return d};a.Surface.prototype.makeImageSnapshot=
|
||||
function(d){a.Ud(this.Td);d=n(d,"HEAP32",Ma);return this._makeImageSnapshot(d)};a.Surface.prototype.makeSurface=function(d){a.Ud(this.Td);d=this._makeSurface(d);d.Td=this.Td;return d};a.Surface.prototype.Te=function(d,h){this.ne||(this.ne=this.getCanvas());return requestAnimationFrame(function(){a.Ud(this.Td);d(this.ne);this.flush(h)}.bind(this))};a.Surface.prototype.requestAnimationFrame||(a.Surface.prototype.requestAnimationFrame=a.Surface.prototype.Te);a.Surface.prototype.Qe=function(d,h){this.ne||
|
||||
(this.ne=this.getCanvas());requestAnimationFrame(function(){a.Ud(this.Td);d(this.ne);this.flush(h);this.dispose()}.bind(this))};a.Surface.prototype.drawOnce||(a.Surface.prototype.drawOnce=a.Surface.prototype.Qe);a.PathEffect.MakeDash=function(d,h){h||=0;if(!d.length||1===d.length%2)throw"Intervals array must have even length";var m=n(d,"HEAPF32");h=a.PathEffect._MakeDash(m,d.length,h);k(m,d);return h};a.PathEffect.MakeLine2D=function(d,h){h=q(h);return a.PathEffect._MakeLine2D(d,h)};a.PathEffect.MakePath2D=
|
||||
function(d,h){d=q(d);return a.PathEffect._MakePath2D(d,h)};a.Shader.MakeColor=function(d,h){h=h||null;d=w(d);return a.Shader._MakeColor(d,h)};a.Shader.Blend=a.Shader.MakeBlend;a.Shader.Color=a.Shader.MakeColor;a.Shader.MakeLinearGradient=function(d,h,m,t,u,x,C,G){G=G||null;var F=l(m),S=n(t,"HEAPF32");C=C||0;x=q(x);var T=ea.toTypedArray();T.set(d);T.set(h,2);d=a.Shader._MakeLinearGradient(V,F.be,F.colorType,S,F.count,u,C,x,G);k(F.be,m);t&&k(S,t);return d};a.Shader.MakeRadialGradient=function(d,h,m,
|
||||
t,u,x,C,G){G=G||null;var F=l(m),S=n(t,"HEAPF32");C=C||0;x=q(x);d=a.Shader._MakeRadialGradient(d[0],d[1],h,F.be,F.colorType,S,F.count,u,C,x,G);k(F.be,m);t&&k(S,t);return d};a.Shader.MakeSweepGradient=function(d,h,m,t,u,x,C,G,F,S){S=S||null;var T=l(m),p=n(t,"HEAPF32");C=C||0;G=G||0;F=F||360;x=q(x);d=a.Shader._MakeSweepGradient(d,h,T.be,T.colorType,p,T.count,u,G,F,C,x,S);k(T.be,m);t&&k(p,t);return d};a.Shader.MakeTwoPointConicalGradient=function(d,h,m,t,u,x,C,G,F,S){S=S||null;var T=l(u),p=n(x,"HEAPF32");
|
||||
F=F||0;G=q(G);var y=ea.toTypedArray();y.set(d);y.set(m,2);d=a.Shader._MakeTwoPointConicalGradient(V,h,t,T.be,T.colorType,p,T.count,C,F,G,S);k(T.be,u);x&&k(p,x);return d};a.Vertices.prototype.bounds=function(d){this._bounds(V);var h=ea.toTypedArray();return d?(d.set(h),d):h.slice()};a.Xd&&a.Xd.forEach(function(d){d()})};a.computeTonalColors=function(g){var d=n(g.ambient,"HEAPF32"),h=n(g.spot,"HEAPF32");this._computeTonalColors(d,h);var m={ambient:D(d),spot:D(h)};k(d,g.ambient);k(h,g.spot);return m};
|
||||
a.LTRBRect=function(g,d,h,m){return Float32Array.of(g,d,h,m)};a.XYWHRect=function(g,d,h,m){return Float32Array.of(g,d,g+h,d+m)};a.LTRBiRect=function(g,d,h,m){return Int32Array.of(g,d,h,m)};a.XYWHiRect=function(g,d,h,m){return Int32Array.of(g,d,g+h,d+m)};a.RRectXY=function(g,d,h){return Float32Array.of(g[0],g[1],g[2],g[3],d,h,d,h,d,h,d,h)};a.MakeAnimatedImageFromEncoded=function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._decodeAnimatedImage(d,g.byteLength))?
|
||||
g:null};a.MakeImageFromEncoded=function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._decodeImage(d,g.byteLength))?g:null};var ab=null;a.MakeImageFromCanvasImageSource=function(g){var d=g.width,h=g.height;ab||=document.createElement("canvas");ab.width=d;ab.height=h;var m=ab.getContext("2d",{willReadFrequently:!0});m.drawImage(g,0,0);g=m.getImageData(0,0,d,h);return a.MakeImage({width:d,height:h,alphaType:a.AlphaType.Unpremul,colorType:a.ColorType.RGBA_8888,colorSpace:a.ColorSpace.SRGB},
|
||||
g.data,4*d)};a.MakeImage=function(g,d,h){var m=a._malloc(d.length);a.HEAPU8.set(d,m);return a._MakeImage(g,m,d.length,h)};a.MakeVertices=function(g,d,h,m,t,u){var x=t&&t.length||0,C=0;h&&h.length&&(C|=1);m&&m.length&&(C|=2);void 0===u||u||(C|=4);g=new a._VerticesBuilder(g,d.length/2,x,C);n(d,"HEAPF32",g.positions());g.texCoords()&&n(h,"HEAPF32",g.texCoords());g.colors()&&n(c(m),"HEAPU32",g.colors());g.indices()&&n(t,"HEAPU16",g.indices());return g.detach()};(function(g){g.Xd=g.Xd||[];g.Xd.push(function(){function d(p){p&&
|
||||
(p.dir=0===p.dir?g.TextDirection.RTL:g.TextDirection.LTR);return p}function h(p){if(!p||!p.length)return[];for(var y=[],M=0;M<p.length;M+=5){var W=g.LTRBRect(p[M],p[M+1],p[M+2],p[M+3]),wa=g.TextDirection.LTR;0===p[M+4]&&(wa=g.TextDirection.RTL);y.push({rect:W,dir:wa})}g._free(p.byteOffset);return y}function m(p){p=p||{};void 0===p.weight&&(p.weight=g.FontWeight.Normal);p.width=p.width||g.FontWidth.Normal;p.slant=p.slant||g.FontSlant.Upright;return p}function t(p){if(!p||!p.length)return 0;for(var y=
|
||||
[],M=0;M<p.length;M++){var W=u(p[M]);y.push(W)}return n(y,"HEAPU32")}function u(p){if(G[p])return G[p];var y=qa(p)+1,M=g._malloc(y);ra(p,M,y);return G[p]=M}function x(p){p._colorPtr=w(p.color);p._foregroundColorPtr=0;p._backgroundColorPtr=0;p._decorationColorPtr=0;p.foregroundColor&&(p._foregroundColorPtr=w(p.foregroundColor,F));p.backgroundColor&&(p._backgroundColorPtr=w(p.backgroundColor,S));p.decorationColor&&(p._decorationColorPtr=w(p.decorationColor,T));Array.isArray(p.fontFamilies)&&p.fontFamilies.length?
|
||||
(p._fontFamiliesPtr=t(p.fontFamilies),p._fontFamiliesLen=p.fontFamilies.length):(p._fontFamiliesPtr=0,p._fontFamiliesLen=0);if(p.locale){var y=p.locale;p._localePtr=u(y);p._localeLen=qa(y)}else p._localePtr=0,p._localeLen=0;if(Array.isArray(p.shadows)&&p.shadows.length){y=p.shadows;var M=y.map(function(ma){return ma.color||g.BLACK}),W=y.map(function(ma){return ma.blurRadius||0});p._shadowLen=y.length;for(var wa=g._malloc(8*y.length),wb=wa/4,xb=0;xb<y.length;xb++){var $b=y[xb].offset||[0,0];g.HEAPF32[wb]=
|
||||
$b[0];g.HEAPF32[wb+1]=$b[1];wb+=2}p._shadowColorsPtr=l(M).be;p._shadowOffsetsPtr=wa;p._shadowBlurRadiiPtr=n(W,"HEAPF32")}else p._shadowLen=0,p._shadowColorsPtr=0,p._shadowOffsetsPtr=0,p._shadowBlurRadiiPtr=0;Array.isArray(p.fontFeatures)&&p.fontFeatures.length?(y=p.fontFeatures,M=y.map(function(ma){return ma.name}),W=y.map(function(ma){return ma.value}),p._fontFeatureLen=y.length,p._fontFeatureNamesPtr=t(M),p._fontFeatureValuesPtr=n(W,"HEAPU32")):(p._fontFeatureLen=0,p._fontFeatureNamesPtr=0,p._fontFeatureValuesPtr=
|
||||
0);Array.isArray(p.fontVariations)&&p.fontVariations.length?(y=p.fontVariations,M=y.map(function(ma){return ma.axis}),W=y.map(function(ma){return ma.value}),p._fontVariationLen=y.length,p._fontVariationAxesPtr=t(M),p._fontVariationValuesPtr=n(W,"HEAPF32")):(p._fontVariationLen=0,p._fontVariationAxesPtr=0,p._fontVariationValuesPtr=0)}function C(p){g._free(p._fontFamiliesPtr);g._free(p._shadowColorsPtr);g._free(p._shadowOffsetsPtr);g._free(p._shadowBlurRadiiPtr);g._free(p._fontFeatureNamesPtr);g._free(p._fontFeatureValuesPtr);
|
||||
g._free(p._fontVariationAxesPtr);g._free(p._fontVariationValuesPtr)}g.Paragraph.prototype.getRectsForRange=function(p,y,M,W){p=this._getRectsForRange(p,y,M,W);return h(p)};g.Paragraph.prototype.getRectsForPlaceholders=function(){var p=this._getRectsForPlaceholders();return h(p)};g.Paragraph.prototype.getGlyphInfoAt=function(p){return d(this._getGlyphInfoAt(p))};g.Paragraph.prototype.getClosestGlyphInfoAtCoordinate=function(p,y){return d(this._getClosestGlyphInfoAtCoordinate(p,y))};g.TypefaceFontProvider.prototype.registerFont=
|
||||
function(p,y){p=g.Typeface.MakeTypefaceFromData(p);if(!p)return null;y=u(y);this._registerFont(p,y);p.delete()};g.ParagraphStyle=function(p){p.disableHinting=p.disableHinting||!1;if(p.ellipsis){var y=p.ellipsis;p._ellipsisPtr=u(y);p._ellipsisLen=qa(y)}else p._ellipsisPtr=0,p._ellipsisLen=0;null==p.heightMultiplier&&(p.heightMultiplier=-1);p.maxLines=p.maxLines||0;p.replaceTabCharacters=p.replaceTabCharacters||!1;y=(y=p.strutStyle)||{};y.strutEnabled=y.strutEnabled||!1;y.strutEnabled&&Array.isArray(y.fontFamilies)&&
|
||||
y.fontFamilies.length?(y._fontFamiliesPtr=t(y.fontFamilies),y._fontFamiliesLen=y.fontFamilies.length):(y._fontFamiliesPtr=0,y._fontFamiliesLen=0);y.fontStyle=m(y.fontStyle);null==y.fontSize&&(y.fontSize=-1);null==y.heightMultiplier&&(y.heightMultiplier=-1);y.halfLeading=y.halfLeading||!1;y.leading=y.leading||0;y.forceStrutHeight=y.forceStrutHeight||!1;p.strutStyle=y;p.textAlign=p.textAlign||g.TextAlign.Start;p.textDirection=p.textDirection||g.TextDirection.LTR;p.textHeightBehavior=p.textHeightBehavior||
|
||||
g.TextHeightBehavior.All;p.textStyle=g.TextStyle(p.textStyle);p.applyRoundingHack=!1!==p.applyRoundingHack;return p};g.TextStyle=function(p){p.color||(p.color=g.BLACK);p.decoration=p.decoration||0;p.decorationThickness=p.decorationThickness||0;p.decorationStyle=p.decorationStyle||g.DecorationStyle.Solid;p.textBaseline=p.textBaseline||g.TextBaseline.Alphabetic;null==p.fontSize&&(p.fontSize=-1);p.letterSpacing=p.letterSpacing||0;p.wordSpacing=p.wordSpacing||0;null==p.heightMultiplier&&(p.heightMultiplier=
|
||||
-1);p.halfLeading=p.halfLeading||!1;p.fontStyle=m(p.fontStyle);return p};var G={},F=g._malloc(16),S=g._malloc(16),T=g._malloc(16);g.ParagraphBuilder.Make=function(p,y){x(p.textStyle);y=g.ParagraphBuilder._Make(p,y);C(p.textStyle);return y};g.ParagraphBuilder.MakeFromFontProvider=function(p,y){x(p.textStyle);y=g.ParagraphBuilder._MakeFromFontProvider(p,y);C(p.textStyle);return y};g.ParagraphBuilder.MakeFromFontCollection=function(p,y){x(p.textStyle);y=g.ParagraphBuilder._MakeFromFontCollection(p,y);
|
||||
C(p.textStyle);return y};g.ParagraphBuilder.ShapeText=function(p,y,M){let W=0;for(const wa of y)W+=wa.length;if(W!==p.length)throw"Accumulated block lengths must equal text.length";return g.ParagraphBuilder._ShapeText(p,y,M)};g.ParagraphBuilder.prototype.pushStyle=function(p){x(p);this._pushStyle(p);C(p)};g.ParagraphBuilder.prototype.pushPaintStyle=function(p,y,M){x(p);this._pushPaintStyle(p,y,M);C(p)};g.ParagraphBuilder.prototype.addPlaceholder=function(p,y,M,W,wa){M=M||g.PlaceholderAlignment.Baseline;
|
||||
W=W||g.TextBaseline.Alphabetic;this._addPlaceholder(p||0,y||0,M,W,wa||0)};g.ParagraphBuilder.prototype.setWordsUtf8=function(p){var y=n(p,"HEAPU32");this._setWordsUtf8(y,p&&p.length||0);k(y,p)};g.ParagraphBuilder.prototype.setWordsUtf16=function(p){var y=n(p,"HEAPU32");this._setWordsUtf16(y,p&&p.length||0);k(y,p)};g.ParagraphBuilder.prototype.setGraphemeBreaksUtf8=function(p){var y=n(p,"HEAPU32");this._setGraphemeBreaksUtf8(y,p&&p.length||0);k(y,p)};g.ParagraphBuilder.prototype.setGraphemeBreaksUtf16=
|
||||
function(p){var y=n(p,"HEAPU32");this._setGraphemeBreaksUtf16(y,p&&p.length||0);k(y,p)};g.ParagraphBuilder.prototype.setLineBreaksUtf8=function(p){var y=n(p,"HEAPU32");this._setLineBreaksUtf8(y,p&&p.length||0);k(y,p)};g.ParagraphBuilder.prototype.setLineBreaksUtf16=function(p){var y=n(p,"HEAPU32");this._setLineBreaksUtf16(y,p&&p.length||0);k(y,p)}})})(r);a.Xd=a.Xd||[];a.Xd.push(function(){a.Path.prototype.op=function(g,d){return this._op(g,d)?this:null};a.Path.prototype.simplify=function(){return this._simplify()?
|
||||
this:null}});a.Xd=a.Xd||[];a.Xd.push(function(){a.Canvas.prototype.drawText=function(g,d,h,m,t){var u=qa(g),x=a._malloc(u+1);ra(g,x,u+1);this._drawSimpleText(x,u,d,h,t,m);a._free(x)};a.Canvas.prototype.drawGlyphs=function(g,d,h,m,t,u){if(!(2*g.length<=d.length))throw"Not enough positions for the array of gyphs";a.Ud(this.Td);const x=n(g,"HEAPU16"),C=n(d,"HEAPF32");this._drawGlyphs(g.length,x,C,h,m,t,u);k(C,d);k(x,g)};a.Font.prototype.getGlyphBounds=function(g,d,h){var m=n(g,"HEAPU16"),t=a._malloc(16*
|
||||
g.length);this._getGlyphWidthBounds(m,g.length,0,t,d||null);d=new Float32Array(a.HEAPU8.buffer,t,4*g.length);k(m,g);if(h)return h.set(d),a._free(t),h;g=Float32Array.from(d);a._free(t);return g};a.Font.prototype.getGlyphIDs=function(g,d,h){d||(d=g.length);var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=a._malloc(2*d);d=this._getGlyphIDs(t,m-1,d,g);a._free(t);if(0>d)return a._free(g),null;t=new Uint16Array(a.HEAPU8.buffer,g,d);if(h)return h.set(t),a._free(g),h;h=Uint16Array.from(t);a._free(g);return h};a.Font.prototype.getGlyphIntercepts=
|
||||
function(g,d,h,m){var t=n(g,"HEAPU16"),u=n(d,"HEAPF32");return this._getGlyphIntercepts(t,g.length,!(g&&g._ck),u,d.length,!(d&&d._ck),h,m)};a.Font.prototype.getGlyphWidths=function(g,d,h){var m=n(g,"HEAPU16"),t=a._malloc(4*g.length);this._getGlyphWidthBounds(m,g.length,t,0,d||null);d=new Float32Array(a.HEAPU8.buffer,t,g.length);k(m,g);if(h)return h.set(d),a._free(t),h;g=Float32Array.from(d);a._free(t);return g};a.FontMgr.FromData=function(){if(!arguments.length)return null;var g=arguments;1===g.length&&
|
||||
Array.isArray(g[0])&&(g=arguments[0]);if(!g.length)return null;for(var d=[],h=[],m=0;m<g.length;m++){var t=new Uint8Array(g[m]),u=n(t,"HEAPU8");d.push(u);h.push(t.byteLength)}d=n(d,"HEAPU32");h=n(h,"HEAPU32");g=a.FontMgr._fromData(d,h,g.length);a._free(d);a._free(h);return g};a.Typeface.MakeTypefaceFromData=function(g){g=new Uint8Array(g);var d=n(g,"HEAPU8");return(g=a.Typeface._MakeTypefaceFromData(d,g.byteLength))?g:null};a.Typeface.MakeFreeTypeFaceFromData=a.Typeface.MakeTypefaceFromData;a.Typeface.prototype.getGlyphIDs=
|
||||
function(g,d,h){d||(d=g.length);var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=a._malloc(2*d);d=this._getGlyphIDs(t,m-1,d,g);a._free(t);if(0>d)return a._free(g),null;t=new Uint16Array(a.HEAPU8.buffer,g,d);if(h)return h.set(t),a._free(g),h;h=Uint16Array.from(t);a._free(g);return h};a.TextBlob.MakeOnPath=function(g,d,h,m){if(g&&g.length&&d&&d.countPoints()){if(1===d.countPoints())return this.MakeFromText(g,h);m||=0;var t=h.getGlyphIDs(g);t=h.getGlyphWidths(t);var u=[];d=new a.ContourMeasureIter(d,!1,1);for(var x=
|
||||
d.next(),C=new Float32Array(4),G=0;G<g.length&&x;G++){var F=t[G];m+=F/2;if(m>x.length()){x.delete();x=d.next();if(!x){g=g.substring(0,G);break}m=F/2}x.getPosTan(m,C);var S=C[2],T=C[3];u.push(S,T,C[0]-F/2*S,C[1]-F/2*T);m+=F/2}g=this.MakeFromRSXform(g,u,h);x&&x.delete();d.delete();return g}};a.TextBlob.MakeFromRSXform=function(g,d,h){var m=qa(g)+1,t=a._malloc(m);ra(g,t,m);g=n(d,"HEAPF32");h=a.TextBlob._MakeFromRSXform(t,m-1,g,h);a._free(t);return h?h:null};a.TextBlob.MakeFromRSXformGlyphs=function(g,
|
||||
d,h){var m=n(g,"HEAPU16");d=n(d,"HEAPF32");h=a.TextBlob._MakeFromRSXformGlyphs(m,2*g.length,d,h);k(m,g);return h?h:null};a.TextBlob.MakeFromGlyphs=function(g,d){var h=n(g,"HEAPU16");d=a.TextBlob._MakeFromGlyphs(h,2*g.length,d);k(h,g);return d?d:null};a.TextBlob.MakeFromText=function(g,d){var h=qa(g)+1,m=a._malloc(h);ra(g,m,h);g=a.TextBlob._MakeFromText(m,h-1,d);a._free(m);return g?g:null};a.MallocGlyphIDs=function(g){return a.Malloc(Uint16Array,g)}});a.Xd=a.Xd||[];a.Xd.push(function(){a.MakePicture=
|
||||
function(g){g=new Uint8Array(g);var d=a._malloc(g.byteLength);a.HEAPU8.set(g,d);return(g=a._MakePicture(d,g.byteLength))?g:null}});a.Xd=a.Xd||[];a.Xd.push(function(){a.RuntimeEffect.Make=function(g,d){return a.RuntimeEffect._Make(g,{onError:d||function(h){console.log("RuntimeEffect error",h)}})};a.RuntimeEffect.MakeForBlender=function(g,d){return a.RuntimeEffect._MakeForBlender(g,{onError:d||function(h){console.log("RuntimeEffect error",h)}})};a.RuntimeEffect.prototype.makeShader=function(g,d){var h=
|
||||
!g._ck,m=n(g,"HEAPF32");d=q(d);return this._makeShader(m,4*g.length,h,d)};a.RuntimeEffect.prototype.makeShaderWithChildren=function(g,d,h){var m=!g._ck,t=n(g,"HEAPF32");h=q(h);for(var u=[],x=0;x<d.length;x++)u.push(d[x].Sd.Vd);d=n(u,"HEAPU32");return this._makeShaderWithChildren(t,4*g.length,m,d,u.length,h)};a.RuntimeEffect.prototype.makeBlender=function(g){var d=!g._ck,h=n(g,"HEAPF32");return this._makeBlender(h,4*g.length,d)}})})(r);var sa=Object.assign({},r),ta="",ua,va;
|
||||
if(fa||ia)ia?ta=self.location.href:"undefined"!=typeof document&&document.currentScript&&(ta=document.currentScript.src),_scriptName&&(ta=_scriptName),ta.startsWith("blob:")?ta="":ta=ta.substr(0,ta.replace(/[?#].*/,"").lastIndexOf("/")+1),ia&&(va=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),ua=a=>fetch(a,{credentials:"same-origin"}).then(b=>b.ok?b.arrayBuffer():Promise.reject(Error(b.status+" : "+b.url)));
|
||||
var xa=console.log.bind(console),ya=console.error.bind(console);Object.assign(r,sa);sa=null;var za,Ba=!1,Ca,B,Da,Fa,E,H,J,Ga;function Ha(){var a=za.buffer;r.HEAP8=Ca=new Int8Array(a);r.HEAP16=Da=new Int16Array(a);r.HEAPU8=B=new Uint8Array(a);r.HEAPU16=Fa=new Uint16Array(a);r.HEAP32=E=new Int32Array(a);r.HEAPU32=H=new Uint32Array(a);r.HEAPF32=J=new Float32Array(a);r.HEAPF64=Ga=new Float64Array(a)}var Ia=[],Ja=[],Ka=[],La=0,Na=null,Oa=null;
|
||||
function Pa(a){a="Aborted("+a+")";ya(a);Ba=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");ca(a);throw a;}var Qa=a=>a.startsWith("data:application/octet-stream;base64,"),Ra;function Sa(a){return ua(a).then(b=>new Uint8Array(b),()=>{if(va)var b=va(a);else throw"both async and sync fetching of the wasm failed";return b})}function Ta(a,b,c){return Sa(a).then(e=>WebAssembly.instantiate(e,b)).then(c,e=>{ya(`failed to asynchronously prepare wasm: ${e}`);Pa(e)})}
|
||||
function Ua(a,b){var c=Ra;return"function"!=typeof WebAssembly.instantiateStreaming||Qa(c)||"function"!=typeof fetch?Ta(c,a,b):fetch(c,{credentials:"same-origin"}).then(e=>WebAssembly.instantiateStreaming(e,a).then(b,function(f){ya(`wasm streaming compile failed: ${f}`);ya("falling back to ArrayBuffer instantiation");return Ta(c,a,b)}))}function Va(a){this.name="ExitStatus";this.message=`Program terminated with exit(${a})`;this.status=a}var Wa=a=>{a.forEach(b=>b(r))},Xa=r.noExitRuntime||!0;
|
||||
class Ya{constructor(a){this.Vd=a-24}}
|
||||
var Za=0,bb=0,cb="undefined"!=typeof TextDecoder?new TextDecoder:void 0,db=(a,b=0,c=NaN)=>{var e=b+c;for(c=b;a[c]&&!(c>=e);)++c;if(16<c-b&&a.buffer&&cb)return cb.decode(a.subarray(b,c));for(e="";b<c;){var f=a[b++];if(f&128){var k=a[b++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|k);else{var n=a[b++]&63;f=224==(f&240)?(f&15)<<12|k<<6|n:(f&7)<<18|k<<12|n<<6|a[b++]&63;65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e},
|
||||
eb={},fb=a=>{for(;a.length;){var b=a.pop();a.pop()(b)}};function gb(a){return this.fromWireType(H[a>>2])}
|
||||
var hb={},ib={},jb={},kb,mb=(a,b,c)=>{function e(l){l=c(l);if(l.length!==a.length)throw new kb("Mismatched type converter count");for(var q=0;q<a.length;++q)lb(a[q],l[q])}a.forEach(l=>jb[l]=b);var f=Array(b.length),k=[],n=0;b.forEach((l,q)=>{ib.hasOwnProperty(l)?f[q]=ib[l]:(k.push(l),hb.hasOwnProperty(l)||(hb[l]=[]),hb[l].push(()=>{f[q]=ib[l];++n;n===k.length&&e(f)}))});0===k.length&&e(f)},nb,K=a=>{for(var b="";B[a];)b+=nb[B[a++]];return b},L;
|
||||
function ob(a,b,c={}){var e=b.name;if(!a)throw new L(`type "${e}" must have a positive integer typeid pointer`);if(ib.hasOwnProperty(a)){if(c.ef)return;throw new L(`Cannot register type '${e}' twice`);}ib[a]=b;delete jb[a];hb.hasOwnProperty(a)&&(b=hb[a],delete hb[a],b.forEach(f=>f()))}function lb(a,b,c={}){return ob(a,b,c)}
|
||||
var pb=a=>{throw new L(a.Sd.Yd.Wd.name+" instance already deleted");},qb=!1,rb=()=>{},sb=(a,b,c)=>{if(b===c)return a;if(void 0===c.ae)return null;a=sb(a,b,c.ae);return null===a?null:c.Xe(a)},yb={},zb={},Ab=(a,b)=>{if(void 0===b)throw new L("ptr should not be undefined");for(;a.ae;)b=a.se(b),a=a.ae;return zb[b]},Cb=(a,b)=>{if(!b.Yd||!b.Vd)throw new kb("makeClassHandle requires ptr and ptrType");if(!!b.ce!==!!b.Zd)throw new kb("Both smartPtrType and smartPtr must be specified");b.count={value:1};return Bb(Object.create(a,
|
||||
{Sd:{value:b,writable:!0}}))},Bb=a=>{if("undefined"===typeof FinalizationRegistry)return Bb=b=>b,a;qb=new FinalizationRegistry(b=>{b=b.Sd;--b.count.value;0===b.count.value&&(b.Zd?b.ce.he(b.Zd):b.Yd.Wd.he(b.Vd))});Bb=b=>{var c=b.Sd;c.Zd&&qb.register(b,{Sd:c},b);return b};rb=b=>{qb.unregister(b)};return Bb(a)},Db=[];function Eb(){}
|
||||
var Fb=(a,b)=>Object.defineProperty(b,"name",{value:a}),Gb=(a,b,c)=>{if(void 0===a[b].$d){var e=a[b];a[b]=function(...f){if(!a[b].$d.hasOwnProperty(f.length))throw new L(`Function '${c}' called with an invalid number of arguments (${f.length}) - expects one of (${a[b].$d})!`);return a[b].$d[f.length].apply(this,f)};a[b].$d=[];a[b].$d[e.ie]=e}},Hb=(a,b,c)=>{if(r.hasOwnProperty(a)){if(void 0===c||void 0!==r[a].$d&&void 0!==r[a].$d[c])throw new L(`Cannot register public name '${a}' twice`);Gb(r,a,a);
|
||||
if(r[a].$d.hasOwnProperty(c))throw new L(`Cannot register multiple overloads of a function with the same number of arguments (${c})!`);r[a].$d[c]=b}else r[a]=b,r[a].ie=c},Ib=a=>{a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?`_${a}`:a};function Jb(a,b,c,e,f,k,n,l){this.name=a;this.constructor=b;this.me=c;this.he=e;this.ae=f;this.$e=k;this.se=n;this.Xe=l;this.hf=[]}
|
||||
var Kb=(a,b,c)=>{for(;b!==c;){if(!b.se)throw new L(`Expected null or instance of ${c.name}, got an instance of ${b.name}`);a=b.se(a);b=b.ae}return a};function Lb(a,b){if(null===b){if(this.Ee)throw new L(`null is not a valid ${this.name}`);return 0}if(!b.Sd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Sd.Vd)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);return Kb(b.Sd.Vd,b.Sd.Yd.Wd,this.Wd)}
|
||||
function Nb(a,b){if(null===b){if(this.Ee)throw new L(`null is not a valid ${this.name}`);if(this.xe){var c=this.Fe();null!==a&&a.push(this.he,c);return c}return 0}if(!b||!b.Sd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Sd.Vd)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);if(!this.we&&b.Sd.Yd.we)throw new L(`Cannot convert argument of type ${b.Sd.ce?b.Sd.ce.name:b.Sd.Yd.name} to parameter type ${this.name}`);c=Kb(b.Sd.Vd,b.Sd.Yd.Wd,this.Wd);if(this.xe){if(void 0===
|
||||
b.Sd.Zd)throw new L("Passing raw pointer to smart pointer is illegal");switch(this.nf){case 0:if(b.Sd.ce===this)c=b.Sd.Zd;else throw new L(`Cannot convert argument of type ${b.Sd.ce?b.Sd.ce.name:b.Sd.Yd.name} to parameter type ${this.name}`);break;case 1:c=b.Sd.Zd;break;case 2:if(b.Sd.ce===this)c=b.Sd.Zd;else{var e=b.clone();c=this.jf(c,Ob(()=>e["delete"]()));null!==a&&a.push(this.he,c)}break;default:throw new L("Unsupporting sharing policy");}}return c}
|
||||
function Pb(a,b){if(null===b){if(this.Ee)throw new L(`null is not a valid ${this.name}`);return 0}if(!b.Sd)throw new L(`Cannot pass "${Mb(b)}" as a ${this.name}`);if(!b.Sd.Vd)throw new L(`Cannot pass deleted object as a pointer of type ${this.name}`);if(b.Sd.Yd.we)throw new L(`Cannot convert argument of type ${b.Sd.Yd.name} to parameter type ${this.name}`);return Kb(b.Sd.Vd,b.Sd.Yd.Wd,this.Wd)}
|
||||
function Qb(a,b,c,e,f,k,n,l,q,v,w){this.name=a;this.Wd=b;this.Ee=c;this.we=e;this.xe=f;this.gf=k;this.nf=n;this.Me=l;this.Fe=q;this.jf=v;this.he=w;f||void 0!==b.ae?this.toWireType=Nb:(this.toWireType=e?Lb:Pb,this.ee=null)}
|
||||
var Rb=(a,b,c)=>{if(!r.hasOwnProperty(a))throw new kb("Replacing nonexistent public symbol");void 0!==r[a].$d&&void 0!==c?r[a].$d[c]=b:(r[a]=b,r[a].ie=c)},N,Sb=(a,b,c=[])=>{a.includes("j")?(a=a.replace(/p/g,"i"),b=(0,r["dynCall_"+a])(b,...c)):b=N.get(b)(...c);return b},Tb=(a,b)=>(...c)=>Sb(a,b,c),Q=(a,b)=>{a=K(a);var c=a.includes("j")?Tb(a,b):N.get(b);if("function"!=typeof c)throw new L(`unknown function pointer with signature ${a}: ${b}`);return c},ac,dc=a=>{a=bc(a);var b=K(a);cc(a);return b},ec=
|
||||
(a,b)=>{function c(k){f[k]||ib[k]||(jb[k]?jb[k].forEach(c):(e.push(k),f[k]=!0))}var e=[],f={};b.forEach(c);throw new ac(`${a}: `+e.map(dc).join([", "]));};function fc(a){for(var b=1;b<a.length;++b)if(null!==a[b]&&void 0===a[b].ee)return!0;return!1}
|
||||
function gc(a,b,c,e,f){var k=b.length;if(2>k)throw new L("argTypes array size mismatch! Must at least get return value and 'this' types!");var n=null!==b[1]&&null!==c,l=fc(b),q="void"!==b[0].name,v=k-2,w=Array(v),A=[],D=[];return Fb(a,function(...I){D.length=0;A.length=n?2:1;A[0]=f;if(n){var P=b[1].toWireType(D,this);A[1]=P}for(var O=0;O<v;++O)w[O]=b[O+2].toWireType(D,I[O]),A.push(w[O]);I=e(...A);if(l)fb(D);else for(O=n?1:2;O<b.length;O++){var aa=1===O?P:w[O-2];null!==b[O].ee&&b[O].ee(aa)}P=q?b[0].fromWireType(I):
|
||||
void 0;return P})}
|
||||
var hc=(a,b)=>{for(var c=[],e=0;e<a;e++)c.push(H[b+4*e>>2]);return c},ic=a=>{a=a.trim();const b=a.indexOf("(");return-1!==b?a.substr(0,b):a},jc=[],kc=[],lc=a=>{9<a&&0===--kc[a+1]&&(kc[a]=void 0,jc.push(a))},mc=a=>{if(!a)throw new L("Cannot use deleted val. handle = "+a);return kc[a]},Ob=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=jc.pop()||kc.length;kc[b]=a;kc[b+1]=1;return b}},nc={name:"emscripten::val",fromWireType:a=>{var b=mc(a);lc(a);
|
||||
return b},toWireType:(a,b)=>Ob(b),de:8,readValueFromPointer:gb,ee:null},oc=(a,b,c)=>{switch(b){case 1:return c?function(e){return this.fromWireType(Ca[e])}:function(e){return this.fromWireType(B[e])};case 2:return c?function(e){return this.fromWireType(Da[e>>1])}:function(e){return this.fromWireType(Fa[e>>1])};case 4:return c?function(e){return this.fromWireType(E[e>>2])}:function(e){return this.fromWireType(H[e>>2])};default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},pc=(a,b)=>
|
||||
{var c=ib[a];if(void 0===c)throw a=`${b} has unknown type ${dc(a)}`,new L(a);return c},Mb=a=>{if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a},qc=(a,b)=>{switch(b){case 4:return function(c){return this.fromWireType(J[c>>2])};case 8:return function(c){return this.fromWireType(Ga[c>>3])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}},rc=(a,b,c)=>{switch(b){case 1:return c?e=>Ca[e]:e=>B[e];case 2:return c?e=>Da[e>>1]:e=>Fa[e>>
|
||||
1];case 4:return c?e=>E[e>>2]:e=>H[e>>2];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},ra=(a,b,c)=>{var e=B;if(!(0<c))return 0;var f=b;c=b+c-1;for(var k=0;k<a.length;++k){var n=a.charCodeAt(k);if(55296<=n&&57343>=n){var l=a.charCodeAt(++k);n=65536+((n&1023)<<10)|l&1023}if(127>=n){if(b>=c)break;e[b++]=n}else{if(2047>=n){if(b+1>=c)break;e[b++]=192|n>>6}else{if(65535>=n){if(b+2>=c)break;e[b++]=224|n>>12}else{if(b+3>=c)break;e[b++]=240|n>>18;e[b++]=128|n>>12&63}e[b++]=128|n>>6&
|
||||
63}e[b++]=128|n&63}}e[b]=0;return b-f},qa=a=>{for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);127>=e?b++:2047>=e?b+=2:55296<=e&&57343>=e?(b+=4,++c):b+=3}return b},sc="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0,tc=(a,b)=>{var c=a>>1;for(var e=c+b/2;!(c>=e)&&Fa[c];)++c;c<<=1;if(32<c-a&&sc)return sc.decode(B.subarray(a,c));c="";for(e=0;!(e>=b/2);++e){var f=Da[a+2*e>>1];if(0==f)break;c+=String.fromCharCode(f)}return c},uc=(a,b,c)=>{c??=2147483647;if(2>c)return 0;c-=2;var e=
|
||||
b;c=c<2*a.length?c/2:a.length;for(var f=0;f<c;++f)Da[b>>1]=a.charCodeAt(f),b+=2;Da[b>>1]=0;return b-e},vc=a=>2*a.length,wc=(a,b)=>{for(var c=0,e="";!(c>=b/4);){var f=E[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e},xc=(a,b,c)=>{c??=2147483647;if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f<a.length;++f){var k=a.charCodeAt(f);if(55296<=k&&57343>=k){var n=a.charCodeAt(++f);k=65536+((k&1023)<<10)|n&1023}E[b>>2]=k;b+=
|
||||
4;if(b+4>c)break}E[b>>2]=0;return b-e},yc=a=>{for(var b=0,c=0;c<a.length;++c){var e=a.charCodeAt(c);55296<=e&&57343>=e&&++c;b+=4}return b},zc=(a,b,c)=>{var e=[];a=a.toWireType(e,c);e.length&&(H[b>>2]=Ob(e));return a},Ac=[],Bc={},Cc=a=>{var b=Bc[a];return void 0===b?K(a):b},Dc=()=>{function a(b){b.$$$embind_global$$$=b;var c="object"==typeof $$$embind_global$$$&&b.$$$embind_global$$$==b;c||delete b.$$$embind_global$$$;return c}if("object"==typeof globalThis)return globalThis;if("object"==typeof $$$embind_global$$$)return $$$embind_global$$$;
|
||||
"object"==typeof global&&a(global)?$$$embind_global$$$=global:"object"==typeof self&&a(self)&&($$$embind_global$$$=self);if("object"==typeof $$$embind_global$$$)return $$$embind_global$$$;throw Error("unable to get global object.");},Ec=a=>{var b=Ac.length;Ac.push(a);return b},Fc=(a,b)=>{for(var c=Array(a),e=0;e<a;++e)c[e]=pc(H[b+4*e>>2],"parameter "+e);return c},Gc=Reflect.construct,R,Hc=a=>{var b=a.getExtension("ANGLE_instanced_arrays");b&&(a.vertexAttribDivisor=(c,e)=>b.vertexAttribDivisorANGLE(c,
|
||||
e),a.drawArraysInstanced=(c,e,f,k)=>b.drawArraysInstancedANGLE(c,e,f,k),a.drawElementsInstanced=(c,e,f,k,n)=>b.drawElementsInstancedANGLE(c,e,f,k,n))},Ic=a=>{var b=a.getExtension("OES_vertex_array_object");b&&(a.createVertexArray=()=>b.createVertexArrayOES(),a.deleteVertexArray=c=>b.deleteVertexArrayOES(c),a.bindVertexArray=c=>b.bindVertexArrayOES(c),a.isVertexArray=c=>b.isVertexArrayOES(c))},Jc=a=>{var b=a.getExtension("WEBGL_draw_buffers");b&&(a.drawBuffers=(c,e)=>b.drawBuffersWEBGL(c,e))},Kc=a=>
|
||||
{var b="ANGLE_instanced_arrays EXT_blend_minmax EXT_disjoint_timer_query EXT_frag_depth EXT_shader_texture_lod EXT_sRGB OES_element_index_uint OES_fbo_render_mipmap OES_standard_derivatives OES_texture_float OES_texture_half_float OES_texture_half_float_linear OES_vertex_array_object WEBGL_color_buffer_float WEBGL_depth_texture WEBGL_draw_buffers EXT_color_buffer_float EXT_conservative_depth EXT_disjoint_timer_query_webgl2 EXT_texture_norm16 NV_shader_noperspective_interpolation WEBGL_clip_cull_distance EXT_clip_control EXT_color_buffer_half_float EXT_depth_clamp EXT_float_blend EXT_polygon_offset_clamp EXT_texture_compression_bptc EXT_texture_compression_rgtc EXT_texture_filter_anisotropic KHR_parallel_shader_compile OES_texture_float_linear WEBGL_blend_func_extended WEBGL_compressed_texture_astc WEBGL_compressed_texture_etc WEBGL_compressed_texture_etc1 WEBGL_compressed_texture_s3tc WEBGL_compressed_texture_s3tc_srgb WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_lose_context WEBGL_multi_draw WEBGL_polygon_mode".split(" ");
|
||||
return(a.getSupportedExtensions()||[]).filter(c=>b.includes(c))},Lc=1,Mc=[],Nc=[],Oc=[],Pc=[],ka=[],Qc=[],Rc=[],pa=[],Sc=[],Tc=[],Uc=[],Wc={},Xc={},Yc=4,Zc=0,ja=a=>{for(var b=Lc++,c=a.length;c<b;c++)a[c]=null;return b},$c=(a,b,c,e)=>{for(var f=0;f<a;f++){var k=R[c](),n=k&&ja(e);k?(k.name=n,e[n]=k):U||=1282;E[b+4*f>>2]=n}},na=(a,b)=>{a.He||(a.He=a.getContext,a.getContext=function(e,f){f=a.He(e,f);return"webgl"==e==f instanceof WebGLRenderingContext?f:null});var c=1<b.majorVersion?a.getContext("webgl2",
|
||||
b):a.getContext("webgl",b);return c?ad(c,b):0},ad=(a,b)=>{var c=ja(pa),e={handle:c,attributes:b,version:b.majorVersion,fe:a};a.canvas&&(a.canvas.Pe=e);pa[c]=e;("undefined"==typeof b.Ye||b.Ye)&&bd(e);return c},oa=a=>{z=pa[a];r.pf=R=z?.fe;return!(a&&!R)},bd=a=>{a||=z;if(!a.ff){a.ff=!0;var b=a.fe;b.tf=b.getExtension("WEBGL_multi_draw");b.rf=b.getExtension("EXT_polygon_offset_clamp");b.qf=b.getExtension("EXT_clip_control");b.vf=b.getExtension("WEBGL_polygon_mode");Hc(b);Ic(b);Jc(b);b.Je=b.getExtension("WEBGL_draw_instanced_base_vertex_base_instance");
|
||||
b.Le=b.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance");2<=a.version&&(b.ge=b.getExtension("EXT_disjoint_timer_query_webgl2"));if(2>a.version||!b.ge)b.ge=b.getExtension("EXT_disjoint_timer_query");Kc(b).forEach(c=>{c.includes("lose_context")||c.includes("debug")||b.getExtension(c)})}},z,U,cd=(a,b)=>{R.bindFramebuffer(a,Oc[b])},dd=a=>{R.bindVertexArray(Rc[a])},ed=a=>R.clear(a),fd=(a,b,c,e)=>R.clearColor(a,b,c,e),gd=a=>R.clearStencil(a),hd=(a,b)=>{for(var c=0;c<a;c++){var e=E[b+
|
||||
4*c>>2];R.deleteVertexArray(Rc[e]);Rc[e]=null}},jd=[],kd=(a,b)=>{$c(a,b,"createVertexArray",Rc)};function ld(){var a=Kc(R);return a=a.concat(a.map(b=>"GL_"+b))}
|
||||
var md=(a,b,c)=>{if(b){var e=void 0;switch(a){case 36346:e=1;break;case 36344:0!=c&&1!=c&&(U||=1280);return;case 34814:case 36345:e=0;break;case 34466:var f=R.getParameter(34467);e=f?f.length:0;break;case 33309:if(2>z.version){U||=1282;return}e=ld().length;break;case 33307:case 33308:if(2>z.version){U||=1280;return}e=33307==a?3:0}if(void 0===e)switch(f=R.getParameter(a),typeof f){case "number":e=f;break;case "boolean":e=f?1:0;break;case "string":U||=1280;return;case "object":if(null===f)switch(a){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:e=
|
||||
0;break;default:U||=1280;return}else{if(f instanceof Float32Array||f instanceof Uint32Array||f instanceof Int32Array||f instanceof Array){for(a=0;a<f.length;++a)switch(c){case 0:E[b+4*a>>2]=f[a];break;case 2:J[b+4*a>>2]=f[a];break;case 4:Ca[b+a]=f[a]?1:0}return}try{e=f.name|0}catch(k){U||=1280;ya(`GL_INVALID_ENUM in glGet${c}v: Unknown object returned from WebGL getParameter(${a})! (error: ${k})`);return}}break;default:U||=1280;ya(`GL_INVALID_ENUM in glGet${c}v: Native code calling glGet${c}v(${a}) and it returns ${f} of type ${typeof f}!`);
|
||||
return}switch(c){case 1:c=e;H[b>>2]=c;H[b+4>>2]=(c-H[b>>2])/4294967296;break;case 0:E[b>>2]=e;break;case 2:J[b>>2]=e;break;case 4:Ca[b]=e?1:0}}else U||=1281},nd=(a,b)=>md(a,b,0),od=(a,b,c)=>{if(c){a=Sc[a];b=2>z.version?R.ge.getQueryObjectEXT(a,b):R.getQueryParameter(a,b);var e;"boolean"==typeof b?e=b?1:0:e=b;H[c>>2]=e;H[c+4>>2]=(e-H[c>>2])/4294967296}else U||=1281},qd=a=>{var b=qa(a)+1,c=pd(b);c&&ra(a,c,b);return c},rd=a=>{var b=Wc[a];if(!b){switch(a){case 7939:b=qd(ld().join(" "));break;case 7936:case 7937:case 37445:case 37446:(b=
|
||||
R.getParameter(a))||(U||=1280);b=b?qd(b):0;break;case 7938:b=R.getParameter(7938);var c=`OpenGL ES 2.0 (${b})`;2<=z.version&&(c=`OpenGL ES 3.0 (${b})`);b=qd(c);break;case 35724:b=R.getParameter(35724);c=b.match(/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/);null!==c&&(3==c[1].length&&(c[1]+="0"),b=`OpenGL ES GLSL ES ${c[1]} (${b})`);b=qd(b);break;default:U||=1280}Wc[a]=b}return b},sd=(a,b)=>{if(2>z.version)return U||=1282,0;var c=Xc[a];if(c)return 0>b||b>=c.length?(U||=1281,0):c[b];switch(a){case 7939:return c=
|
||||
ld().map(qd),c=Xc[a]=c,0>b||b>=c.length?(U||=1281,0):c[b];default:return U||=1280,0}},td=a=>"]"==a.slice(-1)&&a.lastIndexOf("["),ud=a=>{a-=5120;return 0==a?Ca:1==a?B:2==a?Da:4==a?E:6==a?J:5==a||28922==a||28520==a||30779==a||30782==a?H:Fa},vd=(a,b,c,e,f)=>{a=ud(a);b=e*((Zc||c)*({5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4}[b-6402]||1)*a.BYTES_PER_ELEMENT+Yc-1&-Yc);return a.subarray(f>>>31-Math.clz32(a.BYTES_PER_ELEMENT),f+b>>>31-Math.clz32(a.BYTES_PER_ELEMENT))},Y=a=>{var b=R.We;if(b){var c=
|
||||
b.re[a];"number"==typeof c&&(b.re[a]=c=R.getUniformLocation(b,b.Ne[a]+(0<c?`[${c}]`:"")));return c}U||=1282},wd=[],xd=[],yd={},Ad=()=>{if(!zd){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"},b;for(b in yd)void 0===yd[b]?delete a[b]:a[b]=yd[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);zd=c}return zd},zd,Bd=[null,[],[]];
|
||||
kb=r.InternalError=class extends Error{constructor(a){super(a);this.name="InternalError"}};for(var Cd=Array(256),Dd=0;256>Dd;++Dd)Cd[Dd]=String.fromCharCode(Dd);nb=Cd;L=r.BindingError=class extends Error{constructor(a){super(a);this.name="BindingError"}};
|
||||
Object.assign(Eb.prototype,{isAliasOf:function(a){if(!(this instanceof Eb&&a instanceof Eb))return!1;var b=this.Sd.Yd.Wd,c=this.Sd.Vd;a.Sd=a.Sd;var e=a.Sd.Yd.Wd;for(a=a.Sd.Vd;b.ae;)c=b.se(c),b=b.ae;for(;e.ae;)a=e.se(a),e=e.ae;return b===e&&c===a},clone:function(){this.Sd.Vd||pb(this);if(this.Sd.qe)return this.Sd.count.value+=1,this;var a=Bb,b=Object,c=b.create,e=Object.getPrototypeOf(this),f=this.Sd;a=a(c.call(b,e,{Sd:{value:{count:f.count,pe:f.pe,qe:f.qe,Vd:f.Vd,Yd:f.Yd,Zd:f.Zd,ce:f.ce}}}));a.Sd.count.value+=
|
||||
1;a.Sd.pe=!1;return a},["delete"](){this.Sd.Vd||pb(this);if(this.Sd.pe&&!this.Sd.qe)throw new L("Object already scheduled for deletion");rb(this);var a=this.Sd;--a.count.value;0===a.count.value&&(a.Zd?a.ce.he(a.Zd):a.Yd.Wd.he(a.Vd));this.Sd.qe||(this.Sd.Zd=void 0,this.Sd.Vd=void 0)},isDeleted:function(){return!this.Sd.Vd},deleteLater:function(){this.Sd.Vd||pb(this);if(this.Sd.pe&&!this.Sd.qe)throw new L("Object already scheduled for deletion");Db.push(this);this.Sd.pe=!0;return this}});
|
||||
Object.assign(Qb.prototype,{af(a){this.Me&&(a=this.Me(a));return a},Ie(a){this.he?.(a)},de:8,readValueFromPointer:gb,fromWireType:function(a){function b(){return this.xe?Cb(this.Wd.me,{Yd:this.gf,Vd:c,ce:this,Zd:a}):Cb(this.Wd.me,{Yd:this,Vd:a})}var c=this.af(a);if(!c)return this.Ie(a),null;var e=Ab(this.Wd,c);if(void 0!==e){if(0===e.Sd.count.value)return e.Sd.Vd=c,e.Sd.Zd=a,e.clone();e=e.clone();this.Ie(a);return e}e=this.Wd.$e(c);e=yb[e];if(!e)return b.call(this);e=this.we?e.Ve:e.pointerType;var f=
|
||||
sb(c,this.Wd,e.Wd);return null===f?b.call(this):this.xe?Cb(e.Wd.me,{Yd:e,Vd:f,ce:this,Zd:a}):Cb(e.Wd.me,{Yd:e,Vd:f})}});ac=r.UnboundTypeError=((a,b)=>{var c=Fb(b,function(e){this.name=b;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(a.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:`${this.name}: ${this.message}`};return c})(Error,"UnboundTypeError");
|
||||
kc.push(0,1,void 0,1,null,1,!0,1,!1,1);r.count_emval_handles=()=>kc.length/2-5-jc.length;for(var Ed=0;32>Ed;++Ed)jd.push(Array(Ed));var Fd=new Float32Array(288);for(Ed=0;288>=Ed;++Ed)wd[Ed]=Fd.subarray(0,Ed);var Gd=new Int32Array(288);for(Ed=0;288>=Ed;++Ed)xd[Ed]=Gd.subarray(0,Ed);
|
||||
var Vd={F:(a,b,c)=>{var e=new Ya(a);H[e.Vd+16>>2]=0;H[e.Vd+4>>2]=b;H[e.Vd+8>>2]=c;Za=a;bb++;throw Za;},U:function(){return 0},ud:()=>{},td:function(){return 0},sd:()=>{},rd:function(){},qd:()=>{},md:()=>{Pa("")},B:a=>{var b=eb[a];delete eb[a];var c=b.Fe,e=b.he,f=b.Ke,k=f.map(n=>n.df).concat(f.map(n=>n.lf));mb([a],k,n=>{var l={};f.forEach((q,v)=>{var w=n[v],A=q.bf,D=q.cf,I=n[v+f.length],P=q.kf,O=q.mf;l[q.Ze]={read:aa=>w.fromWireType(A(D,aa)),write:(aa,la)=>{var X=[];P(O,aa,I.toWireType(X,la));fb(X)}}});
|
||||
return[{name:b.name,fromWireType:q=>{var v={},w;for(w in l)v[w]=l[w].read(q);e(q);return v},toWireType:(q,v)=>{for(var w in l)if(!(w in v))throw new TypeError(`Missing field: "${w}"`);var A=c();for(w in l)l[w].write(A,v[w]);null!==q&&q.push(e,A);return A},de:8,readValueFromPointer:gb,ee:e}]})},X:()=>{},ld:(a,b,c,e)=>{b=K(b);lb(a,{name:b,fromWireType:function(f){return!!f},toWireType:function(f,k){return k?c:e},de:8,readValueFromPointer:function(f){return this.fromWireType(B[f])},ee:null})},k:(a,b,
|
||||
c,e,f,k,n,l,q,v,w,A,D)=>{w=K(w);k=Q(f,k);l&&=Q(n,l);v&&=Q(q,v);D=Q(A,D);var I=Ib(w);Hb(I,function(){ec(`Cannot construct ${w} due to unbound types`,[e])});mb([a,b,c],e?[e]:[],P=>{P=P[0];if(e){var O=P.Wd;var aa=O.me}else aa=Eb.prototype;P=Fb(w,function(...Ea){if(Object.getPrototypeOf(this)!==la)throw new L("Use 'new' to construct "+w);if(void 0===X.je)throw new L(w+" has no accessible constructor");var ea=X.je[Ea.length];if(void 0===ea)throw new L(`Tried to invoke ctor of ${w} with invalid number of parameters (${Ea.length}) - expected (${Object.keys(X.je).toString()}) parameters instead!`);
|
||||
return ea.apply(this,Ea)});var la=Object.create(aa,{constructor:{value:P}});P.prototype=la;var X=new Jb(w,P,la,D,O,k,l,v);if(X.ae){var ha;(ha=X.ae).te??(ha.te=[]);X.ae.te.push(X)}O=new Qb(w,X,!0,!1,!1);ha=new Qb(w+"*",X,!1,!1,!1);aa=new Qb(w+" const*",X,!1,!0,!1);yb[a]={pointerType:ha,Ve:aa};Rb(I,P);return[O,ha,aa]})},e:(a,b,c,e,f,k,n)=>{var l=hc(c,e);b=K(b);b=ic(b);k=Q(f,k);mb([],[a],q=>{function v(){ec(`Cannot call ${w} due to unbound types`,l)}q=q[0];var w=`${q.name}.${b}`;b.startsWith("@@")&&
|
||||
(b=Symbol[b.substring(2)]);var A=q.Wd.constructor;void 0===A[b]?(v.ie=c-1,A[b]=v):(Gb(A,b,w),A[b].$d[c-1]=v);mb([],l,D=>{D=[D[0],null].concat(D.slice(1));D=gc(w,D,null,k,n);void 0===A[b].$d?(D.ie=c-1,A[b]=D):A[b].$d[c-1]=D;if(q.Wd.te)for(const I of q.Wd.te)I.constructor.hasOwnProperty(b)||(I.constructor[b]=D);return[]});return[]})},z:(a,b,c,e,f,k)=>{var n=hc(b,c);f=Q(e,f);mb([],[a],l=>{l=l[0];var q=`constructor ${l.name}`;void 0===l.Wd.je&&(l.Wd.je=[]);if(void 0!==l.Wd.je[b-1])throw new L(`Cannot register multiple constructors with identical number of parameters (${b-
|
||||
1}) for class '${l.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);l.Wd.je[b-1]=()=>{ec(`Cannot construct ${l.name} due to unbound types`,n)};mb([],n,v=>{v.splice(1,0,null);l.Wd.je[b-1]=gc(q,v,null,f,k);return[]});return[]})},a:(a,b,c,e,f,k,n,l)=>{var q=hc(c,e);b=K(b);b=ic(b);k=Q(f,k);mb([],[a],v=>{function w(){ec(`Cannot call ${A} due to unbound types`,q)}v=v[0];var A=`${v.name}.${b}`;b.startsWith("@@")&&(b=Symbol[b.substring(2)]);l&&v.Wd.hf.push(b);
|
||||
var D=v.Wd.me,I=D[b];void 0===I||void 0===I.$d&&I.className!==v.name&&I.ie===c-2?(w.ie=c-2,w.className=v.name,D[b]=w):(Gb(D,b,A),D[b].$d[c-2]=w);mb([],q,P=>{P=gc(A,P,v,k,n);void 0===D[b].$d?(P.ie=c-2,D[b]=P):D[b].$d[c-2]=P;return[]});return[]})},q:(a,b,c)=>{a=K(a);mb([],[b],e=>{e=e[0];r[a]=e.fromWireType(c);return[]})},kd:a=>lb(a,nc),i:(a,b,c,e)=>{function f(){}b=K(b);f.values={};lb(a,{name:b,constructor:f,fromWireType:function(k){return this.constructor.values[k]},toWireType:(k,n)=>n.value,de:8,
|
||||
readValueFromPointer:oc(b,c,e),ee:null});Hb(b,f)},b:(a,b,c)=>{var e=pc(a,"enum");b=K(b);a=e.constructor;e=Object.create(e.constructor.prototype,{value:{value:c},constructor:{value:Fb(`${e.name}_${b}`,function(){})}});a.values[c]=e;a[b]=e},R:(a,b,c)=>{b=K(b);lb(a,{name:b,fromWireType:e=>e,toWireType:(e,f)=>f,de:8,readValueFromPointer:qc(b,c),ee:null})},w:(a,b,c,e,f,k)=>{var n=hc(b,c);a=K(a);a=ic(a);f=Q(e,f);Hb(a,function(){ec(`Cannot call ${a} due to unbound types`,n)},b-1);mb([],n,l=>{l=[l[0],null].concat(l.slice(1));
|
||||
Rb(a,gc(a,l,null,f,k),b-1);return[]})},C:(a,b,c,e,f)=>{b=K(b);-1===f&&(f=4294967295);f=l=>l;if(0===e){var k=32-8*c;f=l=>l<<k>>>k}var n=b.includes("unsigned")?function(l,q){return q>>>0}:function(l,q){return q};lb(a,{name:b,fromWireType:f,toWireType:n,de:8,readValueFromPointer:rc(b,c,0!==e),ee:null})},p:(a,b,c)=>{function e(k){return new f(Ca.buffer,H[k+4>>2],H[k>>2])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=K(c);lb(a,{name:c,fromWireType:e,
|
||||
de:8,readValueFromPointer:e},{ef:!0})},o:(a,b,c,e,f,k,n,l,q,v,w,A)=>{c=K(c);k=Q(f,k);l=Q(n,l);v=Q(q,v);A=Q(w,A);mb([a],[b],D=>{D=D[0];return[new Qb(c,D.Wd,!1,!1,!0,D,e,k,l,v,A)]})},Q:(a,b)=>{b=K(b);var c="std::string"===b;lb(a,{name:b,fromWireType:function(e){var f=H[e>>2],k=e+4;if(c)for(var n=k,l=0;l<=f;++l){var q=k+l;if(l==f||0==B[q]){n=n?db(B,n,q-n):"";if(void 0===v)var v=n;else v+=String.fromCharCode(0),v+=n;n=q+1}}else{v=Array(f);for(l=0;l<f;++l)v[l]=String.fromCharCode(B[k+l]);v=v.join("")}cc(e);
|
||||
return v},toWireType:function(e,f){f instanceof ArrayBuffer&&(f=new Uint8Array(f));var k="string"==typeof f;if(!(k||f instanceof Uint8Array||f instanceof Uint8ClampedArray||f instanceof Int8Array))throw new L("Cannot pass non-string to std::string");var n=c&&k?qa(f):f.length;var l=pd(4+n+1),q=l+4;H[l>>2]=n;if(c&&k)ra(f,q,n+1);else if(k)for(k=0;k<n;++k){var v=f.charCodeAt(k);if(255<v)throw cc(q),new L("String has UTF-16 code units that do not fit in 8 bits");B[q+k]=v}else for(k=0;k<n;++k)B[q+k]=f[k];
|
||||
null!==e&&e.push(cc,l);return l},de:8,readValueFromPointer:gb,ee(e){cc(e)}})},M:(a,b,c)=>{c=K(c);if(2===b){var e=tc;var f=uc;var k=vc;var n=l=>Fa[l>>1]}else 4===b&&(e=wc,f=xc,k=yc,n=l=>H[l>>2]);lb(a,{name:c,fromWireType:l=>{for(var q=H[l>>2],v,w=l+4,A=0;A<=q;++A){var D=l+4+A*b;if(A==q||0==n(D))w=e(w,D-w),void 0===v?v=w:(v+=String.fromCharCode(0),v+=w),w=D+b}cc(l);return v},toWireType:(l,q)=>{if("string"!=typeof q)throw new L(`Cannot pass non-string to C++ string type ${c}`);var v=k(q),w=pd(4+v+b);
|
||||
H[w>>2]=v/b;f(q,w+4,v+b);null!==l&&l.push(cc,w);return w},de:8,readValueFromPointer:gb,ee(l){cc(l)}})},A:(a,b,c,e,f,k)=>{eb[a]={name:K(b),Fe:Q(c,e),he:Q(f,k),Ke:[]}},d:(a,b,c,e,f,k,n,l,q,v)=>{eb[a].Ke.push({Ze:K(b),df:c,bf:Q(e,f),cf:k,lf:n,kf:Q(l,q),mf:v})},jd:(a,b)=>{b=K(b);lb(a,{sf:!0,name:b,de:0,fromWireType:()=>{},toWireType:()=>{}})},id:()=>1,hd:()=>{throw Infinity;},E:(a,b,c)=>{a=mc(a);b=pc(b,"emval::as");return zc(b,c,a)},L:(a,b,c,e)=>{a=Ac[a];b=mc(b);return a(null,b,c,e)},t:(a,b,c,e,f)=>{a=
|
||||
Ac[a];b=mc(b);c=Cc(c);return a(b,b[c],e,f)},c:lc,K:a=>{if(0===a)return Ob(Dc());a=Cc(a);return Ob(Dc()[a])},n:(a,b,c)=>{var e=Fc(a,b),f=e.shift();a--;var k=Array(a);b=`methodCaller<(${e.map(n=>n.name).join(", ")}) => ${f.name}>`;return Ec(Fb(b,(n,l,q,v)=>{for(var w=0,A=0;A<a;++A)k[A]=e[A].readValueFromPointer(v+w),w+=e[A].de;n=1===c?Gc(l,k):l.apply(n,k);return zc(f,q,n)}))},y:(a,b)=>{a=mc(a);b=mc(b);return Ob(a[b])},H:a=>{9<a&&(kc[a+1]+=1)},G:()=>Ob([]),f:a=>Ob(Cc(a)),D:()=>Ob({}),gd:a=>{a=mc(a);
|
||||
return!a},l:a=>{var b=mc(a);fb(b);lc(a)},h:(a,b,c)=>{a=mc(a);b=mc(b);c=mc(c);a[b]=c},g:(a,b)=>{a=pc(a,"_emval_take_value");a=a.readValueFromPointer(b);return Ob(a)},W:function(){return-52},V:function(){},fd:(a,b,c,e)=>{var f=(new Date).getFullYear(),k=(new Date(f,0,1)).getTimezoneOffset();f=(new Date(f,6,1)).getTimezoneOffset();H[a>>2]=60*Math.max(k,f);E[b>>2]=Number(k!=f);b=n=>{var l=Math.abs(n);return`UTC${0<=n?"-":"+"}${String(Math.floor(l/60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};
|
||||
a=b(k);b=b(f);f<k?(ra(a,c,17),ra(b,e,17)):(ra(a,e,17),ra(b,c,17))},ed:()=>performance.now(),dd:a=>R.activeTexture(a),cd:(a,b)=>{R.attachShader(Nc[a],Qc[b])},bd:(a,b)=>{R.beginQuery(a,Sc[b])},ad:(a,b)=>{R.ge.beginQueryEXT(a,Sc[b])},$c:(a,b,c)=>{R.bindAttribLocation(Nc[a],b,c?db(B,c):"")},_c:(a,b)=>{35051==a?R.Ce=b:35052==a&&(R.le=b);R.bindBuffer(a,Mc[b])},Zc:cd,Yc:(a,b)=>{R.bindRenderbuffer(a,Pc[b])},Xc:(a,b)=>{R.bindSampler(a,Tc[b])},Wc:(a,b)=>{R.bindTexture(a,ka[b])},Vc:dd,Uc:dd,Tc:(a,b,c,e)=>R.blendColor(a,
|
||||
b,c,e),Sc:a=>R.blendEquation(a),Rc:(a,b)=>R.blendFunc(a,b),Qc:(a,b,c,e,f,k,n,l,q,v)=>R.blitFramebuffer(a,b,c,e,f,k,n,l,q,v),Pc:(a,b,c,e)=>{2<=z.version?c&&b?R.bufferData(a,B,e,c,b):R.bufferData(a,b,e):R.bufferData(a,c?B.subarray(c,c+b):b,e)},Oc:(a,b,c,e)=>{2<=z.version?c&&R.bufferSubData(a,b,B,e,c):R.bufferSubData(a,b,B.subarray(e,e+c))},Nc:a=>R.checkFramebufferStatus(a),Mc:ed,Lc:fd,Kc:gd,Jc:(a,b,c,e)=>R.clientWaitSync(Uc[a],b,(c>>>0)+4294967296*e),Ic:(a,b,c,e)=>{R.colorMask(!!a,!!b,!!c,!!e)},Hc:a=>
|
||||
{R.compileShader(Qc[a])},Gc:(a,b,c,e,f,k,n,l)=>{2<=z.version?R.le||!n?R.compressedTexImage2D(a,b,c,e,f,k,n,l):R.compressedTexImage2D(a,b,c,e,f,k,B,l,n):R.compressedTexImage2D(a,b,c,e,f,k,B.subarray(l,l+n))},Fc:(a,b,c,e,f,k,n,l,q)=>{2<=z.version?R.le||!l?R.compressedTexSubImage2D(a,b,c,e,f,k,n,l,q):R.compressedTexSubImage2D(a,b,c,e,f,k,n,B,q,l):R.compressedTexSubImage2D(a,b,c,e,f,k,n,B.subarray(q,q+l))},Ec:(a,b,c,e,f)=>R.copyBufferSubData(a,b,c,e,f),Dc:(a,b,c,e,f,k,n,l)=>R.copyTexSubImage2D(a,b,c,
|
||||
e,f,k,n,l),Cc:()=>{var a=ja(Nc),b=R.createProgram();b.name=a;b.Ae=b.ye=b.ze=0;b.Ge=1;Nc[a]=b;return a},Bc:a=>{var b=ja(Qc);Qc[b]=R.createShader(a);return b},Ac:a=>R.cullFace(a),zc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Mc[e];f&&(R.deleteBuffer(f),f.name=0,Mc[e]=null,e==R.Ce&&(R.Ce=0),e==R.le&&(R.le=0))}},yc:(a,b)=>{for(var c=0;c<a;++c){var e=E[b+4*c>>2],f=Oc[e];f&&(R.deleteFramebuffer(f),f.name=0,Oc[e]=null)}},xc:a=>{if(a){var b=Nc[a];b?(R.deleteProgram(b),b.name=0,Nc[a]=null):U||=1281}},
|
||||
wc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Sc[e];f&&(R.deleteQuery(f),Sc[e]=null)}},vc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Sc[e];f&&(R.ge.deleteQueryEXT(f),Sc[e]=null)}},uc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Pc[e];f&&(R.deleteRenderbuffer(f),f.name=0,Pc[e]=null)}},tc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=Tc[e];f&&(R.deleteSampler(f),f.name=0,Tc[e]=null)}},sc:a=>{if(a){var b=Qc[a];b?(R.deleteShader(b),Qc[a]=null):U||=1281}},rc:a=>{if(a){var b=Uc[a];b?
|
||||
(R.deleteSync(b),b.name=0,Uc[a]=null):U||=1281}},qc:(a,b)=>{for(var c=0;c<a;c++){var e=E[b+4*c>>2],f=ka[e];f&&(R.deleteTexture(f),f.name=0,ka[e]=null)}},pc:hd,oc:hd,nc:a=>{R.depthMask(!!a)},mc:a=>R.disable(a),lc:a=>{R.disableVertexAttribArray(a)},kc:(a,b,c)=>{R.drawArrays(a,b,c)},jc:(a,b,c,e)=>{R.drawArraysInstanced(a,b,c,e)},ic:(a,b,c,e,f)=>{R.Je.drawArraysInstancedBaseInstanceWEBGL(a,b,c,e,f)},hc:(a,b)=>{for(var c=jd[a],e=0;e<a;e++)c[e]=E[b+4*e>>2];R.drawBuffers(c)},gc:(a,b,c,e)=>{R.drawElements(a,
|
||||
b,c,e)},fc:(a,b,c,e,f)=>{R.drawElementsInstanced(a,b,c,e,f)},ec:(a,b,c,e,f,k,n)=>{R.Je.drawElementsInstancedBaseVertexBaseInstanceWEBGL(a,b,c,e,f,k,n)},dc:(a,b,c,e,f,k)=>{R.drawElements(a,e,f,k)},cc:a=>R.enable(a),bc:a=>{R.enableVertexAttribArray(a)},ac:a=>R.endQuery(a),$b:a=>{R.ge.endQueryEXT(a)},_b:(a,b)=>(a=R.fenceSync(a,b))?(b=ja(Uc),a.name=b,Uc[b]=a,b):0,Zb:()=>R.finish(),Yb:()=>R.flush(),Xb:(a,b,c,e)=>{R.framebufferRenderbuffer(a,b,c,Pc[e])},Wb:(a,b,c,e,f)=>{R.framebufferTexture2D(a,b,c,ka[e],
|
||||
f)},Vb:a=>R.frontFace(a),Ub:(a,b)=>{$c(a,b,"createBuffer",Mc)},Tb:(a,b)=>{$c(a,b,"createFramebuffer",Oc)},Sb:(a,b)=>{$c(a,b,"createQuery",Sc)},Rb:(a,b)=>{for(var c=0;c<a;c++){var e=R.ge.createQueryEXT();if(!e){for(U||=1282;c<a;)E[b+4*c++>>2]=0;break}var f=ja(Sc);e.name=f;Sc[f]=e;E[b+4*c>>2]=f}},Qb:(a,b)=>{$c(a,b,"createRenderbuffer",Pc)},Pb:(a,b)=>{$c(a,b,"createSampler",Tc)},Ob:(a,b)=>{$c(a,b,"createTexture",ka)},Nb:kd,Mb:kd,Lb:a=>R.generateMipmap(a),Kb:(a,b,c)=>{c?E[c>>2]=R.getBufferParameter(a,
|
||||
b):U||=1281},Jb:()=>{var a=R.getError()||U;U=0;return a},Ib:(a,b)=>md(a,b,2),Hb:(a,b,c,e)=>{a=R.getFramebufferAttachmentParameter(a,b,c);if(a instanceof WebGLRenderbuffer||a instanceof WebGLTexture)a=a.name|0;E[e>>2]=a},Gb:nd,Fb:(a,b,c,e)=>{a=R.getProgramInfoLog(Nc[a]);null===a&&(a="(unknown error)");b=0<b&&e?ra(a,e,b):0;c&&(E[c>>2]=b)},Eb:(a,b,c)=>{if(c)if(a>=Lc)U||=1281;else if(a=Nc[a],35716==b)a=R.getProgramInfoLog(a),null===a&&(a="(unknown error)"),E[c>>2]=a.length+1;else if(35719==b){if(!a.Ae){var e=
|
||||
R.getProgramParameter(a,35718);for(b=0;b<e;++b)a.Ae=Math.max(a.Ae,R.getActiveUniform(a,b).name.length+1)}E[c>>2]=a.Ae}else if(35722==b){if(!a.ye)for(e=R.getProgramParameter(a,35721),b=0;b<e;++b)a.ye=Math.max(a.ye,R.getActiveAttrib(a,b).name.length+1);E[c>>2]=a.ye}else if(35381==b){if(!a.ze)for(e=R.getProgramParameter(a,35382),b=0;b<e;++b)a.ze=Math.max(a.ze,R.getActiveUniformBlockName(a,b).length+1);E[c>>2]=a.ze}else E[c>>2]=R.getProgramParameter(a,b);else U||=1281},Db:od,Cb:od,Bb:(a,b,c)=>{if(c){a=
|
||||
R.getQueryParameter(Sc[a],b);var e;"boolean"==typeof a?e=a?1:0:e=a;E[c>>2]=e}else U||=1281},Ab:(a,b,c)=>{if(c){a=R.ge.getQueryObjectEXT(Sc[a],b);var e;"boolean"==typeof a?e=a?1:0:e=a;E[c>>2]=e}else U||=1281},zb:(a,b,c)=>{c?E[c>>2]=R.getQuery(a,b):U||=1281},yb:(a,b,c)=>{c?E[c>>2]=R.ge.getQueryEXT(a,b):U||=1281},xb:(a,b,c)=>{c?E[c>>2]=R.getRenderbufferParameter(a,b):U||=1281},wb:(a,b,c,e)=>{a=R.getShaderInfoLog(Qc[a]);null===a&&(a="(unknown error)");b=0<b&&e?ra(a,e,b):0;c&&(E[c>>2]=b)},vb:(a,b,c,e)=>
|
||||
{a=R.getShaderPrecisionFormat(a,b);E[c>>2]=a.rangeMin;E[c+4>>2]=a.rangeMax;E[e>>2]=a.precision},ub:(a,b,c)=>{c?35716==b?(a=R.getShaderInfoLog(Qc[a]),null===a&&(a="(unknown error)"),E[c>>2]=a?a.length+1:0):35720==b?(a=R.getShaderSource(Qc[a]),E[c>>2]=a?a.length+1:0):E[c>>2]=R.getShaderParameter(Qc[a],b):U||=1281},tb:rd,sb:sd,rb:(a,b)=>{b=b?db(B,b):"";if(a=Nc[a]){var c=a,e=c.re,f=c.Oe,k;if(!e){c.re=e={};c.Ne={};var n=R.getProgramParameter(c,35718);for(k=0;k<n;++k){var l=R.getActiveUniform(c,k);var q=
|
||||
l.name;l=l.size;var v=td(q);v=0<v?q.slice(0,v):q;var w=c.Ge;c.Ge+=l;f[v]=[l,w];for(q=0;q<l;++q)e[w]=q,c.Ne[w++]=v}}c=a.re;e=0;f=b;k=td(b);0<k&&(e=parseInt(b.slice(k+1))>>>0,f=b.slice(0,k));if((f=a.Oe[f])&&e<f[0]&&(e+=f[1],c[e]=c[e]||R.getUniformLocation(a,b)))return e}else U||=1281;return-1},qb:(a,b,c)=>{for(var e=jd[b],f=0;f<b;f++)e[f]=E[c+4*f>>2];R.invalidateFramebuffer(a,e)},pb:(a,b,c,e,f,k,n)=>{for(var l=jd[b],q=0;q<b;q++)l[q]=E[c+4*q>>2];R.invalidateSubFramebuffer(a,l,e,f,k,n)},ob:a=>R.isSync(Uc[a]),
|
||||
nb:a=>(a=ka[a])?R.isTexture(a):0,mb:a=>R.lineWidth(a),lb:a=>{a=Nc[a];R.linkProgram(a);a.re=0;a.Oe={}},kb:(a,b,c,e,f,k)=>{R.Le.multiDrawArraysInstancedBaseInstanceWEBGL(a,E,b>>2,E,c>>2,E,e>>2,H,f>>2,k)},jb:(a,b,c,e,f,k,n,l)=>{R.Le.multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL(a,E,b>>2,c,E,e>>2,E,f>>2,E,k>>2,H,n>>2,l)},ib:(a,b)=>{3317==a?Yc=b:3314==a&&(Zc=b);R.pixelStorei(a,b)},hb:(a,b)=>{R.ge.queryCounterEXT(Sc[a],b)},gb:a=>R.readBuffer(a),fb:(a,b,c,e,f,k,n)=>{if(2<=z.version)if(R.Ce)R.readPixels(a,
|
||||
b,c,e,f,k,n);else{var l=ud(k);n>>>=31-Math.clz32(l.BYTES_PER_ELEMENT);R.readPixels(a,b,c,e,f,k,l,n)}else(l=vd(k,f,c,e,n))?R.readPixels(a,b,c,e,f,k,l):U||=1280},eb:(a,b,c,e)=>R.renderbufferStorage(a,b,c,e),db:(a,b,c,e,f)=>R.renderbufferStorageMultisample(a,b,c,e,f),cb:(a,b,c)=>{R.samplerParameterf(Tc[a],b,c)},bb:(a,b,c)=>{R.samplerParameteri(Tc[a],b,c)},ab:(a,b,c)=>{R.samplerParameteri(Tc[a],b,E[c>>2])},$a:(a,b,c,e)=>R.scissor(a,b,c,e),_a:(a,b,c,e)=>{for(var f="",k=0;k<b;++k){var n=(n=H[c+4*k>>2])?
|
||||
db(B,n,e?H[e+4*k>>2]:void 0):"";f+=n}R.shaderSource(Qc[a],f)},Za:(a,b,c)=>R.stencilFunc(a,b,c),Ya:(a,b,c,e)=>R.stencilFuncSeparate(a,b,c,e),Xa:a=>R.stencilMask(a),Wa:(a,b)=>R.stencilMaskSeparate(a,b),Va:(a,b,c)=>R.stencilOp(a,b,c),Ua:(a,b,c,e)=>R.stencilOpSeparate(a,b,c,e),Ta:(a,b,c,e,f,k,n,l,q)=>{if(2<=z.version){if(R.le){R.texImage2D(a,b,c,e,f,k,n,l,q);return}if(q){var v=ud(l);q>>>=31-Math.clz32(v.BYTES_PER_ELEMENT);R.texImage2D(a,b,c,e,f,k,n,l,v,q);return}}v=q?vd(l,n,e,f,q):null;R.texImage2D(a,
|
||||
b,c,e,f,k,n,l,v)},Sa:(a,b,c)=>R.texParameterf(a,b,c),Ra:(a,b,c)=>{R.texParameterf(a,b,J[c>>2])},Qa:(a,b,c)=>R.texParameteri(a,b,c),Pa:(a,b,c)=>{R.texParameteri(a,b,E[c>>2])},Oa:(a,b,c,e,f)=>R.texStorage2D(a,b,c,e,f),Na:(a,b,c,e,f,k,n,l,q)=>{if(2<=z.version){if(R.le){R.texSubImage2D(a,b,c,e,f,k,n,l,q);return}if(q){var v=ud(l);R.texSubImage2D(a,b,c,e,f,k,n,l,v,q>>>31-Math.clz32(v.BYTES_PER_ELEMENT));return}}q=q?vd(l,n,f,k,q):null;R.texSubImage2D(a,b,c,e,f,k,n,l,q)},Ma:(a,b)=>{R.uniform1f(Y(a),b)},La:(a,
|
||||
b,c)=>{if(2<=z.version)b&&R.uniform1fv(Y(a),J,c>>2,b);else{if(288>=b)for(var e=wd[b],f=0;f<b;++f)e[f]=J[c+4*f>>2];else e=J.subarray(c>>2,c+4*b>>2);R.uniform1fv(Y(a),e)}},Ka:(a,b)=>{R.uniform1i(Y(a),b)},Ja:(a,b,c)=>{if(2<=z.version)b&&R.uniform1iv(Y(a),E,c>>2,b);else{if(288>=b)for(var e=xd[b],f=0;f<b;++f)e[f]=E[c+4*f>>2];else e=E.subarray(c>>2,c+4*b>>2);R.uniform1iv(Y(a),e)}},Ia:(a,b,c)=>{R.uniform2f(Y(a),b,c)},Ha:(a,b,c)=>{if(2<=z.version)b&&R.uniform2fv(Y(a),J,c>>2,2*b);else{if(144>=b){b*=2;for(var e=
|
||||
wd[b],f=0;f<b;f+=2)e[f]=J[c+4*f>>2],e[f+1]=J[c+(4*f+4)>>2]}else e=J.subarray(c>>2,c+8*b>>2);R.uniform2fv(Y(a),e)}},Ga:(a,b,c)=>{R.uniform2i(Y(a),b,c)},Fa:(a,b,c)=>{if(2<=z.version)b&&R.uniform2iv(Y(a),E,c>>2,2*b);else{if(144>=b){b*=2;for(var e=xd[b],f=0;f<b;f+=2)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2]}else e=E.subarray(c>>2,c+8*b>>2);R.uniform2iv(Y(a),e)}},Ea:(a,b,c,e)=>{R.uniform3f(Y(a),b,c,e)},Da:(a,b,c)=>{if(2<=z.version)b&&R.uniform3fv(Y(a),J,c>>2,3*b);else{if(96>=b){b*=3;for(var e=wd[b],f=0;f<
|
||||
b;f+=3)e[f]=J[c+4*f>>2],e[f+1]=J[c+(4*f+4)>>2],e[f+2]=J[c+(4*f+8)>>2]}else e=J.subarray(c>>2,c+12*b>>2);R.uniform3fv(Y(a),e)}},Ca:(a,b,c,e)=>{R.uniform3i(Y(a),b,c,e)},Ba:(a,b,c)=>{if(2<=z.version)b&&R.uniform3iv(Y(a),E,c>>2,3*b);else{if(96>=b){b*=3;for(var e=xd[b],f=0;f<b;f+=3)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2],e[f+2]=E[c+(4*f+8)>>2]}else e=E.subarray(c>>2,c+12*b>>2);R.uniform3iv(Y(a),e)}},Aa:(a,b,c,e,f)=>{R.uniform4f(Y(a),b,c,e,f)},za:(a,b,c)=>{if(2<=z.version)b&&R.uniform4fv(Y(a),J,c>>2,4*
|
||||
b);else{if(72>=b){var e=wd[4*b],f=J;c>>=2;b*=4;for(var k=0;k<b;k+=4){var n=c+k;e[k]=f[n];e[k+1]=f[n+1];e[k+2]=f[n+2];e[k+3]=f[n+3]}}else e=J.subarray(c>>2,c+16*b>>2);R.uniform4fv(Y(a),e)}},ya:(a,b,c,e,f)=>{R.uniform4i(Y(a),b,c,e,f)},xa:(a,b,c)=>{if(2<=z.version)b&&R.uniform4iv(Y(a),E,c>>2,4*b);else{if(72>=b){b*=4;for(var e=xd[b],f=0;f<b;f+=4)e[f]=E[c+4*f>>2],e[f+1]=E[c+(4*f+4)>>2],e[f+2]=E[c+(4*f+8)>>2],e[f+3]=E[c+(4*f+12)>>2]}else e=E.subarray(c>>2,c+16*b>>2);R.uniform4iv(Y(a),e)}},wa:(a,b,c,e)=>
|
||||
{if(2<=z.version)b&&R.uniformMatrix2fv(Y(a),!!c,J,e>>2,4*b);else{if(72>=b){b*=4;for(var f=wd[b],k=0;k<b;k+=4)f[k]=J[e+4*k>>2],f[k+1]=J[e+(4*k+4)>>2],f[k+2]=J[e+(4*k+8)>>2],f[k+3]=J[e+(4*k+12)>>2]}else f=J.subarray(e>>2,e+16*b>>2);R.uniformMatrix2fv(Y(a),!!c,f)}},va:(a,b,c,e)=>{if(2<=z.version)b&&R.uniformMatrix3fv(Y(a),!!c,J,e>>2,9*b);else{if(32>=b){b*=9;for(var f=wd[b],k=0;k<b;k+=9)f[k]=J[e+4*k>>2],f[k+1]=J[e+(4*k+4)>>2],f[k+2]=J[e+(4*k+8)>>2],f[k+3]=J[e+(4*k+12)>>2],f[k+4]=J[e+(4*k+16)>>2],f[k+
|
||||
5]=J[e+(4*k+20)>>2],f[k+6]=J[e+(4*k+24)>>2],f[k+7]=J[e+(4*k+28)>>2],f[k+8]=J[e+(4*k+32)>>2]}else f=J.subarray(e>>2,e+36*b>>2);R.uniformMatrix3fv(Y(a),!!c,f)}},ua:(a,b,c,e)=>{if(2<=z.version)b&&R.uniformMatrix4fv(Y(a),!!c,J,e>>2,16*b);else{if(18>=b){var f=wd[16*b],k=J;e>>=2;b*=16;for(var n=0;n<b;n+=16){var l=e+n;f[n]=k[l];f[n+1]=k[l+1];f[n+2]=k[l+2];f[n+3]=k[l+3];f[n+4]=k[l+4];f[n+5]=k[l+5];f[n+6]=k[l+6];f[n+7]=k[l+7];f[n+8]=k[l+8];f[n+9]=k[l+9];f[n+10]=k[l+10];f[n+11]=k[l+11];f[n+12]=k[l+12];f[n+
|
||||
13]=k[l+13];f[n+14]=k[l+14];f[n+15]=k[l+15]}}else f=J.subarray(e>>2,e+64*b>>2);R.uniformMatrix4fv(Y(a),!!c,f)}},ta:a=>{a=Nc[a];R.useProgram(a);R.We=a},sa:(a,b)=>R.vertexAttrib1f(a,b),ra:(a,b)=>{R.vertexAttrib2f(a,J[b>>2],J[b+4>>2])},qa:(a,b)=>{R.vertexAttrib3f(a,J[b>>2],J[b+4>>2],J[b+8>>2])},pa:(a,b)=>{R.vertexAttrib4f(a,J[b>>2],J[b+4>>2],J[b+8>>2],J[b+12>>2])},oa:(a,b)=>{R.vertexAttribDivisor(a,b)},na:(a,b,c,e,f)=>{R.vertexAttribIPointer(a,b,c,e,f)},ma:(a,b,c,e,f,k)=>{R.vertexAttribPointer(a,b,c,
|
||||
!!e,f,k)},la:(a,b,c,e)=>R.viewport(a,b,c,e),ka:(a,b,c,e)=>{R.waitSync(Uc[a],b,(c>>>0)+4294967296*e)},ja:a=>{var b=B.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var e=b*(1+1/c);e=Math.min(e,a+100663296);a:{e=(Math.min(2147483648,65536*Math.ceil(Math.max(a,e)/65536))-za.buffer.byteLength+65535)/65536|0;try{za.grow(e);Ha();var f=1;break a}catch(k){}f=void 0}if(f)return!0}return!1},ia:()=>z?z.handle:0,pd:(a,b)=>{var c=0;Ad().forEach((e,f)=>{var k=b+c;f=H[a+4*f>>2]=k;for(k=0;k<e.length;++k)Ca[f++]=
|
||||
e.charCodeAt(k);Ca[f]=0;c+=e.length+1});return 0},od:(a,b)=>{var c=Ad();H[a>>2]=c.length;var e=0;c.forEach(f=>e+=f.length+1);H[b>>2]=e;return 0},ha:a=>{Xa||(Ba=!0);throw new Va(a);},T:()=>52,Z:function(){return 52},nd:()=>52,Y:function(){return 70},S:(a,b,c,e)=>{for(var f=0,k=0;k<c;k++){var n=H[b>>2],l=H[b+4>>2];b+=8;for(var q=0;q<l;q++){var v=B[n+q],w=Bd[a];0===v||10===v?((1===a?xa:ya)(db(w)),w.length=0):w.push(v)}f+=l}H[e>>2]=f;return 0},ga:cd,fa:ed,ea:fd,da:gd,J:nd,P:rd,ca:sd,j:Hd,v:Id,m:Jd,I:Kd,
|
||||
ba:Ld,O:Md,N:Nd,s:Od,x:Pd,r:Qd,u:Rd,aa:Sd,$:Td,_:Ud},Z=function(){function a(c){Z=c.exports;za=Z.vd;Ha();N=Z.yd;Ja.unshift(Z.wd);La--;0==La&&(null!==Na&&(clearInterval(Na),Na=null),Oa&&(c=Oa,Oa=null,c()));return Z}var b={a:Vd};La++;if(r.instantiateWasm)try{return r.instantiateWasm(b,a)}catch(c){ya(`Module.instantiateWasm callback failed with error: ${c}`),ca(c)}Ra??=r.locateFile?Qa("canvaskit.wasm")?"canvaskit.wasm":ta+"canvaskit.wasm":(new URL("canvaskit.wasm",import.meta.url)).href;Ua(b,
|
||||
function(c){a(c.instance)}).catch(ca);return{}}(),bc=a=>(bc=Z.xd)(a),pd=r._malloc=a=>(pd=r._malloc=Z.zd)(a),cc=r._free=a=>(cc=r._free=Z.Ad)(a),Wd=(a,b)=>(Wd=Z.Bd)(a,b),Xd=a=>(Xd=Z.Cd)(a),Yd=()=>(Yd=Z.Dd)();r.dynCall_viji=(a,b,c,e,f)=>(r.dynCall_viji=Z.Ed)(a,b,c,e,f);r.dynCall_vijiii=(a,b,c,e,f,k,n)=>(r.dynCall_vijiii=Z.Fd)(a,b,c,e,f,k,n);r.dynCall_viiiiij=(a,b,c,e,f,k,n,l)=>(r.dynCall_viiiiij=Z.Gd)(a,b,c,e,f,k,n,l);r.dynCall_jii=(a,b,c)=>(r.dynCall_jii=Z.Hd)(a,b,c);
|
||||
r.dynCall_vij=(a,b,c,e)=>(r.dynCall_vij=Z.Id)(a,b,c,e);r.dynCall_jiiiiii=(a,b,c,e,f,k,n)=>(r.dynCall_jiiiiii=Z.Jd)(a,b,c,e,f,k,n);r.dynCall_jiiiiji=(a,b,c,e,f,k,n,l)=>(r.dynCall_jiiiiji=Z.Kd)(a,b,c,e,f,k,n,l);r.dynCall_ji=(a,b)=>(r.dynCall_ji=Z.Ld)(a,b);r.dynCall_iijj=(a,b,c,e,f,k)=>(r.dynCall_iijj=Z.Md)(a,b,c,e,f,k);r.dynCall_jiji=(a,b,c,e,f)=>(r.dynCall_jiji=Z.Nd)(a,b,c,e,f);r.dynCall_viijii=(a,b,c,e,f,k,n)=>(r.dynCall_viijii=Z.Od)(a,b,c,e,f,k,n);
|
||||
r.dynCall_iiiiij=(a,b,c,e,f,k,n)=>(r.dynCall_iiiiij=Z.Pd)(a,b,c,e,f,k,n);r.dynCall_iiiiijj=(a,b,c,e,f,k,n,l,q)=>(r.dynCall_iiiiijj=Z.Qd)(a,b,c,e,f,k,n,l,q);r.dynCall_iiiiiijj=(a,b,c,e,f,k,n,l,q,v)=>(r.dynCall_iiiiiijj=Z.Rd)(a,b,c,e,f,k,n,l,q,v);function Rd(a,b,c,e,f){var k=Yd();try{N.get(a)(b,c,e,f)}catch(n){Xd(k);if(n!==n+0)throw n;Wd(1,0)}}function Id(a,b,c){var e=Yd();try{return N.get(a)(b,c)}catch(f){Xd(e);if(f!==f+0)throw f;Wd(1,0)}}
|
||||
function Pd(a,b,c){var e=Yd();try{N.get(a)(b,c)}catch(f){Xd(e);if(f!==f+0)throw f;Wd(1,0)}}function Hd(a,b){var c=Yd();try{return N.get(a)(b)}catch(e){Xd(c);if(e!==e+0)throw e;Wd(1,0)}}function Od(a,b){var c=Yd();try{N.get(a)(b)}catch(e){Xd(c);if(e!==e+0)throw e;Wd(1,0)}}function Jd(a,b,c,e){var f=Yd();try{return N.get(a)(b,c,e)}catch(k){Xd(f);if(k!==k+0)throw k;Wd(1,0)}}function Ud(a,b,c,e,f,k,n,l,q,v){var w=Yd();try{N.get(a)(b,c,e,f,k,n,l,q,v)}catch(A){Xd(w);if(A!==A+0)throw A;Wd(1,0)}}
|
||||
function Qd(a,b,c,e){var f=Yd();try{N.get(a)(b,c,e)}catch(k){Xd(f);if(k!==k+0)throw k;Wd(1,0)}}function Td(a,b,c,e,f,k,n){var l=Yd();try{N.get(a)(b,c,e,f,k,n)}catch(q){Xd(l);if(q!==q+0)throw q;Wd(1,0)}}function Md(a,b,c,e,f,k,n,l){var q=Yd();try{return N.get(a)(b,c,e,f,k,n,l)}catch(v){Xd(q);if(v!==v+0)throw v;Wd(1,0)}}function Sd(a,b,c,e,f,k){var n=Yd();try{N.get(a)(b,c,e,f,k)}catch(l){Xd(n);if(l!==l+0)throw l;Wd(1,0)}}
|
||||
function Kd(a,b,c,e,f){var k=Yd();try{return N.get(a)(b,c,e,f)}catch(n){Xd(k);if(n!==n+0)throw n;Wd(1,0)}}function Nd(a,b,c,e,f,k,n,l,q,v){var w=Yd();try{return N.get(a)(b,c,e,f,k,n,l,q,v)}catch(A){Xd(w);if(A!==A+0)throw A;Wd(1,0)}}function Ld(a,b,c,e,f,k,n){var l=Yd();try{return N.get(a)(b,c,e,f,k,n)}catch(q){Xd(l);if(q!==q+0)throw q;Wd(1,0)}}var Zd,$d;Oa=function ae(){Zd||be();Zd||(Oa=ae)};
|
||||
function be(){if(!(0<La)){if(!$d&&($d=1,Wa(Ia),0<La))return;Zd||(Zd=1,r.calledRun=1,Ba||(Wa(Ja),ba(r),r.onRuntimeInitialized?.(),Wa(Ka)))}}be();moduleRtn=da;
|
||||
|
||||
|
||||
return moduleRtn;
|
||||
}
|
||||
);
|
||||
})();
|
||||
export default CanvasKitInit;
|
||||
11050
web/canvaskit/chromium/canvaskit.js.symbols
Normal file
11050
web/canvaskit/chromium/canvaskit.js.symbols
Normal file
File diff suppressed because one or more lines are too long
BIN
web/canvaskit/chromium/canvaskit.wasm
Executable file
BIN
web/canvaskit/chromium/canvaskit.wasm
Executable file
Binary file not shown.
137
web/canvaskit/skwasm.js
Normal file
137
web/canvaskit/skwasm.js
Normal file
@ -0,0 +1,137 @@
|
||||
|
||||
var skwasm = (() => {
|
||||
var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;
|
||||
|
||||
return (
|
||||
function(moduleArg = {}) {
|
||||
var moduleRtn;
|
||||
|
||||
function e(){g.buffer!=k.buffer&&n();return k}function q(){g.buffer!=k.buffer&&n();return aa}function r(){g.buffer!=k.buffer&&n();return ba}function t(){g.buffer!=k.buffer&&n();return ca}function u(){g.buffer!=k.buffer&&n();return da}var w=moduleArg,ea,fa,ha=new Promise((a,b)=>{ea=a;fa=b}),ia="object"==typeof window,ja="function"==typeof importScripts,ka=w.$ww,la=Object.assign({},w),x="";function ma(a){return w.locateFile?w.locateFile(a,x):x+a}var na,oa;
|
||||
if(ia||ja)ja?x=self.location.href:"undefined"!=typeof document&&document.currentScript&&(x=document.currentScript.src),_scriptName&&(x=_scriptName),x.startsWith("blob:")?x="":x=x.substr(0,x.replace(/[?#].*/,"").lastIndexOf("/")+1),ja&&(oa=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),na=a=>fetch(a,{credentials:"same-origin"}).then(b=>b.ok?b.arrayBuffer():Promise.reject(Error(b.status+" : "+b.url)));
|
||||
var pa=console.log.bind(console),y=console.error.bind(console);Object.assign(w,la);la=null;var g,qa,ra=!1,sa,k,aa,ta,ua,ba,ca,da;function n(){var a=g.buffer;k=new Int8Array(a);ta=new Int16Array(a);aa=new Uint8Array(a);ua=new Uint16Array(a);ba=new Int32Array(a);ca=new Uint32Array(a);da=new Float32Array(a);new Float64Array(a)}w.wasmMemory?g=w.wasmMemory:g=new WebAssembly.Memory({initial:256,maximum:32768,shared:!0});n();var va=[],wa=[],xa=[];
|
||||
function ya(){ka?(za=1,Aa(w.sb,w.sz),removeEventListener("message",Ba),Ca=Ca.forEach(Da),addEventListener("message",Da)):Ea(wa)}var z=0,Fa=null,A=null;function Ga(a){a="Aborted("+a+")";y(a);ra=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");fa(a);throw a;}var Ha=a=>a.startsWith("data:application/octet-stream;base64,"),Ia;
|
||||
function Ja(a){return na(a).then(b=>new Uint8Array(b),()=>{if(oa)var b=oa(a);else throw"both async and sync fetching of the wasm failed";return b})}function Ka(a,b,c){return Ja(a).then(d=>WebAssembly.instantiate(d,b)).then(c,d=>{y(`failed to asynchronously prepare wasm: ${d}`);Ga(d)})}
|
||||
function La(a,b){var c=Ia;return"function"!=typeof WebAssembly.instantiateStreaming||Ha(c)||"function"!=typeof fetch?Ka(c,a,b):fetch(c,{credentials:"same-origin"}).then(d=>WebAssembly.instantiateStreaming(d,a).then(b,function(f){y(`wasm streaming compile failed: ${f}`);y("falling back to ArrayBuffer instantiation");return Ka(c,a,b)}))}function Ma(a){this.name="ExitStatus";this.message=`Program terminated with exit(${a})`;this.status=a}
|
||||
var Ca=[],Na=a=>{if(!(a instanceof Ma||"unwind"==a))throw a;},Oa=0,Pa=a=>{sa=a;za||0<Oa||(ra=!0);throw new Ma(a);},Qa=a=>{if(!ra)try{if(a(),!(za||0<Oa))try{sa=a=sa,Pa(a)}catch(b){Na(b)}}catch(b){Na(b)}},B,Da=a=>{let b=a.data,c=b._wsc;c&&Qa(()=>B.get(c)(...b.x))},Ba=a=>{Ca.push(a)},Ea=a=>{a.forEach(b=>b(w))},za=w.noExitRuntime||!0;class Ra{constructor(a){this.s=a-24}}
|
||||
var Sa=0,Ta=0,Ua="undefined"!=typeof TextDecoder?new TextDecoder:void 0,Va=(a,b=0,c=NaN)=>{var d=b+c;for(c=b;a[c]&&!(c>=d);)++c;if(16<c-b&&a.buffer&&Ua)return Ua.decode(a.slice(b,c));for(d="";b<c;){var f=a[b++];if(f&128){var h=a[b++]&63;if(192==(f&224))d+=String.fromCharCode((f&31)<<6|h);else{var l=a[b++]&63;f=224==(f&240)?(f&15)<<12|h<<6|l:(f&7)<<18|h<<12|l<<6|a[b++]&63;65536>f?d+=String.fromCharCode(f):(f-=65536,d+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else d+=String.fromCharCode(f)}return d},
|
||||
Wa=(a,b)=>a?Va(q(),a,b):"",C={},Xa=1,D={},E=(a,b,c)=>{var d=q();if(0<c){var f=b;c=b+c-1;for(var h=0;h<a.length;++h){var l=a.charCodeAt(h);if(55296<=l&&57343>=l){var m=a.charCodeAt(++h);l=65536+((l&1023)<<10)|m&1023}if(127>=l){if(b>=c)break;d[b++]=l}else{if(2047>=l){if(b+1>=c)break;d[b++]=192|l>>6}else{if(65535>=l){if(b+2>=c)break;d[b++]=224|l>>12}else{if(b+3>=c)break;d[b++]=240|l>>18;d[b++]=128|l>>12&63}d[b++]=128|l>>6&63}d[b++]=128|l&63}}d[b]=0;a=b-f}else a=0;return a},F,Ya=a=>{var b=a.getExtension("ANGLE_instanced_arrays");
|
||||
b&&(a.vertexAttribDivisor=(c,d)=>b.vertexAttribDivisorANGLE(c,d),a.drawArraysInstanced=(c,d,f,h)=>b.drawArraysInstancedANGLE(c,d,f,h),a.drawElementsInstanced=(c,d,f,h,l)=>b.drawElementsInstancedANGLE(c,d,f,h,l))},Za=a=>{var b=a.getExtension("OES_vertex_array_object");b&&(a.createVertexArray=()=>b.createVertexArrayOES(),a.deleteVertexArray=c=>b.deleteVertexArrayOES(c),a.bindVertexArray=c=>b.bindVertexArrayOES(c),a.isVertexArray=c=>b.isVertexArrayOES(c))},$a=a=>{var b=a.getExtension("WEBGL_draw_buffers");
|
||||
b&&(a.drawBuffers=(c,d)=>b.drawBuffersWEBGL(c,d))},ab=a=>{a.H=a.getExtension("WEBGL_draw_instanced_base_vertex_base_instance")},bb=a=>{a.K=a.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance")},cb=a=>{var b="ANGLE_instanced_arrays EXT_blend_minmax EXT_disjoint_timer_query EXT_frag_depth EXT_shader_texture_lod EXT_sRGB OES_element_index_uint OES_fbo_render_mipmap OES_standard_derivatives OES_texture_float OES_texture_half_float OES_texture_half_float_linear OES_vertex_array_object WEBGL_color_buffer_float WEBGL_depth_texture WEBGL_draw_buffers EXT_color_buffer_float EXT_conservative_depth EXT_disjoint_timer_query_webgl2 EXT_texture_norm16 NV_shader_noperspective_interpolation WEBGL_clip_cull_distance EXT_clip_control EXT_color_buffer_half_float EXT_depth_clamp EXT_float_blend EXT_polygon_offset_clamp EXT_texture_compression_bptc EXT_texture_compression_rgtc EXT_texture_filter_anisotropic KHR_parallel_shader_compile OES_texture_float_linear WEBGL_blend_func_extended WEBGL_compressed_texture_astc WEBGL_compressed_texture_etc WEBGL_compressed_texture_etc1 WEBGL_compressed_texture_s3tc WEBGL_compressed_texture_s3tc_srgb WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_lose_context WEBGL_multi_draw WEBGL_polygon_mode".split(" ");
|
||||
return(a.getSupportedExtensions()||[]).filter(c=>b.includes(c))},db=1,eb=[],G=[],fb=[],gb=[],H=[],I=[],hb=[],ib=[],J=[],K=[],L=[],jb={},kb={},lb=4,mb=0,M=a=>{for(var b=db++,c=a.length;c<b;c++)a[c]=null;return b},O=(a,b,c,d)=>{for(var f=0;f<a;f++){var h=F[c](),l=h&&M(d);h?(h.name=l,d[l]=h):N||=1282;r()[b+4*f>>2]=l}},ob=a=>{var b={J:2,alpha:!0,depth:!0,stencil:!0,antialias:!1,premultipliedAlpha:!0,preserveDrawingBuffer:!1,powerPreference:"default",failIfMajorPerformanceCaveat:!1,I:!0};a.s||(a.s=a.getContext,
|
||||
a.getContext=function(d,f){f=a.s(d,f);return"webgl"==d==f instanceof WebGLRenderingContext?f:null});var c=1<b.J?a.getContext("webgl2",b):a.getContext("webgl",b);return c?nb(c,b):0},nb=(a,b)=>{var c=M(ib),d={handle:c,attributes:b,version:b.J,v:a};a.canvas&&(a.canvas.Z=d);ib[c]=d;("undefined"==typeof b.I||b.I)&&pb(d);return c},pb=a=>{a||=P;if(!a.S){a.S=!0;var b=a.v;b.T=b.getExtension("WEBGL_multi_draw");b.P=b.getExtension("EXT_polygon_offset_clamp");b.O=b.getExtension("EXT_clip_control");b.Y=b.getExtension("WEBGL_polygon_mode");
|
||||
Ya(b);Za(b);$a(b);ab(b);bb(b);2<=a.version&&(b.g=b.getExtension("EXT_disjoint_timer_query_webgl2"));if(2>a.version||!b.g)b.g=b.getExtension("EXT_disjoint_timer_query");cb(b).forEach(c=>{c.includes("lose_context")||c.includes("debug")||b.getExtension(c)})}},N,P,qb=a=>{F.bindVertexArray(hb[a])},rb=(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=H[d];f&&(F.deleteTexture(f),f.name=0,H[d]=null)}},sb=(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2];F.deleteVertexArray(hb[d]);hb[d]=null}},tb=[],ub=(a,
|
||||
b)=>{O(a,b,"createVertexArray",hb)},vb=(a,b)=>{t()[a>>2]=b;var c=t()[a>>2];t()[a+4>>2]=(b-c)/4294967296};function wb(){var a=cb(F);return a=a.concat(a.map(b=>"GL_"+b))}
|
||||
var xb=(a,b,c)=>{if(b){var d=void 0;switch(a){case 36346:d=1;break;case 36344:0!=c&&1!=c&&(N||=1280);return;case 34814:case 36345:d=0;break;case 34466:var f=F.getParameter(34467);d=f?f.length:0;break;case 33309:if(2>P.version){N||=1282;return}d=wb().length;break;case 33307:case 33308:if(2>P.version){N||=1280;return}d=33307==a?3:0}if(void 0===d)switch(f=F.getParameter(a),typeof f){case "number":d=f;break;case "boolean":d=f?1:0;break;case "string":N||=1280;return;case "object":if(null===f)switch(a){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:d=
|
||||
0;break;default:N||=1280;return}else{if(f instanceof Float32Array||f instanceof Uint32Array||f instanceof Int32Array||f instanceof Array){for(a=0;a<f.length;++a)switch(c){case 0:r()[b+4*a>>2]=f[a];break;case 2:u()[b+4*a>>2]=f[a];break;case 4:e()[b+a]=f[a]?1:0}return}try{d=f.name|0}catch(h){N||=1280;y(`GL_INVALID_ENUM in glGet${c}v: Unknown object returned from WebGL getParameter(${a})! (error: ${h})`);return}}break;default:N||=1280;y(`GL_INVALID_ENUM in glGet${c}v: Native code calling glGet${c}v(${a}) and it returns ${f} of type ${typeof f}!`);
|
||||
return}switch(c){case 1:vb(b,d);break;case 0:r()[b>>2]=d;break;case 2:u()[b>>2]=d;break;case 4:e()[b]=d?1:0}}else N||=1281},yb=(a,b)=>xb(a,b,0),zb=(a,b,c)=>{if(c){a=J[a];b=2>P.version?F.g.getQueryObjectEXT(a,b):F.getQueryParameter(a,b);var d;"boolean"==typeof b?d=b?1:0:d=b;vb(c,d)}else N||=1281},Bb=a=>{for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);127>=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}b+=1;(c=Ab(b))&&E(a,c,b);return c},Cb=a=>{var b=jb[a];if(!b){switch(a){case 7939:b=Bb(wb().join(" "));
|
||||
break;case 7936:case 7937:case 37445:case 37446:(b=F.getParameter(a))||(N||=1280);b=b?Bb(b):0;break;case 7938:b=F.getParameter(7938);var c=`OpenGL ES 2.0 (${b})`;2<=P.version&&(c=`OpenGL ES 3.0 (${b})`);b=Bb(c);break;case 35724:b=F.getParameter(35724);c=b.match(/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/);null!==c&&(3==c[1].length&&(c[1]+="0"),b=`OpenGL ES GLSL ES ${c[1]} (${b})`);b=Bb(b);break;default:N||=1280}jb[a]=b}return b},Db=(a,b)=>{if(2>P.version)return N||=1282,0;var c=kb[a];if(c)return 0>
|
||||
b||b>=c.length?(N||=1281,0):c[b];switch(a){case 7939:return c=wb().map(Bb),c=kb[a]=c,0>b||b>=c.length?(N||=1281,0):c[b];default:return N||=1280,0}},Eb=a=>"]"==a.slice(-1)&&a.lastIndexOf("["),Fb=a=>{a-=5120;0==a?a=e():1==a?a=q():2==a?(g.buffer!=k.buffer&&n(),a=ta):4==a?a=r():6==a?a=u():5==a||28922==a||28520==a||30779==a||30782==a?a=t():(g.buffer!=k.buffer&&n(),a=ua);return a},Gb=(a,b,c,d,f)=>{a=Fb(a);b=d*((mb||c)*({5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4}[b-6402]||1)*a.BYTES_PER_ELEMENT+
|
||||
lb-1&-lb);return a.subarray(f>>>31-Math.clz32(a.BYTES_PER_ELEMENT),f+b>>>31-Math.clz32(a.BYTES_PER_ELEMENT))},Q=a=>{var b=F.N;if(b){var c=b.u[a];"number"==typeof c&&(b.u[a]=c=F.getUniformLocation(b,b.L[a]+(0<c?`[${c}]`:"")));return c}N||=1282},R=[],Hb=[],Ib={},Kb=()=>{if(!Jb){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"},b;for(b in Ib)void 0===
|
||||
Ib[b]?delete a[b]:a[b]=Ib[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);Jb=c}return Jb},Jb,Lb=[null,[],[]];function Mb(){}function Nb(){}function Ob(){}function Pb(){}function Qb(){}function Rb(){}function Sb(){}function Tb(){}function Ub(){}function Vb(){}function Wb(){}function Xb(){}function Yb(){}function Zb(){}function $b(){}function S(){}function ac(){}var U,bc=[],dc=a=>cc(a);w.stackAlloc=dc;ka&&(C[0]=this,addEventListener("message",Ba));for(var V=0;32>V;++V)tb.push(Array(V));var ec=new Float32Array(288);
|
||||
for(V=0;288>=V;++V)R[V]=ec.subarray(0,V);var fc=new Int32Array(288);for(V=0;288>=V;++V)Hb[V]=fc.subarray(0,V);
|
||||
(function(){if(w.skwasmSingleThreaded){Xb=function(){return!0};let c;Nb=function(d,f){c=f};Ob=function(){return performance.now()};S=function(d){queueMicrotask(()=>c(d))}}else{Xb=function(){return!1};let c=0;Nb=function(d,f){function h({data:l}){const m=l.h;m&&("syncTimeOrigin"==m?c=performance.timeOrigin-l.timeOrigin:f(l))}d?(C[d].addEventListener("message",h),C[d].postMessage({h:"syncTimeOrigin",timeOrigin:performance.timeOrigin})):addEventListener("message",h)};Ob=function(){return performance.now()+
|
||||
c};S=function(d,f,h){h?C[h].postMessage(d,{transfer:f}):postMessage(d,{transfer:f})}}const a=new Map,b=new Map;ac=function(c,d,f){S({h:"setAssociatedObject",F:d,object:f},[f],c)};Wb=function(c){return b.get(c)};Pb=function(c){Nb(c,function(d){var f=d.h;if(f)switch(f){case "renderPictures":gc(d.l,d.V,d.U,d.m,Ob());break;case "onRenderComplete":hc(d.l,d.m,{imageBitmaps:d.R,rasterStartMilliseconds:d.X,rasterEndMilliseconds:d.W});break;case "setAssociatedObject":b.set(d.F,d.object);break;case "disposeAssociatedObject":d=
|
||||
d.F;f=b.get(d);f.close&&f.close();b.delete(d);break;case "disposeSurface":ic(d.l);break;case "rasterizeImage":jc(d.l,d.image,d.format,d.m);break;case "onRasterizeComplete":kc(d.l,d.data,d.m);break;default:console.warn(`unrecognized skwasm message: ${f}`)}})};Ub=function(c,d,f,h,l){S({h:"renderPictures",l:d,V:f,U:h,m:l},[],c)};Rb=function(c,d){c=new OffscreenCanvas(c,d);d=ob(c);a.set(d,c);return d};$b=function(c,d,f){c=a.get(c);c.width=d;c.height=f};Mb=function(c,d){d||=[];c=a.get(c);d.push(c.transferToImageBitmap());
|
||||
return d};Yb=async function(c,d,f,h){S({h:"onRenderComplete",l:c,m:h,R:d,X:f,W:Ob()},[...d])};Qb=function(c,d,f){const h=P.v,l=h.createTexture();h.bindTexture(h.TEXTURE_2D,l);h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0);h.texImage2D(h.TEXTURE_2D,0,h.RGBA,d,f,0,h.RGBA,h.UNSIGNED_BYTE,c);h.pixelStorei(h.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1);h.bindTexture(h.TEXTURE_2D,null);c=M(H);H[c]=l;return c};Vb=function(c,d){S({h:"disposeAssociatedObject",F:d},[],c)};Sb=function(c,d){S({h:"disposeSurface",l:d},
|
||||
[],c)};Tb=function(c,d,f,h,l){S({h:"rasterizeImage",l:d,image:f,format:h,m:l},[],c)};Zb=function(c,d,f){S({h:"onRasterizeComplete",l:c,data:d,m:f})}})();
|
||||
var wc={__cxa_throw:(a,b,c)=>{var d=new Ra(a);t()[d.s+16>>2]=0;t()[d.s+4>>2]=b;t()[d.s+8>>2]=c;Sa=a;Ta++;throw Sa;},__syscall_fcntl64:function(){return 0},__syscall_fstat64:()=>{},__syscall_ioctl:function(){return 0},__syscall_openat:function(){},_abort_js:()=>{Ga("")},_emscripten_create_wasm_worker:(a,b)=>{let c=C[Xa]=new Worker(ma("skwasm.ww.js"));c.postMessage({$ww:Xa,wasm:qa,js:w.mainScriptUrlOrBlob||_scriptName,wasmMemory:g,sb:a,sz:b});c.onmessage=Da;return Xa++},_emscripten_get_now_is_monotonic:()=>
|
||||
1,_emscripten_runtime_keepalive_clear:()=>{za=!1;Oa=0},_emscripten_throw_longjmp:()=>{throw Infinity;},_mmap_js:function(){return-52},_munmap_js:function(){},_setitimer_js:(a,b)=>{D[a]&&(clearTimeout(D[a].id),delete D[a]);if(!b)return 0;var c=setTimeout(()=>{delete D[a];Qa(()=>lc(a,performance.now()))},b);D[a]={id:c,aa:b};return 0},_tzset_js:(a,b,c,d)=>{var f=(new Date).getFullYear(),h=(new Date(f,0,1)).getTimezoneOffset();f=(new Date(f,6,1)).getTimezoneOffset();var l=Math.max(h,f);t()[a>>2]=60*l;
|
||||
r()[b>>2]=Number(h!=f);b=m=>{var p=Math.abs(m);return`UTC${0<=m?"-":"+"}${String(Math.floor(p/60)).padStart(2,"0")}${String(p%60).padStart(2,"0")}`};a=b(h);b=b(f);f<h?(E(a,c,17),E(b,d,17)):(E(a,d,17),E(b,c,17))},emscripten_get_now:()=>performance.now(),emscripten_glActiveTexture:a=>F.activeTexture(a),emscripten_glAttachShader:(a,b)=>{F.attachShader(G[a],I[b])},emscripten_glBeginQuery:(a,b)=>{F.beginQuery(a,J[b])},emscripten_glBeginQueryEXT:(a,b)=>{F.g.beginQueryEXT(a,J[b])},emscripten_glBindAttribLocation:(a,
|
||||
b,c)=>{F.bindAttribLocation(G[a],b,Wa(c))},emscripten_glBindBuffer:(a,b)=>{35051==a?F.D=b:35052==a&&(F.o=b);F.bindBuffer(a,eb[b])},emscripten_glBindFramebuffer:(a,b)=>{F.bindFramebuffer(a,fb[b])},emscripten_glBindRenderbuffer:(a,b)=>{F.bindRenderbuffer(a,gb[b])},emscripten_glBindSampler:(a,b)=>{F.bindSampler(a,K[b])},emscripten_glBindTexture:(a,b)=>{F.bindTexture(a,H[b])},emscripten_glBindVertexArray:qb,emscripten_glBindVertexArrayOES:qb,emscripten_glBlendColor:(a,b,c,d)=>F.blendColor(a,b,c,d),emscripten_glBlendEquation:a=>
|
||||
F.blendEquation(a),emscripten_glBlendFunc:(a,b)=>F.blendFunc(a,b),emscripten_glBlitFramebuffer:(a,b,c,d,f,h,l,m,p,v)=>F.blitFramebuffer(a,b,c,d,f,h,l,m,p,v),emscripten_glBufferData:(a,b,c,d)=>{2<=P.version?c&&b?F.bufferData(a,q(),d,c,b):F.bufferData(a,b,d):F.bufferData(a,c?q().subarray(c,c+b):b,d)},emscripten_glBufferSubData:(a,b,c,d)=>{2<=P.version?c&&F.bufferSubData(a,b,q(),d,c):F.bufferSubData(a,b,q().subarray(d,d+c))},emscripten_glCheckFramebufferStatus:a=>F.checkFramebufferStatus(a),emscripten_glClear:a=>
|
||||
F.clear(a),emscripten_glClearColor:(a,b,c,d)=>F.clearColor(a,b,c,d),emscripten_glClearStencil:a=>F.clearStencil(a),emscripten_glClientWaitSync:(a,b,c,d)=>F.clientWaitSync(L[a],b,(c>>>0)+4294967296*d),emscripten_glColorMask:(a,b,c,d)=>{F.colorMask(!!a,!!b,!!c,!!d)},emscripten_glCompileShader:a=>{F.compileShader(I[a])},emscripten_glCompressedTexImage2D:(a,b,c,d,f,h,l,m)=>{2<=P.version?F.o||!l?F.compressedTexImage2D(a,b,c,d,f,h,l,m):F.compressedTexImage2D(a,b,c,d,f,h,q(),m,l):F.compressedTexImage2D(a,
|
||||
b,c,d,f,h,q().subarray(m,m+l))},emscripten_glCompressedTexSubImage2D:(a,b,c,d,f,h,l,m,p)=>{2<=P.version?F.o||!m?F.compressedTexSubImage2D(a,b,c,d,f,h,l,m,p):F.compressedTexSubImage2D(a,b,c,d,f,h,l,q(),p,m):F.compressedTexSubImage2D(a,b,c,d,f,h,l,q().subarray(p,p+m))},emscripten_glCopyBufferSubData:(a,b,c,d,f)=>F.copyBufferSubData(a,b,c,d,f),emscripten_glCopyTexSubImage2D:(a,b,c,d,f,h,l,m)=>F.copyTexSubImage2D(a,b,c,d,f,h,l,m),emscripten_glCreateProgram:()=>{var a=M(G),b=F.createProgram();b.name=a;
|
||||
b.C=b.A=b.B=0;b.G=1;G[a]=b;return a},emscripten_glCreateShader:a=>{var b=M(I);I[b]=F.createShader(a);return b},emscripten_glCullFace:a=>F.cullFace(a),emscripten_glDeleteBuffers:(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=eb[d];f&&(F.deleteBuffer(f),f.name=0,eb[d]=null,d==F.D&&(F.D=0),d==F.o&&(F.o=0))}},emscripten_glDeleteFramebuffers:(a,b)=>{for(var c=0;c<a;++c){var d=r()[b+4*c>>2],f=fb[d];f&&(F.deleteFramebuffer(f),f.name=0,fb[d]=null)}},emscripten_glDeleteProgram:a=>{if(a){var b=G[a];b?(F.deleteProgram(b),
|
||||
b.name=0,G[a]=null):N||=1281}},emscripten_glDeleteQueries:(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=J[d];f&&(F.deleteQuery(f),J[d]=null)}},emscripten_glDeleteQueriesEXT:(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=J[d];f&&(F.g.deleteQueryEXT(f),J[d]=null)}},emscripten_glDeleteRenderbuffers:(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=gb[d];f&&(F.deleteRenderbuffer(f),f.name=0,gb[d]=null)}},emscripten_glDeleteSamplers:(a,b)=>{for(var c=0;c<a;c++){var d=r()[b+4*c>>2],f=K[d];f&&
|
||||
(F.deleteSampler(f),f.name=0,K[d]=null)}},emscripten_glDeleteShader:a=>{if(a){var b=I[a];b?(F.deleteShader(b),I[a]=null):N||=1281}},emscripten_glDeleteSync:a=>{if(a){var b=L[a];b?(F.deleteSync(b),b.name=0,L[a]=null):N||=1281}},emscripten_glDeleteTextures:rb,emscripten_glDeleteVertexArrays:sb,emscripten_glDeleteVertexArraysOES:sb,emscripten_glDepthMask:a=>{F.depthMask(!!a)},emscripten_glDisable:a=>F.disable(a),emscripten_glDisableVertexAttribArray:a=>{F.disableVertexAttribArray(a)},emscripten_glDrawArrays:(a,
|
||||
b,c)=>{F.drawArrays(a,b,c)},emscripten_glDrawArraysInstanced:(a,b,c,d)=>{F.drawArraysInstanced(a,b,c,d)},emscripten_glDrawArraysInstancedBaseInstanceWEBGL:(a,b,c,d,f)=>{F.H.drawArraysInstancedBaseInstanceWEBGL(a,b,c,d,f)},emscripten_glDrawBuffers:(a,b)=>{for(var c=tb[a],d=0;d<a;d++)c[d]=r()[b+4*d>>2];F.drawBuffers(c)},emscripten_glDrawElements:(a,b,c,d)=>{F.drawElements(a,b,c,d)},emscripten_glDrawElementsInstanced:(a,b,c,d,f)=>{F.drawElementsInstanced(a,b,c,d,f)},emscripten_glDrawElementsInstancedBaseVertexBaseInstanceWEBGL:(a,
|
||||
b,c,d,f,h,l)=>{F.H.drawElementsInstancedBaseVertexBaseInstanceWEBGL(a,b,c,d,f,h,l)},emscripten_glDrawRangeElements:(a,b,c,d,f,h)=>{F.drawElements(a,d,f,h)},emscripten_glEnable:a=>F.enable(a),emscripten_glEnableVertexAttribArray:a=>{F.enableVertexAttribArray(a)},emscripten_glEndQuery:a=>F.endQuery(a),emscripten_glEndQueryEXT:a=>{F.g.endQueryEXT(a)},emscripten_glFenceSync:(a,b)=>(a=F.fenceSync(a,b))?(b=M(L),a.name=b,L[b]=a,b):0,emscripten_glFinish:()=>F.finish(),emscripten_glFlush:()=>F.flush(),emscripten_glFramebufferRenderbuffer:(a,
|
||||
b,c,d)=>{F.framebufferRenderbuffer(a,b,c,gb[d])},emscripten_glFramebufferTexture2D:(a,b,c,d,f)=>{F.framebufferTexture2D(a,b,c,H[d],f)},emscripten_glFrontFace:a=>F.frontFace(a),emscripten_glGenBuffers:(a,b)=>{O(a,b,"createBuffer",eb)},emscripten_glGenFramebuffers:(a,b)=>{O(a,b,"createFramebuffer",fb)},emscripten_glGenQueries:(a,b)=>{O(a,b,"createQuery",J)},emscripten_glGenQueriesEXT:(a,b)=>{for(var c=0;c<a;c++){var d=F.g.createQueryEXT();if(!d){for(N||=1282;c<a;)r()[b+4*c++>>2]=0;break}var f=M(J);
|
||||
d.name=f;J[f]=d;r()[b+4*c>>2]=f}},emscripten_glGenRenderbuffers:(a,b)=>{O(a,b,"createRenderbuffer",gb)},emscripten_glGenSamplers:(a,b)=>{O(a,b,"createSampler",K)},emscripten_glGenTextures:(a,b)=>{O(a,b,"createTexture",H)},emscripten_glGenVertexArrays:ub,emscripten_glGenVertexArraysOES:ub,emscripten_glGenerateMipmap:a=>F.generateMipmap(a),emscripten_glGetBufferParameteriv:(a,b,c)=>{c?r()[c>>2]=F.getBufferParameter(a,b):N||=1281},emscripten_glGetError:()=>{var a=F.getError()||N;N=0;return a},emscripten_glGetFloatv:(a,
|
||||
b)=>xb(a,b,2),emscripten_glGetFramebufferAttachmentParameteriv:(a,b,c,d)=>{a=F.getFramebufferAttachmentParameter(a,b,c);if(a instanceof WebGLRenderbuffer||a instanceof WebGLTexture)a=a.name|0;r()[d>>2]=a},emscripten_glGetIntegerv:yb,emscripten_glGetProgramInfoLog:(a,b,c,d)=>{a=F.getProgramInfoLog(G[a]);null===a&&(a="(unknown error)");b=0<b&&d?E(a,d,b):0;c&&(r()[c>>2]=b)},emscripten_glGetProgramiv:(a,b,c)=>{if(c)if(a>=db)N||=1281;else if(a=G[a],35716==b)a=F.getProgramInfoLog(a),null===a&&(a="(unknown error)"),
|
||||
r()[c>>2]=a.length+1;else if(35719==b){if(!a.C){var d=F.getProgramParameter(a,35718);for(b=0;b<d;++b)a.C=Math.max(a.C,F.getActiveUniform(a,b).name.length+1)}r()[c>>2]=a.C}else if(35722==b){if(!a.A)for(d=F.getProgramParameter(a,35721),b=0;b<d;++b)a.A=Math.max(a.A,F.getActiveAttrib(a,b).name.length+1);r()[c>>2]=a.A}else if(35381==b){if(!a.B)for(d=F.getProgramParameter(a,35382),b=0;b<d;++b)a.B=Math.max(a.B,F.getActiveUniformBlockName(a,b).length+1);r()[c>>2]=a.B}else r()[c>>2]=F.getProgramParameter(a,
|
||||
b);else N||=1281},emscripten_glGetQueryObjecti64vEXT:zb,emscripten_glGetQueryObjectui64vEXT:zb,emscripten_glGetQueryObjectuiv:(a,b,c)=>{if(c){a=F.getQueryParameter(J[a],b);var d;"boolean"==typeof a?d=a?1:0:d=a;r()[c>>2]=d}else N||=1281},emscripten_glGetQueryObjectuivEXT:(a,b,c)=>{if(c){a=F.g.getQueryObjectEXT(J[a],b);var d;"boolean"==typeof a?d=a?1:0:d=a;r()[c>>2]=d}else N||=1281},emscripten_glGetQueryiv:(a,b,c)=>{c?r()[c>>2]=F.getQuery(a,b):N||=1281},emscripten_glGetQueryivEXT:(a,b,c)=>{c?r()[c>>
|
||||
2]=F.g.getQueryEXT(a,b):N||=1281},emscripten_glGetRenderbufferParameteriv:(a,b,c)=>{c?r()[c>>2]=F.getRenderbufferParameter(a,b):N||=1281},emscripten_glGetShaderInfoLog:(a,b,c,d)=>{a=F.getShaderInfoLog(I[a]);null===a&&(a="(unknown error)");b=0<b&&d?E(a,d,b):0;c&&(r()[c>>2]=b)},emscripten_glGetShaderPrecisionFormat:(a,b,c,d)=>{a=F.getShaderPrecisionFormat(a,b);r()[c>>2]=a.rangeMin;r()[c+4>>2]=a.rangeMax;r()[d>>2]=a.precision},emscripten_glGetShaderiv:(a,b,c)=>{c?35716==b?(a=F.getShaderInfoLog(I[a]),
|
||||
null===a&&(a="(unknown error)"),a=a?a.length+1:0,r()[c>>2]=a):35720==b?(a=(a=F.getShaderSource(I[a]))?a.length+1:0,r()[c>>2]=a):r()[c>>2]=F.getShaderParameter(I[a],b):N||=1281},emscripten_glGetString:Cb,emscripten_glGetStringi:Db,emscripten_glGetUniformLocation:(a,b)=>{b=Wa(b);if(a=G[a]){var c=a,d=c.u,f=c.M,h;if(!d){c.u=d={};c.L={};var l=F.getProgramParameter(c,35718);for(h=0;h<l;++h){var m=F.getActiveUniform(c,h);var p=m.name;m=m.size;var v=Eb(p);v=0<v?p.slice(0,v):p;var T=c.G;c.G+=m;f[v]=[m,T];
|
||||
for(p=0;p<m;++p)d[T]=p,c.L[T++]=v}}c=a.u;d=0;f=b;h=Eb(b);0<h&&(d=parseInt(b.slice(h+1))>>>0,f=b.slice(0,h));if((f=a.M[f])&&d<f[0]&&(d+=f[1],c[d]=c[d]||F.getUniformLocation(a,b)))return d}else N||=1281;return-1},emscripten_glInvalidateFramebuffer:(a,b,c)=>{for(var d=tb[b],f=0;f<b;f++)d[f]=r()[c+4*f>>2];F.invalidateFramebuffer(a,d)},emscripten_glInvalidateSubFramebuffer:(a,b,c,d,f,h,l)=>{for(var m=tb[b],p=0;p<b;p++)m[p]=r()[c+4*p>>2];F.invalidateSubFramebuffer(a,m,d,f,h,l)},emscripten_glIsSync:a=>F.isSync(L[a]),
|
||||
emscripten_glIsTexture:a=>(a=H[a])?F.isTexture(a):0,emscripten_glLineWidth:a=>F.lineWidth(a),emscripten_glLinkProgram:a=>{a=G[a];F.linkProgram(a);a.u=0;a.M={}},emscripten_glMultiDrawArraysInstancedBaseInstanceWEBGL:(a,b,c,d,f,h)=>{F.K.multiDrawArraysInstancedBaseInstanceWEBGL(a,r(),b>>2,r(),c>>2,r(),d>>2,t(),f>>2,h)},emscripten_glMultiDrawElementsInstancedBaseVertexBaseInstanceWEBGL:(a,b,c,d,f,h,l,m)=>{F.K.multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL(a,r(),b>>2,c,r(),d>>2,r(),f>>2,r(),h>>
|
||||
2,t(),l>>2,m)},emscripten_glPixelStorei:(a,b)=>{3317==a?lb=b:3314==a&&(mb=b);F.pixelStorei(a,b)},emscripten_glQueryCounterEXT:(a,b)=>{F.g.queryCounterEXT(J[a],b)},emscripten_glReadBuffer:a=>F.readBuffer(a),emscripten_glReadPixels:(a,b,c,d,f,h,l)=>{if(2<=P.version)if(F.D)F.readPixels(a,b,c,d,f,h,l);else{var m=Fb(h);l>>>=31-Math.clz32(m.BYTES_PER_ELEMENT);F.readPixels(a,b,c,d,f,h,m,l)}else(m=Gb(h,f,c,d,l))?F.readPixels(a,b,c,d,f,h,m):N||=1280},emscripten_glRenderbufferStorage:(a,b,c,d)=>F.renderbufferStorage(a,
|
||||
b,c,d),emscripten_glRenderbufferStorageMultisample:(a,b,c,d,f)=>F.renderbufferStorageMultisample(a,b,c,d,f),emscripten_glSamplerParameterf:(a,b,c)=>{F.samplerParameterf(K[a],b,c)},emscripten_glSamplerParameteri:(a,b,c)=>{F.samplerParameteri(K[a],b,c)},emscripten_glSamplerParameteriv:(a,b,c)=>{c=r()[c>>2];F.samplerParameteri(K[a],b,c)},emscripten_glScissor:(a,b,c,d)=>F.scissor(a,b,c,d),emscripten_glShaderSource:(a,b,c,d)=>{for(var f="",h=0;h<b;++h){var l=d?t()[d+4*h>>2]:void 0;f+=Wa(t()[c+4*h>>2],
|
||||
l)}F.shaderSource(I[a],f)},emscripten_glStencilFunc:(a,b,c)=>F.stencilFunc(a,b,c),emscripten_glStencilFuncSeparate:(a,b,c,d)=>F.stencilFuncSeparate(a,b,c,d),emscripten_glStencilMask:a=>F.stencilMask(a),emscripten_glStencilMaskSeparate:(a,b)=>F.stencilMaskSeparate(a,b),emscripten_glStencilOp:(a,b,c)=>F.stencilOp(a,b,c),emscripten_glStencilOpSeparate:(a,b,c,d)=>F.stencilOpSeparate(a,b,c,d),emscripten_glTexImage2D:(a,b,c,d,f,h,l,m,p)=>{if(2<=P.version){if(F.o){F.texImage2D(a,b,c,d,f,h,l,m,p);return}if(p){var v=
|
||||
Fb(m);p>>>=31-Math.clz32(v.BYTES_PER_ELEMENT);F.texImage2D(a,b,c,d,f,h,l,m,v,p);return}}v=p?Gb(m,l,d,f,p):null;F.texImage2D(a,b,c,d,f,h,l,m,v)},emscripten_glTexParameterf:(a,b,c)=>F.texParameterf(a,b,c),emscripten_glTexParameterfv:(a,b,c)=>{c=u()[c>>2];F.texParameterf(a,b,c)},emscripten_glTexParameteri:(a,b,c)=>F.texParameteri(a,b,c),emscripten_glTexParameteriv:(a,b,c)=>{c=r()[c>>2];F.texParameteri(a,b,c)},emscripten_glTexStorage2D:(a,b,c,d,f)=>F.texStorage2D(a,b,c,d,f),emscripten_glTexSubImage2D:(a,
|
||||
b,c,d,f,h,l,m,p)=>{if(2<=P.version){if(F.o){F.texSubImage2D(a,b,c,d,f,h,l,m,p);return}if(p){var v=Fb(m);F.texSubImage2D(a,b,c,d,f,h,l,m,v,p>>>31-Math.clz32(v.BYTES_PER_ELEMENT));return}}p=p?Gb(m,l,f,h,p):null;F.texSubImage2D(a,b,c,d,f,h,l,m,p)},emscripten_glUniform1f:(a,b)=>{F.uniform1f(Q(a),b)},emscripten_glUniform1fv:(a,b,c)=>{if(2<=P.version)b&&F.uniform1fv(Q(a),u(),c>>2,b);else{if(288>=b)for(var d=R[b],f=0;f<b;++f)d[f]=u()[c+4*f>>2];else d=u().subarray(c>>2,c+4*b>>2);F.uniform1fv(Q(a),d)}},emscripten_glUniform1i:(a,
|
||||
b)=>{F.uniform1i(Q(a),b)},emscripten_glUniform1iv:(a,b,c)=>{if(2<=P.version)b&&F.uniform1iv(Q(a),r(),c>>2,b);else{if(288>=b)for(var d=Hb[b],f=0;f<b;++f)d[f]=r()[c+4*f>>2];else d=r().subarray(c>>2,c+4*b>>2);F.uniform1iv(Q(a),d)}},emscripten_glUniform2f:(a,b,c)=>{F.uniform2f(Q(a),b,c)},emscripten_glUniform2fv:(a,b,c)=>{if(2<=P.version)b&&F.uniform2fv(Q(a),u(),c>>2,2*b);else{if(144>=b){b*=2;for(var d=R[b],f=0;f<b;f+=2)d[f]=u()[c+4*f>>2],d[f+1]=u()[c+(4*f+4)>>2]}else d=u().subarray(c>>2,c+8*b>>2);F.uniform2fv(Q(a),
|
||||
d)}},emscripten_glUniform2i:(a,b,c)=>{F.uniform2i(Q(a),b,c)},emscripten_glUniform2iv:(a,b,c)=>{if(2<=P.version)b&&F.uniform2iv(Q(a),r(),c>>2,2*b);else{if(144>=b){b*=2;for(var d=Hb[b],f=0;f<b;f+=2)d[f]=r()[c+4*f>>2],d[f+1]=r()[c+(4*f+4)>>2]}else d=r().subarray(c>>2,c+8*b>>2);F.uniform2iv(Q(a),d)}},emscripten_glUniform3f:(a,b,c,d)=>{F.uniform3f(Q(a),b,c,d)},emscripten_glUniform3fv:(a,b,c)=>{if(2<=P.version)b&&F.uniform3fv(Q(a),u(),c>>2,3*b);else{if(96>=b){b*=3;for(var d=R[b],f=0;f<b;f+=3)d[f]=u()[c+
|
||||
4*f>>2],d[f+1]=u()[c+(4*f+4)>>2],d[f+2]=u()[c+(4*f+8)>>2]}else d=u().subarray(c>>2,c+12*b>>2);F.uniform3fv(Q(a),d)}},emscripten_glUniform3i:(a,b,c,d)=>{F.uniform3i(Q(a),b,c,d)},emscripten_glUniform3iv:(a,b,c)=>{if(2<=P.version)b&&F.uniform3iv(Q(a),r(),c>>2,3*b);else{if(96>=b){b*=3;for(var d=Hb[b],f=0;f<b;f+=3)d[f]=r()[c+4*f>>2],d[f+1]=r()[c+(4*f+4)>>2],d[f+2]=r()[c+(4*f+8)>>2]}else d=r().subarray(c>>2,c+12*b>>2);F.uniform3iv(Q(a),d)}},emscripten_glUniform4f:(a,b,c,d,f)=>{F.uniform4f(Q(a),b,c,d,f)},
|
||||
emscripten_glUniform4fv:(a,b,c)=>{if(2<=P.version)b&&F.uniform4fv(Q(a),u(),c>>2,4*b);else{if(72>=b){var d=R[4*b],f=u();c>>=2;b*=4;for(var h=0;h<b;h+=4){var l=c+h;d[h]=f[l];d[h+1]=f[l+1];d[h+2]=f[l+2];d[h+3]=f[l+3]}}else d=u().subarray(c>>2,c+16*b>>2);F.uniform4fv(Q(a),d)}},emscripten_glUniform4i:(a,b,c,d,f)=>{F.uniform4i(Q(a),b,c,d,f)},emscripten_glUniform4iv:(a,b,c)=>{if(2<=P.version)b&&F.uniform4iv(Q(a),r(),c>>2,4*b);else{if(72>=b){b*=4;for(var d=Hb[b],f=0;f<b;f+=4)d[f]=r()[c+4*f>>2],d[f+1]=r()[c+
|
||||
(4*f+4)>>2],d[f+2]=r()[c+(4*f+8)>>2],d[f+3]=r()[c+(4*f+12)>>2]}else d=r().subarray(c>>2,c+16*b>>2);F.uniform4iv(Q(a),d)}},emscripten_glUniformMatrix2fv:(a,b,c,d)=>{if(2<=P.version)b&&F.uniformMatrix2fv(Q(a),!!c,u(),d>>2,4*b);else{if(72>=b){b*=4;for(var f=R[b],h=0;h<b;h+=4)f[h]=u()[d+4*h>>2],f[h+1]=u()[d+(4*h+4)>>2],f[h+2]=u()[d+(4*h+8)>>2],f[h+3]=u()[d+(4*h+12)>>2]}else f=u().subarray(d>>2,d+16*b>>2);F.uniformMatrix2fv(Q(a),!!c,f)}},emscripten_glUniformMatrix3fv:(a,b,c,d)=>{if(2<=P.version)b&&F.uniformMatrix3fv(Q(a),
|
||||
!!c,u(),d>>2,9*b);else{if(32>=b){b*=9;for(var f=R[b],h=0;h<b;h+=9)f[h]=u()[d+4*h>>2],f[h+1]=u()[d+(4*h+4)>>2],f[h+2]=u()[d+(4*h+8)>>2],f[h+3]=u()[d+(4*h+12)>>2],f[h+4]=u()[d+(4*h+16)>>2],f[h+5]=u()[d+(4*h+20)>>2],f[h+6]=u()[d+(4*h+24)>>2],f[h+7]=u()[d+(4*h+28)>>2],f[h+8]=u()[d+(4*h+32)>>2]}else f=u().subarray(d>>2,d+36*b>>2);F.uniformMatrix3fv(Q(a),!!c,f)}},emscripten_glUniformMatrix4fv:(a,b,c,d)=>{if(2<=P.version)b&&F.uniformMatrix4fv(Q(a),!!c,u(),d>>2,16*b);else{if(18>=b){var f=R[16*b],h=u();d>>=
|
||||
2;b*=16;for(var l=0;l<b;l+=16){var m=d+l;f[l]=h[m];f[l+1]=h[m+1];f[l+2]=h[m+2];f[l+3]=h[m+3];f[l+4]=h[m+4];f[l+5]=h[m+5];f[l+6]=h[m+6];f[l+7]=h[m+7];f[l+8]=h[m+8];f[l+9]=h[m+9];f[l+10]=h[m+10];f[l+11]=h[m+11];f[l+12]=h[m+12];f[l+13]=h[m+13];f[l+14]=h[m+14];f[l+15]=h[m+15]}}else f=u().subarray(d>>2,d+64*b>>2);F.uniformMatrix4fv(Q(a),!!c,f)}},emscripten_glUseProgram:a=>{a=G[a];F.useProgram(a);F.N=a},emscripten_glVertexAttrib1f:(a,b)=>F.vertexAttrib1f(a,b),emscripten_glVertexAttrib2fv:(a,b)=>{F.vertexAttrib2f(a,
|
||||
u()[b>>2],u()[b+4>>2])},emscripten_glVertexAttrib3fv:(a,b)=>{F.vertexAttrib3f(a,u()[b>>2],u()[b+4>>2],u()[b+8>>2])},emscripten_glVertexAttrib4fv:(a,b)=>{F.vertexAttrib4f(a,u()[b>>2],u()[b+4>>2],u()[b+8>>2],u()[b+12>>2])},emscripten_glVertexAttribDivisor:(a,b)=>{F.vertexAttribDivisor(a,b)},emscripten_glVertexAttribIPointer:(a,b,c,d,f)=>{F.vertexAttribIPointer(a,b,c,d,f)},emscripten_glVertexAttribPointer:(a,b,c,d,f,h)=>{F.vertexAttribPointer(a,b,c,!!d,f,h)},emscripten_glViewport:(a,b,c,d)=>F.viewport(a,
|
||||
b,c,d),emscripten_glWaitSync:(a,b,c,d)=>{F.waitSync(L[a],b,(c>>>0)+4294967296*d)},emscripten_resize_heap:a=>{var b=q().length;a>>>=0;if(a<=b||2147483648<a)return!1;for(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a,d)/65536))-g.buffer.byteLength+65535)/65536|0;try{g.grow(d);n();var f=1;break a}catch(h){}f=void 0}if(f)return!0}return!1},emscripten_wasm_worker_post_function_v:(a,b)=>{C[a].postMessage({_wsc:b,x:[]})},emscripten_webgl_enable_extension:function(a,
|
||||
b){a=ib[a];b=Wa(b);b.startsWith("GL_")&&(b=b.substr(3));"ANGLE_instanced_arrays"==b&&Ya(F);"OES_vertex_array_object"==b&&Za(F);"WEBGL_draw_buffers"==b&&$a(F);"WEBGL_draw_instanced_base_vertex_base_instance"==b&&ab(F);"WEBGL_multi_draw_instanced_base_vertex_base_instance"==b&&bb(F);"WEBGL_multi_draw"==b&&(F.T=F.getExtension("WEBGL_multi_draw"));"EXT_polygon_offset_clamp"==b&&(F.P=F.getExtension("EXT_polygon_offset_clamp"));"EXT_clip_control"==b&&(F.O=F.getExtension("EXT_clip_control"));"WEBGL_polygon_mode"==
|
||||
b&&(F.Y=F.getExtension("WEBGL_polygon_mode"));return!!a.v.getExtension(b)},emscripten_webgl_get_current_context:()=>P?P.handle:0,emscripten_webgl_make_context_current:a=>{P=ib[a];w.$=F=P?.v;return!a||F?0:-5},environ_get:(a,b)=>{var c=0;Kb().forEach((d,f)=>{var h=b+c;f=t()[a+4*f>>2]=h;for(h=0;h<d.length;++h)e()[f++]=d.charCodeAt(h);e()[f]=0;c+=d.length+1});return 0},environ_sizes_get:(a,b)=>{var c=Kb();t()[a>>2]=c.length;var d=0;c.forEach(f=>d+=f.length+1);t()[b>>2]=d;return 0},fd_close:()=>52,fd_pread:function(){return 52},
|
||||
fd_read:()=>52,fd_seek:function(){return 70},fd_write:(a,b,c,d)=>{for(var f=0,h=0;h<c;h++){var l=t()[b>>2],m=t()[b+4>>2];b+=8;for(var p=0;p<m;p++){var v=q()[l+p],T=Lb[a];0===v||10===v?((1===a?pa:y)(Va(T)),T.length=0):T.push(v)}f+=m}t()[d>>2]=f;return 0},glDeleteTextures:rb,glGetIntegerv:yb,glGetString:Cb,glGetStringi:Db,invoke_ii:mc,invoke_iii:nc,invoke_iiii:oc,invoke_iiiii:pc,invoke_iiiiiii:qc,invoke_vi:rc,invoke_vii:sc,invoke_viii:tc,invoke_viiii:uc,invoke_viiiiiii:vc,memory:g,proc_exit:Pa,skwasm_captureImageBitmap:Mb,
|
||||
skwasm_connectThread:Pb,skwasm_createGlTextureFromTextureSource:Qb,skwasm_createOffscreenCanvas:Rb,skwasm_dispatchDisposeSurface:Sb,skwasm_dispatchRasterizeImage:Tb,skwasm_dispatchRenderPictures:Ub,skwasm_disposeAssociatedObjectOnThread:Vb,skwasm_getAssociatedObject:Wb,skwasm_isSingleThreaded:Xb,skwasm_postImages:Yb,skwasm_postRasterizeResult:Zb,skwasm_resizeCanvas:$b,skwasm_setAssociatedObjectOnThread:ac},W=function(){function a(c,d){W=c.exports;w.wasmExports=W;B=W.__indirect_function_table;wa.unshift(W.__wasm_call_ctors);
|
||||
qa=d;z--;0==z&&(null!==Fa&&(clearInterval(Fa),Fa=null),A&&(c=A,A=null,c()));return W}var b={env:wc,wasi_snapshot_preview1:wc};z++;if(w.instantiateWasm)try{return w.instantiateWasm(b,a)}catch(c){y(`Module.instantiateWasm callback failed with error: ${c}`),fa(c)}Ia??=Ha("skwasm.wasm")?"skwasm.wasm":ma("skwasm.wasm");La(b,function(c){a(c.instance,c.module)}).catch(fa);return{}}();w._canvas_saveLayer=(a,b,c,d,f)=>(w._canvas_saveLayer=W.canvas_saveLayer)(a,b,c,d,f);w._canvas_save=a=>(w._canvas_save=W.canvas_save)(a);
|
||||
w._canvas_restore=a=>(w._canvas_restore=W.canvas_restore)(a);w._canvas_restoreToCount=(a,b)=>(w._canvas_restoreToCount=W.canvas_restoreToCount)(a,b);w._canvas_getSaveCount=a=>(w._canvas_getSaveCount=W.canvas_getSaveCount)(a);w._canvas_translate=(a,b,c)=>(w._canvas_translate=W.canvas_translate)(a,b,c);w._canvas_scale=(a,b,c)=>(w._canvas_scale=W.canvas_scale)(a,b,c);w._canvas_rotate=(a,b)=>(w._canvas_rotate=W.canvas_rotate)(a,b);w._canvas_skew=(a,b,c)=>(w._canvas_skew=W.canvas_skew)(a,b,c);
|
||||
w._canvas_transform=(a,b)=>(w._canvas_transform=W.canvas_transform)(a,b);w._canvas_clipRect=(a,b,c,d)=>(w._canvas_clipRect=W.canvas_clipRect)(a,b,c,d);w._canvas_clipRRect=(a,b,c)=>(w._canvas_clipRRect=W.canvas_clipRRect)(a,b,c);w._canvas_clipPath=(a,b,c)=>(w._canvas_clipPath=W.canvas_clipPath)(a,b,c);w._canvas_drawColor=(a,b,c)=>(w._canvas_drawColor=W.canvas_drawColor)(a,b,c);w._canvas_drawLine=(a,b,c,d,f,h)=>(w._canvas_drawLine=W.canvas_drawLine)(a,b,c,d,f,h);
|
||||
w._canvas_drawPaint=(a,b)=>(w._canvas_drawPaint=W.canvas_drawPaint)(a,b);w._canvas_drawRect=(a,b,c)=>(w._canvas_drawRect=W.canvas_drawRect)(a,b,c);w._canvas_drawRRect=(a,b,c)=>(w._canvas_drawRRect=W.canvas_drawRRect)(a,b,c);w._canvas_drawDRRect=(a,b,c,d)=>(w._canvas_drawDRRect=W.canvas_drawDRRect)(a,b,c,d);w._canvas_drawOval=(a,b,c)=>(w._canvas_drawOval=W.canvas_drawOval)(a,b,c);w._canvas_drawCircle=(a,b,c,d,f)=>(w._canvas_drawCircle=W.canvas_drawCircle)(a,b,c,d,f);
|
||||
w._canvas_drawArc=(a,b,c,d,f,h)=>(w._canvas_drawArc=W.canvas_drawArc)(a,b,c,d,f,h);w._canvas_drawPath=(a,b,c)=>(w._canvas_drawPath=W.canvas_drawPath)(a,b,c);w._canvas_drawShadow=(a,b,c,d,f,h)=>(w._canvas_drawShadow=W.canvas_drawShadow)(a,b,c,d,f,h);w._canvas_drawParagraph=(a,b,c,d)=>(w._canvas_drawParagraph=W.canvas_drawParagraph)(a,b,c,d);w._canvas_drawPicture=(a,b)=>(w._canvas_drawPicture=W.canvas_drawPicture)(a,b);
|
||||
w._canvas_drawImage=(a,b,c,d,f,h)=>(w._canvas_drawImage=W.canvas_drawImage)(a,b,c,d,f,h);w._canvas_drawImageRect=(a,b,c,d,f,h)=>(w._canvas_drawImageRect=W.canvas_drawImageRect)(a,b,c,d,f,h);w._canvas_drawImageNine=(a,b,c,d,f,h)=>(w._canvas_drawImageNine=W.canvas_drawImageNine)(a,b,c,d,f,h);w._canvas_drawVertices=(a,b,c,d)=>(w._canvas_drawVertices=W.canvas_drawVertices)(a,b,c,d);w._canvas_drawPoints=(a,b,c,d,f)=>(w._canvas_drawPoints=W.canvas_drawPoints)(a,b,c,d,f);
|
||||
w._canvas_drawAtlas=(a,b,c,d,f,h,l,m,p)=>(w._canvas_drawAtlas=W.canvas_drawAtlas)(a,b,c,d,f,h,l,m,p);w._canvas_getTransform=(a,b)=>(w._canvas_getTransform=W.canvas_getTransform)(a,b);w._canvas_getLocalClipBounds=(a,b)=>(w._canvas_getLocalClipBounds=W.canvas_getLocalClipBounds)(a,b);w._canvas_getDeviceClipBounds=(a,b)=>(w._canvas_getDeviceClipBounds=W.canvas_getDeviceClipBounds)(a,b);w._contourMeasureIter_create=(a,b,c)=>(w._contourMeasureIter_create=W.contourMeasureIter_create)(a,b,c);
|
||||
w._contourMeasureIter_next=a=>(w._contourMeasureIter_next=W.contourMeasureIter_next)(a);w._contourMeasureIter_dispose=a=>(w._contourMeasureIter_dispose=W.contourMeasureIter_dispose)(a);w._contourMeasure_dispose=a=>(w._contourMeasure_dispose=W.contourMeasure_dispose)(a);w._contourMeasure_length=a=>(w._contourMeasure_length=W.contourMeasure_length)(a);w._contourMeasure_isClosed=a=>(w._contourMeasure_isClosed=W.contourMeasure_isClosed)(a);
|
||||
w._contourMeasure_getPosTan=(a,b,c,d)=>(w._contourMeasure_getPosTan=W.contourMeasure_getPosTan)(a,b,c,d);w._contourMeasure_getSegment=(a,b,c,d)=>(w._contourMeasure_getSegment=W.contourMeasure_getSegment)(a,b,c,d);w._skData_create=a=>(w._skData_create=W.skData_create)(a);w._skData_getPointer=a=>(w._skData_getPointer=W.skData_getPointer)(a);w._skData_getConstPointer=a=>(w._skData_getConstPointer=W.skData_getConstPointer)(a);w._skData_getSize=a=>(w._skData_getSize=W.skData_getSize)(a);
|
||||
w._skData_dispose=a=>(w._skData_dispose=W.skData_dispose)(a);w._imageFilter_createBlur=(a,b,c)=>(w._imageFilter_createBlur=W.imageFilter_createBlur)(a,b,c);w._imageFilter_createDilate=(a,b)=>(w._imageFilter_createDilate=W.imageFilter_createDilate)(a,b);w._imageFilter_createErode=(a,b)=>(w._imageFilter_createErode=W.imageFilter_createErode)(a,b);w._imageFilter_createMatrix=(a,b)=>(w._imageFilter_createMatrix=W.imageFilter_createMatrix)(a,b);
|
||||
w._imageFilter_createFromColorFilter=a=>(w._imageFilter_createFromColorFilter=W.imageFilter_createFromColorFilter)(a);w._imageFilter_compose=(a,b)=>(w._imageFilter_compose=W.imageFilter_compose)(a,b);w._imageFilter_dispose=a=>(w._imageFilter_dispose=W.imageFilter_dispose)(a);w._imageFilter_getFilterBounds=(a,b)=>(w._imageFilter_getFilterBounds=W.imageFilter_getFilterBounds)(a,b);w._colorFilter_createMode=(a,b)=>(w._colorFilter_createMode=W.colorFilter_createMode)(a,b);
|
||||
w._colorFilter_createMatrix=a=>(w._colorFilter_createMatrix=W.colorFilter_createMatrix)(a);w._colorFilter_createSRGBToLinearGamma=()=>(w._colorFilter_createSRGBToLinearGamma=W.colorFilter_createSRGBToLinearGamma)();w._colorFilter_createLinearToSRGBGamma=()=>(w._colorFilter_createLinearToSRGBGamma=W.colorFilter_createLinearToSRGBGamma)();w._colorFilter_compose=(a,b)=>(w._colorFilter_compose=W.colorFilter_compose)(a,b);w._colorFilter_dispose=a=>(w._colorFilter_dispose=W.colorFilter_dispose)(a);
|
||||
w._maskFilter_createBlur=(a,b)=>(w._maskFilter_createBlur=W.maskFilter_createBlur)(a,b);w._maskFilter_dispose=a=>(w._maskFilter_dispose=W.maskFilter_dispose)(a);w._fontCollection_create=()=>(w._fontCollection_create=W.fontCollection_create)();w._fontCollection_dispose=a=>(w._fontCollection_dispose=W.fontCollection_dispose)(a);w._typeface_create=a=>(w._typeface_create=W.typeface_create)(a);w._typeface_dispose=a=>(w._typeface_dispose=W.typeface_dispose)(a);
|
||||
w._typefaces_filterCoveredCodePoints=(a,b,c,d)=>(w._typefaces_filterCoveredCodePoints=W.typefaces_filterCoveredCodePoints)(a,b,c,d);w._fontCollection_registerTypeface=(a,b,c)=>(w._fontCollection_registerTypeface=W.fontCollection_registerTypeface)(a,b,c);w._fontCollection_clearCaches=a=>(w._fontCollection_clearCaches=W.fontCollection_clearCaches)(a);w._image_createFromPicture=(a,b,c)=>(w._image_createFromPicture=W.image_createFromPicture)(a,b,c);
|
||||
w._image_createFromPixels=(a,b,c,d,f)=>(w._image_createFromPixels=W.image_createFromPixels)(a,b,c,d,f);w._image_createFromTextureSource=(a,b,c,d)=>(w._image_createFromTextureSource=W.image_createFromTextureSource)(a,b,c,d);w._image_ref=a=>(w._image_ref=W.image_ref)(a);w._image_dispose=a=>(w._image_dispose=W.image_dispose)(a);w._image_getWidth=a=>(w._image_getWidth=W.image_getWidth)(a);w._image_getHeight=a=>(w._image_getHeight=W.image_getHeight)(a);
|
||||
w._paint_create=(a,b,c,d,f,h,l,m)=>(w._paint_create=W.paint_create)(a,b,c,d,f,h,l,m);w._paint_dispose=a=>(w._paint_dispose=W.paint_dispose)(a);w._paint_setShader=(a,b)=>(w._paint_setShader=W.paint_setShader)(a,b);w._paint_setImageFilter=(a,b)=>(w._paint_setImageFilter=W.paint_setImageFilter)(a,b);w._paint_setColorFilter=(a,b)=>(w._paint_setColorFilter=W.paint_setColorFilter)(a,b);w._paint_setMaskFilter=(a,b)=>(w._paint_setMaskFilter=W.paint_setMaskFilter)(a,b);w._path_create=()=>(w._path_create=W.path_create)();
|
||||
w._path_dispose=a=>(w._path_dispose=W.path_dispose)(a);w._path_copy=a=>(w._path_copy=W.path_copy)(a);w._path_setFillType=(a,b)=>(w._path_setFillType=W.path_setFillType)(a,b);w._path_getFillType=a=>(w._path_getFillType=W.path_getFillType)(a);w._path_moveTo=(a,b,c)=>(w._path_moveTo=W.path_moveTo)(a,b,c);w._path_relativeMoveTo=(a,b,c)=>(w._path_relativeMoveTo=W.path_relativeMoveTo)(a,b,c);w._path_lineTo=(a,b,c)=>(w._path_lineTo=W.path_lineTo)(a,b,c);
|
||||
w._path_relativeLineTo=(a,b,c)=>(w._path_relativeLineTo=W.path_relativeLineTo)(a,b,c);w._path_quadraticBezierTo=(a,b,c,d,f)=>(w._path_quadraticBezierTo=W.path_quadraticBezierTo)(a,b,c,d,f);w._path_relativeQuadraticBezierTo=(a,b,c,d,f)=>(w._path_relativeQuadraticBezierTo=W.path_relativeQuadraticBezierTo)(a,b,c,d,f);w._path_cubicTo=(a,b,c,d,f,h,l)=>(w._path_cubicTo=W.path_cubicTo)(a,b,c,d,f,h,l);w._path_relativeCubicTo=(a,b,c,d,f,h,l)=>(w._path_relativeCubicTo=W.path_relativeCubicTo)(a,b,c,d,f,h,l);
|
||||
w._path_conicTo=(a,b,c,d,f,h)=>(w._path_conicTo=W.path_conicTo)(a,b,c,d,f,h);w._path_relativeConicTo=(a,b,c,d,f,h)=>(w._path_relativeConicTo=W.path_relativeConicTo)(a,b,c,d,f,h);w._path_arcToOval=(a,b,c,d,f)=>(w._path_arcToOval=W.path_arcToOval)(a,b,c,d,f);w._path_arcToRotated=(a,b,c,d,f,h,l,m)=>(w._path_arcToRotated=W.path_arcToRotated)(a,b,c,d,f,h,l,m);w._path_relativeArcToRotated=(a,b,c,d,f,h,l,m)=>(w._path_relativeArcToRotated=W.path_relativeArcToRotated)(a,b,c,d,f,h,l,m);
|
||||
w._path_addRect=(a,b)=>(w._path_addRect=W.path_addRect)(a,b);w._path_addOval=(a,b)=>(w._path_addOval=W.path_addOval)(a,b);w._path_addArc=(a,b,c,d)=>(w._path_addArc=W.path_addArc)(a,b,c,d);w._path_addPolygon=(a,b,c,d)=>(w._path_addPolygon=W.path_addPolygon)(a,b,c,d);w._path_addRRect=(a,b)=>(w._path_addRRect=W.path_addRRect)(a,b);w._path_addPath=(a,b,c,d)=>(w._path_addPath=W.path_addPath)(a,b,c,d);w._path_close=a=>(w._path_close=W.path_close)(a);w._path_reset=a=>(w._path_reset=W.path_reset)(a);
|
||||
w._path_contains=(a,b,c)=>(w._path_contains=W.path_contains)(a,b,c);w._path_transform=(a,b)=>(w._path_transform=W.path_transform)(a,b);w._path_getBounds=(a,b)=>(w._path_getBounds=W.path_getBounds)(a,b);w._path_combine=(a,b,c)=>(w._path_combine=W.path_combine)(a,b,c);w._path_getSvgString=a=>(w._path_getSvgString=W.path_getSvgString)(a);w._pictureRecorder_create=()=>(w._pictureRecorder_create=W.pictureRecorder_create)();w._pictureRecorder_dispose=a=>(w._pictureRecorder_dispose=W.pictureRecorder_dispose)(a);
|
||||
w._pictureRecorder_beginRecording=(a,b)=>(w._pictureRecorder_beginRecording=W.pictureRecorder_beginRecording)(a,b);w._pictureRecorder_endRecording=a=>(w._pictureRecorder_endRecording=W.pictureRecorder_endRecording)(a);w._picture_getCullRect=(a,b)=>(w._picture_getCullRect=W.picture_getCullRect)(a,b);w._picture_dispose=a=>(w._picture_dispose=W.picture_dispose)(a);w._picture_approximateBytesUsed=a=>(w._picture_approximateBytesUsed=W.picture_approximateBytesUsed)(a);
|
||||
w._shader_createLinearGradient=(a,b,c,d,f,h)=>(w._shader_createLinearGradient=W.shader_createLinearGradient)(a,b,c,d,f,h);w._shader_createRadialGradient=(a,b,c,d,f,h,l,m)=>(w._shader_createRadialGradient=W.shader_createRadialGradient)(a,b,c,d,f,h,l,m);w._shader_createConicalGradient=(a,b,c,d,f,h,l,m)=>(w._shader_createConicalGradient=W.shader_createConicalGradient)(a,b,c,d,f,h,l,m);
|
||||
w._shader_createSweepGradient=(a,b,c,d,f,h,l,m,p)=>(w._shader_createSweepGradient=W.shader_createSweepGradient)(a,b,c,d,f,h,l,m,p);w._shader_dispose=a=>(w._shader_dispose=W.shader_dispose)(a);w._runtimeEffect_create=a=>(w._runtimeEffect_create=W.runtimeEffect_create)(a);w._runtimeEffect_dispose=a=>(w._runtimeEffect_dispose=W.runtimeEffect_dispose)(a);w._runtimeEffect_getUniformSize=a=>(w._runtimeEffect_getUniformSize=W.runtimeEffect_getUniformSize)(a);
|
||||
w._shader_createRuntimeEffectShader=(a,b,c,d)=>(w._shader_createRuntimeEffectShader=W.shader_createRuntimeEffectShader)(a,b,c,d);w._shader_createFromImage=(a,b,c,d,f)=>(w._shader_createFromImage=W.shader_createFromImage)(a,b,c,d,f);w._skString_allocate=a=>(w._skString_allocate=W.skString_allocate)(a);w._skString_getData=a=>(w._skString_getData=W.skString_getData)(a);w._skString_getLength=a=>(w._skString_getLength=W.skString_getLength)(a);w._skString_free=a=>(w._skString_free=W.skString_free)(a);
|
||||
w._skString16_allocate=a=>(w._skString16_allocate=W.skString16_allocate)(a);w._skString16_getData=a=>(w._skString16_getData=W.skString16_getData)(a);w._skString16_free=a=>(w._skString16_free=W.skString16_free)(a);w._surface_create=()=>(w._surface_create=W.surface_create)();w._surface_getThreadId=a=>(w._surface_getThreadId=W.surface_getThreadId)(a);w._surface_setCallbackHandler=(a,b)=>(w._surface_setCallbackHandler=W.surface_setCallbackHandler)(a,b);w._surface_destroy=a=>(w._surface_destroy=W.surface_destroy)(a);
|
||||
var ic=w._surface_dispose=a=>(ic=w._surface_dispose=W.surface_dispose)(a);w._surface_renderPictures=(a,b,c)=>(w._surface_renderPictures=W.surface_renderPictures)(a,b,c);var gc=w._surface_renderPicturesOnWorker=(a,b,c,d,f)=>(gc=w._surface_renderPicturesOnWorker=W.surface_renderPicturesOnWorker)(a,b,c,d,f);w._surface_rasterizeImage=(a,b,c)=>(w._surface_rasterizeImage=W.surface_rasterizeImage)(a,b,c);
|
||||
var jc=w._surface_rasterizeImageOnWorker=(a,b,c,d)=>(jc=w._surface_rasterizeImageOnWorker=W.surface_rasterizeImageOnWorker)(a,b,c,d),hc=w._surface_onRenderComplete=(a,b,c)=>(hc=w._surface_onRenderComplete=W.surface_onRenderComplete)(a,b,c),kc=w._surface_onRasterizeComplete=(a,b,c)=>(kc=w._surface_onRasterizeComplete=W.surface_onRasterizeComplete)(a,b,c);w._skwasm_isMultiThreaded=()=>(w._skwasm_isMultiThreaded=W.skwasm_isMultiThreaded)();
|
||||
w._lineMetrics_create=(a,b,c,d,f,h,l,m,p)=>(w._lineMetrics_create=W.lineMetrics_create)(a,b,c,d,f,h,l,m,p);w._lineMetrics_dispose=a=>(w._lineMetrics_dispose=W.lineMetrics_dispose)(a);w._lineMetrics_getHardBreak=a=>(w._lineMetrics_getHardBreak=W.lineMetrics_getHardBreak)(a);w._lineMetrics_getAscent=a=>(w._lineMetrics_getAscent=W.lineMetrics_getAscent)(a);w._lineMetrics_getDescent=a=>(w._lineMetrics_getDescent=W.lineMetrics_getDescent)(a);
|
||||
w._lineMetrics_getUnscaledAscent=a=>(w._lineMetrics_getUnscaledAscent=W.lineMetrics_getUnscaledAscent)(a);w._lineMetrics_getHeight=a=>(w._lineMetrics_getHeight=W.lineMetrics_getHeight)(a);w._lineMetrics_getWidth=a=>(w._lineMetrics_getWidth=W.lineMetrics_getWidth)(a);w._lineMetrics_getLeft=a=>(w._lineMetrics_getLeft=W.lineMetrics_getLeft)(a);w._lineMetrics_getBaseline=a=>(w._lineMetrics_getBaseline=W.lineMetrics_getBaseline)(a);w._lineMetrics_getLineNumber=a=>(w._lineMetrics_getLineNumber=W.lineMetrics_getLineNumber)(a);
|
||||
w._lineMetrics_getStartIndex=a=>(w._lineMetrics_getStartIndex=W.lineMetrics_getStartIndex)(a);w._lineMetrics_getEndIndex=a=>(w._lineMetrics_getEndIndex=W.lineMetrics_getEndIndex)(a);w._paragraph_dispose=a=>(w._paragraph_dispose=W.paragraph_dispose)(a);w._paragraph_getWidth=a=>(w._paragraph_getWidth=W.paragraph_getWidth)(a);w._paragraph_getHeight=a=>(w._paragraph_getHeight=W.paragraph_getHeight)(a);w._paragraph_getLongestLine=a=>(w._paragraph_getLongestLine=W.paragraph_getLongestLine)(a);
|
||||
w._paragraph_getMinIntrinsicWidth=a=>(w._paragraph_getMinIntrinsicWidth=W.paragraph_getMinIntrinsicWidth)(a);w._paragraph_getMaxIntrinsicWidth=a=>(w._paragraph_getMaxIntrinsicWidth=W.paragraph_getMaxIntrinsicWidth)(a);w._paragraph_getAlphabeticBaseline=a=>(w._paragraph_getAlphabeticBaseline=W.paragraph_getAlphabeticBaseline)(a);w._paragraph_getIdeographicBaseline=a=>(w._paragraph_getIdeographicBaseline=W.paragraph_getIdeographicBaseline)(a);
|
||||
w._paragraph_getDidExceedMaxLines=a=>(w._paragraph_getDidExceedMaxLines=W.paragraph_getDidExceedMaxLines)(a);w._paragraph_layout=(a,b)=>(w._paragraph_layout=W.paragraph_layout)(a,b);w._paragraph_getPositionForOffset=(a,b,c,d)=>(w._paragraph_getPositionForOffset=W.paragraph_getPositionForOffset)(a,b,c,d);w._paragraph_getClosestGlyphInfoAtCoordinate=(a,b,c,d,f,h)=>(w._paragraph_getClosestGlyphInfoAtCoordinate=W.paragraph_getClosestGlyphInfoAtCoordinate)(a,b,c,d,f,h);
|
||||
w._paragraph_getGlyphInfoAt=(a,b,c,d,f)=>(w._paragraph_getGlyphInfoAt=W.paragraph_getGlyphInfoAt)(a,b,c,d,f);w._paragraph_getWordBoundary=(a,b,c)=>(w._paragraph_getWordBoundary=W.paragraph_getWordBoundary)(a,b,c);w._paragraph_getLineCount=a=>(w._paragraph_getLineCount=W.paragraph_getLineCount)(a);w._paragraph_getLineNumberAt=(a,b)=>(w._paragraph_getLineNumberAt=W.paragraph_getLineNumberAt)(a,b);
|
||||
w._paragraph_getLineMetricsAtIndex=(a,b)=>(w._paragraph_getLineMetricsAtIndex=W.paragraph_getLineMetricsAtIndex)(a,b);w._textBoxList_dispose=a=>(w._textBoxList_dispose=W.textBoxList_dispose)(a);w._textBoxList_getLength=a=>(w._textBoxList_getLength=W.textBoxList_getLength)(a);w._textBoxList_getBoxAtIndex=(a,b,c)=>(w._textBoxList_getBoxAtIndex=W.textBoxList_getBoxAtIndex)(a,b,c);w._paragraph_getBoxesForRange=(a,b,c,d,f)=>(w._paragraph_getBoxesForRange=W.paragraph_getBoxesForRange)(a,b,c,d,f);
|
||||
w._paragraph_getBoxesForPlaceholders=a=>(w._paragraph_getBoxesForPlaceholders=W.paragraph_getBoxesForPlaceholders)(a);w._paragraph_getUnresolvedCodePoints=(a,b,c)=>(w._paragraph_getUnresolvedCodePoints=W.paragraph_getUnresolvedCodePoints)(a,b,c);w._paragraphBuilder_create=(a,b)=>(w._paragraphBuilder_create=W.paragraphBuilder_create)(a,b);w._paragraphBuilder_dispose=a=>(w._paragraphBuilder_dispose=W.paragraphBuilder_dispose)(a);
|
||||
w._paragraphBuilder_addPlaceholder=(a,b,c,d,f,h)=>(w._paragraphBuilder_addPlaceholder=W.paragraphBuilder_addPlaceholder)(a,b,c,d,f,h);w._paragraphBuilder_addText=(a,b)=>(w._paragraphBuilder_addText=W.paragraphBuilder_addText)(a,b);w._paragraphBuilder_getUtf8Text=(a,b)=>(w._paragraphBuilder_getUtf8Text=W.paragraphBuilder_getUtf8Text)(a,b);w._paragraphBuilder_pushStyle=(a,b)=>(w._paragraphBuilder_pushStyle=W.paragraphBuilder_pushStyle)(a,b);w._paragraphBuilder_pop=a=>(w._paragraphBuilder_pop=W.paragraphBuilder_pop)(a);
|
||||
w._paragraphBuilder_build=a=>(w._paragraphBuilder_build=W.paragraphBuilder_build)(a);w._unicodePositionBuffer_create=a=>(w._unicodePositionBuffer_create=W.unicodePositionBuffer_create)(a);w._unicodePositionBuffer_getDataPointer=a=>(w._unicodePositionBuffer_getDataPointer=W.unicodePositionBuffer_getDataPointer)(a);w._unicodePositionBuffer_free=a=>(w._unicodePositionBuffer_free=W.unicodePositionBuffer_free)(a);w._lineBreakBuffer_create=a=>(w._lineBreakBuffer_create=W.lineBreakBuffer_create)(a);
|
||||
w._lineBreakBuffer_getDataPointer=a=>(w._lineBreakBuffer_getDataPointer=W.lineBreakBuffer_getDataPointer)(a);w._lineBreakBuffer_free=a=>(w._lineBreakBuffer_free=W.lineBreakBuffer_free)(a);w._paragraphBuilder_setGraphemeBreaksUtf16=(a,b)=>(w._paragraphBuilder_setGraphemeBreaksUtf16=W.paragraphBuilder_setGraphemeBreaksUtf16)(a,b);w._paragraphBuilder_setWordBreaksUtf16=(a,b)=>(w._paragraphBuilder_setWordBreaksUtf16=W.paragraphBuilder_setWordBreaksUtf16)(a,b);
|
||||
w._paragraphBuilder_setLineBreaksUtf16=(a,b)=>(w._paragraphBuilder_setLineBreaksUtf16=W.paragraphBuilder_setLineBreaksUtf16)(a,b);w._paragraphStyle_create=()=>(w._paragraphStyle_create=W.paragraphStyle_create)();w._paragraphStyle_dispose=a=>(w._paragraphStyle_dispose=W.paragraphStyle_dispose)(a);w._paragraphStyle_setTextAlign=(a,b)=>(w._paragraphStyle_setTextAlign=W.paragraphStyle_setTextAlign)(a,b);
|
||||
w._paragraphStyle_setTextDirection=(a,b)=>(w._paragraphStyle_setTextDirection=W.paragraphStyle_setTextDirection)(a,b);w._paragraphStyle_setMaxLines=(a,b)=>(w._paragraphStyle_setMaxLines=W.paragraphStyle_setMaxLines)(a,b);w._paragraphStyle_setHeight=(a,b)=>(w._paragraphStyle_setHeight=W.paragraphStyle_setHeight)(a,b);w._paragraphStyle_setTextHeightBehavior=(a,b,c)=>(w._paragraphStyle_setTextHeightBehavior=W.paragraphStyle_setTextHeightBehavior)(a,b,c);
|
||||
w._paragraphStyle_setEllipsis=(a,b)=>(w._paragraphStyle_setEllipsis=W.paragraphStyle_setEllipsis)(a,b);w._paragraphStyle_setStrutStyle=(a,b)=>(w._paragraphStyle_setStrutStyle=W.paragraphStyle_setStrutStyle)(a,b);w._paragraphStyle_setTextStyle=(a,b)=>(w._paragraphStyle_setTextStyle=W.paragraphStyle_setTextStyle)(a,b);w._paragraphStyle_setApplyRoundingHack=(a,b)=>(w._paragraphStyle_setApplyRoundingHack=W.paragraphStyle_setApplyRoundingHack)(a,b);w._strutStyle_create=()=>(w._strutStyle_create=W.strutStyle_create)();
|
||||
w._strutStyle_dispose=a=>(w._strutStyle_dispose=W.strutStyle_dispose)(a);w._strutStyle_setFontFamilies=(a,b,c)=>(w._strutStyle_setFontFamilies=W.strutStyle_setFontFamilies)(a,b,c);w._strutStyle_setFontSize=(a,b)=>(w._strutStyle_setFontSize=W.strutStyle_setFontSize)(a,b);w._strutStyle_setHeight=(a,b)=>(w._strutStyle_setHeight=W.strutStyle_setHeight)(a,b);w._strutStyle_setHalfLeading=(a,b)=>(w._strutStyle_setHalfLeading=W.strutStyle_setHalfLeading)(a,b);
|
||||
w._strutStyle_setLeading=(a,b)=>(w._strutStyle_setLeading=W.strutStyle_setLeading)(a,b);w._strutStyle_setFontStyle=(a,b,c)=>(w._strutStyle_setFontStyle=W.strutStyle_setFontStyle)(a,b,c);w._strutStyle_setForceStrutHeight=(a,b)=>(w._strutStyle_setForceStrutHeight=W.strutStyle_setForceStrutHeight)(a,b);w._textStyle_create=()=>(w._textStyle_create=W.textStyle_create)();w._textStyle_copy=a=>(w._textStyle_copy=W.textStyle_copy)(a);w._textStyle_dispose=a=>(w._textStyle_dispose=W.textStyle_dispose)(a);
|
||||
w._textStyle_setColor=(a,b)=>(w._textStyle_setColor=W.textStyle_setColor)(a,b);w._textStyle_setDecoration=(a,b)=>(w._textStyle_setDecoration=W.textStyle_setDecoration)(a,b);w._textStyle_setDecorationColor=(a,b)=>(w._textStyle_setDecorationColor=W.textStyle_setDecorationColor)(a,b);w._textStyle_setDecorationStyle=(a,b)=>(w._textStyle_setDecorationStyle=W.textStyle_setDecorationStyle)(a,b);
|
||||
w._textStyle_setDecorationThickness=(a,b)=>(w._textStyle_setDecorationThickness=W.textStyle_setDecorationThickness)(a,b);w._textStyle_setFontStyle=(a,b,c)=>(w._textStyle_setFontStyle=W.textStyle_setFontStyle)(a,b,c);w._textStyle_setTextBaseline=(a,b)=>(w._textStyle_setTextBaseline=W.textStyle_setTextBaseline)(a,b);w._textStyle_clearFontFamilies=a=>(w._textStyle_clearFontFamilies=W.textStyle_clearFontFamilies)(a);
|
||||
w._textStyle_addFontFamilies=(a,b,c)=>(w._textStyle_addFontFamilies=W.textStyle_addFontFamilies)(a,b,c);w._textStyle_setFontSize=(a,b)=>(w._textStyle_setFontSize=W.textStyle_setFontSize)(a,b);w._textStyle_setLetterSpacing=(a,b)=>(w._textStyle_setLetterSpacing=W.textStyle_setLetterSpacing)(a,b);w._textStyle_setWordSpacing=(a,b)=>(w._textStyle_setWordSpacing=W.textStyle_setWordSpacing)(a,b);w._textStyle_setHeight=(a,b)=>(w._textStyle_setHeight=W.textStyle_setHeight)(a,b);
|
||||
w._textStyle_setHalfLeading=(a,b)=>(w._textStyle_setHalfLeading=W.textStyle_setHalfLeading)(a,b);w._textStyle_setLocale=(a,b)=>(w._textStyle_setLocale=W.textStyle_setLocale)(a,b);w._textStyle_setBackground=(a,b)=>(w._textStyle_setBackground=W.textStyle_setBackground)(a,b);w._textStyle_setForeground=(a,b)=>(w._textStyle_setForeground=W.textStyle_setForeground)(a,b);w._textStyle_addShadow=(a,b,c,d,f)=>(w._textStyle_addShadow=W.textStyle_addShadow)(a,b,c,d,f);
|
||||
w._textStyle_addFontFeature=(a,b,c)=>(w._textStyle_addFontFeature=W.textStyle_addFontFeature)(a,b,c);w._textStyle_setFontVariations=(a,b,c,d)=>(w._textStyle_setFontVariations=W.textStyle_setFontVariations)(a,b,c,d);w._vertices_create=(a,b,c,d,f,h,l)=>(w._vertices_create=W.vertices_create)(a,b,c,d,f,h,l);w._vertices_dispose=a=>(w._vertices_dispose=W.vertices_dispose)(a);
|
||||
var Ab=a=>(Ab=W.malloc)(a),lc=(a,b)=>(lc=W._emscripten_timeout)(a,b),X=(a,b)=>(X=W.setThrew)(a,b),Y=a=>(Y=W._emscripten_stack_restore)(a),cc=a=>(cc=W._emscripten_stack_alloc)(a),Z=()=>(Z=W.emscripten_stack_get_current)(),Aa=(a,b)=>(Aa=W._emscripten_wasm_worker_initialize)(a,b);function nc(a,b,c){var d=Z();try{return B.get(a)(b,c)}catch(f){Y(d);if(f!==f+0)throw f;X(1,0)}}function sc(a,b,c){var d=Z();try{B.get(a)(b,c)}catch(f){Y(d);if(f!==f+0)throw f;X(1,0)}}
|
||||
function mc(a,b){var c=Z();try{return B.get(a)(b)}catch(d){Y(c);if(d!==d+0)throw d;X(1,0)}}function tc(a,b,c,d){var f=Z();try{B.get(a)(b,c,d)}catch(h){Y(f);if(h!==h+0)throw h;X(1,0)}}function oc(a,b,c,d){var f=Z();try{return B.get(a)(b,c,d)}catch(h){Y(f);if(h!==h+0)throw h;X(1,0)}}function uc(a,b,c,d,f){var h=Z();try{B.get(a)(b,c,d,f)}catch(l){Y(h);if(l!==l+0)throw l;X(1,0)}}function vc(a,b,c,d,f,h,l,m){var p=Z();try{B.get(a)(b,c,d,f,h,l,m)}catch(v){Y(p);if(v!==v+0)throw v;X(1,0)}}
|
||||
function rc(a,b){var c=Z();try{B.get(a)(b)}catch(d){Y(c);if(d!==d+0)throw d;X(1,0)}}function qc(a,b,c,d,f,h,l){var m=Z();try{return B.get(a)(b,c,d,f,h,l)}catch(p){Y(m);if(p!==p+0)throw p;X(1,0)}}function pc(a,b,c,d,f){var h=Z();try{return B.get(a)(b,c,d,f)}catch(l){Y(h);if(l!==l+0)throw l;X(1,0)}}w.wasmMemory=g;w.wasmExports=W;w.stackAlloc=dc;
|
||||
w.addFunction=(a,b)=>{if(!U){U=new WeakMap;var c=B.length;if(U)for(var d=0;d<0+c;d++){var f=B.get(d);f&&U.set(f,d)}}if(c=U.get(a)||0)return c;if(bc.length)c=bc.pop();else{try{B.grow(1)}catch(m){if(!(m instanceof RangeError))throw m;throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.";}c=B.length-1}try{B.set(c,a)}catch(m){if(!(m instanceof TypeError))throw m;if("function"==typeof WebAssembly.Function){d=WebAssembly.Function;f={i:"i32",j:"i64",f:"f32",d:"f64",e:"externref",p:"i32"};for(var h={parameters:[],
|
||||
results:"v"==b[0]?[]:[f[b[0]]]},l=1;l<b.length;++l)h.parameters.push(f[b[l]]);b=new d(h,a)}else{d=[1];f=b.slice(0,1);b=b.slice(1);h={i:127,p:127,j:126,f:125,d:124,e:111};d.push(96);l=b.length;128>l?d.push(l):d.push(l%128|128,l>>7);for(l=0;l<b.length;++l)d.push(h[b[l]]);"v"==f?d.push(0):d.push(1,h[f]);b=[0,97,115,109,1,0,0,0,1];f=d.length;128>f?b.push(f):b.push(f%128|128,f>>7);b.push(...d);b.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);b=new WebAssembly.Module(new Uint8Array(b));b=(new WebAssembly.Instance(b,
|
||||
{e:{f:a}})).exports.f}B.set(c,b)}U.set(a,c);return c};var xc,yc;A=function zc(){xc||Ac();xc||(A=zc)};function Ac(){if(!(0<z))if(ka)ea(w),ya();else{if(!yc&&(yc=1,Ea(va),0<z))return;xc||(xc=1,w.calledRun=1,ra||(ya(),ea(w),Ea(xa)))}}Ac();moduleRtn=ha;
|
||||
|
||||
|
||||
return moduleRtn;
|
||||
}
|
||||
);
|
||||
})();
|
||||
export default skwasm;
|
||||
12073
web/canvaskit/skwasm.js.symbols
Normal file
12073
web/canvaskit/skwasm.js.symbols
Normal file
File diff suppressed because one or more lines are too long
BIN
web/canvaskit/skwasm.wasm
Executable file
BIN
web/canvaskit/skwasm.wasm
Executable file
Binary file not shown.
BIN
web/favicon.png
Normal file
BIN
web/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 917 B |
32
web/flutter.js
Normal file
32
web/flutter.js
Normal file
@ -0,0 +1,32 @@
|
||||
(()=>{var U=()=>navigator.vendor==="Google Inc."||navigator.agent==="Edg/",E=()=>typeof ImageDecoder>"u"?!1:U(),W=()=>typeof Intl.v8BreakIterator<"u"&&typeof Intl.Segmenter<"u",P=()=>{let s=[0,97,115,109,1,0,0,0,1,5,1,95,1,120,0];return WebAssembly.validate(new Uint8Array(s))},p={hasImageCodecs:E(),hasChromiumBreakIterators:W(),supportsWasmGC:P(),crossOriginIsolated:window.crossOriginIsolated};function l(...s){return new URL(_(...s),document.baseURI).toString()}function _(...s){return s.filter(e=>!!e).map((e,i)=>i===0?C(e):j(C(e))).filter(e=>e.length).join("/")}function j(s){let e=0;for(;e<s.length&&s.charAt(e)==="/";)e++;return s.substring(e)}function C(s){let e=s.length;for(;e>0&&s.charAt(e-1)==="/";)e--;return s.substring(0,e)}function L(s,e){return s.canvasKitBaseUrl?s.canvasKitBaseUrl:e.engineRevision&&!e.useLocalCanvasKit?_("https://www.gstatic.com/flutter-canvaskit",e.engineRevision):"canvaskit"}var h=class{constructor(){this._scriptLoaded=!1}setTrustedTypesPolicy(e){this._ttPolicy=e}async loadEntrypoint(e){let{entrypointUrl:i=l("main.dart.js"),onEntrypointLoaded:r,nonce:t}=e||{};return this._loadJSEntrypoint(i,r,t)}async load(e,i,r,t,n){n??=o=>{o.initializeEngine(r).then(c=>c.runApp())};let{entryPointBaseUrl:a}=r;if(e.compileTarget==="dart2wasm")return this._loadWasmEntrypoint(e,i,a,n);{let o=e.mainJsPath??"main.dart.js",c=l(a,o);return this._loadJSEntrypoint(c,n,t)}}didCreateEngineInitializer(e){typeof this._didCreateEngineInitializerResolve=="function"&&(this._didCreateEngineInitializerResolve(e),this._didCreateEngineInitializerResolve=null,delete _flutter.loader.didCreateEngineInitializer),typeof this._onEntrypointLoaded=="function"&&this._onEntrypointLoaded(e)}_loadJSEntrypoint(e,i,r){let t=typeof i=="function";if(!this._scriptLoaded){this._scriptLoaded=!0;let n=this._createScriptTag(e,r);if(t)console.debug("Injecting <script> tag. Using callback."),this._onEntrypointLoaded=i,document.head.append(n);else return new Promise((a,o)=>{console.debug("Injecting <script> tag. Using Promises. Use the callback approach instead!"),this._didCreateEngineInitializerResolve=a,n.addEventListener("error",o),document.head.append(n)})}}async _loadWasmEntrypoint(e,i,r,t){if(!this._scriptLoaded){this._scriptLoaded=!0,this._onEntrypointLoaded=t;let{mainWasmPath:n,jsSupportRuntimePath:a}=e,o=l(r,n),c=l(r,a);this._ttPolicy!=null&&(c=this._ttPolicy.createScriptURL(c));let d=(await import(c)).compileStreaming(fetch(o)),w;e.renderer==="skwasm"?w=(async()=>{let f=await i.skwasm;return window._flutter_skwasmInstance=f,{skwasm:f.wasmExports,skwasmWrapper:f,ffi:{memory:f.wasmMemory}}})():w=Promise.resolve({}),await(await(await d).instantiate(await w)).invokeMain()}}_createScriptTag(e,i){let r=document.createElement("script");r.type="application/javascript",i&&(r.nonce=i);let t=e;return this._ttPolicy!=null&&(t=this._ttPolicy.createScriptURL(e)),r.src=t,r}};async function T(s,e,i){if(e<0)return s;let r,t=new Promise((n,a)=>{r=setTimeout(()=>{a(new Error(`${i} took more than ${e}ms to resolve. Moving on.`,{cause:T}))},e)});return Promise.race([s,t]).finally(()=>{clearTimeout(r)})}var g=class{setTrustedTypesPolicy(e){this._ttPolicy=e}loadServiceWorker(e){if(!e)return console.debug("Null serviceWorker configuration. Skipping."),Promise.resolve();if(!("serviceWorker"in navigator)){let o="Service Worker API unavailable.";return window.isSecureContext||(o+=`
|
||||
The current context is NOT secure.`,o+=`
|
||||
Read more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts`),Promise.reject(new Error(o))}let{serviceWorkerVersion:i,serviceWorkerUrl:r=l(`flutter_service_worker.js?v=${i}`),timeoutMillis:t=4e3}=e,n=r;this._ttPolicy!=null&&(n=this._ttPolicy.createScriptURL(n));let a=navigator.serviceWorker.register(n).then(o=>this._getNewServiceWorker(o,i)).then(this._waitForServiceWorkerActivation);return T(a,t,"prepareServiceWorker")}async _getNewServiceWorker(e,i){if(!e.active&&(e.installing||e.waiting))return console.debug("Installing/Activating first service worker."),e.installing||e.waiting;if(e.active.scriptURL.endsWith(i))return console.debug("Loading from existing service worker."),e.active;{let r=await e.update();return console.debug("Updating service worker."),r.installing||r.waiting||r.active}}async _waitForServiceWorkerActivation(e){if(!e||e.state==="activated")if(e){console.debug("Service worker already active.");return}else throw new Error("Cannot activate a null service worker!");return new Promise((i,r)=>{e.addEventListener("statechange",()=>{e.state==="activated"&&(console.debug("Activated new service worker."),i())})})}};var y=class{constructor(e,i="flutter-js"){let r=e||[/\.js$/,/\.mjs$/];window.trustedTypes&&(this.policy=trustedTypes.createPolicy(i,{createScriptURL:function(t){if(t.startsWith("blob:"))return t;let n=new URL(t,window.location),a=n.pathname.split("/").pop();if(r.some(c=>c.test(a)))return n.toString();console.error("URL rejected by TrustedTypes policy",i,":",t,"(download prevented)")}}))}};var k=s=>{let e=WebAssembly.compileStreaming(fetch(s));return(i,r)=>((async()=>{let t=await e,n=await WebAssembly.instantiate(t,i);r(n,t)})(),{})};var I=(s,e,i,r)=>(window.flutterCanvasKitLoaded=(async()=>{if(window.flutterCanvasKit)return window.flutterCanvasKit;let t=i.hasChromiumBreakIterators&&i.hasImageCodecs;if(!t&&e.canvasKitVariant=="chromium")throw"Chromium CanvasKit variant specifically requested, but unsupported in this browser";let n=t&&e.canvasKitVariant!=="full",a=r;n&&(a=l(a,"chromium"));let o=l(a,"canvaskit.js");s.flutterTT.policy&&(o=s.flutterTT.policy.createScriptURL(o));let c=k(l(a,"canvaskit.wasm")),u=await import(o);return window.flutterCanvasKit=await u.default({instantiateWasm:c}),window.flutterCanvasKit})(),window.flutterCanvasKitLoaded);var b=async(s,e,i,r)=>{let t=l(r,"skwasm.js"),n=t;s.flutterTT.policy&&(n=s.flutterTT.policy.createScriptURL(n));let a=k(l(r,"skwasm.wasm"));return await(await import(n)).default({skwasmSingleThreaded:!i.crossOriginIsolated||e.forceSingleThreadedSkwasm,instantiateWasm:a,locateFile:(c,u)=>{if(c.endsWith(".ww.js")){let d=l(r,c);return URL.createObjectURL(new Blob([`
|
||||
"use strict";
|
||||
|
||||
let eventListener;
|
||||
eventListener = (message) => {
|
||||
const pendingMessages = [];
|
||||
const data = message.data;
|
||||
data["instantiateWasm"] = (info,receiveInstance) => {
|
||||
const instance = new WebAssembly.Instance(data["wasm"], info);
|
||||
return receiveInstance(instance, data["wasm"])
|
||||
};
|
||||
import(data.js).then(async (skwasm) => {
|
||||
await skwasm.default(data);
|
||||
|
||||
removeEventListener("message", eventListener);
|
||||
for (const message of pendingMessages) {
|
||||
dispatchEvent(message);
|
||||
}
|
||||
});
|
||||
removeEventListener("message", eventListener);
|
||||
eventListener = (message) => {
|
||||
|
||||
pendingMessages.push(message);
|
||||
};
|
||||
|
||||
addEventListener("message", eventListener);
|
||||
};
|
||||
addEventListener("message", eventListener);
|
||||
`],{type:"application/javascript"}))}return url},mainScriptUrlOrBlob:t})};var S=class{async loadEntrypoint(e){let{serviceWorker:i,...r}=e||{},t=new y,n=new g;n.setTrustedTypesPolicy(t.policy),await n.loadServiceWorker(i).catch(o=>{console.warn("Exception while loading service worker:",o)});let a=new h;return a.setTrustedTypesPolicy(t.policy),this.didCreateEngineInitializer=a.didCreateEngineInitializer.bind(a),a.loadEntrypoint(r)}async load({serviceWorkerSettings:e,onEntrypointLoaded:i,nonce:r,config:t}={}){t??={};let n=_flutter.buildConfig;if(!n)throw"FlutterLoader.load requires _flutter.buildConfig to be set";let a=m=>{switch(m){case"skwasm":return p.hasChromiumBreakIterators&&p.hasImageCodecs&&p.supportsWasmGC;default:return!0}},o=(m,f)=>m.renderer==f,c=m=>m.compileTarget==="dart2wasm"&&!p.supportsWasmGC||t.renderer&&!o(m,t.renderer)?!1:a(m.renderer),u=n.builds.find(c);if(!u)throw"FlutterLoader could not find a build compatible with configuration and environment.";let d={};d.flutterTT=new y,e&&(d.serviceWorkerLoader=new g,d.serviceWorkerLoader.setTrustedTypesPolicy(d.flutterTT.policy),await d.serviceWorkerLoader.loadServiceWorker(e).catch(m=>{console.warn("Exception while loading service worker:",m)}));let w=L(t,n);u.renderer==="canvaskit"?d.canvasKit=I(d,t,p,w):u.renderer==="skwasm"&&(d.skwasm=b(d,t,p,w));let v=new h;return v.setTrustedTypesPolicy(d.flutterTT.policy),this.didCreateEngineInitializer=v.didCreateEngineInitializer.bind(v),v.load(u,d,t,r,i)}};window._flutter||(window._flutter={});window._flutter.loader||(window._flutter.loader=new S);})();
|
||||
//# sourceMappingURL=flutter.js.map
|
||||
44
web/flutter_bootstrap.js
Normal file
44
web/flutter_bootstrap.js
Normal file
@ -0,0 +1,44 @@
|
||||
(()=>{var U=()=>navigator.vendor==="Google Inc."||navigator.agent==="Edg/",E=()=>typeof ImageDecoder>"u"?!1:U(),W=()=>typeof Intl.v8BreakIterator<"u"&&typeof Intl.Segmenter<"u",P=()=>{let s=[0,97,115,109,1,0,0,0,1,5,1,95,1,120,0];return WebAssembly.validate(new Uint8Array(s))},p={hasImageCodecs:E(),hasChromiumBreakIterators:W(),supportsWasmGC:P(),crossOriginIsolated:window.crossOriginIsolated};function l(...s){return new URL(_(...s),document.baseURI).toString()}function _(...s){return s.filter(e=>!!e).map((e,i)=>i===0?C(e):j(C(e))).filter(e=>e.length).join("/")}function j(s){let e=0;for(;e<s.length&&s.charAt(e)==="/";)e++;return s.substring(e)}function C(s){let e=s.length;for(;e>0&&s.charAt(e-1)==="/";)e--;return s.substring(0,e)}function L(s,e){return s.canvasKitBaseUrl?s.canvasKitBaseUrl:e.engineRevision&&!e.useLocalCanvasKit?_("https://www.gstatic.com/flutter-canvaskit",e.engineRevision):"canvaskit"}var h=class{constructor(){this._scriptLoaded=!1}setTrustedTypesPolicy(e){this._ttPolicy=e}async loadEntrypoint(e){let{entrypointUrl:i=l("main.dart.js"),onEntrypointLoaded:r,nonce:t}=e||{};return this._loadJSEntrypoint(i,r,t)}async load(e,i,r,t,n){n??=o=>{o.initializeEngine(r).then(c=>c.runApp())};let{entryPointBaseUrl:a}=r;if(e.compileTarget==="dart2wasm")return this._loadWasmEntrypoint(e,i,a,n);{let o=e.mainJsPath??"main.dart.js",c=l(a,o);return this._loadJSEntrypoint(c,n,t)}}didCreateEngineInitializer(e){typeof this._didCreateEngineInitializerResolve=="function"&&(this._didCreateEngineInitializerResolve(e),this._didCreateEngineInitializerResolve=null,delete _flutter.loader.didCreateEngineInitializer),typeof this._onEntrypointLoaded=="function"&&this._onEntrypointLoaded(e)}_loadJSEntrypoint(e,i,r){let t=typeof i=="function";if(!this._scriptLoaded){this._scriptLoaded=!0;let n=this._createScriptTag(e,r);if(t)console.debug("Injecting <script> tag. Using callback."),this._onEntrypointLoaded=i,document.head.append(n);else return new Promise((a,o)=>{console.debug("Injecting <script> tag. Using Promises. Use the callback approach instead!"),this._didCreateEngineInitializerResolve=a,n.addEventListener("error",o),document.head.append(n)})}}async _loadWasmEntrypoint(e,i,r,t){if(!this._scriptLoaded){this._scriptLoaded=!0,this._onEntrypointLoaded=t;let{mainWasmPath:n,jsSupportRuntimePath:a}=e,o=l(r,n),c=l(r,a);this._ttPolicy!=null&&(c=this._ttPolicy.createScriptURL(c));let d=(await import(c)).compileStreaming(fetch(o)),w;e.renderer==="skwasm"?w=(async()=>{let f=await i.skwasm;return window._flutter_skwasmInstance=f,{skwasm:f.wasmExports,skwasmWrapper:f,ffi:{memory:f.wasmMemory}}})():w=Promise.resolve({}),await(await(await d).instantiate(await w)).invokeMain()}}_createScriptTag(e,i){let r=document.createElement("script");r.type="application/javascript",i&&(r.nonce=i);let t=e;return this._ttPolicy!=null&&(t=this._ttPolicy.createScriptURL(e)),r.src=t,r}};async function T(s,e,i){if(e<0)return s;let r,t=new Promise((n,a)=>{r=setTimeout(()=>{a(new Error(`${i} took more than ${e}ms to resolve. Moving on.`,{cause:T}))},e)});return Promise.race([s,t]).finally(()=>{clearTimeout(r)})}var g=class{setTrustedTypesPolicy(e){this._ttPolicy=e}loadServiceWorker(e){if(!e)return console.debug("Null serviceWorker configuration. Skipping."),Promise.resolve();if(!("serviceWorker"in navigator)){let o="Service Worker API unavailable.";return window.isSecureContext||(o+=`
|
||||
The current context is NOT secure.`,o+=`
|
||||
Read more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts`),Promise.reject(new Error(o))}let{serviceWorkerVersion:i,serviceWorkerUrl:r=l(`flutter_service_worker.js?v=${i}`),timeoutMillis:t=4e3}=e,n=r;this._ttPolicy!=null&&(n=this._ttPolicy.createScriptURL(n));let a=navigator.serviceWorker.register(n).then(o=>this._getNewServiceWorker(o,i)).then(this._waitForServiceWorkerActivation);return T(a,t,"prepareServiceWorker")}async _getNewServiceWorker(e,i){if(!e.active&&(e.installing||e.waiting))return console.debug("Installing/Activating first service worker."),e.installing||e.waiting;if(e.active.scriptURL.endsWith(i))return console.debug("Loading from existing service worker."),e.active;{let r=await e.update();return console.debug("Updating service worker."),r.installing||r.waiting||r.active}}async _waitForServiceWorkerActivation(e){if(!e||e.state==="activated")if(e){console.debug("Service worker already active.");return}else throw new Error("Cannot activate a null service worker!");return new Promise((i,r)=>{e.addEventListener("statechange",()=>{e.state==="activated"&&(console.debug("Activated new service worker."),i())})})}};var y=class{constructor(e,i="flutter-js"){let r=e||[/\.js$/,/\.mjs$/];window.trustedTypes&&(this.policy=trustedTypes.createPolicy(i,{createScriptURL:function(t){if(t.startsWith("blob:"))return t;let n=new URL(t,window.location),a=n.pathname.split("/").pop();if(r.some(c=>c.test(a)))return n.toString();console.error("URL rejected by TrustedTypes policy",i,":",t,"(download prevented)")}}))}};var k=s=>{let e=WebAssembly.compileStreaming(fetch(s));return(i,r)=>((async()=>{let t=await e,n=await WebAssembly.instantiate(t,i);r(n,t)})(),{})};var I=(s,e,i,r)=>(window.flutterCanvasKitLoaded=(async()=>{if(window.flutterCanvasKit)return window.flutterCanvasKit;let t=i.hasChromiumBreakIterators&&i.hasImageCodecs;if(!t&&e.canvasKitVariant=="chromium")throw"Chromium CanvasKit variant specifically requested, but unsupported in this browser";let n=t&&e.canvasKitVariant!=="full",a=r;n&&(a=l(a,"chromium"));let o=l(a,"canvaskit.js");s.flutterTT.policy&&(o=s.flutterTT.policy.createScriptURL(o));let c=k(l(a,"canvaskit.wasm")),u=await import(o);return window.flutterCanvasKit=await u.default({instantiateWasm:c}),window.flutterCanvasKit})(),window.flutterCanvasKitLoaded);var b=async(s,e,i,r)=>{let t=l(r,"skwasm.js"),n=t;s.flutterTT.policy&&(n=s.flutterTT.policy.createScriptURL(n));let a=k(l(r,"skwasm.wasm"));return await(await import(n)).default({skwasmSingleThreaded:!i.crossOriginIsolated||e.forceSingleThreadedSkwasm,instantiateWasm:a,locateFile:(c,u)=>{if(c.endsWith(".ww.js")){let d=l(r,c);return URL.createObjectURL(new Blob([`
|
||||
"use strict";
|
||||
|
||||
let eventListener;
|
||||
eventListener = (message) => {
|
||||
const pendingMessages = [];
|
||||
const data = message.data;
|
||||
data["instantiateWasm"] = (info,receiveInstance) => {
|
||||
const instance = new WebAssembly.Instance(data["wasm"], info);
|
||||
return receiveInstance(instance, data["wasm"])
|
||||
};
|
||||
import(data.js).then(async (skwasm) => {
|
||||
await skwasm.default(data);
|
||||
|
||||
removeEventListener("message", eventListener);
|
||||
for (const message of pendingMessages) {
|
||||
dispatchEvent(message);
|
||||
}
|
||||
});
|
||||
removeEventListener("message", eventListener);
|
||||
eventListener = (message) => {
|
||||
|
||||
pendingMessages.push(message);
|
||||
};
|
||||
|
||||
addEventListener("message", eventListener);
|
||||
};
|
||||
addEventListener("message", eventListener);
|
||||
`],{type:"application/javascript"}))}return url},mainScriptUrlOrBlob:t})};var S=class{async loadEntrypoint(e){let{serviceWorker:i,...r}=e||{},t=new y,n=new g;n.setTrustedTypesPolicy(t.policy),await n.loadServiceWorker(i).catch(o=>{console.warn("Exception while loading service worker:",o)});let a=new h;return a.setTrustedTypesPolicy(t.policy),this.didCreateEngineInitializer=a.didCreateEngineInitializer.bind(a),a.loadEntrypoint(r)}async load({serviceWorkerSettings:e,onEntrypointLoaded:i,nonce:r,config:t}={}){t??={};let n=_flutter.buildConfig;if(!n)throw"FlutterLoader.load requires _flutter.buildConfig to be set";let a=m=>{switch(m){case"skwasm":return p.hasChromiumBreakIterators&&p.hasImageCodecs&&p.supportsWasmGC;default:return!0}},o=(m,f)=>m.renderer==f,c=m=>m.compileTarget==="dart2wasm"&&!p.supportsWasmGC||t.renderer&&!o(m,t.renderer)?!1:a(m.renderer),u=n.builds.find(c);if(!u)throw"FlutterLoader could not find a build compatible with configuration and environment.";let d={};d.flutterTT=new y,e&&(d.serviceWorkerLoader=new g,d.serviceWorkerLoader.setTrustedTypesPolicy(d.flutterTT.policy),await d.serviceWorkerLoader.loadServiceWorker(e).catch(m=>{console.warn("Exception while loading service worker:",m)}));let w=L(t,n);u.renderer==="canvaskit"?d.canvasKit=I(d,t,p,w):u.renderer==="skwasm"&&(d.skwasm=b(d,t,p,w));let v=new h;return v.setTrustedTypesPolicy(d.flutterTT.policy),this.didCreateEngineInitializer=v.didCreateEngineInitializer.bind(v),v.load(u,d,t,r,i)}};window._flutter||(window._flutter={});window._flutter.loader||(window._flutter.loader=new S);})();
|
||||
//# sourceMappingURL=flutter.js.map
|
||||
|
||||
if (!window._flutter) {
|
||||
window._flutter = {};
|
||||
}
|
||||
_flutter.buildConfig = {"engineRevision":"72f2b18bb094f92f62a3113a8075240ebb59affa","builds":[{"compileTarget":"dart2js","renderer":"canvaskit","mainJsPath":"main.dart.js"}]};
|
||||
|
||||
|
||||
_flutter.loader.load({
|
||||
serviceWorkerSettings: {
|
||||
serviceWorkerVersion: "3536977589"
|
||||
}
|
||||
});
|
||||
207
web/flutter_service_worker.js
Normal file
207
web/flutter_service_worker.js
Normal file
@ -0,0 +1,207 @@
|
||||
'use strict';
|
||||
const MANIFEST = 'flutter-app-manifest';
|
||||
const TEMP = 'flutter-temp-cache';
|
||||
const CACHE_NAME = 'flutter-app-cache';
|
||||
|
||||
const RESOURCES = {"flutter_bootstrap.js": "67ea8e8ba17a037878e97fb97744615b",
|
||||
"version.json": "2fe62a2512b6ba284732a0255fe16b80",
|
||||
"folderPage.java": "d41d8cd98f00b204e9800998ecf8427e",
|
||||
"index.html": "6969d9c82c7a8d15b9cb7ffed40b548e",
|
||||
"/": "6969d9c82c7a8d15b9cb7ffed40b548e",
|
||||
"main.dart.js": "b0c18056efb7628500f2acf8770b6b84",
|
||||
"flutter.js": "83d881c1dbb6d6bcd6b42e274605b69c",
|
||||
"favicon.png": "5dcef449791fa27946b3d35ad8803796",
|
||||
"icons/Icon-192.png": "ac9a721a12bbc803b44f645561ecb1e1",
|
||||
"icons/Icon-maskable-192.png": "c457ef57daa1d16f64b27b786ec2ea3c",
|
||||
"icons/Icon-maskable-512.png": "301a7604d45b3e739efc881eb04896ea",
|
||||
"icons/Icon-512.png": "96e752610906ba2a93c65f8abe1645f1",
|
||||
"manifest.json": "7ecf77d798f49ca9bd7ba8f7385f490d",
|
||||
"assets/AssetManifest.json": "4fc41e07eb7fb3b22fbcb8eb9b64ee27",
|
||||
"assets/NOTICES": "75d179303d74b3c43f65c10ba7e200e3",
|
||||
"assets/FontManifest.json": "dc3d03800ccca4601324923c0b1d6d57",
|
||||
"assets/AssetManifest.bin.json": "e44bb50a0b122ee5f3666674fa966327",
|
||||
"assets/packages/cupertino_icons/assets/CupertinoIcons.ttf": "33b7d9392238c04c131b6ce224e13711",
|
||||
"assets/packages/media_kit/assets/web/hls1.4.10.js": "bd60e2701c42b6bf2c339dcf5d495865",
|
||||
"assets/packages/wakelock_plus/assets/no_sleep.js": "7748a45cd593f33280669b29c2c8919a",
|
||||
"assets/shaders/ink_sparkle.frag": "ecc85a2e95f5e9f53123dcaf8cb9b6ce",
|
||||
"assets/AssetManifest.bin": "1fe78d99099ee4407478e70a08513c6f",
|
||||
"assets/fonts/MaterialIcons-Regular.otf": "debef29a5f1e1194e350b62af18b4a77",
|
||||
"canvaskit/skwasm.js": "ea559890a088fe28b4ddf70e17e60052",
|
||||
"canvaskit/skwasm.js.symbols": "e72c79950c8a8483d826a7f0560573a1",
|
||||
"canvaskit/canvaskit.js.symbols": "bdcd3835edf8586b6d6edfce8749fb77",
|
||||
"canvaskit/skwasm.wasm": "39dd80367a4e71582d234948adc521c0",
|
||||
"canvaskit/chromium/canvaskit.js.symbols": "b61b5f4673c9698029fa0a746a9ad581",
|
||||
"canvaskit/chromium/canvaskit.js": "8191e843020c832c9cf8852a4b909d4c",
|
||||
"canvaskit/chromium/canvaskit.wasm": "f504de372e31c8031018a9ec0a9ef5f0",
|
||||
"canvaskit/canvaskit.js": "728b2d477d9b8c14593d4f9b82b484f3",
|
||||
"canvaskit/canvaskit.wasm": "7a3f4ae7d65fc1de6a6e7ddd3224bc93"};
|
||||
// The application shell files that are downloaded before a service worker can
|
||||
// start.
|
||||
const CORE = ["main.dart.js",
|
||||
"index.html",
|
||||
"flutter_bootstrap.js",
|
||||
"assets/AssetManifest.bin.json",
|
||||
"assets/FontManifest.json"];
|
||||
|
||||
// During install, the TEMP cache is populated with the application shell files.
|
||||
self.addEventListener("install", (event) => {
|
||||
self.skipWaiting();
|
||||
return event.waitUntil(
|
||||
caches.open(TEMP).then((cache) => {
|
||||
return cache.addAll(
|
||||
CORE.map((value) => new Request(value, {'cache': 'reload'})));
|
||||
})
|
||||
);
|
||||
});
|
||||
// During activate, the cache is populated with the temp files downloaded in
|
||||
// install. If this service worker is upgrading from one with a saved
|
||||
// MANIFEST, then use this to retain unchanged resource files.
|
||||
self.addEventListener("activate", function(event) {
|
||||
return event.waitUntil(async function() {
|
||||
try {
|
||||
var contentCache = await caches.open(CACHE_NAME);
|
||||
var tempCache = await caches.open(TEMP);
|
||||
var manifestCache = await caches.open(MANIFEST);
|
||||
var manifest = await manifestCache.match('manifest');
|
||||
// When there is no prior manifest, clear the entire cache.
|
||||
if (!manifest) {
|
||||
await caches.delete(CACHE_NAME);
|
||||
contentCache = await caches.open(CACHE_NAME);
|
||||
for (var request of await tempCache.keys()) {
|
||||
var response = await tempCache.match(request);
|
||||
await contentCache.put(request, response);
|
||||
}
|
||||
await caches.delete(TEMP);
|
||||
// Save the manifest to make future upgrades efficient.
|
||||
await manifestCache.put('manifest', new Response(JSON.stringify(RESOURCES)));
|
||||
// Claim client to enable caching on first launch
|
||||
self.clients.claim();
|
||||
return;
|
||||
}
|
||||
var oldManifest = await manifest.json();
|
||||
var origin = self.location.origin;
|
||||
for (var request of await contentCache.keys()) {
|
||||
var key = request.url.substring(origin.length + 1);
|
||||
if (key == "") {
|
||||
key = "/";
|
||||
}
|
||||
// If a resource from the old manifest is not in the new cache, or if
|
||||
// the MD5 sum has changed, delete it. Otherwise the resource is left
|
||||
// in the cache and can be reused by the new service worker.
|
||||
if (!RESOURCES[key] || RESOURCES[key] != oldManifest[key]) {
|
||||
await contentCache.delete(request);
|
||||
}
|
||||
}
|
||||
// Populate the cache with the app shell TEMP files, potentially overwriting
|
||||
// cache files preserved above.
|
||||
for (var request of await tempCache.keys()) {
|
||||
var response = await tempCache.match(request);
|
||||
await contentCache.put(request, response);
|
||||
}
|
||||
await caches.delete(TEMP);
|
||||
// Save the manifest to make future upgrades efficient.
|
||||
await manifestCache.put('manifest', new Response(JSON.stringify(RESOURCES)));
|
||||
// Claim client to enable caching on first launch
|
||||
self.clients.claim();
|
||||
return;
|
||||
} catch (err) {
|
||||
// On an unhandled exception the state of the cache cannot be guaranteed.
|
||||
console.error('Failed to upgrade service worker: ' + err);
|
||||
await caches.delete(CACHE_NAME);
|
||||
await caches.delete(TEMP);
|
||||
await caches.delete(MANIFEST);
|
||||
}
|
||||
}());
|
||||
});
|
||||
// The fetch handler redirects requests for RESOURCE files to the service
|
||||
// worker cache.
|
||||
self.addEventListener("fetch", (event) => {
|
||||
if (event.request.method !== 'GET') {
|
||||
return;
|
||||
}
|
||||
var origin = self.location.origin;
|
||||
var key = event.request.url.substring(origin.length + 1);
|
||||
// Redirect URLs to the index.html
|
||||
if (key.indexOf('?v=') != -1) {
|
||||
key = key.split('?v=')[0];
|
||||
}
|
||||
if (event.request.url == origin || event.request.url.startsWith(origin + '/#') || key == '') {
|
||||
key = '/';
|
||||
}
|
||||
// If the URL is not the RESOURCE list then return to signal that the
|
||||
// browser should take over.
|
||||
if (!RESOURCES[key]) {
|
||||
return;
|
||||
}
|
||||
// If the URL is the index.html, perform an online-first request.
|
||||
if (key == '/') {
|
||||
return onlineFirst(event);
|
||||
}
|
||||
event.respondWith(caches.open(CACHE_NAME)
|
||||
.then((cache) => {
|
||||
return cache.match(event.request).then((response) => {
|
||||
// Either respond with the cached resource, or perform a fetch and
|
||||
// lazily populate the cache only if the resource was successfully fetched.
|
||||
return response || fetch(event.request).then((response) => {
|
||||
if (response && Boolean(response.ok)) {
|
||||
cache.put(event.request, response.clone());
|
||||
}
|
||||
return response;
|
||||
});
|
||||
})
|
||||
})
|
||||
);
|
||||
});
|
||||
self.addEventListener('message', (event) => {
|
||||
// SkipWaiting can be used to immediately activate a waiting service worker.
|
||||
// This will also require a page refresh triggered by the main worker.
|
||||
if (event.data === 'skipWaiting') {
|
||||
self.skipWaiting();
|
||||
return;
|
||||
}
|
||||
if (event.data === 'downloadOffline') {
|
||||
downloadOffline();
|
||||
return;
|
||||
}
|
||||
});
|
||||
// Download offline will check the RESOURCES for all files not in the cache
|
||||
// and populate them.
|
||||
async function downloadOffline() {
|
||||
var resources = [];
|
||||
var contentCache = await caches.open(CACHE_NAME);
|
||||
var currentContent = {};
|
||||
for (var request of await contentCache.keys()) {
|
||||
var key = request.url.substring(origin.length + 1);
|
||||
if (key == "") {
|
||||
key = "/";
|
||||
}
|
||||
currentContent[key] = true;
|
||||
}
|
||||
for (var resourceKey of Object.keys(RESOURCES)) {
|
||||
if (!currentContent[resourceKey]) {
|
||||
resources.push(resourceKey);
|
||||
}
|
||||
}
|
||||
return contentCache.addAll(resources);
|
||||
}
|
||||
// Attempt to download the resource online before falling back to
|
||||
// the offline cache.
|
||||
function onlineFirst(event) {
|
||||
return event.respondWith(
|
||||
fetch(event.request).then((response) => {
|
||||
return caches.open(CACHE_NAME).then((cache) => {
|
||||
cache.put(event.request, response.clone());
|
||||
return response;
|
||||
});
|
||||
}).catch((error) => {
|
||||
return caches.open(CACHE_NAME).then((cache) => {
|
||||
return cache.match(event.request).then((response) => {
|
||||
if (response != null) {
|
||||
return response;
|
||||
}
|
||||
throw error;
|
||||
});
|
||||
});
|
||||
})
|
||||
);
|
||||
}
|
||||
0
web/folderPage.java
Normal file
0
web/folderPage.java
Normal file
BIN
web/icons/Icon-192.png
Normal file
BIN
web/icons/Icon-192.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.2 KiB |
BIN
web/icons/Icon-512.png
Normal file
BIN
web/icons/Icon-512.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.1 KiB |
BIN
web/icons/Icon-maskable-192.png
Normal file
BIN
web/icons/Icon-maskable-192.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
BIN
web/icons/Icon-maskable-512.png
Normal file
BIN
web/icons/Icon-maskable-512.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
48
web/index.html
Normal file
48
web/index.html
Normal file
@ -0,0 +1,48 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
If you are serving your web app in a path other than the root, change the
|
||||
href value below to reflect the base path you are serving from.
|
||||
|
||||
The path provided below has to start and end with a slash "/" in order for
|
||||
it to work correctly.
|
||||
|
||||
For more details:
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
|
||||
|
||||
This is a placeholder for base href that will be replaced by the value of
|
||||
the `--base-href` argument provided to `flutter build`.
|
||||
-->
|
||||
<base href="/static/">
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
|
||||
<meta name="description" content="Shelfy">
|
||||
|
||||
<!-- iOS meta tags & icons -->
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||
<meta name="apple-mobile-web-app-title" content="shelfy_app">
|
||||
<link rel="apple-touch-icon" href="icons/Icon-192.png">
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="icon" type="image/png" href="favicon.png"/>
|
||||
|
||||
<title>shelfy_app</title>
|
||||
<link rel="manifest" href="manifest.json">
|
||||
</head>
|
||||
<body>
|
||||
<script src='https://cdn.jsdelivr.net/npm/pdfjs-dist@4.6.82/build/pdf.min.mjs' type='module'></script>
|
||||
<script type='module'>
|
||||
var { pdfjsLib } = globalThis;
|
||||
pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@4.6.82/build/pdf.worker.mjs';
|
||||
|
||||
var pdfRenderOptions = {
|
||||
cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@4.6.82/cmaps/',
|
||||
cMapPacked: true,
|
||||
}
|
||||
</script>
|
||||
<script src="flutter_bootstrap.js" async></script>
|
||||
</body>
|
||||
</html>
|
||||
107015
web/main.dart.js
Normal file
107015
web/main.dart.js
Normal file
File diff suppressed because one or more lines are too long
35
web/manifest.json
Normal file
35
web/manifest.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "shelfy_app",
|
||||
"short_name": "shelfy_app",
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"background_color": "#0175C2",
|
||||
"theme_color": "#0175C2",
|
||||
"description": "Shelfy",
|
||||
"orientation": "portrait-primary",
|
||||
"prefer_related_applications": false,
|
||||
"icons": [
|
||||
{
|
||||
"src": "icons/Icon-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "icons/Icon-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "icons/Icon-maskable-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "icons/Icon-maskable-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
}
|
||||
]
|
||||
}
|
||||
1
web/version.json
Normal file
1
web/version.json
Normal file
@ -0,0 +1 @@
|
||||
{"app_name":"shelfy_app","version":"1.0.0","build_number":"1","package_name":"shelfy_app"}
|
||||
Loading…
Reference in New Issue
Block a user