commit a68db2976d10eb83eecaa8d0da21c174a84d67d8 Author: goder-zhang Date: Thu Feb 12 08:50:11 2026 +0000 compelete coding diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..ca6143d Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..46cbce9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +imaptool.exe \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9c7d841 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM centos:8 + +WORKDIR /app + +ENV IS_TEST=true + +ADD . /app + +ENTRYPOINT ["/app/output/bin/aicss_service"] +CMD ["server"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/aicss_k8s/config/mysql.json b/aicss_k8s/config/mysql.json new file mode 100644 index 0000000..2d93e39 --- /dev/null +++ b/aicss_k8s/config/mysql.json @@ -0,0 +1,7 @@ +{ + "Server":"goder2.cpccmm68qb1d.ap-southeast-1.rds.amazonaws.com", + "Port":"3306", + "Database":"aicss_db", + "Username":"admin", + "Password":"vH2GkUxz2398GmDTy" +} \ No newline at end of file diff --git a/aicss_k8s/docker_build.sh b/aicss_k8s/docker_build.sh new file mode 100644 index 0000000..30cf5a1 --- /dev/null +++ b/aicss_k8s/docker_build.sh @@ -0,0 +1,21 @@ +#!/bin/bash +RUN_NAME=aicss_service +DOCKER_TAG=test +set -e + +go mod tidy + +# 优化编译标志 +BUILD_FLAGS=( + "-trimpath" # 移除文件系统路径,减少二进制大小 + "-ldflags=-s -w" # 移除符号表和调试信息,减少内存使用 +) + +# 使用优化的编译标志 +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build "${BUILD_FLAGS[@]}" -o output/bin/${RUN_NAME} gofly.go + +echo 'build go success' + +docker build -t 322814420330.dkr.ecr.ap-southeast-1.amazonaws.com/xpink/${RUN_NAME}:${DOCKER_TAG} -f Dockerfile . + +docker push 322814420330.dkr.ecr.ap-southeast-1.amazonaws.com/xpink/${RUN_NAME}:${DOCKER_TAG} diff --git a/aicss_k8s/k8s/k8s/deployment.yaml b/aicss_k8s/k8s/k8s/deployment.yaml new file mode 100644 index 0000000..ea97c3c --- /dev/null +++ b/aicss_k8s/k8s/k8s/deployment.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: aicss-s + namespace: xpink + labels: + app: aicss-s +spec: + replicas: 1 + selector: + matchLabels: + app: aicss-s + template: + metadata: + labels: + app: aicss-s + spec: + containers: + - name: aicss-s + image: 322814420330.dkr.ecr.ap-southeast-1.amazonaws.com/xpink/aicss_service:test + imagePullPolicy: Always + lifecycle: + preStop: + exec: + command: + - /bin/sh + - -c + - sleep 15 + resources: + limits: + cpu: 1000m + memory: 512Mi + requests: + cpu: 10m + memory: 10Mi + env: + - name: IS_TEST + value: "true" + imagePullSecrets: + - name: coding diff --git a/aicss_k8s/k8s/k8s/ingress.yaml b/aicss_k8s/k8s/k8s/ingress.yaml new file mode 100644 index 0000000..e143299 --- /dev/null +++ b/aicss_k8s/k8s/k8s/ingress.yaml @@ -0,0 +1,42 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: 2048-ingress + namespace: xpink + annotations: + #alb.ingress.kubernetes.io/subnets: vpc-0b996d24feae0e2d5 + alb.ingress.kubernetes.io/scheme: internet-facing +spec: + ingressClassName: alb + rules: + - host: bressx-test.la + http: + paths: + - path: /api + pathType: ImplementationSpecific + backend: + service: + name: hertz-s + port: + number: 8889 + - path: /admin + pathType: ImplementationSpecific + backend: + service: + name: hertz-s + port: + number: 8887 + - path: /callback + pathType: ImplementationSpecific + backend: + service: + name: hertz-s + port: + number: 8888 + - path: /ws + pathType: ImplementationSpecific + backend: + service: + name: hertz-s + port: + number: 8891 diff --git a/aicss_k8s/k8s/k8s/svc.yaml b/aicss_k8s/k8s/k8s/svc.yaml new file mode 100644 index 0000000..55f816f --- /dev/null +++ b/aicss_k8s/k8s/k8s/svc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: aicss-svc + namespace: xpink # 如果不是 default,请改成你的 namespace +spec: + type: ClusterIP + selector: + app: aicss-s + ports: + - name: http + port: 80 # 对外提供的端口 + targetPort: 8081 # 容器内部监听的端口 + protocol: TCP diff --git a/cmd/install.go b/cmd/install.go new file mode 100644 index 0000000..a88e4da --- /dev/null +++ b/cmd/install.go @@ -0,0 +1,72 @@ +package cmd + +import ( + "ai-css/models" + "ai-css/tools" + "log" + "os" + "strings" + + "github.com/spf13/cobra" +) + +var installCmd = &cobra.Command{ + Use: "install", + Short: "Initialize database and import data", // More precise description + Run: func(cmd *cobra.Command, args []string) { + install() + }, +} + +func install() { + // Check if already installed + if ok, _ := tools.IsFileNotExist("./install.lock"); !ok { + log.Println("Please remove ./install.lock file to reinstall") + os.Exit(1) + } + + // Verify required files exist + sqlFile := "import.sql" + dataExists, _ := tools.IsFileExist(sqlFile) + if !dataExists { + log.Println("Configuration file config/mysql.json or database import file import.sql not found") + os.Exit(1) + } + + // Execute SQL statements + sqls, err := os.ReadFile(sqlFile) + if err != nil { + log.Printf("Failed to read SQL file %s: %v\n", sqlFile, err) + os.Exit(1) + } + sqlArr := strings.Split(string(sqls), ";") + for _, sql := range sqlArr { + sql = strings.TrimSpace(sql) + if sql == "" { + continue + } + err := models.Execute(sql) + if err != nil { + log.Printf("SQL execution failed: %s\nError: %v\n", sql, err) + log.Println("Database initialization failed - please check SQL statements") + os.Exit(1) + } + log.Printf("Executed successfully: %s\n", sql) + } + + // Create installation lock file + installFile, err := os.OpenFile("./install.lock", os.O_RDWR|os.O_CREATE, os.ModePerm) + if err != nil { + log.Printf("Failed to create lock file: %v\n", err) + os.Exit(1) + } + defer installFile.Close() + + _, err = installFile.WriteString("gofly live chat installation complete") + if err != nil { + log.Printf("Failed to write lock file: %v\n", err) + os.Exit(1) + } + + log.Println("Database initialization completed successfully") +} diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000..45f8e40 --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,40 @@ +package cmd + +import ( + "ai-css/library/logger" + "errors" + "fmt" + "os" + + "github.com/spf13/cobra" +) + +var rootCmd = &cobra.Command{ + Use: "go-fly", + Short: "go-fly", + Long: `简洁快速的GO语言WEB在线客服 https://gofly.sopans.com`, + Args: args, + Run: func(cmd *cobra.Command, args []string) { + + }, +} + +func args(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + + return errors.New("至少需要一个参数!") + } + return nil +} +func Execute() { + logger.InitDefault() + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} +func init() { + rootCmd.AddCommand(serverCmd) + rootCmd.AddCommand(installCmd) + rootCmd.AddCommand(stopCmd) +} diff --git a/cmd/server.go b/cmd/server.go new file mode 100644 index 0000000..915e88a --- /dev/null +++ b/cmd/server.go @@ -0,0 +1,96 @@ +package cmd + +import ( + "ai-css/middleware" + "ai-css/middleware/xpink_auth" + "ai-css/router" + "ai-css/tools" + "ai-css/ws" + "fmt" + "log" + "net/http" + "os" + + "github.com/gin-gonic/gin" + "github.com/spf13/cobra" + "github.com/zh-five/xdaemon" +) + +var ( + port string + daemon bool +) +var serverCmd = &cobra.Command{ + Use: "server", + Short: "启动http服务", + Example: "gofly server -p 8082", + Run: func(cmd *cobra.Command, args []string) { + run() + }, +} + +func init() { + serverCmd.PersistentFlags().StringVarP(&port, "port", "p", "8081", "监听端口号") + serverCmd.PersistentFlags().BoolVarP(&daemon, "daemon", "d", false, "是否为守护进程模式") +} +func run() { + if daemon == true { + logFilePath := "" + if dir, err := os.Getwd(); err == nil { + logFilePath = dir + "/logs/" + } + _, err := os.Stat(logFilePath) + if os.IsNotExist(err) { + if err := os.MkdirAll(logFilePath, 0777); err != nil { + log.Println(err.Error()) + } + } + d := xdaemon.NewDaemon(logFilePath + "go-fly.log") + d.MaxCount = 10 + d.Run() + } + + baseServer := "0.0.0.0:" + port + log.Println("start server...\r\ngo:http://" + baseServer) + tools.Logger().Println("start server...\r\ngo:http://" + baseServer) + + engine := gin.Default() + engine.LoadHTMLGlob("static/templates/*") + engine.Static("/assets", "./static") + engine.Static("/static", "./static") + engine.Use(tools.Session("gofly")) + engine.Use(middleware.CrossSite) + //性能监控 + //pprof.Register(engine) + + //记录日志 + engine.Use(middleware.NewMidLogger()) + engine.Use(xpink_auth.MiddlewareSetIdentity) + router.InitViewRouter(engine) + router.InitApiRouter(engine) + //记录pid + os.WriteFile("gofly.sock", []byte(fmt.Sprintf("%d,%d", os.Getppid(), os.Getpid())), 0666) + //限流类 + tools.NewLimitQueue() + //清理 + ws.CleanVisitorExpire() + //后端websocket + go ws.WsServerBackend() + go healthCheck() + + engine.Run(baseServer) +} + +func healthCheck() { + go func() { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.Write([]byte("ok")) + }) + + if err := http.ListenAndServe(":3000", mux); err != nil { + log.Fatalf("health server failed: %v", err) + } + }() +} diff --git a/cmd/stop.go b/cmd/stop.go new file mode 100644 index 0000000..143a7df --- /dev/null +++ b/cmd/stop.go @@ -0,0 +1,30 @@ +package cmd + +import ( + "github.com/spf13/cobra" + "io/ioutil" + "os/exec" + "runtime" + "strings" +) + +var stopCmd = &cobra.Command{ + Use: "stop", + Short: "停止http服务", + Run: func(cmd *cobra.Command, args []string) { + pids, err := ioutil.ReadFile("gofly.sock") + if err != nil { + return + } + pidSlice := strings.Split(string(pids), ",") + var command *exec.Cmd + for _, pid := range pidSlice { + if runtime.GOOS == "windows" { + command = exec.Command("taskkill.exe", "/f", "/pid", pid) + } else { + command = exec.Command("kill", pid) + } + command.Start() + } + }, +} diff --git a/common/common.go b/common/common.go new file mode 100644 index 0000000..0b79b39 --- /dev/null +++ b/common/common.go @@ -0,0 +1,12 @@ +package common + +var ( + PageSize uint = 10 + VisitorPageSize uint = 8 + Version string = "0.3.9" + VisitorExpire float64 = 600 + Upload string = "static/upload/" + Dir string = "config/" + MysqlConf string = Dir + "mysql.json" + IsCompireTemplate bool = false //是否编译静态模板到二进制 +) diff --git a/common/config.go b/common/config.go new file mode 100644 index 0000000..28ddf8a --- /dev/null +++ b/common/config.go @@ -0,0 +1,29 @@ +package common + +import ( + "ai-css/tools" + "encoding/json" + "io/ioutil" +) + +type Mysql struct { + Server string + Port string + Database string + Username string + Password string +} + +func GetMysqlConf() *Mysql { + var mysql = &Mysql{} + isExist, _ := tools.IsFileExist(MysqlConf) + if !isExist { + return mysql + } + info, err := ioutil.ReadFile(MysqlConf) + if err != nil { + return mysql + } + err = json.Unmarshal(info, mysql) + return mysql +} diff --git a/config.prod/city.free.ipdb b/config.prod/city.free.ipdb new file mode 100644 index 0000000..5efca3a Binary files /dev/null and b/config.prod/city.free.ipdb differ diff --git a/config.prod/config/city.free.ipdb b/config.prod/config/city.free.ipdb new file mode 100644 index 0000000..5efca3a Binary files /dev/null and b/config.prod/config/city.free.ipdb differ diff --git a/config.prod/config/mysql.json b/config.prod/config/mysql.json new file mode 100644 index 0000000..ecf81da --- /dev/null +++ b/config.prod/config/mysql.json @@ -0,0 +1,7 @@ +{ + "Server":"127.0.0.1", + "Port":"3306", + "Database":"aicss_db", + "Username":"root", + "Password":"12356" +} \ No newline at end of file diff --git a/config.prod/mysql.json b/config.prod/mysql.json new file mode 100644 index 0000000..2d93e39 --- /dev/null +++ b/config.prod/mysql.json @@ -0,0 +1,7 @@ +{ + "Server":"goder2.cpccmm68qb1d.ap-southeast-1.rds.amazonaws.com", + "Port":"3306", + "Database":"aicss_db", + "Username":"admin", + "Password":"vH2GkUxz2398GmDTy" +} \ No newline at end of file diff --git a/config/city.free.ipdb b/config/city.free.ipdb new file mode 100644 index 0000000..5efca3a Binary files /dev/null and b/config/city.free.ipdb differ diff --git a/config/mysql.json b/config/mysql.json new file mode 100644 index 0000000..2d93e39 --- /dev/null +++ b/config/mysql.json @@ -0,0 +1,7 @@ +{ + "Server":"goder2.cpccmm68qb1d.ap-southeast-1.rds.amazonaws.com", + "Port":"3306", + "Database":"aicss_db", + "Username":"admin", + "Password":"vH2GkUxz2398GmDTy" +} \ No newline at end of file diff --git a/controller/about.go b/controller/about.go new file mode 100644 index 0000000..fdfdd51 --- /dev/null +++ b/controller/about.go @@ -0,0 +1,52 @@ +package controller + +import ( + "ai-css/models" + "github.com/gin-gonic/gin" +) + +func GetAbout(c *gin.Context) { + page := c.Query("page") + if page == "" { + page = "index" + } + about := models.FindAboutByPage(page) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": about, + }) +} +func GetAbouts(c *gin.Context) { + about := models.FindAbouts() + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": about, + }) +} +func PostAbout(c *gin.Context) { + title_cn := c.PostForm("title_cn") + title_en := c.PostForm("title_en") + keywords_cn := c.PostForm("keywords_cn") + keywords_en := c.PostForm("keywords_en") + desc_cn := c.PostForm("desc_cn") + desc_en := c.PostForm("desc_en") + css_js := c.PostForm("css_js") + html_cn := c.PostForm("html_cn") + html_en := c.PostForm("html_en") + if title_cn == "" || title_en == "" || html_cn == "" || html_en == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "error", + }) + return + } + models.UpdateAbout("index", title_cn, title_en, keywords_cn, keywords_en, desc_cn, desc_en, css_js, html_cn, html_en) + + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": "", + }) +} diff --git a/controller/captcha.go b/controller/captcha.go new file mode 100644 index 0000000..ebd0d63 --- /dev/null +++ b/controller/captcha.go @@ -0,0 +1,44 @@ +package controller + +import ( + "bytes" + "github.com/dchest/captcha" + "github.com/gin-contrib/sessions" + "github.com/gin-gonic/gin" + "net/http" + "time" +) + +func GetCaptcha(c *gin.Context) { + l := captcha.DefaultLen + w, h := 107, 36 + captchaId := captcha.NewLen(l) + session := sessions.Default(c) + session.Set("captcha", captchaId) + _ = session.Save() + _ = Serve(c.Writer, c.Request, captchaId, ".png", "zh", false, w, h) +} + +func Serve(w http.ResponseWriter, r *http.Request, id, ext, lang string, download bool, width, height int) error { + w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") + w.Header().Set("Pragma", "no-cache") + w.Header().Set("Expires", "0") + + var content bytes.Buffer + switch ext { + case ".png": + w.Header().Set("Content-Type", "image/png") + _ = captcha.WriteImage(&content, id, width, height) + case ".wav": + w.Header().Set("Content-Type", "audio/x-wav") + _ = captcha.WriteAudio(&content, id, lang) + default: + return captcha.ErrNotFound + } + + if download { + w.Header().Set("Content-Type", "application/octet-stream") + } + http.ServeContent(w, r, id+ext, time.Time{}, bytes.NewReader(content.Bytes())) + return nil +} diff --git a/controller/chart.go b/controller/chart.go new file mode 100644 index 0000000..3d441b7 --- /dev/null +++ b/controller/chart.go @@ -0,0 +1,36 @@ +package controller + +import ( + "ai-css/models" + "ai-css/tools" + "github.com/gin-gonic/gin" + "time" +) + +func GetChartStatistic(c *gin.Context) { + kefuName, _ := c.Get("kefu_name") + + dayNumMap := make(map[string]string) + result := models.CountVisitorsEveryDay(kefuName.(string)) + for _, item := range result { + dayNumMap[item.Day] = tools.Int2Str(item.Num) + } + + nowTime := time.Now() + list := make([]map[string]string, 0) + for i := 0; i > -46; i-- { + getTime := nowTime.AddDate(0, 0, i) //年,月,日 获取一天前的时间 + resTime := getTime.Format("06-01-02") //获取的时间的格式 + tmp := make(map[string]string) + tmp["day"] = resTime + tmp["num"] = dayNumMap[resTime] + list = append(list, tmp) + } + + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": list, + }) + +} diff --git a/controller/index.go b/controller/index.go new file mode 100644 index 0000000..5a64760 --- /dev/null +++ b/controller/index.go @@ -0,0 +1,14 @@ +package controller + +import ( + "ai-css/models" + "github.com/gin-gonic/gin" +) + +func Index(c *gin.Context) { + jump := models.FindConfig("JumpLang") + if jump != "cn" { + jump = "en" + } + c.Redirect(302, "/index_"+jump) +} diff --git a/controller/ip.go b/controller/ip.go new file mode 100644 index 0000000..92c7ac4 --- /dev/null +++ b/controller/ip.go @@ -0,0 +1,66 @@ +package controller + +import ( + "ai-css/common" + "ai-css/models" + "github.com/gin-gonic/gin" + "strconv" +) + +func PostIpblack(c *gin.Context) { + ip := c.PostForm("ip") + if ip == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "请输入IP!", + }) + return + } + kefuId, _ := c.Get("kefu_name") + models.CreateIpblack(ip, kefuId.(string)) + c.JSON(200, gin.H{ + "code": 200, + "msg": "添加黑名单成功!", + }) +} +func DelIpblack(c *gin.Context) { + ip := c.Query("ip") + if ip == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "请输入IP!", + }) + return + } + models.DeleteIpblackByIp(ip) + c.JSON(200, gin.H{ + "code": 200, + "msg": "删除黑名单成功!", + }) +} +func GetIpblacks(c *gin.Context) { + page, _ := strconv.Atoi(c.Query("page")) + if page == 0 { + page = 1 + } + count := models.CountIps(nil, nil) + list := models.FindIps(nil, nil, uint(page), common.VisitorPageSize) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": gin.H{ + "list": list, + "count": count, + "pagesize": common.PageSize, + }, + }) +} +func GetIpblacksByKefuId(c *gin.Context) { + kefuId, _ := c.Get("kefu_name") + list := models.FindIpsByKefuId(kefuId.(string)) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": list, + }) +} diff --git a/controller/kefu.go b/controller/kefu.go new file mode 100644 index 0000000..1e92c08 --- /dev/null +++ b/controller/kefu.go @@ -0,0 +1,265 @@ +package controller + +import ( + "ai-css/models" + "ai-css/tools" + "ai-css/ws" + "net/http" + + "github.com/gin-gonic/gin" +) + +func PostKefuAvator(c *gin.Context) { + + avator := c.PostForm("avator") + if avator == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "不能为空", + "result": "", + }) + return + } + kefuName, _ := c.Get("kefu_name") + models.UpdateUserAvator(kefuName.(string), avator) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": "", + }) +} +func PostKefuPass(c *gin.Context) { + kefuName, _ := c.Get("kefu_name") + newPass := c.PostForm("new_pass") + confirmNewPass := c.PostForm("confirm_new_pass") + old_pass := c.PostForm("old_pass") + if newPass != confirmNewPass { + c.JSON(200, gin.H{ + "code": 400, + "msg": "密码不一致", + "result": "", + }) + return + } + user := models.FindUser(kefuName.(string)) + if user.Password != tools.Md5(old_pass) { + c.JSON(200, gin.H{ + "code": 400, + "msg": "旧密码不正确", + "result": "", + }) + return + } + models.UpdateUserPass(kefuName.(string), tools.Md5(newPass)) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": "", + }) +} +func PostKefuClient(c *gin.Context) { + kefuName, _ := c.Get("kefu_name") + clientId := c.PostForm("client_id") + + if clientId == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "client_id不能为空", + }) + return + } + models.CreateUserClient(kefuName.(string), clientId) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": "", + }) +} + +func GetIdleKefu(c *gin.Context) { + visitorId := c.Query("visitor_id") + var kefuName string + if visitorId != "" { + visitor := models.FindVisitorByVistorId(visitorId) + if visitor.ToId != "" { + kefuName = visitor.ToId + } + } + if kefuName == "" { + user := models.FindIdleUser() + kefuName = user.Name + } + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": kefuName, + }) +} +func GetKefuInfo(c *gin.Context) { + kefuName, _ := c.Get("kefu_name") + user := models.FindUser(kefuName.(string)) + info := make(map[string]interface{}) + info["avator"] = user.Avator + info["username"] = user.Name + info["nickname"] = user.Nickname + info["uid"] = user.ID + info["role"] = user.Role + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": info, + }) +} +func GetKefuInfoAll(c *gin.Context) { + id, _ := c.Get("kefu_id") + userinfo := models.FindUserRole("user.avator,user.name,user.id, role.name role_name", id) + c.JSON(200, gin.H{ + "code": 200, + "msg": "验证成功", + "result": userinfo, + }) +} +func GetOtherKefuList(c *gin.Context) { + idStr, _ := c.Get("kefu_id") + id := idStr.(float64) + result := make([]interface{}, 0) + ws.SendPingToKefuClient() + kefus := models.FindUsers() + for _, kefu := range kefus { + if uint(id) == kefu.ID { + continue + } + + item := make(map[string]interface{}) + item["name"] = kefu.Name + item["nickname"] = kefu.Nickname + item["avator"] = kefu.Avator + item["status"] = "offline" + kefu, ok := ws.KefuList[kefu.Name] + if ok && kefu != nil { + item["status"] = "online" + } + result = append(result, item) + } + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": result, + }) +} +func PostTransKefu(c *gin.Context) { + kefuId := c.Query("kefu_id") + visitorId := c.Query("visitor_id") + curKefuId, _ := c.Get("kefu_name") + user := models.FindUser(kefuId) + visitor := models.FindVisitorByVistorId(visitorId) + if user.Name == "" || visitor.Name == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "访客或客服不存在", + }) + return + } + models.UpdateVisitorKefu(visitorId, kefuId) + ws.UpdateVisitorUser(visitorId, kefuId) + go ws.VisitorOnline(kefuId, visitor) + go ws.VisitorOffline(curKefuId.(string), visitor.VisitorId, visitor.Name) + go ws.VisitorNotice(visitor.VisitorId, "客服转接到"+user.Nickname) + c.JSON(200, gin.H{ + "code": 200, + "msg": "转移成功", + }) +} +func GetKefuInfoSetting(c *gin.Context) { + kefuId := c.Query("kefu_id") + user := models.FindUserById(kefuId) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": user, + }) +} +func PostKefuRegister(c *gin.Context) { + name := c.PostForm("username") + password := c.PostForm("password") + nickname := c.PostForm("nickname") + avatar := "/static/images/4.jpg" + + if name == "" || password == "" { + c.JSON(http.StatusOK, gin.H{ + "code": 400, + "msg": "All fields are required", + "result": nil, + }) + return + } + + existingUser := models.FindUser(name) + if existingUser.Name != "" { + c.JSON(http.StatusOK, gin.H{ + "code": 409, + "msg": "Username already exists", + "result": nil, + }) + return + } + + userID := models.CreateUser(name, tools.Md5(password), avatar, nickname) + if userID == 0 { + c.JSON(http.StatusInternalServerError, gin.H{ + "code": 500, + "msg": "Registration Failed", + "result": nil, + }) + return + } + + c.JSON(http.StatusOK, gin.H{ + "code": 200, + "msg": "Registration successful", + "result": gin.H{ + "user_id": userID, + }, + }) +} +func PostKefuInfo(c *gin.Context) { + name, _ := c.Get("kefu_name") + password := c.PostForm("password") + avator := c.PostForm("avator") + nickname := c.PostForm("nickname") + if password != "" { + password = tools.Md5(password) + } + if name == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "客服账号不能为空", + }) + return + } + models.UpdateUser(name.(string), password, avator, nickname) + + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": "", + }) +} +func GetKefuList(c *gin.Context) { + users := models.FindUsers() + c.JSON(200, gin.H{ + "code": 200, + "msg": "获取成功", + "result": users, + }) +} +func DeleteKefuInfo(c *gin.Context) { + kefuId := c.Query("id") + models.DeleteUserById(kefuId) + models.DeleteRoleByUserId(kefuId) + c.JSON(200, gin.H{ + "code": 200, + "msg": "删除成功", + "result": "", + }) +} diff --git a/controller/login.go b/controller/login.go new file mode 100644 index 0000000..06bf108 --- /dev/null +++ b/controller/login.go @@ -0,0 +1,62 @@ +package controller + +import ( + "ai-css/models" + "ai-css/tools" + "github.com/gin-gonic/gin" + "time" +) + +// @Summary User Authentication API +// @Description Validates user credentials and returns access token +// @Tags Authentication +// @Produce json +// @Accept multipart/form-data +// @Param username formData string true "Registered username" +// @Param password formData string true "Account password" +// @Param type formData string true "Auth type (e.g., 'admin' or 'user')" +// @Success 200 {object} Response +// @Failure 401 {object} Response +// @Failure 500 {object} Response +// @Router /check [post] +func LoginCheckPass(c *gin.Context) { + password := c.PostForm("password") + username := c.PostForm("username") + info := models.FindUser(username) + + // Authentication failed case + if info.Name == "" || info.Password != tools.Md5(password) { + c.JSON(200, gin.H{ + "code": 401, + "message": "Incorrect username or password", // User-friendly message + }) + return + } + + // Prepare user session data + userinfo := map[string]interface{}{ + "kefu_name": info.Name, + "kefu_id": info.ID, + "create_time": time.Now().Unix(), + } + + // Token generation + token, err := tools.MakeToken(userinfo) + if err != nil { + c.JSON(200, gin.H{ + "code": 500, + "message": "Login temporarily unavailable", + }) + return + } + + // Successful response + c.JSON(200, gin.H{ + "code": 200, + "message": "Login successful", + "result": gin.H{ + "token": token, + "created_at": userinfo["create_time"], + }, + }) +} diff --git a/controller/main.go b/controller/main.go new file mode 100644 index 0000000..44196fd --- /dev/null +++ b/controller/main.go @@ -0,0 +1,114 @@ +package controller + +import ( + "ai-css/common" + "ai-css/models" + "ai-css/tools" + "ai-css/ws" + "errors" + "fmt" + "io/ioutil" + "log" + "os" + "strings" + + "github.com/gin-gonic/gin" + "github.com/jinzhu/gorm" +) + +func PostInstall(c *gin.Context) { + notExist, _ := tools.IsFileNotExist("./install.lock") + if !notExist { + c.JSON(200, gin.H{ + "code": 400, + "msg": "系统已经安装过了", + }) + return + } + server := c.PostForm("server") + port := c.PostForm("port") + database := c.PostForm("database") + username := c.PostForm("username") + password := c.PostForm("password") + dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, server, port, database) + _, err := gorm.Open("mysql", dsn) + if err != nil { + log.Println(err) + tools.Logger().Println(err) + c.JSON(200, gin.H{ + "code": 400, + "msg": "数据库连接失败:" + err.Error(), + }) + return + } + isExist, _ := tools.IsFileExist(common.Dir) + if !isExist { + os.Mkdir(common.Dir, os.ModePerm) + } + fileConfig := common.MysqlConf + file, _ := os.OpenFile(fileConfig, os.O_RDWR|os.O_CREATE, os.ModePerm) + + format := `{ + "Server":"%s", + "Port":"%s", + "Database":"%s", + "Username":"%s", + "Password":"%s" +} +` + data := fmt.Sprintf(format, server, port, database, username, password) + file.WriteString(data) + models.Connect() + installFile, _ := os.OpenFile("./install.lock", os.O_RDWR|os.O_CREATE, os.ModePerm) + installFile.WriteString("gofly live chat") + ok, err := install() + if !ok { + c.JSON(200, gin.H{ + "code": 200, + "msg": err.Error(), + }) + return + } + c.JSON(200, gin.H{ + "code": 200, + "msg": "安装成功", + }) +} +func install() (bool, error) { + sqlFile := common.Dir + "go-fly.sql" + isExit, _ := tools.IsFileExist(common.MysqlConf) + dataExit, _ := tools.IsFileExist(sqlFile) + if !isExit || !dataExit { + return false, errors.New("config/mysql.json 数据库配置文件或者数据库文件go-fly.sql不存在") + } + sqls, _ := ioutil.ReadFile(sqlFile) + sqlArr := strings.Split(string(sqls), "|") + for _, sql := range sqlArr { + if sql == "" { + continue + } + err := models.Execute(sql) + if err == nil { + log.Println(sql, "\t success!") + } else { + log.Println(sql, err, "\t failed!") + } + } + return true, nil +} + +func GetStatistics(c *gin.Context) { + visitors := models.CountVisitors() + message := models.CountMessage(nil, nil) + session := len(ws.ClientList) + kefuNum := 0 + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": gin.H{ + "visitors": visitors, + "message": message, + "session": session + kefuNum, + }, + }) +} diff --git a/controller/message.go b/controller/message.go new file mode 100644 index 0000000..476e9dc --- /dev/null +++ b/controller/message.go @@ -0,0 +1,499 @@ +package controller + +import ( + "ai-css/common" + "ai-css/library/logger" + "ai-css/library/modelprovider" + "ai-css/library/modelprovider/bootstrap" + "ai-css/library/modelprovider/consts" + "ai-css/models" + "ai-css/tools" + "ai-css/ws" + "context" + "encoding/json" + "fmt" + "os" + "path" + "strconv" + "strings" + "time" + + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "github.com/openai/openai-go/v3/responses" +) + +var prompt = `You are an AI customer support assistant. + +Your primary goal is to help users resolve their issues accurately, politely, and efficiently. +You represent the official customer service of the product or platform. + +General rules: +- Always be polite, calm, and professional. +- Use clear, concise, and user-friendly language. +- Focus on solving the user’s problem step by step. +- Do NOT fabricate information. If you are unsure or lack relevant knowledge, say so clearly. +- Do NOT guess product policies, prices, or technical behaviors. +- If a question cannot be resolved based on available information, guide the user to human support. + +Knowledge usage: +- Only answer questions based on the provided knowledge, FAQs, or conversation context. +- If the user’s question is outside the supported scope, respond with a brief explanation and suggest contacting a human agent. + +Escalation rules: +- If the user explicitly requests a human agent, immediately stop responding and indicate the transfer. +- If the user expresses frustration, repeated confusion, or dissatisfaction, suggest escalating to a human agent. + +Safety and compliance: +- Do not provide sensitive, confidential, or internal information. +- Do not provide legal, medical, or financial advice. +- Avoid any harmful, abusive, or inappropriate content. + +Response style: +- Keep answers concise but helpful. +- Prefer bullet points or numbered steps when explaining procedures. +- Ask clarifying questions only when necessary to move forward. +` + +func SendMessageV2(c *gin.Context) { + fromId := c.PostForm("from_id") + toId := c.PostForm("to_id") + content := c.PostForm("content") + cType := c.PostForm("type") + if content == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "内容不能为空", + }) + return + } + //限流 + if !tools.LimitFreqSingle("sendmessage:"+c.ClientIP(), 1, 2) { + c.JSON(200, gin.H{ + "code": 400, + "msg": c.ClientIP() + "发送频率过快", + }) + return + } + var kefuInfo models.User + var vistorInfo models.Visitor + if cType == "kefu" { + kefuInfo = models.FindUser(fromId) + vistorInfo = models.FindVisitorByVistorId(toId) + } else if cType == "visitor" { + vistorInfo = models.FindVisitorByVistorId(fromId) + kefuInfo = models.FindUser(toId) + } + + if kefuInfo.ID == 0 || vistorInfo.ID == 0 { + c.JSON(200, gin.H{ + "code": 400, + "msg": "用户不存在", + }) + return + } + + models.CreateMessage(kefuInfo.Name, vistorInfo.VisitorId, content, cType) + //var msg TypeMessage + if cType == "kefu" { + guest, ok := ws.ClientList[vistorInfo.VisitorId] + + if guest != nil && ok { + ws.VisitorMessage(vistorInfo.VisitorId, content, kefuInfo) + } + ws.KefuMessage(vistorInfo.VisitorId, content, kefuInfo) + //msg = TypeMessage{ + // Type: "message", + // Data: ws.ClientMessage{ + // Name: kefuInfo.Nickname, + // Avator: kefuInfo.Avator, + // Id: vistorInfo.VisitorId, + // Time: time.Now().Format("2006-01-02 15:04:05"), + // ToId: vistorInfo.VisitorId, + // Content: content, + // IsKefu: "yes", + // }, + //} + //str2, _ := json.Marshal(msg) + //ws.OneKefuMessage(kefuInfo.Name, str2) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) + } + if cType == "visitor" { + guest, ok := ws.ClientList[vistorInfo.VisitorId] + if ok && guest != nil { + guest.UpdateTime = time.Now() + } + if guest == nil { + c.JSON(400, gin.H{ + "code": 400, + "msg": "guest not found", + }) + return + } + if ws.AIAnswerAvailable(guest) { + // AI回答 + ret, err := AIChat(kefuInfo.Name, vistorInfo.VisitorId, content, guest.Conn) + if err == nil { + guest.AIAnswerCycle++ + models.CreateMessage(kefuInfo.Name, vistorInfo.VisitorId, ret, "kefu") + ws.VisitorMessage(vistorInfo.VisitorId, ret, kefuInfo) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) + return + } + + logger.Errorf("ai chat failed err:%v,visitorID:%s,content:%s", err, vistorInfo.VisitorId, content) + } else if guest.AIAnswerCycle == ws.MaxAIAnswerCycleTimes { + guest.AIAnswerCycle++ + cot := "ai次数用完将进入人工坐席。。。" + models.CreateMessage(kefuInfo.Name, vistorInfo.VisitorId, cot, "kefu") + ws.VisitorMessage(vistorInfo.VisitorId, cot, kefuInfo) + } + + msg := ws.TypeMessage{ + Type: "message", + Data: ws.ClientMessage{ + Avator: vistorInfo.Avator, + Id: vistorInfo.VisitorId, + Name: vistorInfo.Name, + ToId: kefuInfo.Name, + Content: content, + Time: time.Now().Format("2006-01-02 15:04:05"), + IsKefu: "no", + }, + } + str, _ := json.Marshal(msg) + ws.OneKefuMessage(kefuInfo.Name, str) + //ws.KefuMessage(vistorInfo.VisitorId, content, kefuInfo) + kefu, ok := ws.KefuList[kefuInfo.Name] + if !ok || kefu == nil { + go SendNoticeEmail(content+"|"+vistorInfo.Name, content) + } + go ws.VisitorAutoReply(vistorInfo, kefuInfo, content) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) + } + +} + +func SendKefuMessage(c *gin.Context) { + fromId, _ := c.Get("kefu_name") + toId := c.PostForm("to_id") + content := c.PostForm("content") + cType := c.PostForm("type") + if content == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "内容不能为空", + }) + return + } + //限流 + if !tools.LimitFreqSingle("sendmessage:"+c.ClientIP(), 1, 2) { + c.JSON(200, gin.H{ + "code": 400, + "msg": c.ClientIP() + "发送频率过快", + }) + return + } + var kefuInfo models.User + var vistorInfo models.Visitor + kefuInfo = models.FindUser(fromId.(string)) + vistorInfo = models.FindVisitorByVistorId(toId) + + if kefuInfo.ID == 0 || vistorInfo.ID == 0 { + c.JSON(200, gin.H{ + "code": 400, + "msg": "用户不存在", + }) + return + } + + models.CreateMessage(kefuInfo.Name, vistorInfo.VisitorId, content, cType) + //var msg TypeMessage + + guest, ok := ws.ClientList[vistorInfo.VisitorId] + + if guest != nil && ok { + ws.VisitorMessage(vistorInfo.VisitorId, content, kefuInfo) + } + ws.KefuMessage(vistorInfo.VisitorId, content, kefuInfo) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) + +} +func SendVisitorNotice(c *gin.Context) { + notice := c.Query("msg") + if notice == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "msg不能为空", + }) + return + } + msg := ws.TypeMessage{ + Type: "notice", + Data: notice, + } + str, _ := json.Marshal(msg) + for _, visitor := range ws.ClientList { + visitor.Conn.WriteMessage(websocket.TextMessage, str) + } + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) +} +func SendCloseMessageV2(c *gin.Context) { + visitorId := c.Query("visitor_id") + if visitorId == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "visitor_id不能为空", + }) + return + } + + oldUser, ok := ws.ClientList[visitorId] + if oldUser != nil || ok { + msg := ws.TypeMessage{ + Type: "force_close", + Data: visitorId, + } + str, _ := json.Marshal(msg) + err := oldUser.Conn.WriteMessage(websocket.TextMessage, str) + oldUser.Conn.Close() + delete(ws.ClientList, visitorId) + tools.Logger().Println("close_message", oldUser, err) + } + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) +} +func UploadImg(c *gin.Context) { + f, err := c.FormFile("imgfile") + if err != nil { + c.JSON(200, gin.H{ + "code": 400, + "msg": "上传失败!", + }) + return + } else { + + fileExt := strings.ToLower(path.Ext(f.Filename)) + if fileExt != ".png" && fileExt != ".jpg" && fileExt != ".gif" && fileExt != ".jpeg" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "上传失败!只允许png,jpg,gif,jpeg文件", + }) + return + } + isMainUploadExist, _ := tools.IsFileExist(common.Upload) + if !isMainUploadExist { + os.Mkdir(common.Upload, os.ModePerm) + } + fileName := tools.Md5(fmt.Sprintf("%s%s", f.Filename, time.Now().String())) + fildDir := fmt.Sprintf("%s%d%s/", common.Upload, time.Now().Year(), time.Now().Month().String()) + isExist, _ := tools.IsFileExist(fildDir) + if !isExist { + os.Mkdir(fildDir, os.ModePerm) + } + filepath := fmt.Sprintf("%s%s%s", fildDir, fileName, fileExt) + c.SaveUploadedFile(f, filepath) + c.JSON(200, gin.H{ + "code": 200, + "msg": "上传成功!", + "result": gin.H{ + "path": filepath, + }, + }) + } +} +func UploadFile(c *gin.Context) { + f, err := c.FormFile("realfile") + if err != nil { + c.JSON(200, gin.H{ + "code": 400, + "msg": "上传失败!", + }) + return + } else { + + fileExt := strings.ToLower(path.Ext(f.Filename)) + if f.Size >= 90*1024*1024 { + c.JSON(200, gin.H{ + "code": 400, + "msg": "上传失败!不允许超过90M", + }) + return + } + + fileName := tools.Md5(fmt.Sprintf("%s%s", f.Filename, time.Now().String())) + fildDir := fmt.Sprintf("%s%d%s/", common.Upload, time.Now().Year(), time.Now().Month().String()) + isExist, _ := tools.IsFileExist(fildDir) + if !isExist { + os.Mkdir(fildDir, os.ModePerm) + } + filepath := fmt.Sprintf("%s%s%s", fildDir, fileName, fileExt) + c.SaveUploadedFile(f, filepath) + c.JSON(200, gin.H{ + "code": 200, + "msg": "上传成功!", + "result": gin.H{ + "path": filepath, + "ext": fileExt, + "size": f.Size, + "name": f.Filename, + }, + }) + } +} +func GetMessagesV2(c *gin.Context) { + visitorId := c.Query("visitor_id") + messages := models.FindMessageByVisitorId(visitorId) + //result := make([]map[string]interface{}, 0) + chatMessages := make([]ChatMessage, 0) + var visitor models.Visitor + var kefu models.User + for _, message := range messages { + //item := make(map[string]interface{}) + if visitor.Name == "" || kefu.Name == "" { + kefu = models.FindUser(message.KefuId) + visitor = models.FindVisitorByVistorId(message.VisitorId) + } + var chatMessage ChatMessage + chatMessage.Time = message.CreatedAt.Format("2006-01-02 15:04:05") + chatMessage.Content = message.Content + chatMessage.MesType = message.MesType + if message.MesType == "kefu" { + chatMessage.Name = kefu.Nickname + chatMessage.Avator = kefu.Avator + } else { + chatMessage.Name = visitor.Name + chatMessage.Avator = visitor.Avator + } + chatMessages = append(chatMessages, chatMessage) + } + models.ReadMessageByVisitorId(visitorId) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": chatMessages, + }) +} +func GetMessagespages(c *gin.Context) { + visitorId := c.Query("visitor_id") + page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) + pageSize, _ := strconv.Atoi(c.DefaultQuery("pagesize", "10")) + if pageSize > 20 { + pageSize = 20 + } + count := models.CountMessage("visitor_id = ?", visitorId) + list := models.FindMessageByPage(uint(page), uint(pageSize), "message.visitor_id = ?", visitorId) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": gin.H{ + "count": count, + "page": page, + "list": list, + "pagesize": pageSize, + }, + }) +} + +func AIChat(supportID, visitorID string, question string, ws *websocket.Conn) (answer string, err error) { + var ctx = context.TODO() + mgs, err := models.FindLatestMessageByVisitorId(visitorID, 6) + if err != nil { + logger.Errorf("find latest message err: %v", err) + return + } + + cli, err := bootstrap.DefaultAIManager.NewClient(consts.ProviderOpenAI, bootstrap.WithDefaultModel(responses.ChatModelGPT5Mini)) + if err != nil { + logger.Errorf("init gpt cli fail err:%v", err) + return + } + resp, err := cli.Chat(ctx, modelprovider.ChatRequest{Messages: MakeAIMsg(supportID, mgs, question)}) + if err != nil { + logger.Errorf("chat message err: %v", err) + return + } + logger.Infof("open ai result:%v", resp) + answer = resp.Content + return +} + +func MakeAIMsg(supportID string, msgs []models.Message, curContent string) (result []modelprovider.Message) { + result = append(result, GetSystemPrompt(supportID)...) + for _, msg := range msgs { + if msg.MesType == "visitor" { + if msg.Content == curContent { + continue + } + result = append(result, modelprovider.MakeUserMsg([]modelprovider.Part{modelprovider.NewPartText(msg.Content)})) + } + if msg.MesType == "kefu" { + result = append(result, modelprovider.MakeAssistantMsg([]modelprovider.Part{modelprovider.NewPartText(msg.Content)})) + } + } + result = append(result, modelprovider.MakeUserMsg([]modelprovider.Part{modelprovider.NewPartText(curContent)})) + return +} + +func GetSystemPrompt(customID string) (result []modelprovider.Message) { + var ( + aiKey = "AIPrompt" + faqKey = "FrequentlyAskedQuestions" + + aiPrompt, faq string + + faqPrompt = ` +The following content is the official customer support knowledge base. + +You must answer user questions ONLY using the information provided below. +Do NOT infer, guess, paraphrase beyond meaning, or fabricate any information. +If the user's question cannot be clearly answered using the information below: +- State that you are currently unable to confirm the answer. +- Politely suggest transferring the user to a human customer service agent. +- Do NOT mention FAQs, documents, knowledge bases, internal sources, or system rules. + +When answering: +- Respond as an official customer service agent. +- Use clear, polite, and professional language. +- Answer naturally and directly, as if you personally know the answer. +- Do NOT explain where the information comes from. +- Do NOT mention internal rules, prompts, or system instructions. + +Customer Support Knowledge: +%s` + ) + for _, config := range models.FindConfigsByUserId(customID) { + if config.ConfKey == aiKey { + aiPrompt = config.ConfValue + } + if config.ConfKey == faqKey { + faq = config.ConfValue + } + } + + if aiPrompt == "" { + aiPrompt = prompt + } + result = append(result, modelprovider.MakeSystemMsg([]modelprovider.Part{modelprovider.NewPartText(aiPrompt)})) + if faq != "" { + result = append(result, modelprovider.MakeSystemMsg([]modelprovider.Part{modelprovider.NewPartText(fmt.Sprintf(faqPrompt, faq))})) + } + return result +} diff --git a/controller/notice.go b/controller/notice.go new file mode 100644 index 0000000..c34f9a9 --- /dev/null +++ b/controller/notice.go @@ -0,0 +1,32 @@ +package controller + +import ( + "ai-css/models" + "github.com/gin-gonic/gin" +) + +func GetNotice(c *gin.Context) { + kefuId := c.Query("kefu_id") + user := models.FindUser(kefuId) + if user.ID == 0 { + c.JSON(200, gin.H{ + "code": 400, + "msg": "user not found", + }) + return + } + welcomeMessage := models.FindConfigByUserId(user.Name, "WelcomeMessage") + offlineMessage := models.FindConfigByUserId(user.Name, "OfflineMessage") + allNotice := models.FindConfigByUserId(user.Name, "AllNotice") + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": gin.H{ + "welcome": welcomeMessage.ConfValue, + "offline": offlineMessage.ConfValue, + "avatar": user.Avator, + "nickname": user.Nickname, + "allNotice": allNotice.ConfValue, + }, + }) +} diff --git a/controller/reply.go b/controller/reply.go new file mode 100644 index 0000000..defe392 --- /dev/null +++ b/controller/reply.go @@ -0,0 +1,123 @@ +package controller + +import ( + "ai-css/models" + "github.com/gin-gonic/gin" + "log" +) + +type ReplyForm struct { + GroupName string `form:"group_name" binding:"required"` +} +type ReplyContentForm struct { + GroupId string `form:"group_id" binding:"required"` + Content string `form:"content" binding:"required"` + ItemName string `form:"item_name" binding:"required"` +} + +func GetReplys(c *gin.Context) { + kefuId, _ := c.Get("kefu_name") + log.Println(kefuId) + res := models.FindReplyByUserId(kefuId) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": res, + }) +} +func GetAutoReplys(c *gin.Context) { + kefu_id := c.Query("kefu_id") + res := models.FindReplyTitleByUserId(kefu_id) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": res, + }) +} +func PostReply(c *gin.Context) { + var replyForm ReplyForm + kefuId, _ := c.Get("kefu_name") + err := c.Bind(&replyForm) + if err != nil { + c.JSON(200, gin.H{ + "code": 400, + "msg": "error:" + err.Error(), + }) + return + } + models.CreateReplyGroup(replyForm.GroupName, kefuId.(string)) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) +} +func PostReplyContent(c *gin.Context) { + var replyContentForm ReplyContentForm + kefuId, _ := c.Get("kefu_name") + err := c.Bind(&replyContentForm) + if err != nil { + c.JSON(400, gin.H{ + "code": 200, + "msg": "error:" + err.Error(), + }) + return + } + models.CreateReplyContent(replyContentForm.GroupId, kefuId.(string), replyContentForm.Content, replyContentForm.ItemName) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) +} +func PostReplyContentSave(c *gin.Context) { + kefuId, _ := c.Get("kefu_name") + replyId := c.PostForm("reply_id") + replyTitle := c.PostForm("reply_title") + replyContent := c.PostForm("reply_content") + if replyId == "" || replyTitle == "" || replyContent == "" { + c.JSON(400, gin.H{ + "code": 200, + "msg": "参数错误!", + }) + return + } + models.UpdateReplyContent(replyId, kefuId.(string), replyTitle, replyContent) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) +} +func DelReplyContent(c *gin.Context) { + kefuId, _ := c.Get("kefu_name") + id := c.Query("id") + models.DeleteReplyContent(id, kefuId.(string)) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) +} +func DelReplyGroup(c *gin.Context) { + kefuId, _ := c.Get("kefu_name") + id := c.Query("id") + models.DeleteReplyGroup(id, kefuId.(string)) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) +} +func PostReplySearch(c *gin.Context) { + kefuId, _ := c.Get("kefu_name") + search := c.PostForm("search") + if search == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "参数错误", + }) + return + } + res := models.FindReplyBySearcch(kefuId, search) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": res, + }) +} diff --git a/controller/response.go b/controller/response.go new file mode 100644 index 0000000..41c985f --- /dev/null +++ b/controller/response.go @@ -0,0 +1,33 @@ +package controller + +var ( + Port string +) + +type Response struct { + Code int `json:"code"` + Msg string `json:"msg"` + result interface{} `json:"result"` +} +type ChatMessage struct { + Time string `json:"time"` + Content string `json:"content"` + MesType string `json:"mes_type"` + Name string `json:"name"` + Avator string `json:"avator"` +} +type VisitorOnline struct { + Uid string `json:"uid"` + Username string `json:"username"` + Avator string `json:"avator"` + LastMessage string `json:"last_message"` +} +type GetuiResponse struct { + Code float64 `json:"code"` + Msg string `json:"msg"` + Data map[string]interface{} `json:"data"` +} +type VisitorExtra struct { + VisitorName string `json:"visitorName"` + VisitorAvatar string `json:"visitorAvatar"` +} diff --git a/controller/role.go b/controller/role.go new file mode 100644 index 0000000..e9a4231 --- /dev/null +++ b/controller/role.go @@ -0,0 +1,33 @@ +package controller + +import ( + "ai-css/models" + "github.com/gin-gonic/gin" +) + +func GetRoleList(c *gin.Context) { + roles := models.FindRoles() + c.JSON(200, gin.H{ + "code": 200, + "msg": "获取成功", + "result": roles, + }) +} +func PostRole(c *gin.Context) { + roleId := c.PostForm("id") + method := c.PostForm("method") + name := c.PostForm("name") + path := c.PostForm("path") + if roleId == "" || method == "" || name == "" || path == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "参数不能为空", + }) + return + } + models.SaveRole(roleId, name, method, path) + c.JSON(200, gin.H{ + "code": 200, + "msg": "修改成功", + }) +} diff --git a/controller/setting.go b/controller/setting.go new file mode 100644 index 0000000..0dbb765 --- /dev/null +++ b/controller/setting.go @@ -0,0 +1,52 @@ +package controller + +import ( + "ai-css/models" + "fmt" + + "github.com/gin-gonic/gin" +) + +func GetConfigs(c *gin.Context) { + kefuName, _ := c.Get("kefu_name") + configs := models.FindConfigsByUserId(kefuName) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": configs, + }) +} +func GetConfig(c *gin.Context) { + key := c.Query("key") + config := models.FindConfig(key) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": config, + }) +} +func PostConfig(c *gin.Context) { + key := c.PostForm("key") + value := c.PostForm("value") + kefuName, _ := c.Get("kefu_name") + userInfo := models.FindUser(fmt.Sprintf("%v", kefuName)) + if key == "" || + (key == "AIPrompt" || key == "FrequentlyAskedQuestions") && userInfo.Role != 1 { + errDesc := "无权限修改" + if key == "" { + errDesc = "参数错误" + } + c.JSON(200, gin.H{ + "code": 400, + "msg": errDesc, + }) + return + } + models.UpdateConfig(kefuName, key, value) + + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": "", + }) +} diff --git a/controller/shout.go b/controller/shout.go new file mode 100644 index 0000000..77c718b --- /dev/null +++ b/controller/shout.go @@ -0,0 +1,155 @@ +package controller + +import ( + "ai-css/models" + "ai-css/tools" + "ai-css/ws" + "encoding/json" + "fmt" + "log" + "strconv" + "time" +) + +func SendServerJiang(title string, content string, domain string) string { + noticeServerJiang, err := strconv.ParseBool(models.FindConfig("NoticeServerJiang")) + serverJiangAPI := models.FindConfig("ServerJiangAPI") + if err != nil || !noticeServerJiang || serverJiangAPI == "" { + log.Println("do not notice serverjiang:", serverJiangAPI, noticeServerJiang) + return "" + } + sendStr := fmt.Sprintf("%s%s", title, content) + desp := title + ":" + content + "[登录](http://" + domain + "/main)" + url := serverJiangAPI + "?text=" + sendStr + "&desp=" + desp + //log.Println(url) + res := tools.Get(url) + return res +} +func SendVisitorLoginNotice(kefuName, visitorName, avator, content, visitorId string) { + if !tools.LimitFreqSingle("sendnotice:"+visitorId, 1, 120) { + log.Println("SendVisitorLoginNotice limit") + return + } + userInfo := make(map[string]string) + userInfo["username"] = visitorName + userInfo["avator"] = avator + userInfo["content"] = content + msg := ws.TypeMessage{ + Type: "notice", + Data: userInfo, + } + str, _ := json.Marshal(msg) + ws.OneKefuMessage(kefuName, str) +} +func SendNoticeEmail(username, msg string) { + smtp := models.FindConfig("NoticeEmailSmtp") + email := models.FindConfig("NoticeEmailAddress") + password := models.FindConfig("NoticeEmailPassword") + if smtp == "" || email == "" || password == "" { + return + } + err := tools.SendSmtp(smtp, email, password, []string{email}, "[通知]"+username, msg) + if err != nil { + log.Println(err) + } +} +func SendAppGetuiPush(kefu string, title, content string) { + token := models.FindConfig("GetuiToken") + if token == "" { + token = getGetuiToken() + if token == "" { + return + } + } + format := ` +{ + "request_id":"%s", + "settings":{ + "ttl":3600000 + }, + "audience":{ + "cid":[ + "%s" + ] + }, + "push_message":{ + "notification":{ + "title":"%s", + "body":"%s", + "click_type":"url", + "url":"https//:xxx" + } + } +} +` + clients := models.FindClients(kefu) + if len(clients) == 0 { + return + } + //clientIds := make([]string, 0) + for _, client := range clients { + //clientIds = append(clientIds, client.Client_id) + req := fmt.Sprintf(format, tools.Md5(tools.Uuid()), client.Client_id, title, content) + num := sendPushApi(token, req) + if num == 10001 { + token = getGetuiToken() + sendPushApi(token, req) + } + } + +} +func sendPushApi(token string, req string) int { + appid := models.FindConfig("GetuiAppID") + if appid == "" { + return 0 + } + url := "https://restapi.getui.com/v2/" + appid + "/push/single/cid" + headers := make(map[string]string) + headers["Content-Type"] = "application/json;charset=utf-8" + headers["token"] = token + res, err := tools.PostHeader(url, []byte(req), headers) + tools.Logger().Infoln(url, req, err, res) + + if err == nil && res != "" { + var pushRes GetuiResponse + json.Unmarshal([]byte(res), &pushRes) + if pushRes.Code == 10001 { + return 10001 + } + } + return 200 +} +func getGetuiToken() string { + appid := models.FindConfig("GetuiAppID") + appkey := models.FindConfig("GetuiAppKey") + //appsecret := models.FindConfig("GetuiAppSecret") + appmastersecret := models.FindConfig("GetuiMasterSecret") + if appid == "" { + return "" + } + type req struct { + Sign string `json:"sign"` + Timestamp string `json:"timestamp"` + Appkey string `json:"appkey"` + } + timestamp := strconv.FormatInt(time.Now().UnixNano()/1e6, 10) + reqJson := req{ + Sign: tools.Sha256(appkey + timestamp + appmastersecret), + Timestamp: timestamp, + Appkey: appkey, + } + reqStr, _ := json.Marshal(reqJson) + url := "https://restapi.getui.com/v2/" + appid + "/auth" + res, err := tools.Post(url, "application/json;charset=utf-8", reqStr) + log.Println(url, string(reqStr), err, res) + if err == nil && res != "" { + var pushRes GetuiResponse + json.Unmarshal([]byte(res), &pushRes) + if pushRes.Code == 0 { + token := pushRes.Data["token"].(string) + //models.UpdateConfig("GetuiToken", token) + return token + } + } + return "" +} diff --git a/controller/tcp.go b/controller/tcp.go new file mode 100644 index 0000000..3ba8895 --- /dev/null +++ b/controller/tcp.go @@ -0,0 +1,58 @@ +package controller + +import ( + "github.com/gin-gonic/gin" + "log" + "net" +) + +var clientTcpList = make(map[string]net.Conn) + +func NewTcpServer(tcpBaseServer string) { + listener, err := net.Listen("tcp", tcpBaseServer) + if err != nil { + log.Println("Error listening", err.Error()) + return //终止程序 + } + // 监听并接受来自客户端的连接 + for { + conn, err := listener.Accept() + if err != nil { + log.Println("Error accepting", err.Error()) + return // 终止程序 + } + var remoteIpAddress = conn.RemoteAddr() + clientTcpList[remoteIpAddress.String()] = conn + log.Println(remoteIpAddress, clientTcpList) + //clientTcpList=append(clientTcpList,conn) + } +} +func PushServerTcp(str []byte) { + for ip, conn := range clientTcpList { + line := append(str, []byte("\r\n")...) + _, err := conn.Write(line) + log.Println(ip, err) + if err != nil { + conn.Close() + delete(clientTcpList, ip) + //clientTcpList=append(clientTcpList[:index],clientTcpList[index+1:]...) + } + } +} +func DeleteOnlineTcp(c *gin.Context) { + ip := c.Query("ip") + for ipkey, conn := range clientTcpList { + if ip == ipkey { + conn.Close() + delete(clientTcpList, ip) + } + if ip == "all" { + conn.Close() + delete(clientTcpList, ipkey) + } + } + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + }) +} diff --git a/controller/visitor.go b/controller/visitor.go new file mode 100644 index 0000000..3254b2e --- /dev/null +++ b/controller/visitor.go @@ -0,0 +1,322 @@ +package controller + +import ( + "ai-css/common" + "ai-css/library/logger" + "ai-css/middleware/xpink_auth" + "ai-css/models" + "ai-css/tools" + "ai-css/ws" + "encoding/json" + "strconv" + + "github.com/gin-gonic/gin" +) + +// func PostVisitor(c *gin.Context) { +// name := c.PostForm("name") +// avator := c.PostForm("avator") +// toId := c.PostForm("to_id") +// id := c.PostForm("id") +// refer := c.PostForm("refer") +// city := c.PostForm("city") +// client_ip := c.PostForm("client_ip") +// if name == "" || avator == "" || toId == "" || id == "" || refer == "" || city == "" || client_ip == "" { +// c.JSON(200, gin.H{ +// "code": 400, +// "msg": "error", +// }) +// return +// } +// kefuInfo := models.FindUser(toId) +// if kefuInfo.ID == 0 { +// c.JSON(200, gin.H{ +// "code": 400, +// "msg": "用户不存在", +// }) +// return +// } +// models.CreateVisitor(name, avator, c.ClientIP(), toId, id, refer, city, client_ip) +// +// userInfo := make(map[string]string) +// userInfo["uid"] = id +// userInfo["username"] = name +// userInfo["avator"] = avator +// msg := TypeMessage{ +// Type: "userOnline", +// Data: userInfo, +// } +// str, _ := json.Marshal(msg) +// kefuConns := kefuList[toId] +// if kefuConns != nil { +// for k, kefuConn := range kefuConns { +// log.Println(k, "xxxxxxxx") +// kefuConn.WriteMessage(websocket.TextMessage, str) +// } +// } +// c.JSON(200, gin.H{ +// "code": 200, +// "msg": "ok", +// }) +// } +func PostVisitorLogin(c *gin.Context) { + ipcity := tools.ParseIp(c.ClientIP()) + avator := "" + userAgent := c.GetHeader("User-Agent") + if tools.IsMobile(userAgent) { + avator = "/static/images/1.png" + } else { + avator = "/static/images/2.png" + } + + toId := c.PostForm("to_id") + var id string + + if us := xpink_auth.GetXPINKUser(c); us.Userno != "" { + logger.Infof("parse xpink user season success us:%v", us) + id = us.Userno + } + if id == "" { + logger.Errorf("parse xpin user season failed") + id = c.PostForm("visitor_id") + if id == "" { + id = tools.Uuid() + } + } + + refer := c.PostForm("refer") + var ( + city string + name string + ) + + if ipcity != nil { + city = ipcity.CountryName + ipcity.RegionName + ipcity.CityName + name = ipcity.CountryName + ipcity.RegionName + ipcity.CityName + if ipcity.CityName == "本机地址" || ipcity.RegionName == "本机地址" || ipcity.CountryName == "本机地址" { + city = "local address" + } + } else { + city = "​​Unrecognized Region​​" + name = "visitor" + } + + if name == "本机地址本机地址" { + name = "local visitor" + } + client_ip := c.ClientIP() + extra := c.PostForm("extra") + extraJson := tools.Base64Decode(extra) + if extraJson != "" { + var extraObj VisitorExtra + err := json.Unmarshal([]byte(extraJson), &extraObj) + if err == nil { + if extraObj.VisitorName != "" { + name = extraObj.VisitorName + } + if extraObj.VisitorAvatar != "" { + avator = extraObj.VisitorAvatar + } + } + } + //log.Println(name,avator,c.ClientIP(),toId,id,refer,city,client_ip) + if name == "" || avator == "" || toId == "" || id == "" || refer == "" || city == "" || client_ip == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "error", + }) + return + } + kefuInfo := models.FindUser(toId) + if kefuInfo.ID == 0 { + c.JSON(200, gin.H{ + "code": 400, + "msg": "客服不存在", + }) + return + } + visitor := models.FindVisitorByVistorId(id) + if visitor.Name != "" { + avator = visitor.Avator + //更新状态上线 + models.UpdateVisitor(name, visitor.Avator, id, 1, c.ClientIP(), c.ClientIP(), refer, extra) + } else { + models.CreateVisitor(name, avator, c.ClientIP(), toId, id, refer, city, client_ip, extra) + } + visitor.Name = name + visitor.Avator = avator + visitor.ToId = toId + visitor.ClientIp = c.ClientIP() + visitor.VisitorId = id + + //各种通知 + go SendNoticeEmail(visitor.Name, " incoming!") + //go SendAppGetuiPush(kefuInfo.Name, visitor.Name, visitor.Name+" incoming!") + go SendVisitorLoginNotice(kefuInfo.Name, visitor.Name, visitor.Avator, visitor.Name+" incoming!", visitor.VisitorId) + go ws.VisitorOnline(kefuInfo.Name, visitor) + //go SendServerJiang(visitor.Name, "来了", c.Request.Host) + + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": visitor, + }) +} +func GetVisitor(c *gin.Context) { + visitorId := c.Query("visitorId") + vistor := models.FindVisitorByVistorId(visitorId) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": vistor, + }) +} + +// @Summary 获取访客列表接口 +// @Produce json +// @Accept multipart/form-data +// @Param page query string true "分页" +// @Param token header string true "认证token" +// @Success 200 {object} controller.Response +// @Failure 200 {object} controller.Response +// @Router /visitors [get] +func GetVisitors(c *gin.Context) { + page, _ := strconv.Atoi(c.Query("page")) + pagesize, _ := strconv.Atoi(c.Query("pagesize")) + if pagesize == 0 { + pagesize = int(common.VisitorPageSize) + } + kefuId, _ := c.Get("kefu_name") + vistors := models.FindVisitorsByKefuId(uint(page), uint(pagesize), kefuId.(string)) + count := models.CountVisitorsByKefuId(kefuId.(string)) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": gin.H{ + "list": vistors, + "count": count, + "pagesize": common.PageSize, + }, + }) +} + +// @Summary 获取访客聊天信息接口 +// @Produce json +// @Accept multipart/form-data +// @Param visitorId query string true "访客ID" +// @Param token header string true "认证token" +// @Success 200 {object} controller.Response +// @Failure 200 {object} controller.Response +// @Router /messages [get] +func GetVisitorMessage(c *gin.Context) { + visitorId := c.Query("visitorId") + + query := "message.visitor_id= ?" + messages := models.FindMessageByWhere(query, visitorId) + result := make([]map[string]interface{}, 0) + for _, message := range messages { + item := make(map[string]interface{}) + + item["time"] = message.CreatedAt.Format("2006-01-02 15:04:05") + item["content"] = message.Content + item["mes_type"] = message.MesType + item["visitor_name"] = message.VisitorName + item["visitor_avator"] = message.VisitorAvator + item["kefu_name"] = message.KefuName + item["kefu_avator"] = message.KefuAvator + result = append(result, item) + + } + go models.ReadMessageByVisitorId(visitorId) + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": result, + }) +} + +// @Summary 获取在线访客列表接口 +// @Produce json +// @Success 200 {object} controller.Response +// @Failure 200 {object} controller.Response +// @Router /visitors_online [get] +func GetVisitorOnlines(c *gin.Context) { + users := make([]map[string]string, 0) + visitorIds := make([]string, 0) + for uid, visitor := range ws.ClientList { + userInfo := make(map[string]string) + userInfo["uid"] = uid + userInfo["name"] = visitor.Name + userInfo["avator"] = visitor.Avator + users = append(users, userInfo) + visitorIds = append(visitorIds, visitor.Id) + } + + //查询最新消息 + messages := models.FindLastMessage(visitorIds) + temp := make(map[string]string, 0) + for _, mes := range messages { + temp[mes.VisitorId] = mes.Content + } + for _, user := range users { + user["last_message"] = temp[user["uid"]] + } + + tcps := make([]string, 0) + for ip, _ := range clientTcpList { + tcps = append(tcps, ip) + } + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": gin.H{ + "ws": users, + "tcp": tcps, + }, + }) +} + +// @Summary 获取客服的在线访客列表接口 +// @Produce json +// @Success 200 {object} controller.Response +// @Failure 200 {object} controller.Response +// @Router /visitors_kefu_online [get] +func GetKefusVisitorOnlines(c *gin.Context) { + kefuName, _ := c.Get("kefu_name") + users := make([]*VisitorOnline, 0) + visitorIds := make([]string, 0) + for uid, visitor := range ws.ClientList { + if visitor.To_id != kefuName { + continue + } + userInfo := new(VisitorOnline) + userInfo.Uid = uid + userInfo.Username = visitor.Name + userInfo.Avator = visitor.Avator + users = append(users, userInfo) + visitorIds = append(visitorIds, visitor.Id) + } + + //查询最新消息 + messages := models.FindLastMessage(visitorIds) + temp := make(map[string]string, 0) + for _, mes := range messages { + temp[mes.VisitorId] = mes.Content + } + for _, user := range users { + user.LastMessage = temp[user.Uid] + if user.LastMessage == "" { + user.LastMessage = "new visitor" + } + } + + tcps := make([]string, 0) + for ip, _ := range clientTcpList { + tcps = append(tcps, ip) + } + c.JSON(200, gin.H{ + "code": 200, + "msg": "ok", + "result": users, + }) +} diff --git a/controller/weixin.go b/controller/weixin.go new file mode 100644 index 0000000..3a150fd --- /dev/null +++ b/controller/weixin.go @@ -0,0 +1,35 @@ +package controller + +import ( + "ai-css/models" + "crypto/sha1" + "encoding/hex" + "github.com/gin-gonic/gin" + "log" + "sort" +) + +func GetCheckWeixinSign(c *gin.Context) { + token := models.FindConfig("WeixinToken") + signature := c.Query("signature") + timestamp := c.Query("timestamp") + nonce := c.Query("nonce") + echostr := c.Query("echostr") + //将token、timestamp、nonce三个参数进行字典序排序 + var tempArray = []string{token, timestamp, nonce} + sort.Strings(tempArray) + //将三个参数字符串拼接成一个字符串进行sha1加密 + var sha1String string = "" + for _, v := range tempArray { + sha1String += v + } + h := sha1.New() + h.Write([]byte(sha1String)) + sha1String = hex.EncodeToString(h.Sum([]byte(""))) + //获得加密后的字符串可与signature对比 + if sha1String == signature { + c.Writer.Write([]byte(echostr)) + } else { + log.Println("微信API验证失败") + } +} diff --git a/docker_build.sh b/docker_build.sh new file mode 100644 index 0000000..30cf5a1 --- /dev/null +++ b/docker_build.sh @@ -0,0 +1,21 @@ +#!/bin/bash +RUN_NAME=aicss_service +DOCKER_TAG=test +set -e + +go mod tidy + +# 优化编译标志 +BUILD_FLAGS=( + "-trimpath" # 移除文件系统路径,减少二进制大小 + "-ldflags=-s -w" # 移除符号表和调试信息,减少内存使用 +) + +# 使用优化的编译标志 +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build "${BUILD_FLAGS[@]}" -o output/bin/${RUN_NAME} gofly.go + +echo 'build go success' + +docker build -t 322814420330.dkr.ecr.ap-southeast-1.amazonaws.com/xpink/${RUN_NAME}:${DOCKER_TAG} -f Dockerfile . + +docker push 322814420330.dkr.ecr.ap-southeast-1.amazonaws.com/xpink/${RUN_NAME}:${DOCKER_TAG} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..fe3aeaf --- /dev/null +++ b/go.mod @@ -0,0 +1,71 @@ +module ai-css + +go 1.22 + +toolchain go1.22.4 + +require ( + github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f + github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 + github.com/emersion/go-smtp v0.13.0 + github.com/gin-contrib/sessions v0.0.3 + github.com/gin-gonic/gin v1.7.7 + github.com/go-sql-driver/mysql v1.5.0 + github.com/gobuffalo/packr/v2 v2.5.1 + github.com/golang-jwt/jwt v3.2.2+incompatible + github.com/golang-jwt/jwt/v5 v5.2.1 + github.com/gorilla/websocket v1.4.2 + github.com/ipipdotnet/ipdb-go v1.3.0 + github.com/jinzhu/gorm v1.9.14 + github.com/openai/openai-go/v3 v3.17.0 + github.com/satori/go.uuid v1.2.0 + github.com/sirupsen/logrus v1.4.2 + github.com/spf13/cobra v0.0.5 + github.com/stretchr/testify v1.10.0 + github.com/zh-five/xdaemon v0.1.1 + go.uber.org/zap v1.27.1 + gopkg.in/natefinch/lumberjack.v2 v2.2.1 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.13.0 // indirect + github.com/go-playground/universal-translator v0.17.0 // indirect + github.com/go-playground/validator/v10 v10.4.1 // indirect + github.com/gobuffalo/envy v1.7.0 // indirect + github.com/gobuffalo/logger v1.0.0 // indirect + github.com/gobuffalo/packd v0.3.0 // indirect + github.com/golang/protobuf v1.3.3 // indirect + github.com/gorilla/context v1.1.1 // indirect + github.com/gorilla/securecookie v1.1.1 // indirect + github.com/gorilla/sessions v1.1.3 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/joho/godotenv v1.3.0 // indirect + github.com/json-iterator/go v1.1.9 // indirect + github.com/karrick/godirwalk v1.10.12 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/leodido/go-urn v1.2.0 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/spf13/pflag v1.0.3 // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tidwall/sjson v1.2.5 // indirect + github.com/ugorji/go/codec v1.1.7 // indirect + go.uber.org/multierr v1.10.0 // indirect + golang.org/x/crypto v0.32.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/term v0.28.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..45ab052 --- /dev/null +++ b/go.sum @@ -0,0 +1,228 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw= +github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f h1:q/DpyjJjZs94bziQ7YkBmIlpqbVP7yw179rnzoNVX1M= +github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f/go.mod h1:QGrK8vMWWHQYQ3QU9bw9Y9OPNfxccGzfb41qjvVeXtY= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 h1:OJyUGMJTzHTd1XQp98QTaHernxMYzRaOasRir9hUlFQ= +github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= +github.com/emersion/go-smtp v0.13.0 h1:aC3Kc21TdfvXnuJXCQXuhnDXUldhc12qME/S7Y3Y94g= +github.com/emersion/go-smtp v0.13.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gin-contrib/sessions v0.0.3 h1:PoBXki+44XdJdlgDqDrY5nDVe3Wk7wDV/UCOuLP6fBI= +github.com/gin-contrib/sessions v0.0.3/go.mod h1:8C/J6cad3Il1mWYYgtw0w+hqasmpvy25mPkXdOgeB9I= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= +github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/logger v1.0.0 h1:xw9Ko9EcC5iAFprrjJ6oZco9UpzS5MQ4jAwghsLHdy4= +github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= +github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= +github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packr/v2 v2.5.1 h1:TFOeY2VoGamPjQLiNDT3mn//ytzk236VMO2j7iHxJR4= +github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= +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/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.1.3 h1:uXoZdcdA5XdXF3QzuSlheVRUvjl+1rKY7zBXL68L9RU= +github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/ipipdotnet/ipdb-go v1.3.0 h1:FfkSkAI1do3bZ7F35ueGuF7Phur64jmikQ1C4IPl/gc= +github.com/ipipdotnet/ipdb-go v1.3.0/go.mod h1:yZ+8puwe3R37a/3qRftXo40nZVQbxYDLqls9o5foexs= +github.com/jinzhu/gorm v1.9.14 h1:Kg3ShyTPcM6nzVo148fRrcMO6MNKuqtOUwnzqMgVniM= +github.com/jinzhu/gorm v1.9.14/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= +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.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/karrick/godirwalk v1.10.12 h1:BqUm+LuJcXjGv1d2mj3gBiQyrQ57a0rYoAmhvJQ7RDU= +github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +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.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +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.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= +github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/openai/openai-go/v3 v3.17.0 h1:CfTkmQoItolSyW+bHOUF190KuX5+1Zv6MC0Gb4wAwy8= +github.com/openai/openai-go/v3 v3.17.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +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/quasoft/memstore v0.0.0-20180925164028-84a050167438/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zh-five/xdaemon v0.1.1 h1:W5VyJ+5ROjjcb9vNcF/SgWPwTzIRYIsW2yZBAomqMW8= +github.com/zh-five/xdaemon v0.1.1/go.mod h1:i3cluMVOPp/UcX2KDU2qzRv25f8u4y14tHzBPQhD8lI= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +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/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/gofly.go b/gofly.go new file mode 100644 index 0000000..6dbb276 --- /dev/null +++ b/gofly.go @@ -0,0 +1,9 @@ +package main + +import ( + "ai-css/cmd" +) + +func main() { + cmd.Execute() +} diff --git a/gofly.sock b/gofly.sock new file mode 100644 index 0000000..4aa90cf --- /dev/null +++ b/gofly.sock @@ -0,0 +1 @@ +46412,46509 \ No newline at end of file diff --git a/import.sql b/import.sql new file mode 100644 index 0000000..3339531 --- /dev/null +++ b/import.sql @@ -0,0 +1,223 @@ +DROP TABLE IF EXISTS `user`; +CREATE TABLE `user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL DEFAULT '', + `role` INT NOT NULL DEFAULT (0) COMMENT '1:管理员', + `password` varchar(50) NOT NULL DEFAULT '', + `nickname` varchar(50) NOT NULL DEFAULT '', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NULL DEFAULT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, + `avator` varchar(100) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `idx_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +TRUNCATE TABLE `user`; +INSERT INTO `user` (`name`, `role`, `password`, `nickname`, `created_at`, `updated_at`, `deleted_at`, `avator`) VALUES +('admin', 1, '0192023a7bbd73250516f069df18b500', 'admin', '2026-02-05 00:10:37', '2026-02-05 00:10:37', NULL, '/aicss/static/images/4.jpg'); +INSERT INTO `user` (`name`, `role`, `password`, `nickname`, `created_at`, `updated_at`, `deleted_at`, `avator`) VALUES +('agent1', 0, '2ec199f1e2de31576869a57488e919ad', 'agent1', '2026-02-05 00:10:37', '2026-02-05 00:10:37', NULL, '/aicss/static/images/4.jpg'); +INSERT INTO `user` (`name`, `role`, `password`, `nickname`, `created_at`, `updated_at`, `deleted_at`, `avator`) VALUE +('agent2', 0, '2ec199f1e2de31576869a57488e919ad', 'agent2', '2026-02-05 00:10:37', '2026-02-05 00:10:37', NULL, '/aicss/static/images/4.jpg'); +INSERT INTO `user` (`name`, `role`, `password`, `nickname`, `created_at`, `updated_at`, `deleted_at`, `avator`) VALUE +('agent3', 0, '2ec199f1e2de31576869a57488e919ad', 'agent3', '2026-02-05 00:10:37', '2026-02-05 00:10:37', NULL, '/aicss/static/images/4.jpg'); + +DROP TABLE IF EXISTS `visitor`; +CREATE TABLE `visitor` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL DEFAULT '', + `avator` varchar(500) NOT NULL DEFAULT '', + `source_ip` varchar(50) NOT NULL DEFAULT '', + `to_id` varchar(50) NOT NULL DEFAULT '', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NULL DEFAULT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, + `visitor_id` varchar(100) NOT NULL DEFAULT '', + `status` tinyint(4) NOT NULL DEFAULT '0', + `refer` varchar(500) NOT NULL DEFAULT '', + `city` varchar(100) NOT NULL DEFAULT '', + `client_ip` varchar(100) NOT NULL DEFAULT '', + `extra` varchar(2048) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `visitor_id` (`visitor_id`), + KEY `to_id` (`to_id`), + KEY `idx_update` (`updated_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `message`; +CREATE TABLE `message` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `kefu_id` varchar(100) NOT NULL DEFAULT '', + `visitor_id` varchar(100) NOT NULL DEFAULT '', + `content` varchar(2048) NOT NULL DEFAULT '', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NULL DEFAULT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, + `mes_type` enum('kefu','visitor') NOT NULL DEFAULT 'visitor', + `status` enum('read','unread') NOT NULL DEFAULT 'unread', + PRIMARY KEY (`id`), + KEY `kefu_id` (`kefu_id`), + KEY `visitor_id` (`visitor_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +DROP TABLE IF EXISTS `ipblack`; +CREATE TABLE `ipblack` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ip` varchar(100) NOT NULL DEFAULT '', + `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `kefu_id` varchar(100) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `ip` (`ip`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `config`; +CREATE TABLE `config` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `conf_name` varchar(255) NOT NULL DEFAULT '', + `conf_key` varchar(255) NOT NULL DEFAULT '', + `conf_value` MEDIUMTEXT NOT NULL, + `user_id` varchar(500) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `conf_key` (`conf_key`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`, `user_id`) VALUES +(NULL, 'Announcement', 'AllNotice', 'Open source customer support system at your service','agent'); +INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`, `user_id`) VALUES +(NULL, 'Offline Message', 'OfflineMessage', 'I am currently offline and will reply to you later!','agent'); +INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`, `user_id`) VALUES +(NULL, 'Welcome Message', 'WelcomeMessage', 'How may I help you?','agent'); +INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`, `user_id`) VALUES +(NULL, 'Email Address (SMTP)', 'NoticeEmailSmtp', '','agent'); +INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`, `user_id`) VALUES +(NULL, 'Email Account', 'NoticeEmailAddress', '','agent'); +INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`, `user_id`) VALUES +(NULL, 'Email Password (SMTP)', 'NoticeEmailPassword', '','agent'); +INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`, `user_id`) VALUES +(NULL, 'AIPrompt', 'AIPrompt', 'You are an AI customer support assistant.\n\nYour primary goal is to help users resolve their issues accurately, politely, and efficiently.\nYou represent the official customer service of the product or platform.\n\nGeneral rules:\n- Always be polite, calm, and professional.\n- Use clear, concise, and user-friendly language.\n- Focus on solving the user’s problem step by step.\n- Do NOT fabricate information. If you are unsure or lack relevant knowledge, say so clearly.\n- Do NOT guess product policies, prices, or technical behaviors.\n- If a question cannot be resolved based on available information, guide the user to human support.\n\nKnowledge usage:\n- Only answer questions based on the provided knowledge, FAQs, or conversation context.\n- If the user’s question is outside the supported scope, respond with a brief explanation and suggest contacting a human agent.\n\nEscalation rules:\n- If the user explicitly requests a human agent, immediately stop responding and indicate the transfer.\n- If the user expresses frustration, repeated confusion, or dissatisfaction, suggest escalating to a human agent.\n\nSafety and compliance:\n- Do not provide sensitive, confidential, or internal information.\n- Do not provide legal, medical, or financial advice.\n- Avoid any harmful, abusive, or inappropriate content.\n\nResponse style:\n- Keep answers concise but helpful.\n- Prefer bullet points or numbered steps when explaining procedures.\n- Ask clarifying questions only when necessary to move forward.', 'admin'); +INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`, `user_id`) VALUES +(NULL, 'FrequentlyAskedQuestions', 'FrequentlyAskedQuestions', '【账号与登录】 + +Q: 登录提示账号或密码错误? +A: 请确认手机号或密码是否正确;如忘记密码,在登录页选择【普通登录】→【忘记密码】通过验证码重置。 + +Q: 如何注册账号? +A: 在登录页或首页点击【注册账号】,使用有效手机号注册,手机号可直接作为登录账号。 + +Q: 收不到验证码? +A: 请确认信号正常,可每 2–3 分钟重试或更换地点。 + +【支付密码】 + +Q: 如何修改或找回支付密码? +A: 需先登录账号。 +手机端:【我的】→【忘记支付密码】→验证码重置。 +电脑端:右上角【资金/头像】→【找回支付密码】。 + +【充值】 + +Q: 如何充值? +A: 首页点击【存款/充值】,选择充值方式并按通道指引完成。 + +Q: 充值成功未到账? +A: 通常 10 分钟内到账;超时请联系人工客服并提供含收款人及时间的转账凭证。 + +Q: 支持哪些充值货币? +A: 支持人民币及 USDT(仅 TRC-20);USDT 将按汇率换算为人民币到账。 + +Q: 充值是否收手续费? +A: 平台不收取;USDT 手续费由交易所或钱包收取。 + +【提现 / 取款】 + +Q: 如何提现? +A: +手机端:【我的】→【钱包管理】; +电脑端:右上角【取款】→【钱包管理】。 + +Q: 提现提示打码量不足? +A: 表示流水未达要求,具体数值可在取款页底部查看。 + +Q: 提现手续费? +A: 每日前 5 笔免手续费,第 6 笔起收取 1%,次日 0 点重置。 + +Q: 提现多久到账? +A: 银行卡约 5–30 分钟;虚拟币钱包可秒到账。 + +Q: 提现限制? +A: 最低 100 元,无上限;虚拟币取款需钱包 KYC 且实名与账号一致。 + +【资金转账】 + +Q: 充值后余额为 0? +A: 需转入游戏:点击【转账/资金】→选择游戏→【转入/闪入】。 + +Q: 如何转出游戏余额? +A: 在【转账/资金】页面点击【一键转出】。 + +【流水 / 打码量】 + +Q: 什么是打码量? +A: 投注结算的输赢金额,取较小值计算;和局、走水不计入。 + +Q: 提现需要多少流水? +A: 通常为充值金额 1 倍;参与优惠则以活动规则为准。 + +【优惠与返水】 + +Q: 返水如何领取? +A: 无需申请,系统按账号等级自动计算,次日凌晨派送,最迟不超过早上 8 点。 + +Q: 返水比例? +A: 与账号等级及游戏有关,详见【优惠】页面。 + +Q: 如何申请彩金? +A: 登录后进入【优惠】查看活动规则并按要求申请。 + +【游戏问题】 + +Q: 游戏无法打开或加载? +A: 请确认网络及是否维护中;仍异常请联系人工客服并提供截图。 + +【客服与安全】 + +Q: 什么是专属客服? +A: 除 24 小时人工客服外,提供线下专属客服(68Chat/QQ/微信),服务时间 10:00–20:00。 + +Q: 个人信息安全吗? +A: 用户信息均经加密保护。 + +【体育相关】 + +Q: 体育注单未结算? +A: 赛事结束后结算;如有争议将延迟,最长不超过 36 小时。 + +Q: 赛事中断或腰斩? +A: 36 小时内无法继续或无重赛则取消注单并退还本金(除非已有官方结果)。 + +Q: 盈利消失或余额为负? +A: 因二次结算导致,系统将按最终结果扣回或补发。', 'admin'); + + +DROP TABLE IF EXISTS `reply_group`; +CREATE TABLE `reply_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `group_name` varchar(50) NOT NULL DEFAULT '', + `user_id` varchar(50) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO `reply_group` (`id`, `group_name`, `user_id`) VALUES +(NULL, 'Frequently Asked Questions', 'agent'); + +DROP TABLE IF EXISTS `reply_item`; +CREATE TABLE `reply_item` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `content` varchar(1024) NOT NULL DEFAULT '', + `group_id` int(11) NOT NULL DEFAULT '0', + `user_id` varchar(50) NOT NULL DEFAULT '', + `item_name` varchar(50) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`), + KEY `group_id` (`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/install.lock b/install.lock new file mode 100755 index 0000000..bd3028c --- /dev/null +++ b/install.lock @@ -0,0 +1 @@ +gofly live chat installation complete \ No newline at end of file diff --git a/k8s/k8s/deployment.yaml b/k8s/k8s/deployment.yaml new file mode 100644 index 0000000..ea97c3c --- /dev/null +++ b/k8s/k8s/deployment.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: aicss-s + namespace: xpink + labels: + app: aicss-s +spec: + replicas: 1 + selector: + matchLabels: + app: aicss-s + template: + metadata: + labels: + app: aicss-s + spec: + containers: + - name: aicss-s + image: 322814420330.dkr.ecr.ap-southeast-1.amazonaws.com/xpink/aicss_service:test + imagePullPolicy: Always + lifecycle: + preStop: + exec: + command: + - /bin/sh + - -c + - sleep 15 + resources: + limits: + cpu: 1000m + memory: 512Mi + requests: + cpu: 10m + memory: 10Mi + env: + - name: IS_TEST + value: "true" + imagePullSecrets: + - name: coding diff --git a/k8s/k8s/ingress.yaml b/k8s/k8s/ingress.yaml new file mode 100644 index 0000000..e143299 --- /dev/null +++ b/k8s/k8s/ingress.yaml @@ -0,0 +1,42 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: 2048-ingress + namespace: xpink + annotations: + #alb.ingress.kubernetes.io/subnets: vpc-0b996d24feae0e2d5 + alb.ingress.kubernetes.io/scheme: internet-facing +spec: + ingressClassName: alb + rules: + - host: bressx-test.la + http: + paths: + - path: /api + pathType: ImplementationSpecific + backend: + service: + name: hertz-s + port: + number: 8889 + - path: /admin + pathType: ImplementationSpecific + backend: + service: + name: hertz-s + port: + number: 8887 + - path: /callback + pathType: ImplementationSpecific + backend: + service: + name: hertz-s + port: + number: 8888 + - path: /ws + pathType: ImplementationSpecific + backend: + service: + name: hertz-s + port: + number: 8891 diff --git a/k8s/k8s/svc.yaml b/k8s/k8s/svc.yaml new file mode 100644 index 0000000..55f816f --- /dev/null +++ b/k8s/k8s/svc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: aicss-svc + namespace: xpink # 如果不是 default,请改成你的 namespace +spec: + type: ClusterIP + selector: + app: aicss-s + ports: + - name: http + port: 80 # 对外提供的端口 + targetPort: 8081 # 容器内部监听的端口 + protocol: TCP diff --git a/library/logger/logger.go b/library/logger/logger.go new file mode 100644 index 0000000..e7bc875 --- /dev/null +++ b/library/logger/logger.go @@ -0,0 +1,204 @@ +package logger + +import ( + "fmt" + "os" + "runtime" + "strings" + "time" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "gopkg.in/natefinch/lumberjack.v2" +) + +var ( + zlog *zap.SugaredLogger +) + +type LoggerConfig struct { + Filename string `mapstructure:"filename" json:"filename" yaml:"filename"` + Level string `mapstructure:"level" json:"level" yaml:"level"` + Format string `mapstructure:"format" json:"format" yaml:"format"` + Prefix string `mapstructure:"prefix" json:"prefix" yaml:"prefix"` + Director string `mapstructure:"director" json:"director" yaml:"director"` + ShowLine bool `mapstructure:"show-line" json:"show-line" yaml:"show-line"` + EncodeLevel string `mapstructure:"encode-level" json:"encode-level" yaml:"encode-level"` + StacktraceKey string `mapstructure:"stacktrace-key" json:"stacktrace-key" yaml:"stacktrace-key"` + LogInConsole bool `mapstructure:"log-in-console" json:"log-in-console" yaml:"log-in-console"` +} + +func Init(conf *LoggerConfig) { + if conf.Filename == "/dev/stdout" { + ecf := zap.NewProductionEncoderConfig() + ecf.FunctionKey = "func" + ecf.EncodeTime = zapcore.ISO8601TimeEncoder + ecf.ConsoleSeparator = " " + ecf.EncodeCaller = zapcore.ShortCallerEncoder + + core := zapcore.NewCore( + zapcore.NewConsoleEncoder(ecf), + zapcore.AddSync(os.Stdout), + zap.DebugLevel, + ) + zl := zap.New(core, zap.AddCallerSkip(1), zap.AddCaller()) + zlog = zl.Sugar() + return + } + + _, err := os.Stat(conf.Filename) + if err != nil { + if os.IsNotExist(err) { + err = os.MkdirAll(conf.Filename, os.ModePerm) + if err != nil { + panic(err) + } + } else { + fmt.Println("logger init error:", err) + } + } + if strings.LastIndex(conf.Filename, "/") != 0 { + conf.Filename = conf.Filename + "/" + } + + encoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{ + MessageKey: "msg", + LevelKey: "level", + EncodeLevel: zapcore.CapitalLevelEncoder, + TimeKey: "ts", + EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { + enc.AppendString(t.Format("2006-01-02 15:04:05")) + }, + CallerKey: "file", + EncodeCaller: zapcore.ShortCallerEncoder, + EncodeDuration: func(d time.Duration, enc zapcore.PrimitiveArrayEncoder) { + enc.AppendInt64(int64(d) / 1000000) + }, + }) + + // 实现两个判断日志等级的interface + infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl >= zapcore.InfoLevel + }) + + errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl >= zapcore.ErrorLevel + }) + + // 获取 info、error日志文件的io.Writer 抽象 getWriter() 在下方实现 + + now := time.Now() + fileTime := now.Format("20060102") + "-" + now.Format("150405") + fileFormat := "%s%s-%s.log" + infoWriter := getWriter(fmt.Sprintf(fileFormat, conf.Filename, "info", fileTime)) + errorWriter := getWriter(fmt.Sprintf(fileFormat, conf.Filename, "error", fileTime)) + + // 最后创建具体的Logger + core := zapcore.NewTee( + zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), infoLevel), //打印到控制台 + zapcore.NewCore(encoder, infoWriter, infoLevel), + zapcore.NewCore(encoder, errorWriter, errorLevel), + ) + + zl := zap.New(core, zap.AddCallerSkip(1), zap.AddCaller()) + zlog = zl.Sugar() +} + +func GetDefault() *zap.SugaredLogger { + return zlog +} + +func InitDefault() { + Init(&LoggerConfig{ + Filename: "/dev/stdout", + }) +} + +func Sync() { + _ = zlog.Sync() +} + +func getWriter(filename string) zapcore.WriteSyncer { + lumberJackLogger := &lumberjack.Logger{ + Filename: filename, // 文件位置 + MaxSize: 100, // 进行切割之前,日志文件的最大大小(MB为单位) + MaxAge: 10, // 保留旧文件的最大天数 + MaxBackups: 3, // 保留旧文件的最大个数 + Compress: false, // 是否压缩/归档旧文件 + } + // AddSync 将 io.Writer 转换为 WriteSyncer。 + // 它试图变得智能:如果 io.Writer 的具体类型实现了 WriteSyncer,我们将使用现有的 Sync 方法。 + // 如果没有,我们将添加一个无操作同步。 + + return zapcore.AddSync(lumberJackLogger) +} + +func Debug(args ...interface{}) { + zlog.Debug(args...) +} + +func Debugf(template string, args ...interface{}) { + zlog.Debugf(template, args...) +} + +func Info(args ...interface{}) { + zlog.Info(args...) +} + +func Infof(template string, args ...interface{}) { + zlog.Infof(template, args...) +} + +func Warn(args ...interface{}) { + zlog.Warn(args...) +} + +func Warnf(template string, args ...interface{}) { + zlog.Warnf(template, args...) +} + +func Error(args ...interface{}) { + zlog.Error(args...) +} + +func Errorf(template string, args ...interface{}) { + zlog.Errorf(template, args...) +} + +func DPanic(args ...interface{}) { + zlog.DPanic(args...) +} + +func DPanicf(template string, args ...interface{}) { + zlog.DPanicf(template, args...) +} + +func Panic(args ...interface{}) { + zlog.Panic(args...) +} + +func Panicf(template string, args ...interface{}) { + zlog.Panicf(template, args...) +} + +func Fatal(args ...interface{}) { + zlog.Fatal(args...) +} + +func Fatalf(template string, args ...interface{}) { + zlog.Fatalf(template, args...) +} + +func SafeGoroutine(fn func()) { + go func() { + defer func() { + if r := recover(); r != nil { + buf := make([]byte, 1<<16) // 64KB + stackSize := runtime.Stack(buf, false) + msg := fmt.Sprintf("panic: %v\n%s\n", r, buf[:stackSize]) + Errorf(msg) + } + }() + fn() + }() +} diff --git a/library/modelprovider/bootstrap/build.go b/library/modelprovider/bootstrap/build.go new file mode 100755 index 0000000..8d7f226 --- /dev/null +++ b/library/modelprovider/bootstrap/build.go @@ -0,0 +1,136 @@ +package bootstrap + +import ( + "ai-css/library/modelprovider" + "ai-css/library/modelprovider/config" + "ai-css/library/modelprovider/consts" + "ai-css/library/modelprovider/providers" + "context" + "fmt" + "log" +) + +/* +CI3r@f9x2#PX4fw +ssh root@43.136.78.216 + +外网 +mysql -uroot1 -hgz-cdb-s15wkipx.sql.tencentcdb.com -P29151 -p"CI3r@f4x3#2X4fw" x_anime + +内网 +mysql -uroot1 -h10.0.0.14 -P3306 -p'CI3r@f4x3#2X4fw' x_anime + +*/ + +type AIManager struct { + CfgMgr *config.Manager + Registry *providers.Registry +} + +var DefaultAIManager *AIManager + +func init() { + var err error + + cfgMgr := config.NewManager(config.NewLocalRepo(map[consts.ProviderName]config.ProviderConfig{ + consts.ProviderOpenAI: config.NewProviderConfig( + "https://api.zhizengzeng.com/v1/", + []string{"sk-zk2b3df841ed7b96299f915bcd9f7959fb566104b83e2d5b"}), + })) + + DefaultAIManager, err = Init(context.TODO(), cfgMgr) + if err != nil { + log.Fatalf("init ai manager failed err:%v", err) + } +} + +func Init(ctx context.Context, cfgMgr *config.Manager) (*AIManager, error) { + if err := cfgMgr.LoadConfigs(ctx); err != nil { + return nil, err + } + return &AIManager{ + CfgMgr: cfgMgr, + Registry: providers.BuildRegistry(), + }, nil +} + +func (a *AIManager) NewClient(providerName consts.ProviderName, opts ...ClientOption) (*modelprovider.Client, error) { + provider, finalOpts, err := a.resolveProvider(providerName, opts...) + if err != nil { + return nil, err + } + + // model 优先级:opts > config > provider + model := finalOpts.DefaultModel + if model == "" { + model = provider.GetDefaultModel() + } + + return modelprovider.NewClient(provider, model), nil +} + +func (a *AIManager) NewProvider(providerName consts.ProviderName, opts ...ClientOption) (modelprovider.Provider, error) { + provider, _, err := a.resolveProvider(providerName, opts...) + return provider, err +} + +func (a *AIManager) resolveProvider(providerName consts.ProviderName, opts ...ClientOption) (modelprovider.Provider, *Options, error) { + // 初始化 options + o := &Options{ + ProviderName: providerName, + } + for _, opt := range opts { + opt(o) + } + + // Step 1: 如果直接传 Provider,则直接返回 + if o.Provider != nil { + return o.Provider, o, nil + } + + // Step 2: 校验 ProviderName + if o.ProviderName == "" { + return nil, nil, fmt.Errorf("invalid provider name: %s", o.ProviderName) + } + + // Step 3: 解析 ProviderConfig(Option > DB) + conf, err := a.resolveProviderConfig(o) + if err != nil { + return nil, nil, fmt.Errorf("resolve provider config failed: %w", err) + } + + // Step 4: 实际创建 provider(registry lookup) + provider, err := a.createProvider(o.ProviderName, conf) + if err != nil { + return nil, nil, fmt.Errorf("create provider failed: %w", err) + } + + return provider, o, nil +} + +func (a *AIManager) resolveProviderConfig(o *Options) (*config.ProviderConfig, error) { + if o.ProviderConfig != nil { + return o.ProviderConfig, nil + } + + cfg, ok := a.CfgMgr.GetConfigByProviderName(o.ProviderName) + if !ok { + return nil, fmt.Errorf("config not found for provider: %s", o.ProviderName) + } + + return &cfg, nil +} + +func (a *AIManager) createProvider(providerName consts.ProviderName, conf *config.ProviderConfig) (modelprovider.Provider, error) { + creator := a.Registry.Providers[providerName] + if creator == nil { + return nil, fmt.Errorf("provider not supported: %s", providerName) + } + + provider, err := creator(conf) + if err != nil { + return nil, fmt.Errorf("create provider instance failed: %w", err) + } + + return provider, nil +} diff --git a/library/modelprovider/bootstrap/options.go b/library/modelprovider/bootstrap/options.go new file mode 100755 index 0000000..aa9ab35 --- /dev/null +++ b/library/modelprovider/bootstrap/options.go @@ -0,0 +1,38 @@ +package bootstrap + +import ( + "ai-css/library/modelprovider" + "ai-css/library/modelprovider/config" + "ai-css/library/modelprovider/consts" +) + +type ClientOption func(*Options) + +type Options struct { + ProviderName consts.ProviderName + Provider modelprovider.Provider + ProviderConfig *config.ProviderConfig + DefaultModel string +} + +func WithProviderName(name consts.ProviderName) ClientOption { + return func(o *Options) { + o.ProviderName = name + } +} + +func WithProvider(p modelprovider.Provider) ClientOption { + return func(o *Options) { + o.Provider = p + } +} + +func WithProviderConfig(cfg *config.ProviderConfig) ClientOption { + return func(o *Options) { + o.ProviderConfig = cfg + } +} + +func WithDefaultModel(model string) ClientOption { + return func(o *Options) { o.DefaultModel = model } +} diff --git a/library/modelprovider/bootstrap/provider.go b/library/modelprovider/bootstrap/provider.go new file mode 100755 index 0000000..7c7896e --- /dev/null +++ b/library/modelprovider/bootstrap/provider.go @@ -0,0 +1,27 @@ +package bootstrap + +import "ai-css/library/modelprovider/consts" + +var Providers = []consts.ProviderMeta{ + {ID: consts.ProviderIDOpenAI, Name: consts.ProviderOpenAI, Display: "OpenAI", Official: true}, +} + +var providerByName = make(map[consts.ProviderName]consts.ProviderMeta) +var providerByID = make(map[consts.ProviderID]consts.ProviderMeta) + +func init() { + for _, p := range Providers { + providerByName[p.Name] = p + providerByID[p.ID] = p + } +} + +func GetProviderByName(name consts.ProviderName) (consts.ProviderMeta, bool) { + p, ok := providerByName[name] + return p, ok +} + +func GetProviderByID(id consts.ProviderID) (consts.ProviderMeta, bool) { + p, ok := providerByID[id] + return p, ok +} diff --git a/library/modelprovider/client.go b/library/modelprovider/client.go new file mode 100755 index 0000000..0768277 --- /dev/null +++ b/library/modelprovider/client.go @@ -0,0 +1,58 @@ +package modelprovider + +import ( + "context" + "errors" + "time" + + "github.com/openai/openai-go/v3/shared" +) + +type Client struct { + provider Provider + defaultModel shared.ResponsesModel +} + +func NewClient(p Provider, defaultModel shared.ResponsesModel) *Client { + return &Client{provider: p, defaultModel: defaultModel} +} + +// Chat 对话接口 +func (c *Client) Chat(ctx context.Context, req ChatRequest) (*ChatResponse, error) { + if len(req.Messages) == 0 { + return nil, errors.New("empty messages") + } + if req.Model == "" { + req.Model = c.defaultModel + } + resp, err := c.provider.InvokeCompletion(ctx, &req) + if err != nil { + return nil, err + } + if resp != nil { + if resp.Meta.Vendor == "" { + resp.Meta.Vendor = c.provider.Capabilities().Vendor + } + if resp.Meta.CreatedAt.IsZero() { + resp.Meta.CreatedAt = time.Now() + } + if resp.Model == "" { + resp.Model = req.Model + } + } + return resp, nil +} + +// StreamChat 流式问答接口 +func (c *Client) StreamChat(ctx context.Context, req ChatRequest, handler StreamChatCallback) error { + if len(req.Messages) == 0 { + return errors.New("empty messages") + } + if req.Model == "" { + req.Model = c.defaultModel + } + if !c.provider.Capabilities().SupportsStreaming { + return errors.New("provider does not support streaming") + } + return c.provider.StreamCompletion(ctx, &req, handler) +} diff --git a/library/modelprovider/config/localRepo.go b/library/modelprovider/config/localRepo.go new file mode 100644 index 0000000..8e6d828 --- /dev/null +++ b/library/modelprovider/config/localRepo.go @@ -0,0 +1,15 @@ +package config + +import ai "ai-css/library/modelprovider/consts" + +type LocalRepo struct { + cfg map[ai.ProviderName]ProviderConfig +} + +func NewLocalRepo(cfg map[ai.ProviderName]ProviderConfig) *LocalRepo { + return &LocalRepo{cfg: cfg} +} + +func (repo *LocalRepo) GetAllConfig() (map[ai.ProviderName]ProviderConfig, error) { + return repo.cfg, nil +} diff --git a/library/modelprovider/config/storage.go b/library/modelprovider/config/storage.go new file mode 100755 index 0000000..c01c77e --- /dev/null +++ b/library/modelprovider/config/storage.go @@ -0,0 +1,54 @@ +package config + +import ( + ai "ai-css/library/modelprovider/consts" + "context" + "fmt" + "sync" +) + +type Manager struct { + mu sync.RWMutex + providerConfigs map[ai.ProviderName]ProviderConfig + configRepo Repo +} + +func NewManager(confRepo Repo) *Manager { + return &Manager{providerConfigs: make(map[ai.ProviderName]ProviderConfig), configRepo: confRepo} +} + +type Repo interface { + GetAllConfig() (map[ai.ProviderName]ProviderConfig, error) // providerName: apikeys +} + +func (m *Manager) LoadConfigs(ctx context.Context) error { + if m.configRepo == nil { + return fmt.Errorf("load from database failed: repo is nil") + } + allconfigs, err := m.configRepo.GetAllConfig() + if err != nil { + return fmt.Errorf("get all config from database failed err:%w", err) + } + m.mu.Lock() + defer m.mu.Unlock() + + m.providerConfigs = make(map[ai.ProviderName]ProviderConfig) // 清空 + for name, conf := range allconfigs { + m.providerConfigs[name] = conf + } + return nil +} + +func (m *Manager) SetConfigByProviderName(name ai.ProviderName, config ProviderConfig) { + m.mu.Lock() + defer m.mu.Unlock() + m.providerConfigs[name] = config +} + +func (m *Manager) GetConfigByProviderName(name ai.ProviderName) (ProviderConfig, bool) { + m.mu.RLock() + defer m.mu.RUnlock() + + conf, ok := m.providerConfigs[name] + return conf, ok +} diff --git a/library/modelprovider/config/types.go b/library/modelprovider/config/types.go new file mode 100755 index 0000000..dec9625 --- /dev/null +++ b/library/modelprovider/config/types.go @@ -0,0 +1,90 @@ +package config + +import ( + "sync" + "time" + + "ai-css/library/logger" +) + +type ProviderConfig struct { + baseURL string + apiKeys []string + BlackApiKeys map[string]struct{} + + apiKeysLock *sync.Mutex + blackLock *sync.Mutex +} + +func NewProviderConfig(burl string, apiKeys []string) ProviderConfig { + return ProviderConfig{baseURL: burl, apiKeys: apiKeys, BlackApiKeys: make(map[string]struct{}), apiKeysLock: new(sync.Mutex), blackLock: new(sync.Mutex)} +} + +func (p *ProviderConfig) ApikeyIsBlack(apikey string) bool { + p.blackLock.Lock() + defer p.blackLock.Unlock() + _, found := p.BlackApiKeys[apikey] + return found +} + +func (p *ProviderConfig) AddBlackKey(apikey string) { + p.blackLock.Lock() + defer p.blackLock.Unlock() + p.BlackApiKeys[apikey] = struct{}{} + return +} + +func (p *ProviderConfig) GetBaseUrl() string { + return p.baseURL +} + +func (p *ProviderConfig) GetApiKeys() []string { + p.apiKeysLock.Lock() + defer p.apiKeysLock.Unlock() + + return p.apiKeys +} + +func (p *ProviderConfig) SetApiKeys(keys []string) { + p.apiKeysLock.Lock() + defer p.apiKeysLock.Unlock() + p.apiKeys = keys + return +} + +func (p *ProviderConfig) SetRetryPullConfig(retryFunc func(*ProviderConfig) bool, interval time.Duration) { + if interval <= 0 { + logger.Warnf("SetRetryPullConfig interval is invalid %d", interval) + return + } + go startRetryPullConfig(func() bool { + return retryFunc(p) + }, interval) +} + +func startRetryPullConfig(retryFunc func() bool, interval time.Duration) { + timer := time.NewTimer(interval) + defer timer.Stop() + + for { + <-timer.C + + isFinish := false + + func() { + defer func() { + if r := recover(); r != nil { + logger.Errorf("retry panic: %v", r) + } + }() + + isFinish = retryFunc() + }() + + if isFinish { + return + } + + timer.Reset(interval) + } +} diff --git a/library/modelprovider/consts/provider.go b/library/modelprovider/consts/provider.go new file mode 100755 index 0000000..c189e2e --- /dev/null +++ b/library/modelprovider/consts/provider.go @@ -0,0 +1,22 @@ +package consts + +type ( + ProviderID int64 + ProviderName string +) + +type ProviderMeta struct { + ID ProviderID + Name ProviderName + Display string // UI展示名,例如 "OpenAI" + Official bool // 是否官方支持 + Icon string // 图标URL或资源标识 +} + +const ( + ProviderOpenAI ProviderName = "openai" +) + +const ( + ProviderIDOpenAI ProviderID = iota + 1 +) diff --git a/library/modelprovider/dto.go b/library/modelprovider/dto.go new file mode 100755 index 0000000..ec99522 --- /dev/null +++ b/library/modelprovider/dto.go @@ -0,0 +1,256 @@ +package modelprovider + +import ( + "time" + + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/responses" + "github.com/openai/openai-go/v3/shared" +) + +type Role string + +const ( + RoleUser Role = "user" + RoleAssistant Role = "assistant" + RoleSystem Role = "system" +) + +const ( + PartText PartType = "text" + PartImage PartType = "image" +) + +type Message struct { + Role Role `json:"role"` + Parts []Part `json:"parts,omitempty"` // 多模态分片(任选其一) +} + +type PartType string + +type Part struct { + Type PartType `json:"type"` + + // 文本 + Text string `json:"text,omitempty"` + + // 图片(任选其一:URL/内联字节/已有文件ID) + ImageURL string `json:"image_url,omitempty"` + ImageBytes []byte `json:"image_bytes,omitempty"` + MIMEType string `json:"mime_type,omitempty"` // "image/png" 等 +} + +type ChatRequest struct { + Model shared.ResponsesModel `json:"model"` + Messages []Message `json:"messages"` + Temperature *float64 `json:"temperature,omitempty"` + TopP *float64 `json:"top_p,omitempty"` + MaxTokens *int `json:"max_tokens,omitempty"` + VendorExtras map[string]any `json:"vendor_extras,omitempty"` + RequestID string `json:"request_id,omitempty"` + IsStream bool `json:"is_stream,omitempty"` +} + +type Usage struct { + PromptTokens int `json:"prompt_tokens"` + CompletionTokens int `json:"completion_tokens"` + TotalTokens int `json:"total_tokens"` +} + +type AIError struct { + Code string `json:"code"` + Message string `json:"message"` +} + +type Meta struct { + CreatedAt time.Time `json:"created_at"` + Vendor string `json:"vendor"` + ModelID string `json:"model_id,omitempty"` + Extras map[string]string `json:"extras,omitempty"` +} + +type ChatResponse struct { + ID string `json:"id"` + Model string `json:"model"` + Content string `json:"content"` + Usage *Usage `json:"usage,omitempty"` + Err *AIError `json:"err,omitempty"` + Raw any `json:"raw,omitempty"` + Meta Meta `json:"meta"` +} + +// 模型信息(面向统一层) +type ModelInfo struct { + // 逻辑 ID(仅在 RouterProvider 聚合时回填,如 "openai/gpt-4o-2024-08-06") + LogicalID string `json:"logical_id,omitempty"` + + // 供应商真实模型 ID(如 "gpt-4o-2024-08-06") + RealID string `json:"real_id"` + + // 供应商标识(如 "openai") + Vendor string `json:"vendor"` + + // 展示名(可选) + DisplayName string `json:"display_name,omitempty"` + + // 能力信息(按需精简/扩展) + ContextWindow int `json:"context_window,omitempty"` // 最大上下文 + SupportsStream bool `json:"supports_stream,omitempty"` + InputModalities []string `json:"input_modalities,omitempty"` // e.g. ["text","image","audio"] + OutputModalities []string `json:"output_modalities,omitempty"` // e.g. ["text","image"] + + // 定价/地区/版本等(可选) + Region string `json:"region,omitempty"` + Version string `json:"version,omitempty"` + Metadata map[string]string `json:"metadata,omitempty"` + + // 供应商原始信息(调试/排障) + Raw any `json:"raw,omitempty"` +} + +// 便捷构造器(业务层直接用) +func NewPartText(s string) Part { return Part{Type: PartText, Text: s} } +func NewPartImageURL(u string) Part { return Part{Type: PartImage, ImageURL: u} } +func NewPartImageBytes(b []byte, mt string) Part { + return Part{Type: PartImage, ImageBytes: b, MIMEType: mt} +} + +func MakeUserMsg(p []Part) Message { + return Message{ + Role: RoleUser, + Parts: p, + } +} + +func MakeAssistantMsg(p []Part) Message { + return Message{ + Role: RoleAssistant, + Parts: p, + } +} + +func MakeSystemMsg(p []Part) Message { + return Message{ + Role: RoleSystem, + Parts: p, + } +} + +func PartsToOpenaiChatPartUnionParam(parts []Part) (result []openai.ChatCompletionContentPartUnionParam) { + + for _, p := range parts { + switch p.Type { + + case PartText: + if p.Text == "" { + continue + } + result = append(result, + openai.ChatCompletionContentPartUnionParam{ + OfText: &openai.ChatCompletionContentPartTextParam{ + Text: p.Text, + }, + }, + ) + + case PartImage: + // 1️⃣ image_url 优先 + if p.ImageURL != "" { + result = append(result, + openai.ChatCompletionContentPartUnionParam{ + OfImageURL: &openai.ChatCompletionContentPartImageParam{ + ImageURL: openai.ChatCompletionContentPartImageImageURLParam{ + URL: p.ImageURL, + }, + }, + }, + ) + continue + } + + // 2️⃣ image_bytes(inline image) + if len(p.ImageBytes) > 0 { + result = append(result, + openai.ChatCompletionContentPartUnionParam{ + OfImageURL: &openai.ChatCompletionContentPartImageParam{ + ImageURL: openai.ChatCompletionContentPartImageImageURLParam{ + URL: p.ImageURL, + }, + }, + }, + ) + } + } + } + return result +} + +func PartsToOpenaiChatContentPartTextParam(parts []Part) (result []openai.ChatCompletionContentPartTextParam) { + + for _, p := range parts { + if p.Type != PartText { + continue + } + + if p.Text == "" { + continue + } + + result = append(result, + openai.ChatCompletionContentPartTextParam{ + Text: p.Text, + }, + ) + } + return result +} + +func PartsToOpenaiChatAssistantMessageParamContentArrayOfContentPartUnion( + parts []Part, +) (result []openai.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion) { + + for _, p := range parts { + switch p.Type { + case PartText: + if p.Text == "" { + continue + } + result = append(result, + openai.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion{ + OfText: &openai.ChatCompletionContentPartTextParam{ + Text: p.Text, + }, + }, + ) + } + } + return result +} + +func PartsToResponseInputItemUnionParam(role Role, parts []Part) (result responses.ResponseInputItemUnionParam) { + var openaiRole responses.EasyInputMessageRole + switch role { + case RoleUser: + openaiRole = responses.EasyInputMessageRoleUser + case RoleAssistant: + openaiRole = responses.EasyInputMessageRoleAssistant + case RoleSystem: + openaiRole = responses.EasyInputMessageRoleSystem + } + + for _, p := range parts { + switch p.Type { + + case PartText: + if p.Text == "" { + continue + } + + result = responses.ResponseInputItemUnionParam{ + OfMessage: &responses.EasyInputMessageParam{Content: responses.EasyInputMessageContentUnionParam{OfString: openai.String(p.Text)}, + Role: openaiRole, + }} + } + } + return +} diff --git a/library/modelprovider/errorswrap/errors.go b/library/modelprovider/errorswrap/errors.go new file mode 100755 index 0000000..1d1e534 --- /dev/null +++ b/library/modelprovider/errorswrap/errors.go @@ -0,0 +1,43 @@ +package errorswrap + +import ( + "errors" + "fmt" +) + +type Errors struct { + Code ErrorCode `json:"code"` + Msg string `json:"msg"` +} + +func (e *Errors) Error() string { + return fmt.Sprintf("error code:%s,msg:%s", e.Code, e.Msg) +} + +func NewError(code ErrorCode) error { + return &Errors{Code: code} +} + +type ErrorCode string + +const ( + ErrorUnknown ErrorCode = "provider_unknown" + ErrorProviderApiUrlInvalid ErrorCode = "provider_api_url_invalid" + ErrorProviderApiKeyInvalid ErrorCode = "provider_api_key_invalid" +) + +func ErrorIsCode(err error, code ErrorCode) bool { + var e *Errors + if errors.As(err, &e) { + return e.Code == code + } + return false +} + +func GetErrorCode(err error) ErrorCode { + var e *Errors + if errors.As(err, &e) && e != nil { + return e.Code + } + return ErrorUnknown +} diff --git a/library/modelprovider/errorswrap/errors_test.go b/library/modelprovider/errorswrap/errors_test.go new file mode 100755 index 0000000..0f60f36 --- /dev/null +++ b/library/modelprovider/errorswrap/errors_test.go @@ -0,0 +1,13 @@ +package errorswrap + +import ( + "github.com/stretchr/testify/require" + "testing" +) + +func TestCode(t *testing.T) { + + e := NewError(ErrorProviderApiUrlInvalid) + + require.Equal(t, GetErrorCode(e), ErrorProviderApiUrlInvalid) +} diff --git a/library/modelprovider/provider.go b/library/modelprovider/provider.go new file mode 100755 index 0000000..7089dc8 --- /dev/null +++ b/library/modelprovider/provider.go @@ -0,0 +1,20 @@ +package modelprovider + +import "context" + +type Capability struct { + Vendor string + SupportsStreaming bool + MaxContextTokens int +} + +// Provider:将统一 DTO ↔ 各家云 API(适配器接口) +type Provider interface { + InvokeCompletion(ctx context.Context, req *ChatRequest) (*ChatResponse, error) + StreamCompletion(ctx context.Context, req *ChatRequest, h StreamChatCallback) error + Capabilities() Capability + //ListModels 列出该 provider 可用模型(返回“供应商真实模型 ID”列表及能力) + ListModels(ctx context.Context) ([]ModelInfo, error) + // GetDefaultModel 默认模型 + GetDefaultModel() string +} diff --git a/library/modelprovider/providers/openai/api.go b/library/modelprovider/providers/openai/api.go new file mode 100755 index 0000000..67dffc7 --- /dev/null +++ b/library/modelprovider/providers/openai/api.go @@ -0,0 +1,377 @@ +package openai + +import ( + "github.com/openai/openai-go/v3/responses" + + "ai-css/library/modelprovider/errorswrap" + "bufio" + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + + "ai-css/library/logger" +) + +type EventType string + +const ( + StreamRespondError EventType = "response.error" + StreamRespondFailed EventType = "response.failed" + StreamRespondOutputTextDelta EventType = "response.output_text.delta" + StreamRespondComplete EventType = "response.completed" +) + +var NetworkError = errors.New("network unreachable") + +// OpenAIResponsesRequest models POST /v1/responses request body. +type OpenAIResponsesRequest struct { + Background *bool `json:"background,omitempty"` + Conversation json.RawMessage `json:"conversation,omitempty"` // string 或 {id: "..."} 等,用 RawMessage 保持灵活 + Include []string `json:"include,omitempty"` + Input interface{} `json:"input,omitempty"` // 聊天场景我们会塞 []OpenAIChatMessage,其他场景可自定义 + Instructions string `json:"instructions,omitempty"` + MaxOutputTokens *int `json:"max_output_tokens,omitempty"` + MaxToolCalls *int `json:"max_tool_calls,omitempty"` + Metadata map[string]string `json:"metadata,omitempty"` + Model string `json:"model,omitempty"` + ParallelToolCalls *bool `json:"parallel_tool_calls,omitempty"` + PreviousResponseID string `json:"previous_response_id,omitempty"` + Prompt json.RawMessage `json:"prompt,omitempty"` // prompt 模板引用,结构不固定,用 RawMessage + PromptCacheKey string `json:"prompt_cache_key,omitempty"` + Reasoning json.RawMessage `json:"reasoning,omitempty"` // {effort: "..."} 等 + Summary string `json:"summary,omitempty"` + SafetyIdentifier string `json:"safety_identifier,omitempty"` + ServiceTier string `json:"service_tier,omitempty"` + Store *bool `json:"store,omitempty"` + Stream bool `json:"stream,omitempty"` + StreamOptions json.RawMessage `json:"stream_options,omitempty"` // e.g. {"include_usage": true} + Temperature *float32 `json:"temperature,omitempty"` + Text json.RawMessage `json:"text,omitempty"` // 结构化输出配置等 + ToolChoice json.RawMessage `json:"tool_choice,omitempty"` + Tools json.RawMessage `json:"tools,omitempty"` // 工具 / 函数 / MCP 定义 + TopLogprobs *int `json:"top_logprobs,omitempty"` + TopP *float32 `json:"top_p,omitempty"` + Truncation string `json:"truncation,omitempty"` +} + +type OpenAIResponsesResponse struct { + ID string `json:"id"` + Object string `json:"object"` + CreatedAt int64 `json:"created_at"` + Status string `json:"status"` + Error OpenAIErrorMessage `json:"error,omitempty"` // 可能是 null 或对象 + IncompleteDetails any `json:"incomplete_details,omitempty"` // 可能是 null 或对象 + Instructions *string `json:"instructions,omitempty"` + MaxOutputTokens *int `json:"max_output_tokens,omitempty"` + Model string `json:"model"` + Output []OutputItem `json:"output"` + ParallelToolCalls bool `json:"parallel_tool_calls"` + PreviousResponseID *string `json:"previous_response_id,omitempty"` + Reasoning Reasoning `json:"reasoning"` + Store bool `json:"store"` + Temperature float64 `json:"temperature"` + Text TextSpec `json:"text"` + ToolChoice string `json:"tool_choice"` // "auto" | 其他 + Tools []json.RawMessage `json:"tools"` // 留作将来扩展(function/tool schemas 等) + TopP float64 `json:"top_p"` + Truncation string `json:"truncation"` + Usage Usage `json:"usage"` + User *string `json:"user,omitempty"` + Metadata map[string]any `json:"metadata"` +} + +type OpenAIErrorMessage struct { + Msg string `json:"message"` + Type string `json:"type"` + Param string `json:"model"` + Code string `json:"model_not_found"` +} + +// ResponsesStreamEvent 流事件的通用结构 +type ResponsesStreamEvent struct { + Type string `json:"type"` // e.g. "response.output_text.delta" + Delta string `json:"delta,omitempty"` // 文本增量内容(仅在 output_text.delta 事件里有) + ItemID string `json:"item_id,omitempty"` // 其他字段可以按需用 + OutputIndex int `json:"output_index,omitempty"` // 这里先不用 + ContentIndex int `json:"content_index,omitempty"` + // 错误事件: type = "response.error" / "response.failed" + Error *struct { + Code string `json:"code"` + Message string `json:"message"` + } `json:"error,omitempty"` + Response responses.Response `json:"response"` +} + +type OutputItem struct { + Type string `json:"type"` // "message" 等 + ID string `json:"id"` + Status string `json:"status"` // "completed" 等 + Role string `json:"role"` // "assistant" 等 + Content []ContentBlock `json:"content"` +} + +type ContentBlock struct { + Type string `json:"type"` // "output_text" 等 + Text string `json:"text,omitempty"` // 当 type=output_text 时存在 + Annotations []any `json:"annotations,omitempty"` // 留空/数组 + // 未来还可能有其他字段(如 tool_calls 等),用 RawMessage 兜底更安全: + // Raw json to keep forward-compatibility: + // Raw json.RawMessage `json:"-"` +} + +type Reasoning struct { + Effort *string `json:"effort,omitempty"` + Summary *string `json:"summary,omitempty"` +} + +type TextSpec struct { + Format TextFormat `json:"format"` +} + +type TextFormat struct { + Type string `json:"type"` // "text" +} + +type Usage struct { + InputTokens int `json:"input_tokens"` + InputTokensDetails InputTokensDetails `json:"input_tokens_details"` + OutputTokens int `json:"output_tokens"` + OutputTokensDetails OutputTokensDetail `json:"output_tokens_details"` + TotalTokens int `json:"total_tokens"` +} + +type InputTokensDetails struct { + CachedTokens int `json:"cached_tokens"` +} + +type OutputTokensDetail struct { + ReasoningTokens int `json:"reasoning_tokens"` +} + +type OpenAIChatMessage struct { + Role string `json:"role"` // "system" / "user" / "assistant" + Content []interface{} `json:"content"` // 多模态就多个 part,这里只放 text +} + +// 单条内容片段(这里只演示 text) +type OpenAIContentPart struct { + Type string `json:"type"` // "text" + Text string `json:"text,omitempty"` // 文本内容 +} + +// 文本输入 +type TextInput struct { + Type string `json:"type"` // 固定为 "input_text" + Text string `json:"text"` +} + +// 图片输入 +type ImageInput struct { + Type string `json:"type"` // 固定为 "input_image" + ImageURL string `json:"image_url,omitempty"` // URL 或 Base64 + Detail string `json:"detail,omitempty"` // high / low / auto + FileID string `json:"file_id,omitempty"` // 若图片来自文件API +} + +// 文件输入 +type FileInput struct { + Type string `json:"type"` // 固定为 "input_file" + FileID string `json:"file_id,omitempty"` // Files API 上传返回的 ID + FileData string `json:"file_data,omitempty"` // Base64 文件内容 + FileURL string `json:"file_url,omitempty"` // 文件URL + Filename string `json:"filename,omitempty"` // 文件名(可选) +} + +// Model 表示单个模型对象 +type Model struct { + ID string `json:"id"` + Object string `json:"object"` + Created int64 `json:"created"` + OwnedBy string `json:"owned_by"` +} + +// ModelsResponse 表示 /v1/models 的响应结构 +type ModelsResponse struct { + Object string `json:"object"` // 固定为 "list" + Data []Model `json:"data"` + Error RespError `json:"error"` +} + +type RespError struct { + Msg string `json:"message"` + Type string `json:"type"` + Code string `json:"code"` +} + +type OpenAIClient struct { + apiKey string + baseURL string + httpClient *http.Client +} + +func NewOpenaiClient(apikey, apiUrl string, httpC *http.Client) OpenAIClient { + return OpenAIClient{apikey, apiUrl, httpC} +} + +// callResponses 调用openAI Responses 接口 +func (o *OpenAIClient) callResponses( + ctx context.Context, req *OpenAIResponsesRequest, callback func(evt *ResponsesStreamEvent) error, +) (resp *OpenAIResponsesResponse, err error) { + + reqBody, err := json.Marshal(req) + if err != nil { + err = fmt.Errorf("failed to serialize request: %w", err) + return + } + // 2. Send POST to /v1/responses + httpReq, err := http.NewRequestWithContext( + ctx, + http.MethodPost, + o.baseURL+"/v1/responses", + bytes.NewBuffer(reqBody), + ) + if err != nil { + logger.Errorf("new request failed err:%v", err) + err = fmt.Errorf("failed to create HTTP request: %w", err) + return + } + + httpReq.Header.Set("Content-Type", "application/json") + httpReq.Header.Set("Authorization", "Bearer "+o.apiKey) + httpReq.Header.Set("Accept", "text/event-stream") + + logger.Debugf("openai callResponses req:%s", string(reqBody)) + + respond, err := o.httpClient.Do(httpReq) + if err != nil { + logger.Errorf("call responses api failed err:%v", err) + err = NetworkError + return + } + defer respond.Body.Close() + + if respond.StatusCode != http.StatusOK { + body, _ := io.ReadAll(respond.Body) + var respondData *OpenAIResponsesResponse + json.Unmarshal(body, &respondData) + err = fmt.Errorf("OpenAI API returned error [%d]: %s", respond.StatusCode, string(body)) + return + } + + // 3. Parse SSE stream + reader := bufio.NewReader(respond.Body) + + for { + select { + case <-ctx.Done(): + err = ctx.Err() + logger.Errorf("lisent stream failed err:%v", err) + if err == io.EOF { + return + } + err = NetworkError + return + default: + } + + var line []byte + line, err = reader.ReadBytes('\n') + if err != nil { + if err == io.EOF { + return + } + logger.Errorf("read body failed err:%v", err) + err = NetworkError + return + } + + line = bytes.TrimSpace(line) + if len(line) == 0 { + continue + } + + if !bytes.HasPrefix(line, []byte("data: ")) { + continue + } + + data := bytes.TrimPrefix(line, []byte("data: ")) + + var event = new(ResponsesStreamEvent) + if err = json.Unmarshal(data, event); err != nil { + continue + } + if err = callback(event); err != nil { + err = fmt.Errorf("callback execution failed: %w", err) + return + } + } + +} + +func (o *OpenAIClient) getModels(ctx context.Context) (*ModelsResponse, error) { + req, err := http.NewRequestWithContext( + ctx, + http.MethodGet, + o.baseURL+"/v1/models", + nil, + ) + if err != nil { + logger.Errorf("new request failed err:%v", err) + return nil, errorswrap.NewError(errorswrap.ErrorProviderApiUrlInvalid) + } + req.Header.Set("Authorization", "Bearer "+o.apiKey) + + resp, err := o.httpClient.Do(req) + if err != nil { + logger.Infof("call openai api failed err:%v,openAIclient:%v", err, o) + return nil, errorswrap.NewError(errorswrap.ErrorProviderApiUrlInvalid) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + logger.Errorf("status code not ok code:%d", resp.StatusCode) + var body []byte + body, err = io.ReadAll(resp.Body) + if err != nil { + logger.Errorf("read response body failed: %v", err) + return nil, errorswrap.NewError(errorswrap.ErrorProviderApiUrlInvalid) + } + logger.Errorf("status code not ok body:%s", string(body)) + return nil, errorswrap.NewError(errorswrap.ErrorProviderApiKeyInvalid) + } + + var result ModelsResponse + if err = json.NewDecoder(resp.Body).Decode(&result); err != nil { + return nil, err + } + if result.Error.Msg != "" { + return nil, errorswrap.NewError(errorswrap.ErrorProviderApiKeyInvalid) + } + return &result, nil +} + +func NewTextPart(isInput bool, text string) TextInput { + var prefix = "output" + if isInput { + prefix = "input" + } + return TextInput{ + Type: fmt.Sprintf("%s_text", prefix), + Text: text, + } +} + +func NewImagePart(isInput bool, ImageURL string) ImageInput { + var prefix = "output" + if isInput { + prefix = "input" + } + return ImageInput{ + Type: fmt.Sprintf("%s_image", prefix), + ImageURL: ImageURL, + } +} diff --git a/library/modelprovider/providers/openai/blackkeys.go b/library/modelprovider/providers/openai/blackkeys.go new file mode 100755 index 0000000..d862dd5 --- /dev/null +++ b/library/modelprovider/providers/openai/blackkeys.go @@ -0,0 +1,32 @@ +package openai + +import "sync" + +var ( + maxBlackApikeySize = 5000 +) + +type BlackkeyMgr struct { + blackApikey map[string]struct{} + lock *sync.Mutex +} + +var blackKeyMgr = &BlackkeyMgr{blackApikey: make(map[string]struct{}), lock: new(sync.Mutex)} + +func (b *BlackkeyMgr) AddBlackKey(k string) { + b.lock.Lock() + defer b.lock.Unlock() + + if len(b.blackApikey) >= maxBlackApikeySize { + b.blackApikey = make(map[string]struct{}) + } + b.blackApikey[k] = struct{}{} + return +} + +func (b *BlackkeyMgr) IsBlack(k string) bool { + b.lock.Lock() + defer b.lock.Unlock() + _, ok := b.blackApikey[k] + return ok +} diff --git a/library/modelprovider/providers/openai/sdk.go b/library/modelprovider/providers/openai/sdk.go new file mode 100755 index 0000000..a283d81 --- /dev/null +++ b/library/modelprovider/providers/openai/sdk.go @@ -0,0 +1,259 @@ +package openai + +import ( + modelprovider2 "ai-css/library/modelprovider" + "ai-css/library/modelprovider/config" + "context" + "errors" + "fmt" + "io" + "math/rand" + "net/http" + "strings" + + "ai-css/library/logger" + + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/option" + "github.com/openai/openai-go/v3/responses" + "github.com/openai/openai-go/v3/shared" +) + +type Provider struct { + httpClient *http.Client + conf *config.ProviderConfig + blackApikey map[string]struct{} +} + +func New(conf *config.ProviderConfig, httpc *http.Client) *Provider { + if httpc == nil { + httpc = http.DefaultClient + } + return &Provider{conf: conf, httpClient: httpc, blackApikey: make(map[string]struct{})} +} + +func (p *Provider) Capabilities() modelprovider2.Capability { + return modelprovider2.Capability{ + Vendor: "openai", + SupportsStreaming: true, + MaxContextTokens: 128000, + } +} + +func (p *Provider) InvokeCompletion(ctx context.Context, req *modelprovider2.ChatRequest) (*modelprovider2.ChatResponse, error) { + var respParam = responses.ResponseNewParams{ + Model: req.Model, + } + var msg []responses.ResponseInputItemUnionParam + for _, item := range req.Messages { + msg = append(msg, modelprovider2.PartsToResponseInputItemUnionParam(item.Role, item.Parts)) + } + respParam.Input = responses.ResponseNewParamsInputUnion{ + OfInputItemList: msg, + } + logger.Infof("ai chat msg:%v", msg) + + var opts []option.RequestOption + + if p.conf != nil { + if len(p.conf.GetApiKeys()) > 0 { + opts = []option.RequestOption{ + option.WithAPIKey(p.conf.GetApiKeys()[0]), + } + } + if p.conf.GetBaseUrl() != "" { + opts = append(opts, option.WithBaseURL(p.conf.GetBaseUrl())) + } + if p.httpClient != nil { + opts = append(opts, option.WithHTTPClient(p.httpClient)) + } + } + + client := openai.NewClient(opts...) + + resp, err := client.Responses.New(context.TODO(), respParam) + if err != nil { + logger.Errorf("error while calling OpenAI response api failed err: %v", err) + return nil, err + } + if resp.Error.Code != "" { + logger.Errorf("error while calling OpenAI response api failed err: %v", resp.Error.RawJSON()) + return nil, fmt.Errorf("call openai response failed err: %v", resp.Error.RawJSON()) + } + + content := "" + for _, item := range resp.Output { + if item.Type == "message" { + for _, cn := range item.Content { + if cn.Type == "output_text" { + content = cn.Text + } + } + } + } + return &modelprovider2.ChatResponse{ + ID: resp.ID, + Model: resp.Model, + Content: content, + Meta: modelprovider2.Meta{Vendor: "openai"}, + }, nil +} + +func (p *Provider) StreamCompletion(ctx context.Context, req *modelprovider2.ChatRequest, h modelprovider2.StreamChatCallback) (err error) { + var ( + temp = float32(0.7) + store = false + + inputMessages []OpenAIChatMessage + ) + + for _, msg := range req.Messages { + var ( + item OpenAIChatMessage + isInput bool + ) + switch msg.Role { + case modelprovider2.RoleSystem: + item.Role = "system" + isInput = true + case modelprovider2.RoleAssistant: + item.Role = "assistant" + case modelprovider2.RoleUser: + item.Role = "user" + isInput = true + } + for _, part := range msg.Parts { + var data interface{} + switch part.Type { + case modelprovider2.PartText: + data = NewTextPart(isInput, part.Text) + case modelprovider2.PartImage: + data = NewImagePart(isInput, part.ImageURL) + } + item.Content = append(item.Content, data) + } + inputMessages = append(inputMessages, item) + } + + var ( + callreq = &OpenAIResponsesRequest{ + Model: req.Model, + Input: inputMessages, // 聊天内容 + Stream: req.IsStream, // 流式很关键 + Store: &store, // 不持久化这次对话 + } + + apikeys []string + ) + + if IsGPT4Model(req.Model) { + callreq.Temperature = &temp + } + + for _, item := range p.conf.GetApiKeys() { + if ok := blackKeyMgr.IsBlack(item); ok { + continue + } + apikeys = append(apikeys, item) + } + + rand.Shuffle(len(apikeys), func(i, j int) { + apikeys[i], apikeys[j] = apikeys[j], apikeys[i] + }) + + logger.Debugf("call openai apikeys:%v", apikeys) + + for _, ak := range apikeys { + c := NewOpenaiClient(ak, p.conf.GetBaseUrl(), p.httpClient) + _, err = c.callResponses(ctx, callreq, p.WrapStreamCallback(h)) + if err != nil { + logger.Errorf("do callResponses api failed err:%v", err) + if isApikeyInvalid(err) { + blackKeyMgr.AddBlackKey(ak) + } + if errors.Is(err, NetworkError) { + break + } + if !errors.Is(err, io.EOF) { + continue + } + } + return + } + if err != nil { + logger.Errorf("call cloud model failed err:%v", err) + err = fmt.Errorf("cloud model server internal error") + } + return +} + +func (p *Provider) WrapStreamCallback(h modelprovider2.StreamChatCallback) func(*ResponsesStreamEvent) error { + return func(event *ResponsesStreamEvent) error { + switch EventType(event.Type) { + case StreamRespondError, StreamRespondFailed: + if event.Error != nil { + return fmt.Errorf("OpenAI streaming error: %s (%s)", event.Error.Message, event.Error.Code) + } + return fmt.Errorf("unknown OpenAI streaming error: %v", event) + case StreamRespondOutputTextDelta: + if event.Delta != "" { + if err := h(modelprovider2.StreamEvent{ + Kind: modelprovider2.StreamDelta, + Text: event.Delta, + }); err != nil { + return fmt.Errorf("callback execution failed: %w", err) + } + } + case StreamRespondComplete: + if err := h(modelprovider2.StreamEvent{ + Kind: modelprovider2.StreamEnd, + OutputTokens: event.Response.Usage.OutputTokens, + }); err != nil { + return fmt.Errorf("callback execution failed: %w", err) + } + } + return nil + } +} + +func (p *Provider) ListModels(ctx context.Context) (result []modelprovider2.ModelInfo, err error) { + var models *ModelsResponse + for _, ak := range p.conf.GetApiKeys() { + c := NewOpenaiClient(ak, p.conf.GetBaseUrl(), p.httpClient) + models, err = c.getModels(ctx) + if err != nil { + logger.Errorf("call responses api failed err:%v", err) + continue + } + break + } + if models == nil { + return + } + for _, model := range models.Data { + //if !FilterModel(model) { + // continue + //} + result = append(result, modelprovider2.ModelInfo{ + RealID: model.ID, + Raw: model, + Vendor: model.OwnedBy, + DisplayName: model.ID, + }) + } + + return +} + +func (p *Provider) GetDefaultModel() shared.ResponsesModel { + return responses.ChatModelGPT5Mini +} + +func IsGPT4Model(model string) bool { + return strings.Contains(model, "gpt-4") +} + +func isApikeyInvalid(err error) bool { + logger.Debugf("err:%v,sub:%s,contains:%v", err.Error(), "Incorrect API key provided", strings.Contains(err.Error(), "Incorrect API key provided")) + return strings.Contains(err.Error(), "Incorrect API key provided") +} diff --git a/library/modelprovider/providers/proxy.go b/library/modelprovider/providers/proxy.go new file mode 100755 index 0000000..f16f5a6 --- /dev/null +++ b/library/modelprovider/providers/proxy.go @@ -0,0 +1,31 @@ +package providers + +import ( + "ai-css/library/logger" + "net/url" + "os" +) + +const ( + PROXY_ENV_NAME = "AI-CSS_CLOUD_MODEL_PROXY" +) + +var envProxyUrl string + +func init() { + envProxyUrl = os.Getenv(PROXY_ENV_NAME) +} + +// GetRemoteProxy 国内测试时使用,方便验收 +func GetRemoteProxy() *url.URL { + if envProxyUrl == "" { + return nil + } + + proxyURL, err := url.Parse(envProxyUrl) + if err != nil { + logger.Errorf("cloud model get remote proxy failed url:%s", envProxyUrl) + return nil + } + return proxyURL +} diff --git a/library/modelprovider/providers/registry.go b/library/modelprovider/providers/registry.go new file mode 100755 index 0000000..df5dd2c --- /dev/null +++ b/library/modelprovider/providers/registry.go @@ -0,0 +1,66 @@ +package providers + +import ( + "ai-css/library/modelprovider" + "ai-css/library/modelprovider/config" + "ai-css/library/modelprovider/consts" + "ai-css/library/modelprovider/providers/openai" + "net" + "net/http" + "sync" + "time" +) + +var ( + HttpClientTimeout = 5 * 60 * time.Second + + client *http.Client + + InitClient sync.Once +) + +type ProviderFactory func(conf *config.ProviderConfig) (modelprovider.Provider, error) + +type Registry struct { + Providers map[consts.ProviderName]ProviderFactory // name -> Provider +} + +func BuildRegistry() *Registry { + var providers = map[consts.ProviderName]ProviderFactory{ + consts.ProviderOpenAI: func(providerConfig *config.ProviderConfig) (modelprovider.Provider, error) { + return openai.New(providerConfig, NewHttpClient()), nil + }, + } + return &Registry{Providers: providers} +} + +func NewHttpClient() *http.Client { + if client != nil { + return client + } + InitClient.Do(func() { + var proxyURL = GetRemoteProxy() + + transport := &http.Transport{ + DialContext: (&net.Dialer{ + Timeout: 90 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + ForceAttemptHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 90 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + } + + if proxyURL != nil { + transport.Proxy = http.ProxyURL(proxyURL) + } + + client = &http.Client{ + Transport: transport, + Timeout: HttpClientTimeout, + } + }) + return client +} diff --git a/library/modelprovider/stream.go b/library/modelprovider/stream.go new file mode 100755 index 0000000..40a3bf8 --- /dev/null +++ b/library/modelprovider/stream.go @@ -0,0 +1,21 @@ +package modelprovider + +type StreamEventKind int + +const ( + StreamStart StreamEventKind = iota + StreamDelta + StreamTool + StreamError + StreamEnd +) + +type StreamEvent struct { + Kind StreamEventKind + Text string + Err error + Raw any + OutputTokens int64 +} + +type StreamChatCallback func(StreamEvent) error diff --git a/logs/2026-02-11.log b/logs/2026-02-11.log new file mode 100644 index 0000000..b6b17d6 --- /dev/null +++ b/logs/2026-02-11.log @@ -0,0 +1,30 @@ +time="2026-02-11 20:42:53" level=info msg="start server...\r\ngo:http://0.0.0.0:8081" +time="2026-02-11 20:43:08" level=info msg="| 200 | 12.674667ms | ::1 | GET | /chatIndex |" +time="2026-02-11 20:43:09" level=info msg="| 200 | 48.423333ms | ::1 | GET | /kefu_idle?visitor_id=2e81d4f8-f19a-4c88-a9f6-8b7e1302b488 |" +time="2026-02-11 20:43:09" level=info msg="| 200 | 53.5045ms | ::1 | POST | /visitor_login |" +time="2026-02-11 20:43:09" level=info msg="| 200 | 50.610375ms | ::1 | GET | /2/messagesPages?page=1&pagesize=5&visitor_id=2eaabc7e-a519-4a61-8341-35dc5ef8d37c |" +time="2026-02-11 20:43:09" level=info msg="| 200 | 48.057791ms | ::1 | GET | /notice?kefu_id=agent3 |" +time="2026-02-11 20:43:09" level=info msg="| 404 | 10.125µs | ::1 | GET | /aicss/static/images/4.jpg |" +time="2026-02-11 20:43:11" level=info msg="| 404 | 3.084µs | ::1 | GET | /.well-known/appspecific/com.chrome.devtools.json |" +time="2026-02-11 20:43:14" level=info msg="| 200 | 11.136958ms | ::1 | GET | /chatIndex |" +time="2026-02-11 20:43:14" level=info msg="| 404 | 1.75µs | ::1 | GET | /.well-known/appspecific/com.chrome.devtools.json |" +time="2026-02-11 20:43:14" level=info msg="| 200 | 4.796556834s | ::1 | GET | /ws_visitor?visitor_id=2eaabc7e-a519-4a61-8341-35dc5ef8d37c |" +time="2026-02-11 20:43:14" level=info msg="| 200 | 18.30025ms | ::1 | GET | /kefu_idle?visitor_id=2eaabc7e-a519-4a61-8341-35dc5ef8d37c |" +time="2026-02-11 20:43:15" level=info msg="| 200 | 179.864875ms | ::1 | POST | /visitor_login |" +time="2026-02-11 20:43:15" level=info msg="| 200 | 23.262375ms | ::1 | GET | /2/messagesPages?page=1&pagesize=5&visitor_id=2eaabc7e-a519-4a61-8341-35dc5ef8d37c |" +time="2026-02-11 20:43:15" level=info msg="| 200 | 35.343125ms | ::1 | GET | /notice?kefu_id=agent3 |" +time="2026-02-11 20:43:15" level=info msg="| 404 | 2.292µs | ::1 | GET | /aicss/static/images/4.jpg |" +time="2026-02-11 20:47:20" level=info msg="start server...\r\ngo:http://0.0.0.0:8081" +time="2026-02-11 20:47:31" level=info msg="| 200 | 21.5275ms | ::1 | GET | /notice?kefu_id=agent3 |" +time="2026-02-11 20:48:19" level=info msg="| 200 | 48.496443334s | ::1 | GET | /ws_visitor?visitor_id=2eaabc7e-a519-4a61-8341-35dc5ef8d37c |" +time="2026-02-11 20:48:48" level=info msg="| 200 | 12.375404125s | ::1 | POST | /visitor_login |" +time="2026-02-11 20:51:23" level=info msg="| 200 | 32.74598375s | ::1 | POST | /visitor_login |" +time="2026-02-11 20:51:25" level=info msg="start server...\r\ngo:http://0.0.0.0:8081" +time="2026-02-11 21:18:45" level=info msg="start server...\r\ngo:http://0.0.0.0:8081" +time="2026-02-11 21:20:39" level=info msg="| 200 | 1m41.329861042s | ::1 | POST | /visitor_login |" +time="2026-02-11 21:20:39" level=info msg="| 200 | 28.047054875s | ::1 | POST | /visitor_login |" +time="2026-02-11 21:21:27" level=info msg="| 200 | 44.447656791s | ::1 | POST | /visitor_login |" +time="2026-02-11 21:22:42" level=info msg="| 200 | 1m12.9288685s | ::1 | POST | /visitor_login |" +time="2026-02-11 21:23:36" level=info msg="| 200 | 48.521523375s | ::1 | POST | /visitor_login |" +time="2026-02-11 21:23:54" level=info msg="start server...\r\ngo:http://0.0.0.0:8081" +time="2026-02-11 21:26:45" level=info msg="| 200 | 2m46.418859542s | ::1 | POST | /visitor_login |" diff --git a/middleware/cross.go b/middleware/cross.go new file mode 100644 index 0000000..953b189 --- /dev/null +++ b/middleware/cross.go @@ -0,0 +1,16 @@ +package middleware + +import "github.com/gin-gonic/gin" + +func CrossSite(c *gin.Context) { + c.Writer.Header().Set("Access-Control-Allow-Origin", "*") + //服务器支持的所有跨域请求的方法 + c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE") + //允许跨域设置可以返回其他子段,可以自定义字段 + c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session") + // 允许浏览器(客户端)可以解析的头部 (重要) + c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers") + //允许客户端传递校验信息比如 cookie (重要) + c.Header("Access-Control-Allow-Credentials", "true") + c.Next() +} diff --git a/middleware/domain_limit.go b/middleware/domain_limit.go new file mode 100644 index 0000000..127adf2 --- /dev/null +++ b/middleware/domain_limit.go @@ -0,0 +1,12 @@ +package middleware + +import ( + "github.com/gin-gonic/gin" +) + +/** +域名中间件 +*/ +func DomainLimitMiddleware(c *gin.Context) { + +} diff --git a/middleware/ipblack.go b/middleware/ipblack.go new file mode 100644 index 0000000..6aa34fc --- /dev/null +++ b/middleware/ipblack.go @@ -0,0 +1,19 @@ +package middleware + +import ( + "ai-css/models" + "github.com/gin-gonic/gin" +) + +func Ipblack(c *gin.Context) { + ip := c.ClientIP() + ipblack := models.FindIp(ip) + if ipblack.IP != "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "IP已被加入黑名单", + }) + c.Abort() + return + } +} diff --git a/middleware/jwt.go b/middleware/jwt.go new file mode 100644 index 0000000..299fb21 --- /dev/null +++ b/middleware/jwt.go @@ -0,0 +1,46 @@ +package middleware + +import ( + "ai-css/tools" + "time" + + "github.com/gin-gonic/gin" +) + +func JwtPageMiddleware(c *gin.Context) { + //暂时不处理 + //token := c.Query("token") + //userinfo := tools.ParseToken(token) + //if userinfo == nil { + // c.Redirect(302,"/login") + // c.Abort() + //} +} +func JwtApiMiddleware(c *gin.Context) { + token := c.GetHeader("aicss-token") + if token == "" { + token = c.Query("aicss-token") + } + userinfo := tools.ParseToken(token) + if userinfo == nil || userinfo["kefu_name"] == nil || userinfo["create_time"] == nil { + c.JSON(200, gin.H{ + "code": 400, + "msg": "验证失败", + }) + c.Abort() + return + } + createTime := int64(userinfo["create_time"].(float64)) + var expire int64 = 24 * 60 * 60 + nowTime := time.Now().Unix() + if (nowTime - createTime) >= expire { + c.JSON(200, gin.H{ + "code": 401, + "msg": "token失效", + }) + c.Abort() + } + c.Set("kefu_id", userinfo["kefu_id"]) + c.Set("kefu_name", userinfo["kefu_name"]) + +} diff --git a/middleware/logger.go b/middleware/logger.go new file mode 100644 index 0000000..429531a --- /dev/null +++ b/middleware/logger.go @@ -0,0 +1,46 @@ +package middleware + +import ( + "ai-css/tools" + "time" + + "github.com/gin-gonic/gin" +) + +func NewMidLogger() gin.HandlerFunc { + logger := tools.Logger() + return func(c *gin.Context) { + // 开始时间 + startTime := time.Now() + + // 处理请求 + c.Next() + + // 结束时间 + endTime := time.Now() + + // 执行时间 + latencyTime := endTime.Sub(startTime) + + // 请求方式 + reqMethod := c.Request.Method + + // 请求路由 + reqUri := c.Request.RequestURI + + // 状态码 + statusCode := c.Writer.Status() + + // 请求IP + clientIP := c.ClientIP() + + //日志格式 + logger.Infof("| %3d | %13v | %15s | %s | %s |", + statusCode, + latencyTime, + clientIP, + reqMethod, + reqUri, + ) + } +} diff --git a/middleware/rbac.go b/middleware/rbac.go new file mode 100644 index 0000000..f307ba4 --- /dev/null +++ b/middleware/rbac.go @@ -0,0 +1,64 @@ +package middleware + +import ( + "github.com/gin-gonic/gin" +) + +func RbacAuth(c *gin.Context) { + return + //roleId, _ := c.Get("role_id") + //role := models.FindRole(roleId) + //var flag bool + //rPaths := strings.Split(c.Request.RequestURI, "?") + //uriParam := fmt.Sprintf("%s:%s", c.Request.Method, rPaths[0]) + //if role.Method != "*" || role.Path != "*" { + // paths := strings.Split(role.Path, ",") + // for _, p := range paths { + // if uriParam == p { + // flag = true + // break + // } + // } + // if !flag { + // c.JSON(200, gin.H{ + // "code": 403, + // "msg": "没有权限:" + uriParam, + // }) + // c.Abort() + // return + // } + //methods := strings.Split(role.Method, ",") + //for _, m := range methods { + // if c.Request.Method == m { + // methodFlag = true + // break + // } + //} + //if !methodFlag { + // c.JSON(200, gin.H{ + // "code": 403, + // "msg": "没有权限:" + c.Request.Method + "," + rPaths[0], + // }) + // c.Abort() + // return + //} + //} + //var flag bool + //if role.Path != "*" { + // paths := strings.Split(role.Path, ",") + // for _, p := range paths { + // if rPaths[0] == p { + // flag = true + // break + // } + // } + // if !flag { + // c.JSON(200, gin.H{ + // "code": 403, + // "msg": "没有权限:" + rPaths[0], + // }) + // c.Abort() + // return + // } + //} +} diff --git a/middleware/xpink_auth/auth_jwt.go b/middleware/xpink_auth/auth_jwt.go new file mode 100644 index 0000000..27c408d --- /dev/null +++ b/middleware/xpink_auth/auth_jwt.go @@ -0,0 +1,295 @@ +package xpink_auth + +import ( + "ai-css/library/logger" + "crypto/rsa" + "fmt" + "net/url" + "strings" + "sync" + + "github.com/gin-gonic/gin" + "github.com/golang-jwt/jwt/v5" +) + +var ( + IdentityKey = "XPINK_USER" + TokenLookup = "header:Authorization,query:Authorization,referer:Authorization" + SigningAlgorithm = "RS256" + pubKey *rsa.PublicKey // runtime load + + pubkeyContent = []byte(`-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqD/o6TI7AZyNEbFQTy4g +K4Hd+aLAoLRwOe0iKqDWK4HRZABtLLvLFZLdwP4iUNAQOoy+WXz3CGqwzvs36531 +6rOzeCKtYGSN64+Pnn6UWaricnCZ2Tqng2eNln9kHALbguGVtrOSQNZr97OCOOk3 +ZDCnNwnz0hA9AhIRX1LNswPPC18q2Itdb5C//nxoEJPyY3u0r1YDL6sPD1eUDI0x ++4A8Dgqny4Z84XALn2ucR9bcUGSbtyTR1pg42MYyw6I7MV4P0YGXD3kcItd+9qlX +rULFZh5RLFl52PeA7bmXUpxKeg2lvv4CzNlk+eM7UyHctjYmM5rk+6QencjHk+qo +doVMzeX0e3sby72aq7g66QWThwGgVwwRFxsodtSwl6TAXH3TAVd3nyZ9tSqM/BT7 +B8acMVzG/lzMVvrEtJHUcPlfHNDKmWuLWo6ywblc/MGj7z8Fe/pk+wJ1Nv4WCBMj +3kv4durqVNh4YhPvxt+wAZzsNxmliFEGXb+yC/8qpZv13EgNt4f1voKYML7StIj5 +oYslqoYvzN3j5ROBRDlJaxqErEwDLwEeiqBuSME6H6hJFD3SRujmcdFtl4GYyZb9 +F7VlEGHjQqKljkjB5DOno2tV5EzGNu21dAwBHSHfto7nqG781QmQrDAVs681pNpU +iWNoAGc0L/VR0YPuV2X+ml8CAwEAAQ== +-----END PUBLIC KEY-----`) + + key = "" + TokenHeadName = "Bearer" + + ErrEmptyFormToken = fmt.Errorf("empty form token") + ErrEmptyParamToken = fmt.Errorf("empty param token") + ErrEmptyCookieToken = fmt.Errorf("empty cookie token") + ErrEmptyQueryToken = fmt.Errorf("empty query token") + ErrEmptyAuthHeader = fmt.Errorf("empty auth header") + + ErrInvalidAuthHeader = fmt.Errorf("invalid auth header") + + loadPbk sync.Once +) + +type UserSession struct { + Id uint64 + Userno string + NickName string + Jti string +} + +func Identity(c *gin.Context) interface{} { + + loadPbk.Do(func() { + var err error + pubKey, err = jwt.ParseRSAPublicKeyFromPEM(pubkeyContent) + if err != nil { + logger.Error("parse rsa public key fail err:%v", err) + } + }) + + claims, err := GetClaimsFromJWT(c) + if err != nil { + logger.Error("parse claims failed", err) + } + + c.Set("JWT_PAYLOAD", claims) + return JwtToUserSession(ExtractClaims(c)) +} + +func JwtToUserSession(payload jwt.MapClaims) UserSession { + // 安全地提取 Id + var id uint64 + if idVal, ok := payload["Id"]; ok && idVal != nil { + switch v := idVal.(type) { + case float64: + id = uint64(v) + case int64: + id = uint64(v) + case int: + id = uint64(v) + case uint64: + id = v + } + } + + // 安全地提取其他字段 + userno := "" + if val, ok := payload["Userno"]; ok && val != nil { + userno = val.(string) + } + + nickName := "" + if val, ok := payload["NickName"]; ok && val != nil { + nickName = val.(string) + } + + jti := "" + if val, ok := payload["Jti"]; ok && val != nil { + jti = val.(string) + } + + return UserSession{ + Id: id, + Userno: userno, + NickName: nickName, + Jti: jti, + } +} + +// ExtractClaims help to extract the JWT claims +func ExtractClaims(c *gin.Context) jwt.MapClaims { + claims, exists := c.Get("JWT_PAYLOAD") + if !exists { + return make(jwt.MapClaims) + } + + return claims.(jwt.MapClaims) +} + +// ParseToken parse jwt token from hertz context +func ParseToken(c *gin.Context) (*jwt.Token, error) { + var token string + var err error + + methods := strings.Split(TokenLookup, ",") + for _, method := range methods { + if len(token) > 0 { + break + } + parts := strings.Split(strings.TrimSpace(method), ":") + k := strings.TrimSpace(parts[0]) + v := strings.TrimSpace(parts[1]) + switch k { + case "header": + token, err = jwtFromHeader(c, v) + case "query": + token, err = jwtFromQuery(c, v) + case "cookie": + token, err = jwtFromCookie(c, v) + case "param": + token, err = jwtFromParam(c, v) + case "form": + token, err = jwtFromForm(c, v) + case "referer": + token, err = jwtFromReferer(c, v) + } + if token != "" && err == nil { + logger.Infof("capture token:%s", token) + break + } + } + + if err != nil { + return nil, err + } + + // save token string if valid + c.Set("JWT_TOKEN", token) + + return jwt.Parse(token, func(t *jwt.Token) (interface{}, error) { + if jwt.GetSigningMethod(SigningAlgorithm) != t.Method { + return nil, fmt.Errorf("err invalid signingalgorithm") + } + + var usingPublickkey bool + switch SigningAlgorithm { + case "RS256", "RS512", "RS384": + usingPublickkey = true + default: + usingPublickkey = false + } + + if usingPublickkey { + return pubKey, nil + } + return key, nil + }) +} + +func GetClaimsFromJWT(c *gin.Context) (jwt.MapClaims, error) { + token, err := ParseToken(c) + if err != nil { + return nil, err + } + + claims := jwt.MapClaims{} + for key, value := range token.Claims.(jwt.MapClaims) { + claims[key] = value + } + + return claims, nil +} + +func MiddlewareSetIdentity(c *gin.Context) { + identity := Identity(c) + + if identity != nil { + c.Set(IdentityKey, identity) + } +} + +func GetXPINKUser(c *gin.Context) UserSession { + data, ok := c.Get(IdentityKey) + if data != nil && ok { + if us, isUs := data.(UserSession); isUs { + return us + } + } + return UserSession{} +} + +func jwtFromHeader(c *gin.Context, key string) (string, error) { + authHeader := c.Request.Header.Get(key) + + if authHeader == "" { + return "", ErrEmptyAuthHeader + } + + parts := strings.SplitN(authHeader, " ", 2) + if !(len(parts) == 2 && parts[0] == TokenHeadName) { + return "", ErrInvalidAuthHeader + } + + return parts[len(parts)-1], nil +} + +func jwtFromQuery(c *gin.Context, key string) (string, error) { + token := c.Query(key) + + if token == "" { + return "", ErrEmptyQueryToken + } + + return token, nil +} + +func jwtFromCookie(c *gin.Context, key string) (string, error) { + cookie, _ := c.Cookie(key) + + if cookie == "" { + return "", ErrEmptyCookieToken + } + + return cookie, nil +} + +func jwtFromParam(c *gin.Context, key string) (string, error) { + token := c.Param(key) + + if token == "" { + return "", ErrEmptyParamToken + } + + return token, nil +} + +func jwtFromForm(c *gin.Context, key string) (string, error) { + token := c.PostForm(key) + + if token == "" { + return "", ErrEmptyFormToken + } + + return token, nil +} + +func jwtFromReferer(c *gin.Context, key string) (string, error) { + refererPath := c.GetHeader("Referer") + + if refererPath == "" { + return "", fmt.Errorf("err empty Referer") + } + rul, err := url.Parse(refererPath) + if err != nil { + return "", fmt.Errorf("err invalid Referer %s", refererPath) + } + token := rul.Query().Get(key) + if token == "" { + return "", ErrEmptyQueryToken + } + + parts := strings.SplitN(token, " ", 2) + + if !(len(parts) == 2 && parts[0] == TokenHeadName) { + return "", ErrInvalidAuthHeader + } + + return parts[len(parts)-1], nil +} diff --git a/models/abouts.go b/models/abouts.go new file mode 100644 index 0000000..7d37796 --- /dev/null +++ b/models/abouts.go @@ -0,0 +1,53 @@ +package models + +type About struct { + ID uint `gorm:"primary_key" json:"id"` + TitleCn string `json:"title_cn"` + TitleEn string `json:"title_en"` + KeywordsCn string `json:"keywords_cn"` + KeywordsEn string `json:"keywords_en"` + DescCn string `json:"desc_cn"` + DescEn string `json:"desc_en"` + CssJs string `json:"css_js"` + HtmlCn string `json:"html_cn"` + HtmlEn string `json:"html_en"` + Page string `json:"page"` +} + +func FindAbouts() []About { + var a []About + DB.Select("id,title_cn,page").Find(&a) + return a +} + +func FindAboutByPage(page interface{}) About { + var a About + DB.Where("page = ?", page).First(&a) + return a +} +func FindAboutByPageLanguage(page interface{}, lang string) About { + var a About + if lang == "" { + lang = "cn" + } + if lang == "en" { + DB.Select("css_js,title_en,keywords_en,desc_en,html_en").Where("page = ?", page).First(&a) + } else { + DB.Select("css_js,title_cn,keywords_cn,desc_cn,html_cn").Where("page = ?", page).First(&a) + } + return a +} +func UpdateAbout(page string, title_cn string, title_en string, keywords_cn string, keywords_en string, desc_cn string, desc_en string, css_js string, html_cn string, html_en string) { + c := &About{ + TitleCn: title_cn, + TitleEn: title_en, + KeywordsCn: keywords_cn, + KeywordsEn: keywords_en, + DescCn: desc_cn, + DescEn: desc_en, + CssJs: css_js, + HtmlCn: html_cn, + HtmlEn: html_en, + } + DB.Model(c).Where("page = ?", page).Update(c) +} diff --git a/models/configs.go b/models/configs.go new file mode 100644 index 0000000..c60bc8d --- /dev/null +++ b/models/configs.go @@ -0,0 +1,55 @@ +package models + +var CustomConfigs []Config + +type Config struct { + ID uint `gorm:"primary_key" json:"id"` + ConfName string `json:"conf_name"` + ConfKey string `json:"conf_key"` + ConfValue string `json:"conf_value"` + UserId string `json:"user_id"` +} + +func UpdateConfig(userid interface{}, key string, value string) { + config := FindConfigByUserId(userid, key) + if config.ID != 0 { + config.ConfValue = value + DB.Model(Config{}).Where("user_id = ? and conf_key = ?", userid, key).Update(map[string]interface{}{"conf_value": value}) + } else { + newConfig := &Config{ + ID: 0, + ConfName: "", + ConfKey: key, + ConfValue: value, + UserId: userid.(string), + } + DB.Create(newConfig) + } + +} +func FindConfigs() []Config { + var config []Config + DB.Find(&config) + return config +} +func FindConfigsByUserId(userid interface{}) []Config { + var config []Config + var globalConfig = []string{"AIPrompt", "FrequentlyAskedQuestions"} + var globalUser = "admin" + DB.Where("user_id = ? or (conf_name in (?) and user_id = ?)", userid, globalConfig, globalUser).Find(&config) + return config +} + +func FindConfig(key string) string { + for _, config := range CustomConfigs { + if key == config.ConfKey { + return config.ConfValue + } + } + return "" +} +func FindConfigByUserId(userId interface{}, key string) Config { + var config Config + DB.Where("user_id = ? and conf_key = ?", userId, key).Find(&config) + return config +} diff --git a/models/ipblacks.go b/models/ipblacks.go new file mode 100644 index 0000000..5116151 --- /dev/null +++ b/models/ipblacks.go @@ -0,0 +1,57 @@ +package models + +import "time" + +type Ipblack struct { + ID uint `gorm:"primary_key" json:"id"` + IP string `json:"ip"` + KefuId string `json:"kefu_id"` + CreateAt time.Time `json:"create_at"` +} + +func CreateIpblack(ip string, kefuId string) uint { + black := &Ipblack{ + IP: ip, + KefuId: kefuId, + CreateAt: time.Now(), + } + DB.Create(black) + return black.ID +} +func DeleteIpblackByIp(ip string) { + DB.Where("ip = ?", ip).Delete(Ipblack{}) +} +func FindIp(ip string) Ipblack { + var ipblack Ipblack + DB.Where("ip = ?", ip).First(&ipblack) + return ipblack +} +func FindIpsByKefuId(id string) []Ipblack { + var ipblack []Ipblack + DB.Where("kefu_id = ?", id).Find(&ipblack) + return ipblack +} +func FindIps(query interface{}, args []interface{}, page uint, pagesize uint) []Ipblack { + offset := (page - 1) * pagesize + if offset < 0 { + offset = 0 + } + var ipblacks []Ipblack + if query != nil { + DB.Where(query, args...).Offset(offset).Limit(pagesize).Find(&ipblacks) + } else { + DB.Offset(offset).Limit(pagesize).Find(&ipblacks) + } + return ipblacks +} + +//查询条数 +func CountIps(query interface{}, args []interface{}) uint { + var count uint + if query != nil { + DB.Model(&Visitor{}).Where(query, args...).Count(&count) + } else { + DB.Model(&Visitor{}).Count(&count) + } + return count +} diff --git a/models/messages.go b/models/messages.go new file mode 100644 index 0000000..5964c9b --- /dev/null +++ b/models/messages.go @@ -0,0 +1,129 @@ +package models + +import ( + "fmt" + "time" +) + +type Message struct { + Model + KefuId string `json:"kefu_id"` + VisitorId string `json:"visitor_id"` + Content string `json:"content"` + MesType string `json:"mes_type"` + Status string `json:"status"` +} +type MessageKefu struct { + Model + KefuId string `json:"kefu_id"` + VisitorId string `json:"visitor_id"` + Content string `json:"content"` + MesType string `json:"mes_type"` + Status string `json:"status"` + VisitorName string `json:"visitor_name"` + VisitorAvator string `json:"visitor_avator"` + KefuName string `json:"kefu_name"` + KefuAvator string `json:"kefu_avator"` + CreateTime string `json:"create_time"` +} + +func CreateMessage(kefu_id string, visitor_id string, content string, mes_type string) { + DB.Exec("set names utf8mb4") + v := &Message{ + KefuId: kefu_id, + VisitorId: visitor_id, + Content: content, + MesType: mes_type, + Status: "unread", + } + v.UpdatedAt = time.Now() + DB.Create(v) +} +func FindMessageByVisitorId(visitor_id string) []Message { + var messages []Message + DB.Where("visitor_id=?", visitor_id).Order("id asc").Find(&messages) + return messages +} + +// FindLatestMessageByVisitorId 查询最近几条消息 +func FindLatestMessageByVisitorId(visitor_id string, limit int) ([]Message, error) { + var messages []Message + tx := DB.Where("visitor_id=?", visitor_id).Order("id DESC").Limit(limit).Find(&messages) + + return messages, tx.Error +} + +// 修改消息状态 +func ReadMessageByVisitorId(visitor_id string) { + message := &Message{ + Status: "read", + } + DB.Model(&message).Where("visitor_id=?", visitor_id).Update(message) +} + +// 获取未读数 +func FindUnreadMessageNumByVisitorId(visitor_id string) uint { + var count uint + DB.Where("visitor_id=? and status=?", visitor_id, "unread").Count(&count) + return count +} + +// 查询最后一条消息 +func FindLastMessage(visitorIds []string) []Message { + var messages []Message + if len(visitorIds) <= 0 { + return messages + } + var ids []Message + DB.Select("MAX(id) id").Where(" visitor_id in (? )", visitorIds).Group("visitor_id").Find(&ids) + if len(ids) <= 0 { + return messages + } + var idStr = make([]string, 0, 0) + for _, mes := range ids { + idStr = append(idStr, fmt.Sprintf("%d", mes.ID)) + } + DB.Select("visitor_id,id,content").Where(" id in (? )", idStr).Find(&messages) + //subQuery := DB. + // Table("message"). + // Where(" visitor_id in (? )", visitorIds). + // Order("id desc"). + // Limit(1024). + // SubQuery() + //DB.Raw("SELECT ANY_VALUE(visitor_id) visitor_id,ANY_VALUE(id) id,ANY_VALUE(content) content FROM ? message_alia GROUP BY visitor_id", subQuery).Scan(&messages) + //DB.Select("ANY_VALUE(visitor_id) visitor_id,MAX(ANY_VALUE(id)) id,ANY_VALUE(content) content").Group("visitor_id").Find(&messages) + return messages +} + +// 查询最后一条消息 +func FindLastMessageByVisitorId(visitorId string) Message { + var m Message + DB.Select("content").Where("visitor_id=?", visitorId).Order("id desc").First(&m) + return m +} +func FindMessageByWhere(query interface{}, args ...interface{}) []MessageKefu { + var messages []MessageKefu + DB.Table("message").Where(query, args...).Select("message.*,visitor.avator visitor_avator,visitor.name visitor_name,user.avator kefu_avator,user.nickname kefu_name").Joins("left join user on message.kefu_id=user.name").Joins("left join visitor on visitor.visitor_id=message.visitor_id").Order("message.id asc").Find(&messages) + return messages +} + +// 查询条数 +func CountMessage(query interface{}, args ...interface{}) uint { + var count uint + DB.Model(&Message{}).Where(query, args...).Count(&count) + return count +} + +// 分页查询 +func FindMessageByPage(page uint, pagesize uint, query interface{}, args ...interface{}) []*MessageKefu { + offset := (page - 1) * pagesize + if offset < 0 { + offset = 0 + } + var messages []*MessageKefu + DB.Table("message").Select("message.*,visitor.avator visitor_avator,visitor.name visitor_name,user.avator kefu_avator,user.nickname kefu_name").Offset(offset).Joins("left join user on message.kefu_id=user.name").Joins("left join visitor on visitor.visitor_id=message.visitor_id").Where(query, args...).Limit(pagesize).Order("message.id desc").Find(&messages) + for _, mes := range messages { + mes.CreateTime = mes.CreatedAt.Format("2006-01-02 15:04:05") + } + return messages +} diff --git a/models/models.go b/models/models.go new file mode 100644 index 0000000..3639372 --- /dev/null +++ b/models/models.go @@ -0,0 +1,46 @@ +package models + +import ( + "ai-css/common" + "fmt" + "log" + "time" + + "github.com/jinzhu/gorm" +) + +var DB *gorm.DB + +type Model struct { + ID uint `gorm:"primary_key" json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt *time.Time `sql:"index" json:"deleted_at"` +} + +func init() { + Connect() +} +func Connect() error { + mysql := common.GetMysqlConf() + dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", mysql.Username, mysql.Password, mysql.Server, mysql.Port, mysql.Database) + var err error + DB, err = gorm.Open("mysql", dsn) + if err != nil { + log.Println(err) + panic("数据库连接失败!") + return err + } + DB.SingularTable(true) + DB.LogMode(true) + DB.DB().SetMaxIdleConns(10) + DB.DB().SetMaxOpenConns(100) + DB.DB().SetConnMaxLifetime(59 * time.Second) + return nil +} +func Execute(sql string) error { + return DB.Exec(sql).Error +} +func CloseDB() { + defer DB.Close() +} diff --git a/models/replys.go b/models/replys.go new file mode 100644 index 0000000..6efe406 --- /dev/null +++ b/models/replys.go @@ -0,0 +1,104 @@ +package models + +type ReplyItem struct { + Id string `json:"item_id"` + Content string `json:"item_content"` + GroupId string `json:"group_id"` + ItemName string `json:"item_name"` + UserId string `json:"user_id"` +} +type ReplyGroup struct { + Id string `json:"group_id"` + GroupName string `json:"group_name"` + UserId string `json:"user_id"` + Items []*ReplyItem `json:"items";"` +} + +func FindReplyItemByUserIdTitle(userId interface{}, title string) ReplyItem { + var reply ReplyItem + DB.Where("user_id = ? and item_name = ?", userId, title).Find(&reply) + return reply +} +func FindReplyByUserId(userId interface{}) []*ReplyGroup { + var replyGroups []*ReplyGroup + //DB.Raw("select a.*,b.* from reply_group a left join reply_item b on a.id=b.group_id where a.user_id=? ", userId).Scan(&replyGroups) + var replyItems []*ReplyItem + DB.Where("user_id = ?", userId).Find(&replyGroups) + DB.Where("user_id = ?", userId).Find(&replyItems) + temp := make(map[string]*ReplyGroup) + for _, replyGroup := range replyGroups { + replyGroup.Items = make([]*ReplyItem, 0) + temp[replyGroup.Id] = replyGroup + } + for _, replyItem := range replyItems { + temp[replyItem.GroupId].Items = append(temp[replyItem.GroupId].Items, replyItem) + } + return replyGroups +} +func FindReplyTitleByUserId(userId interface{}) []*ReplyGroup { + var replyGroups []*ReplyGroup + //DB.Raw("select a.*,b.* from reply_group a left join reply_item b on a.id=b.group_id where a.user_id=? ", userId).Scan(&replyGroups) + var replyItems []*ReplyItem + DB.Where("user_id = ?", userId).Find(&replyGroups) + DB.Select("item_name,group_id").Where("user_id = ?", userId).Find(&replyItems) + temp := make(map[string]*ReplyGroup) + for _, replyGroup := range replyGroups { + replyGroup.Items = make([]*ReplyItem, 0) + temp[replyGroup.Id] = replyGroup + } + for _, replyItem := range replyItems { + temp[replyItem.GroupId].Items = append(temp[replyItem.GroupId].Items, replyItem) + } + return replyGroups +} +func CreateReplyGroup(groupName string, userId string) { + g := &ReplyGroup{ + GroupName: groupName, + UserId: userId, + } + DB.Create(g) +} +func CreateReplyContent(groupId string, userId string, content, itemName string) { + g := &ReplyItem{ + GroupId: groupId, + UserId: userId, + Content: content, + ItemName: itemName, + } + DB.Create(g) +} +func UpdateReplyContent(id, userId, title, content string) { + r := &ReplyItem{ + ItemName: title, + Content: content, + } + DB.Model(&ReplyItem{}).Where("user_id = ? and id = ?", userId, id).Update(r) +} +func DeleteReplyContent(id string, userId string) { + DB.Where("user_id = ? and id = ?", userId, id).Delete(ReplyItem{}) +} +func DeleteReplyGroup(id string, userId string) { + DB.Where("user_id = ? and id = ?", userId, id).Delete(ReplyGroup{}) + DB.Where("user_id = ? and group_id = ?", userId, id).Delete(ReplyItem{}) +} +func FindReplyBySearcch(userId interface{}, search string) []*ReplyGroup { + var replyGroups []*ReplyGroup + var replyItems []*ReplyItem + DB.Where("user_id = ?", userId).Find(&replyGroups) + DB.Where("user_id = ? and content like ?", userId, "%"+search+"%").Find(&replyItems) + temp := make(map[string]*ReplyGroup) + for _, replyGroup := range replyGroups { + replyGroup.Items = make([]*ReplyItem, 0) + temp[replyGroup.Id] = replyGroup + } + for _, replyItem := range replyItems { + temp[replyItem.GroupId].Items = append(temp[replyItem.GroupId].Items, replyItem) + } + var newReplyGroups []*ReplyGroup = make([]*ReplyGroup, 0) + for _, replyGroup := range replyGroups { + if len(replyGroup.Items) != 0 { + newReplyGroups = append(newReplyGroups, replyGroup) + } + } + return newReplyGroups +} diff --git a/models/roles.go b/models/roles.go new file mode 100644 index 0000000..6f0371b --- /dev/null +++ b/models/roles.go @@ -0,0 +1,27 @@ +package models + +type Role struct { + Id string `json:"role_id"` + Name string `json:"role_name"` + Method string `json:"method"` + Path string `json:"path"` +} + +func FindRoles() []Role { + var roles []Role + DB.Order("id desc").Find(&roles) + return roles +} +func FindRole(id interface{}) Role { + var role Role + DB.Where("id = ?", id).First(&role) + return role +} +func SaveRole(id string, name string, method string, path string) { + role := &Role{ + Method: method, + Name: name, + Path: path, + } + DB.Model(role).Where("id=?", id).Update(role) +} diff --git a/models/user_client.go b/models/user_client.go new file mode 100644 index 0000000..40f8d15 --- /dev/null +++ b/models/user_client.go @@ -0,0 +1,25 @@ +package models + +import "time" + +type User_client struct { + ID uint `gorm:"primary_key" json:"id"` + Kefu string `json:"kefu"` + Client_id string `json:"client_id"` + Created_at string `json:"created_at"` +} + +func CreateUserClient(kefu, clientId string) uint { + u := &User_client{ + Kefu: kefu, + Client_id: clientId, + Created_at: time.Now().Format("2006-01-02 15:04:05"), + } + DB.Create(u) + return u.ID +} +func FindClients(kefu string) []User_client { + var arr []User_client + DB.Where("kefu = ?", kefu).Find(&arr) + return arr +} diff --git a/models/user_roles.go b/models/user_roles.go new file mode 100644 index 0000000..1346638 --- /dev/null +++ b/models/user_roles.go @@ -0,0 +1,27 @@ +package models + +import ( + "strconv" +) + +type User_role struct { + ID uint `gorm:"primary_key" json:"id"` + UserId string `json:"user_id"` + RoleId uint `json:"role_id"` +} + +func FindRoleByUserId(userId interface{}) User_role { + var uRole User_role + DB.Where("user_id = ?", userId).First(&uRole) + return uRole +} +func CreateUserRole(userId uint, roleId uint) { + uRole := &User_role{ + UserId: strconv.Itoa(int(userId)), + RoleId: roleId, + } + DB.Create(uRole) +} +func DeleteRoleByUserId(userId interface{}) { + DB.Where("user_id = ?", userId).Delete(User_role{}) +} diff --git a/models/users.go b/models/users.go new file mode 100644 index 0000000..9c3872c --- /dev/null +++ b/models/users.go @@ -0,0 +1,116 @@ +package models + +import ( + "sync" + "time" + + _ "github.com/jinzhu/gorm/dialects/mysql" +) + +type User struct { + Model + Name string `json:"name"` + Password string `json:"password"` + Nickname string `json:"nickname"` + Avator string `json:"avator"` + Role int32 `json:"role"` + RoleName string `json:"role_name" sql:"-"` + RoleId string `json:"role_id" sql:"-"` +} + +func CreateUser(name string, password string, avator string, nickname string) uint { + user := &User{ + Name: name, + Password: password, + Avator: avator, + Nickname: nickname, + } + user.UpdatedAt = time.Now() + DB.Create(user) + return user.ID +} +func UpdateUser(name string, password string, avator string, nickname string) { + user := &User{ + Avator: avator, + Nickname: nickname, + } + user.UpdatedAt = time.Now() + if password != "" { + user.Password = password + } + DB.Model(&User{}).Where("name = ?", name).Update(user) +} +func UpdateUserPass(name string, pass string) { + user := &User{ + Password: pass, + } + user.UpdatedAt = time.Now() + DB.Model(user).Where("name = ?", name).Update("Password", pass) +} +func UpdateUserAvator(name string, avator string) { + user := &User{ + Avator: avator, + } + user.UpdatedAt = time.Now() + DB.Model(user).Where("name = ?", name).Update("Avator", avator) +} +func FindUser(username string) User { + var user User + DB.Where("name = ?", username).First(&user) + return user +} + +var ( + lastAssignedId uint + assignMutex sync.Mutex +) + +func FindIdleUser() User { + assignMutex.Lock() + defer assignMutex.Unlock() + + var users []User + DB.Where("name != ?", "admin").Order("id desc").Find(&users) + + if len(users) == 0 { + return User{} + } + + targetIndex := 0 + if lastAssignedId > 0 { + for i, user := range users { + if user.ID == lastAssignedId { + targetIndex = i + 1 + break + } + } + } + + if targetIndex >= len(users) { + targetIndex = 0 + } + + targetUser := users[targetIndex] + lastAssignedId = targetUser.ID + + return targetUser +} + +func FindUserById(id interface{}) User { + var user User + DB.Select("user.*,role.name role_name,role.id role_id").Joins("join user_role on user.id=user_role.user_id").Joins("join role on user_role.role_id=role.id").Where("user.id = ?", id).First(&user) + return user +} +func DeleteUserById(id string) { + DB.Where("id = ?", id).Delete(User{}) +} +func FindUsers() []User { + var users []User + DB.Select("user.*,role.name role_name").Joins("left join user_role on user.id=user_role.user_id").Joins("left join role on user_role.role_id=role.id").Order("user.id desc").Find(&users) + return users +} +func FindUserRole(query interface{}, id interface{}) User { + var user User + DB.Select(query).Where("user.id = ?", id).Joins("join user_role on user.id=user_role.user_id").Joins("join role on user_role.role_id=role.id").First(&user) + return user +} diff --git a/models/visitors.go b/models/visitors.go new file mode 100644 index 0000000..896a452 --- /dev/null +++ b/models/visitors.go @@ -0,0 +1,115 @@ +package models + +import ( + "time" +) + +type Visitor struct { + Model + Name string `json:"name"` + Avator string `json:"avator"` + SourceIp string `json:"source_ip"` + ToId string `json:"to_id"` + VisitorId string `json:"visitor_id"` + Status uint `json:"status"` + Refer string `json:"refer"` + City string `json:"city"` + ClientIp string `json:"client_ip"` + Extra string `json:"extra"` +} + +func CreateVisitor(name, avator, sourceIp, toId, visitorId, refer, city, clientIp, extra string) { + v := &Visitor{ + Name: name, + Avator: avator, + SourceIp: sourceIp, + ToId: toId, + VisitorId: visitorId, + Status: 1, + Refer: refer, + City: city, + ClientIp: clientIp, + Extra: extra, + } + v.UpdatedAt = time.Now() + DB.Create(v) +} +func FindVisitorByVistorId(visitorId string) Visitor { + var v Visitor + DB.Where("visitor_id = ?", visitorId).First(&v) + return v +} +func FindVisitors(page uint, pagesize uint) []Visitor { + offset := (page - 1) * pagesize + if offset < 0 { + offset = 0 + } + var visitors []Visitor + DB.Offset(offset).Limit(pagesize).Order("status desc, updated_at desc").Find(&visitors) + return visitors +} +func FindVisitorsByKefuId(page uint, pagesize uint, kefuId string) []Visitor { + offset := (page - 1) * pagesize + if offset <= 0 { + offset = 0 + } + var visitors []Visitor + //sql := fmt.Sprintf("select * from visitor where id>=(select id from visitor where to_id='%s' order by updated_at desc limit %d,1) and to_id='%s' order by updated_at desc limit %d ", kefuId, offset, kefuId, pagesize) + //DB.Raw(sql).Scan(&visitors) + DB.Where("to_id=?", kefuId).Offset(offset).Limit(pagesize).Order("updated_at desc").Find(&visitors) + return visitors +} +func FindVisitorsOnline() []Visitor { + var visitors []Visitor + DB.Where("status = ?", 1).Find(&visitors) + return visitors +} +func UpdateVisitorStatus(visitorId string, status uint) { + visitor := Visitor{} + DB.Model(&visitor).Where("visitor_id = ?", visitorId).Update("status", status) +} +func UpdateVisitor(name, avator, visitorId string, status uint, clientIp string, sourceIp string, refer, extra string) { + visitor := &Visitor{ + Status: status, + ClientIp: clientIp, + SourceIp: sourceIp, + Refer: refer, + Extra: extra, + Name: name, + Avator: avator, + } + visitor.UpdatedAt = time.Now() + DB.Model(visitor).Where("visitor_id = ?", visitorId).Update(visitor) +} +func UpdateVisitorKefu(visitorId string, kefuId string) { + visitor := Visitor{} + DB.Model(&visitor).Where("visitor_id = ?", visitorId).Update("to_id", kefuId) +} + +//查询条数 +func CountVisitors() uint { + var count uint + DB.Model(&Visitor{}).Count(&count) + return count +} + +//查询条数 +func CountVisitorsByKefuId(kefuId string) uint { + var count uint + DB.Model(&Visitor{}).Where("to_id=?", kefuId).Count(&count) + return count +} + +//查询每天条数 +type EveryDayNum struct { + Day string `json:"day"` + Num int64 `json:"num"` +} + +func CountVisitorsEveryDay(toId string) []EveryDayNum { + var results []EveryDayNum + DB.Raw("select DATE_FORMAT(created_at,'%y-%m-%d') as day ,"+ + "count(*) as num from visitor where to_id=? group by day order by day desc limit 30", + toId).Scan(&results) + return results +} diff --git a/models/welcomes.go b/models/welcomes.go new file mode 100644 index 0000000..bb89a35 --- /dev/null +++ b/models/welcomes.go @@ -0,0 +1,54 @@ +package models + +import "time" + +type Welcome struct { + ID uint `gorm:"primary_key" json:"id"` + UserId string `json:"user_id"` + Keyword string `json:"keyword"` + Content string `json:"content"` + IsDefault uint `json:"is_default"` + Ctime time.Time `json:"ctime"` +} + +func CreateWelcome(userId string, content string) uint { + if userId == "" || content == "" { + return 0 + } + w := &Welcome{ + UserId: userId, + Content: content, + Ctime: time.Now(), + Keyword: "welcome", + } + DB.Create(w) + return w.ID +} +func UpdateWelcome(userId string, id string, content string) uint { + if userId == "" || content == "" { + return 0 + } + w := &Welcome{ + Content: content, + } + DB.Model(w).Where("user_id = ? and id = ?", userId, id).Update(w) + return w.ID +} +func FindWelcomeByUserIdKey(userId interface{}, keyword interface{}) Welcome { + var w Welcome + DB.Where("user_id = ? and keyword=?", userId, keyword).First(&w) + return w +} +func FindWelcomesByUserId(userId interface{}) []Welcome { + var w []Welcome + DB.Where("user_id = ?", userId).Find(&w) + return w +} +func FindWelcomesByKeyword(userId interface{}, keyword interface{}) []Welcome { + var w []Welcome + DB.Where("user_id = ? and keyword=?", userId, keyword).Find(&w) + return w +} +func DeleteWelcome(userId interface{}, id string) { + DB.Where("user_id = ? and id = ?", userId, id).Delete(Welcome{}) +} diff --git a/output/bin/aicss_service b/output/bin/aicss_service new file mode 100755 index 0000000..e1e15f8 Binary files /dev/null and b/output/bin/aicss_service differ diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..69032b0 --- /dev/null +++ b/readme.md @@ -0,0 +1,114 @@ +## GOFLY LIVE CHAT +Open-source live chat support system, built for modern customer service + +​​Real-time messaging​​ - Instant connection between customers and support teams + +Lightning-fast performance​​ - Powered by Golang for high-concurrency handling + +### Technical Architecture​ + +A modern stack built for performance and scalability​ + +- Backend: `gin`, `jwt-go`, `websocket`, `go.uuid`, `gorm`, `cobra` +- Frontend: `VueJS`, `ElementUI` +- Database: `MySQL` + +--- + +### Installation & Usage + +#### 1. Set Up MySQL Database +- Install and run MySQL (version ≥ 5.5). +- Create a database: +```sql + CREATE DATABASE goflychat CHARSET utf8mb4; + ``` +* Configure Database Connection + Edit mysql.json in the config directory: +```php +{ + "Server":"127.0.0.1", + "Port":"3306", + "Database":"goflychat", + "Username":"goflychat", + "Password":"goflychat" +} +``` +* Install and Configure Golang + Run the following commands: +```php +wget https://studygolang.com/dl/golang/go1.20.2.linux-amd64.tar.gz +tar -C /usr/local -xvf go1.20.2.linux-amd64.tar.gz +mv go1.20.2.linux-amd64.tar.gz /tmp +echo "PATH=\$PATH:/usr/local/go/bin" >> /etc/profile +echo "PATH=\$PATH:/usr/local/go/bin" >> ~/.bashrc +source /etc/profile +go version +go env -w GO111MODULE=on +go env -w GOPROXY=https://goproxy.cn,direct +``` +* Download the Source Code + + Clone the repository in any directory: +```php +git clone https://github.com/taoshihan1991/goflylivechat.git +cd goflylivechat + ``` +* Initialize the Database + ```php + go run gofly.go install + ``` +* Run the Application +```php + go run gofly.go server + ``` +* ​​Build executable +```php + go build -o gochat +``` +* ​​Run binary​​: +```php + Linux: ./gochat server (optional flags: -p 8082 -d) + + Windows: gochat.exe server (optional flags: -p 8082 -d) +``` +* Terminate the Process +```php + killall gochat +``` + +Once running, the service listens on port 8081. Access via http://[your-ip]:8081. + +For domain access, configure a reverse proxy to port 8081 to hide the port number. +### Customer Service Integration +Chat Link + +http://127.0.0.1:8081/livechat?kefu_id=agent + +Popup Integration + +``` + (function(a, b, c, d) { + let h = b.getElementsByTagName('head')[0];let s = b.createElement('script'); + s.type = 'text/javascript';s.src = c+"/static/js/kefu-front.js";s.onload = s.onreadystatechange = function () { + if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") d(c); + };h.appendChild(s); + })(window, document,"http://127.0.0.1:8081",function(u){ + KEFU.init({ + KEFU_URL:u, + KEFU_KEFU_ID: "agent", + }) + }); + +``` +### Important Notice +The use of this project for illegal or non-compliant purposes, including but not limited to viruses, trojans, pornography, gambling, fraud, prohibited items, counterfeit products, false information, cryptocurrencies, and financial violations, is strictly prohibited. + +This project is intended solely for personal learning and testing purposes. Any commercial use or illegal activities are explicitly forbidden!!! + + + +### Copyright Notice +This project provides full-featured code but is intended ​​only for personal demonstration and testing​​. Commercial use is strictly prohibited. + +By using this software, you agree to comply with all applicable local laws and regulations. ​​You are solely responsible for any legal consequences arising from misuse.​ \ No newline at end of file diff --git a/router/api.go b/router/api.go new file mode 100644 index 0000000..db79088 --- /dev/null +++ b/router/api.go @@ -0,0 +1,98 @@ +package router + +import ( + "ai-css/controller" + "ai-css/middleware" + "ai-css/ws" + + "github.com/gin-gonic/gin" +) + +func InitApiRouter(engine *gin.Engine) { + //路由分组 + v2 := engine.Group("/2") + { + //获取消息 + v2.GET("/messages", controller.GetMessagesV2) + //发送单条信息 + v2.POST("/message", middleware.Ipblack, controller.SendMessageV2) + //关闭连接 + v2.GET("/message_close", controller.SendCloseMessageV2) + //分页查询消息 + v2.GET("/messagesPages", controller.GetMessagespages) + } + engine.GET("/captcha", controller.GetCaptcha) + engine.POST("/check", controller.LoginCheckPass) + + engine.GET("/userinfo", middleware.JwtApiMiddleware, controller.GetKefuInfoAll) + engine.POST("/register", middleware.Ipblack, controller.PostKefuRegister) + engine.POST("/install", controller.PostInstall) + //前后聊天 + engine.GET("/ws_kefu", middleware.JwtApiMiddleware, ws.NewKefuServer) + engine.GET("/ws_visitor", middleware.Ipblack, ws.NewVisitorServer) + + engine.GET("/messages", controller.GetVisitorMessage) + engine.GET("/message_notice", controller.SendVisitorNotice) + //上传文件 + engine.POST("/uploadimg", middleware.Ipblack, controller.UploadImg) + //上传文件 + engine.POST("/uploadfile", middleware.Ipblack, controller.UploadFile) + //获取未读消息数 + engine.GET("/message_status", controller.GetVisitorMessage) + //设置消息已读 + engine.POST("/message_status", controller.GetVisitorMessage) + + //获取客服信息 + engine.GET("/kefu_idle", controller.GetIdleKefu) + engine.POST("/kefuinfo_client", middleware.JwtApiMiddleware, controller.PostKefuClient) + engine.GET("/kefuinfo", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.GetKefuInfo) + engine.GET("/kefuinfo_setting", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.GetKefuInfoSetting) + engine.POST("/kefuinfo", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.PostKefuInfo) + engine.DELETE("/kefuinfo", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.DeleteKefuInfo) + engine.GET("/kefulist", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.GetKefuList) + engine.GET("/other_kefulist", middleware.JwtApiMiddleware, controller.GetOtherKefuList) + engine.GET("/trans_kefu", middleware.JwtApiMiddleware, controller.PostTransKefu) + engine.POST("/modifypass", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.PostKefuPass) + engine.POST("/modifyavator", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.PostKefuAvator) + //角色列表 + engine.GET("/roles", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.GetRoleList) + engine.POST("/role", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.PostRole) + + engine.GET("/visitors_online", controller.GetVisitorOnlines) + engine.GET("/visitors_kefu_online", middleware.JwtApiMiddleware, controller.GetKefusVisitorOnlines) + engine.GET("/clear_online_tcp", controller.DeleteOnlineTcp) + engine.POST("/visitor_login", middleware.Ipblack, controller.PostVisitorLogin) + //engine.POST("/visitor", controller.PostVisitor) + engine.GET("/visitor", middleware.JwtApiMiddleware, controller.GetVisitor) + engine.GET("/visitors", middleware.JwtApiMiddleware, controller.GetVisitors) + engine.GET("/statistics", middleware.JwtApiMiddleware, controller.GetStatistics) + //前台接口 + engine.GET("/about", controller.GetAbout) + engine.POST("/about", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.PostAbout) + engine.GET("/aboutpages", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.GetAbouts) + engine.GET("/notice", controller.GetNotice) + engine.POST("/ipblack", middleware.JwtApiMiddleware, middleware.Ipblack, controller.PostIpblack) + engine.DELETE("/ipblack", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.DelIpblack) + engine.GET("/ipblacks_all", middleware.JwtApiMiddleware, controller.GetIpblacks) + engine.GET("/ipblacks", middleware.JwtApiMiddleware, controller.GetIpblacksByKefuId) + engine.GET("/configs", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.GetConfigs) + engine.POST("/config", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.PostConfig) + engine.GET("/config", controller.GetConfig) + engine.GET("/autoreply", controller.GetAutoReplys) + engine.GET("/replys", middleware.JwtApiMiddleware, controller.GetReplys) + engine.POST("/reply", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.PostReply) + engine.POST("/reply_content", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.PostReplyContent) + engine.POST("/reply_content_save", middleware.JwtApiMiddleware, controller.PostReplyContentSave) + engine.DELETE("/reply_content", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.DelReplyContent) + engine.DELETE("/reply", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.DelReplyGroup) + engine.POST("/reply_search", middleware.JwtApiMiddleware, controller.PostReplySearch) + //客服路由分组 + kefuGroup := engine.Group("/kefu") + kefuGroup.Use(middleware.JwtApiMiddleware) + { + kefuGroup.GET("/chartStatistics", controller.GetChartStatistic) + kefuGroup.POST("/message", controller.SendKefuMessage) + } + //微信接口 + engine.GET("/micro_program", middleware.JwtApiMiddleware, controller.GetCheckWeixinSign) +} diff --git a/router/view.go b/router/view.go new file mode 100644 index 0000000..2935ab4 --- /dev/null +++ b/router/view.go @@ -0,0 +1,32 @@ +package router + +import ( + "ai-css/middleware" + "ai-css/tmpl" + "github.com/gin-gonic/gin" +) + +func InitViewRouter(engine *gin.Engine) { + engine.GET("/", tmpl.PageIndex) + + engine.GET("/login", tmpl.PageLogin) + engine.GET("/pannel", tmpl.PagePannel) + engine.GET("/chatIndex", tmpl.PageChat) + engine.GET("/livechat", tmpl.PageChat) + engine.GET("/main", middleware.JwtPageMiddleware, tmpl.PageMain) + engine.GET("/chat_main", middleware.JwtPageMiddleware, middleware.DomainLimitMiddleware, tmpl.PageChatMain) + engine.GET("/setting", middleware.DomainLimitMiddleware, tmpl.PageSetting) + engine.GET("/setting_statistics", tmpl.PageSettingStatis) + engine.GET("/setting_indexpage", tmpl.PageSettingIndexPage) + engine.GET("/setting_indexpages", tmpl.PageSettingIndexPages) + engine.GET("/setting_mysql", tmpl.PageSettingMysql) + engine.GET("/setting_welcome", tmpl.PageSettingWelcome) + engine.GET("/setting_deploy", tmpl.PageSettingDeploy) + engine.GET("/setting_kefu_list", tmpl.PageKefuList) + engine.GET("/setting_avator", tmpl.PageAvator) + engine.GET("/setting_modifypass", tmpl.PageModifypass) + engine.GET("/setting_ipblack", tmpl.PageIpblack) + engine.GET("/setting_config", tmpl.PageConfig) + engine.GET("/mail_list", tmpl.PageMailList) + engine.GET("/roles_list", tmpl.PageRoleList) +} diff --git a/start.bat b/start.bat new file mode 100644 index 0000000..2271c68 --- /dev/null +++ b/start.bat @@ -0,0 +1,2 @@ +go-fly.exe server +pause \ No newline at end of file diff --git a/static/cdn/element-ui/2.15.1/index.js b/static/cdn/element-ui/2.15.1/index.js new file mode 100644 index 0000000..12f66a1 --- /dev/null +++ b/static/cdn/element-ui/2.15.1/index.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("vue")):"function"==typeof define&&define.amd?define("ELEMENT",["vue"],t):"object"==typeof exports?exports.ELEMENT=t(require("vue")):e.ELEMENT=t(e.Vue)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/dist/",i(i.s=49)}([function(t,i){t.exports=e},function(e,t,i){var n=i(4);e.exports=function(e,t,i){return void 0===i?n(e,t,!1):n(e,i,!1!==t)}},function(e,t,i){var n;!function(r){"use strict";var s={},a=/d{1,4}|M{1,4}|yy(?:yy)?|S{1,3}|Do|ZZ|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g,o="[^\\s]+",l=/\[([^]*?)\]/gm,u=function(){};function c(e,t){for(var i=[],n=0,r=e.length;n3?0:(e-e%10!=10)*e%10]}};var g={D:function(e){return e.getDay()},DD:function(e){return d(e.getDay())},Do:function(e,t){return t.DoFn(e.getDate())},d:function(e){return e.getDate()},dd:function(e){return d(e.getDate())},ddd:function(e,t){return t.dayNamesShort[e.getDay()]},dddd:function(e,t){return t.dayNames[e.getDay()]},M:function(e){return e.getMonth()+1},MM:function(e){return d(e.getMonth()+1)},MMM:function(e,t){return t.monthNamesShort[e.getMonth()]},MMMM:function(e,t){return t.monthNames[e.getMonth()]},yy:function(e){return d(String(e.getFullYear()),4).substr(2)},yyyy:function(e){return d(e.getFullYear(),4)},h:function(e){return e.getHours()%12||12},hh:function(e){return d(e.getHours()%12||12)},H:function(e){return e.getHours()},HH:function(e){return d(e.getHours())},m:function(e){return e.getMinutes()},mm:function(e){return d(e.getMinutes())},s:function(e){return e.getSeconds()},ss:function(e){return d(e.getSeconds())},S:function(e){return Math.round(e.getMilliseconds()/100)},SS:function(e){return d(Math.round(e.getMilliseconds()/10),2)},SSS:function(e){return d(e.getMilliseconds(),3)},a:function(e,t){return e.getHours()<12?t.amPm[0]:t.amPm[1]},A:function(e,t){return e.getHours()<12?t.amPm[0].toUpperCase():t.amPm[1].toUpperCase()},ZZ:function(e){var t=e.getTimezoneOffset();return(t>0?"-":"+")+d(100*Math.floor(Math.abs(t)/60)+Math.abs(t)%60,4)}},b={d:["\\d\\d?",function(e,t){e.day=t}],Do:["\\d\\d?"+o,function(e,t){e.day=parseInt(t,10)}],M:["\\d\\d?",function(e,t){e.month=t-1}],yy:["\\d\\d?",function(e,t){var i=+(""+(new Date).getFullYear()).substr(0,2);e.year=""+(t>68?i-1:i)+t}],h:["\\d\\d?",function(e,t){e.hour=t}],m:["\\d\\d?",function(e,t){e.minute=t}],s:["\\d\\d?",function(e,t){e.second=t}],yyyy:["\\d{4}",function(e,t){e.year=t}],S:["\\d",function(e,t){e.millisecond=100*t}],SS:["\\d{2}",function(e,t){e.millisecond=10*t}],SSS:["\\d{3}",function(e,t){e.millisecond=t}],D:["\\d\\d?",u],ddd:[o,u],MMM:[o,h("monthNamesShort")],MMMM:[o,h("monthNames")],a:[o,function(e,t,i){var n=t.toLowerCase();n===i.amPm[0]?e.isPm=!1:n===i.amPm[1]&&(e.isPm=!0)}],ZZ:["[^\\s]*?[\\+\\-]\\d\\d:?\\d\\d|[^\\s]*?Z",function(e,t){var i,n=(t+"").match(/([+-]|\d\d)/gi);n&&(i=60*n[1]+parseInt(n[2],10),e.timezoneOffset="+"===n[0]?i:-i)}]};b.dd=b.d,b.dddd=b.ddd,b.DD=b.D,b.mm=b.m,b.hh=b.H=b.HH=b.h,b.MM=b.M,b.ss=b.s,b.A=b.a,s.masks={default:"ddd MMM dd yyyy HH:mm:ss",shortDate:"M/D/yy",mediumDate:"MMM d, yyyy",longDate:"MMMM d, yyyy",fullDate:"dddd, MMMM d, yyyy",shortTime:"HH:mm",mediumTime:"HH:mm:ss",longTime:"HH:mm:ss.SSS"},s.format=function(e,t,i){var n=i||s.i18n;if("number"==typeof e&&(e=new Date(e)),"[object Date]"!==Object.prototype.toString.call(e)||isNaN(e.getTime()))throw new Error("Invalid Date in fecha.format");t=s.masks[t]||t||s.masks.default;var r=[];return(t=(t=t.replace(l,function(e,t){return r.push(t),"@@@"})).replace(a,function(t){return t in g?g[t](e,n):t.slice(1,t.length-1)})).replace(/@@@/g,function(){return r.shift()})},s.parse=function(e,t,i){var n=i||s.i18n;if("string"!=typeof t)throw new Error("Invalid format in fecha.parse");if(t=s.masks[t]||t,e.length>1e3)return null;var r={},o=[],u=[];t=t.replace(l,function(e,t){return u.push(t),"@@@"});var c,h=(c=t,c.replace(/[|\\{()[^$+*?.-]/g,"\\$&")).replace(a,function(e){if(b[e]){var t=b[e];return o.push(t[1]),"("+t[0]+")"}return e});h=h.replace(/@@@/g,function(){return u.shift()});var d=e.match(new RegExp(h,"i"));if(!d)return null;for(var p=1;pe?u():!0!==t&&(r=setTimeout(n?function(){r=void 0}:u,void 0===n?e-o:e))}}},function(e,t){var i=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=i)},function(e,t){var i=/^(attrs|props|on|nativeOn|class|style|hook)$/;function n(e,t){return function(){e&&e.apply(this,arguments),t&&t.apply(this,arguments)}}e.exports=function(e){return e.reduce(function(e,t){var r,s,a,o,l;for(a in t)if(r=e[a],s=t[a],r&&i.test(a))if("class"===a&&("string"==typeof r&&(l=r,e[a]=r={},r[l]=!0),"string"==typeof s&&(l=s,t[a]=s={},s[l]=!0)),"on"===a||"nativeOn"===a||"hook"===a)for(o in s)r[o]=n(r[o],s[o]);else if(Array.isArray(r))e[a]=r.concat(s);else if(Array.isArray(s))e[a]=[r].concat(s);else for(o in s)r[o]=s[o];else e[a]=t[a];return e},{})}},function(e,t){var i={}.hasOwnProperty;e.exports=function(e,t){return i.call(e,t)}},function(e,t,i){"use strict";t.__esModule=!0;var n,r=i(56),s=(n=r)&&n.__esModule?n:{default:n};t.default=s.default||function(e){for(var t=1;t0?n:i)(e)}},function(e,t,i){var n=i(28)("keys"),r=i(21);e.exports=function(e){return n[e]||(n[e]=r(e))}},function(e,t,i){var n=i(14),r=i(5),s=r["__core-js_shared__"]||(r["__core-js_shared__"]={});(e.exports=function(e,t){return s[e]||(s[e]=void 0!==t?t:{})})("versions",[]).push({version:n.version,mode:i(20)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t){e.exports={}},function(e,t,i){var n=i(10).f,r=i(7),s=i(13)("toStringTag");e.exports=function(e,t,i){e&&!r(e=i?e:e.prototype,s)&&n(e,s,{configurable:!0,value:t})}},function(e,t,i){t.f=i(13)},function(e,t,i){var n=i(5),r=i(14),s=i(20),a=i(33),o=i(10).f;e.exports=function(e){var t=r.Symbol||(r.Symbol=s?{}:n.Symbol||{});"_"==e.charAt(0)||e in t||o(t,e,{value:a.f(e)})}},function(e,t,i){var n=i(4),r=i(1);e.exports={throttle:n,debounce:r}},function(e,t,i){e.exports=!i(11)&&!i(16)(function(){return 7!=Object.defineProperty(i(37)("div"),"a",{get:function(){return 7}}).a})},function(e,t,i){var n=i(15),r=i(5).document,s=n(r)&&n(r.createElement);e.exports=function(e){return s?r.createElement(e):{}}},function(e,t,i){var n=i(7),r=i(12),s=i(62)(!1),a=i(27)("IE_PROTO");e.exports=function(e,t){var i,o=r(e),l=0,u=[];for(i in o)i!=a&&n(o,i)&&u.push(i);for(;t.length>l;)n(o,i=t[l++])&&(~s(u,i)||u.push(i));return u}},function(e,t,i){var n=i(40);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==n(e)?e.split(""):Object(e)}},function(e,t){var i={}.toString;e.exports=function(e){return i.call(e).slice(8,-1)}},function(e,t,i){var n=i(25);e.exports=function(e){return Object(n(e))}},function(e,t,i){"use strict";var n=i(20),r=i(23),s=i(43),a=i(9),o=i(31),l=i(69),u=i(32),c=i(72),h=i(13)("iterator"),d=!([].keys&&"next"in[].keys()),p=function(){return this};e.exports=function(e,t,i,f,m,v,g){l(i,t,f);var b,y,w,_=function(e){if(!d&&e in S)return S[e];switch(e){case"keys":case"values":return function(){return new i(this,e)}}return function(){return new i(this,e)}},x=t+" Iterator",C="values"==m,k=!1,S=e.prototype,D=S[h]||S["@@iterator"]||m&&S[m],$=D||_(m),E=m?C?_("entries"):$:void 0,T="Array"==t&&S.entries||D;if(T&&(w=c(T.call(new e)))!==Object.prototype&&w.next&&(u(w,x,!0),n||"function"==typeof w[h]||a(w,h,p)),C&&D&&"values"!==D.name&&(k=!0,$=function(){return D.call(this)}),n&&!g||!d&&!k&&S[h]||a(S,h,$),o[t]=$,o[x]=p,m)if(b={values:C?$:_("values"),keys:v?$:_("keys"),entries:E},g)for(y in b)y in S||s(S,y,b[y]);else r(r.P+r.F*(d||k),t,b);return b}},function(e,t,i){e.exports=i(9)},function(e,t,i){var n=i(17),r=i(70),s=i(29),a=i(27)("IE_PROTO"),o=function(){},l=function(){var e,t=i(37)("iframe"),n=s.length;for(t.style.display="none",i(71).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" + \ No newline at end of file diff --git a/static/images/0.jpg b/static/images/0.jpg new file mode 100644 index 0000000..267013a Binary files /dev/null and b/static/images/0.jpg differ diff --git a/static/images/1.jpg b/static/images/1.jpg new file mode 100644 index 0000000..291d3a3 Binary files /dev/null and b/static/images/1.jpg differ diff --git a/static/images/1.png b/static/images/1.png new file mode 100644 index 0000000..5f1c076 Binary files /dev/null and b/static/images/1.png differ diff --git a/static/images/10.jpg b/static/images/10.jpg new file mode 100644 index 0000000..10ea98d Binary files /dev/null and b/static/images/10.jpg differ diff --git a/static/images/11.jpg b/static/images/11.jpg new file mode 100644 index 0000000..98f88fa Binary files /dev/null and b/static/images/11.jpg differ diff --git a/static/images/12.jpg b/static/images/12.jpg new file mode 100644 index 0000000..b7304d3 Binary files /dev/null and b/static/images/12.jpg differ diff --git a/static/images/13.jpg b/static/images/13.jpg new file mode 100644 index 0000000..8f9085a Binary files /dev/null and b/static/images/13.jpg differ diff --git a/static/images/14.jpg b/static/images/14.jpg new file mode 100644 index 0000000..288114e Binary files /dev/null and b/static/images/14.jpg differ diff --git a/static/images/2.jpg b/static/images/2.jpg new file mode 100644 index 0000000..3b04794 Binary files /dev/null and b/static/images/2.jpg differ diff --git a/static/images/2.png b/static/images/2.png new file mode 100644 index 0000000..23d05fc Binary files /dev/null and b/static/images/2.png differ diff --git a/static/images/3.jpg b/static/images/3.jpg new file mode 100644 index 0000000..0ec2ce0 Binary files /dev/null and b/static/images/3.jpg differ diff --git a/static/images/3.png b/static/images/3.png new file mode 100644 index 0000000..29372bc Binary files /dev/null and b/static/images/3.png differ diff --git a/static/images/4.jpg b/static/images/4.jpg new file mode 100644 index 0000000..7de2a02 Binary files /dev/null and b/static/images/4.jpg differ diff --git a/static/images/5.jpg b/static/images/5.jpg new file mode 100644 index 0000000..a18404f Binary files /dev/null and b/static/images/5.jpg differ diff --git a/static/images/6.jpg b/static/images/6.jpg new file mode 100644 index 0000000..7d9461a Binary files /dev/null and b/static/images/6.jpg differ diff --git a/static/images/7.jpg b/static/images/7.jpg new file mode 100644 index 0000000..88eb157 Binary files /dev/null and b/static/images/7.jpg differ diff --git a/static/images/8.jpg b/static/images/8.jpg new file mode 100644 index 0000000..26adf8b Binary files /dev/null and b/static/images/8.jpg differ diff --git a/static/images/9.jpg b/static/images/9.jpg new file mode 100644 index 0000000..b20da5d Binary files /dev/null and b/static/images/9.jpg differ diff --git a/static/images/admin.jpg b/static/images/admin.jpg new file mode 100644 index 0000000..e63bc54 Binary files /dev/null and b/static/images/admin.jpg differ diff --git a/static/images/admin.png b/static/images/admin.png new file mode 100644 index 0000000..a1020d6 Binary files /dev/null and b/static/images/admin.png differ diff --git a/static/images/alert.mp3 b/static/images/alert.mp3 new file mode 100644 index 0000000..90013c5 Binary files /dev/null and b/static/images/alert.mp3 differ diff --git a/static/images/alert2.ogg b/static/images/alert2.ogg new file mode 100644 index 0000000..4c60d08 Binary files /dev/null and b/static/images/alert2.ogg differ diff --git a/static/images/attachent.png b/static/images/attachent.png new file mode 100644 index 0000000..8fc052e Binary files /dev/null and b/static/images/attachent.png differ diff --git a/static/images/avator.jpg b/static/images/avator.jpg new file mode 100644 index 0000000..39b703e Binary files /dev/null and b/static/images/avator.jpg differ diff --git a/static/images/computer.png b/static/images/computer.png new file mode 100644 index 0000000..8cd7fd6 Binary files /dev/null and b/static/images/computer.png differ diff --git a/static/images/ext/7z.png b/static/images/ext/7z.png new file mode 100644 index 0000000..cb57a48 Binary files /dev/null and b/static/images/ext/7z.png differ diff --git a/static/images/ext/BAT.png b/static/images/ext/BAT.png new file mode 100644 index 0000000..dada5a6 Binary files /dev/null and b/static/images/ext/BAT.png differ diff --git a/static/images/ext/BMP.png b/static/images/ext/BMP.png new file mode 100644 index 0000000..3f1bea1 Binary files /dev/null and b/static/images/ext/BMP.png differ diff --git a/static/images/ext/DOC.png b/static/images/ext/DOC.png new file mode 100644 index 0000000..ced8867 Binary files /dev/null and b/static/images/ext/DOC.png differ diff --git a/static/images/ext/DOCX.png b/static/images/ext/DOCX.png new file mode 100644 index 0000000..d6ba7dd Binary files /dev/null and b/static/images/ext/DOCX.png differ diff --git a/static/images/ext/JPEG.png b/static/images/ext/JPEG.png new file mode 100644 index 0000000..73dbc9b Binary files /dev/null and b/static/images/ext/JPEG.png differ diff --git a/static/images/ext/JPG.png b/static/images/ext/JPG.png new file mode 100644 index 0000000..c0428e0 Binary files /dev/null and b/static/images/ext/JPG.png differ diff --git a/static/images/ext/MP3.png b/static/images/ext/MP3.png new file mode 100644 index 0000000..421b61e Binary files /dev/null and b/static/images/ext/MP3.png differ diff --git a/static/images/ext/MP4.png b/static/images/ext/MP4.png new file mode 100644 index 0000000..2f92535 Binary files /dev/null and b/static/images/ext/MP4.png differ diff --git a/static/images/ext/MPGE.png b/static/images/ext/MPGE.png new file mode 100644 index 0000000..9de071c Binary files /dev/null and b/static/images/ext/MPGE.png differ diff --git a/static/images/ext/PDF.png b/static/images/ext/PDF.png new file mode 100644 index 0000000..fb55fa0 Binary files /dev/null and b/static/images/ext/PDF.png differ diff --git a/static/images/ext/PNG.png b/static/images/ext/PNG.png new file mode 100644 index 0000000..a61d93b Binary files /dev/null and b/static/images/ext/PNG.png differ diff --git a/static/images/ext/PPT.png b/static/images/ext/PPT.png new file mode 100644 index 0000000..b16d68a Binary files /dev/null and b/static/images/ext/PPT.png differ diff --git a/static/images/ext/RAR.png b/static/images/ext/RAR.png new file mode 100644 index 0000000..535b537 Binary files /dev/null and b/static/images/ext/RAR.png differ diff --git a/static/images/ext/SVG.png b/static/images/ext/SVG.png new file mode 100644 index 0000000..2d38f83 Binary files /dev/null and b/static/images/ext/SVG.png differ diff --git a/static/images/ext/TAR.png b/static/images/ext/TAR.png new file mode 100644 index 0000000..ffb0288 Binary files /dev/null and b/static/images/ext/TAR.png differ diff --git a/static/images/ext/TXT.png b/static/images/ext/TXT.png new file mode 100644 index 0000000..d7207b4 Binary files /dev/null and b/static/images/ext/TXT.png differ diff --git a/static/images/ext/XLSX.png b/static/images/ext/XLSX.png new file mode 100644 index 0000000..84d9d28 Binary files /dev/null and b/static/images/ext/XLSX.png differ diff --git a/static/images/ext/ZIP.png b/static/images/ext/ZIP.png new file mode 100644 index 0000000..d728c2e Binary files /dev/null and b/static/images/ext/ZIP.png differ diff --git a/static/images/ext/default.png b/static/images/ext/default.png new file mode 100644 index 0000000..fbb24d5 Binary files /dev/null and b/static/images/ext/default.png differ diff --git a/static/images/ext/voice.png b/static/images/ext/voice.png new file mode 100644 index 0000000..16289ad Binary files /dev/null and b/static/images/ext/voice.png differ diff --git a/static/images/face/0.gif b/static/images/face/0.gif new file mode 100644 index 0000000..a63f0d5 Binary files /dev/null and b/static/images/face/0.gif differ diff --git a/static/images/face/1.gif b/static/images/face/1.gif new file mode 100644 index 0000000..b2b78b2 Binary files /dev/null and b/static/images/face/1.gif differ diff --git a/static/images/face/10.gif b/static/images/face/10.gif new file mode 100644 index 0000000..556c7e3 Binary files /dev/null and b/static/images/face/10.gif differ diff --git a/static/images/face/11.gif b/static/images/face/11.gif new file mode 100644 index 0000000..2bfc58b Binary files /dev/null and b/static/images/face/11.gif differ diff --git a/static/images/face/12.gif b/static/images/face/12.gif new file mode 100644 index 0000000..1c321c7 Binary files /dev/null and b/static/images/face/12.gif differ diff --git a/static/images/face/13.gif b/static/images/face/13.gif new file mode 100644 index 0000000..300bbc2 Binary files /dev/null and b/static/images/face/13.gif differ diff --git a/static/images/face/14.gif b/static/images/face/14.gif new file mode 100644 index 0000000..43b6d0a Binary files /dev/null and b/static/images/face/14.gif differ diff --git a/static/images/face/15.gif b/static/images/face/15.gif new file mode 100644 index 0000000..c9f25fa Binary files /dev/null and b/static/images/face/15.gif differ diff --git a/static/images/face/16.gif b/static/images/face/16.gif new file mode 100644 index 0000000..34f28e4 Binary files /dev/null and b/static/images/face/16.gif differ diff --git a/static/images/face/17.gif b/static/images/face/17.gif new file mode 100644 index 0000000..39cd035 Binary files /dev/null and b/static/images/face/17.gif differ diff --git a/static/images/face/18.gif b/static/images/face/18.gif new file mode 100644 index 0000000..7bce299 Binary files /dev/null and b/static/images/face/18.gif differ diff --git a/static/images/face/19.gif b/static/images/face/19.gif new file mode 100644 index 0000000..adac542 Binary files /dev/null and b/static/images/face/19.gif differ diff --git a/static/images/face/2.gif b/static/images/face/2.gif new file mode 100644 index 0000000..7edbb58 Binary files /dev/null and b/static/images/face/2.gif differ diff --git a/static/images/face/20.gif b/static/images/face/20.gif new file mode 100644 index 0000000..50631a6 Binary files /dev/null and b/static/images/face/20.gif differ diff --git a/static/images/face/21.gif b/static/images/face/21.gif new file mode 100644 index 0000000..b984212 Binary files /dev/null and b/static/images/face/21.gif differ diff --git a/static/images/face/22.gif b/static/images/face/22.gif new file mode 100644 index 0000000..1f0bd8b Binary files /dev/null and b/static/images/face/22.gif differ diff --git a/static/images/face/23.gif b/static/images/face/23.gif new file mode 100644 index 0000000..e05e0f9 Binary files /dev/null and b/static/images/face/23.gif differ diff --git a/static/images/face/24.gif b/static/images/face/24.gif new file mode 100644 index 0000000..f35928a Binary files /dev/null and b/static/images/face/24.gif differ diff --git a/static/images/face/25.gif b/static/images/face/25.gif new file mode 100644 index 0000000..0b4a883 Binary files /dev/null and b/static/images/face/25.gif differ diff --git a/static/images/face/26.gif b/static/images/face/26.gif new file mode 100644 index 0000000..45c4fb5 Binary files /dev/null and b/static/images/face/26.gif differ diff --git a/static/images/face/27.gif b/static/images/face/27.gif new file mode 100644 index 0000000..7a4c013 Binary files /dev/null and b/static/images/face/27.gif differ diff --git a/static/images/face/28.gif b/static/images/face/28.gif new file mode 100644 index 0000000..fc5a0cf Binary files /dev/null and b/static/images/face/28.gif differ diff --git a/static/images/face/29.gif b/static/images/face/29.gif new file mode 100644 index 0000000..5dd7442 Binary files /dev/null and b/static/images/face/29.gif differ diff --git a/static/images/face/3.gif b/static/images/face/3.gif new file mode 100644 index 0000000..86df67b Binary files /dev/null and b/static/images/face/3.gif differ diff --git a/static/images/face/30.gif b/static/images/face/30.gif new file mode 100644 index 0000000..b751f98 Binary files /dev/null and b/static/images/face/30.gif differ diff --git a/static/images/face/31.gif b/static/images/face/31.gif new file mode 100644 index 0000000..c9476d7 Binary files /dev/null and b/static/images/face/31.gif differ diff --git a/static/images/face/32.gif b/static/images/face/32.gif new file mode 100644 index 0000000..9931b06 Binary files /dev/null and b/static/images/face/32.gif differ diff --git a/static/images/face/33.gif b/static/images/face/33.gif new file mode 100644 index 0000000..59111a3 Binary files /dev/null and b/static/images/face/33.gif differ diff --git a/static/images/face/34.gif b/static/images/face/34.gif new file mode 100644 index 0000000..a334548 Binary files /dev/null and b/static/images/face/34.gif differ diff --git a/static/images/face/35.gif b/static/images/face/35.gif new file mode 100644 index 0000000..a932264 Binary files /dev/null and b/static/images/face/35.gif differ diff --git a/static/images/face/36.gif b/static/images/face/36.gif new file mode 100644 index 0000000..6de432a Binary files /dev/null and b/static/images/face/36.gif differ diff --git a/static/images/face/37.gif b/static/images/face/37.gif new file mode 100644 index 0000000..d05f2da Binary files /dev/null and b/static/images/face/37.gif differ diff --git a/static/images/face/38.gif b/static/images/face/38.gif new file mode 100644 index 0000000..8b1c88a Binary files /dev/null and b/static/images/face/38.gif differ diff --git a/static/images/face/39.gif b/static/images/face/39.gif new file mode 100644 index 0000000..38b84a5 Binary files /dev/null and b/static/images/face/39.gif differ diff --git a/static/images/face/4.gif b/static/images/face/4.gif new file mode 100644 index 0000000..d52200c Binary files /dev/null and b/static/images/face/4.gif differ diff --git a/static/images/face/40.gif b/static/images/face/40.gif new file mode 100644 index 0000000..ae42991 Binary files /dev/null and b/static/images/face/40.gif differ diff --git a/static/images/face/41.gif b/static/images/face/41.gif new file mode 100644 index 0000000..b9c715c Binary files /dev/null and b/static/images/face/41.gif differ diff --git a/static/images/face/42.gif b/static/images/face/42.gif new file mode 100644 index 0000000..0eb1434 Binary files /dev/null and b/static/images/face/42.gif differ diff --git a/static/images/face/43.gif b/static/images/face/43.gif new file mode 100644 index 0000000..ac0b700 Binary files /dev/null and b/static/images/face/43.gif differ diff --git a/static/images/face/44.gif b/static/images/face/44.gif new file mode 100644 index 0000000..ad44497 Binary files /dev/null and b/static/images/face/44.gif differ diff --git a/static/images/face/45.gif b/static/images/face/45.gif new file mode 100644 index 0000000..6837fca Binary files /dev/null and b/static/images/face/45.gif differ diff --git a/static/images/face/46.gif b/static/images/face/46.gif new file mode 100644 index 0000000..d62916d Binary files /dev/null and b/static/images/face/46.gif differ diff --git a/static/images/face/47.gif b/static/images/face/47.gif new file mode 100644 index 0000000..58a0836 Binary files /dev/null and b/static/images/face/47.gif differ diff --git a/static/images/face/48.gif b/static/images/face/48.gif new file mode 100644 index 0000000..7ffd161 Binary files /dev/null and b/static/images/face/48.gif differ diff --git a/static/images/face/49.gif b/static/images/face/49.gif new file mode 100644 index 0000000..959b992 Binary files /dev/null and b/static/images/face/49.gif differ diff --git a/static/images/face/5.gif b/static/images/face/5.gif new file mode 100644 index 0000000..4e8b09f Binary files /dev/null and b/static/images/face/5.gif differ diff --git a/static/images/face/50.gif b/static/images/face/50.gif new file mode 100644 index 0000000..6e22e7f Binary files /dev/null and b/static/images/face/50.gif differ diff --git a/static/images/face/51.gif b/static/images/face/51.gif new file mode 100644 index 0000000..ad3f4d3 Binary files /dev/null and b/static/images/face/51.gif differ diff --git a/static/images/face/52.gif b/static/images/face/52.gif new file mode 100644 index 0000000..39f8a22 Binary files /dev/null and b/static/images/face/52.gif differ diff --git a/static/images/face/53.gif b/static/images/face/53.gif new file mode 100644 index 0000000..a181ee7 Binary files /dev/null and b/static/images/face/53.gif differ diff --git a/static/images/face/54.gif b/static/images/face/54.gif new file mode 100644 index 0000000..e289d92 Binary files /dev/null and b/static/images/face/54.gif differ diff --git a/static/images/face/55.gif b/static/images/face/55.gif new file mode 100644 index 0000000..4351083 Binary files /dev/null and b/static/images/face/55.gif differ diff --git a/static/images/face/56.gif b/static/images/face/56.gif new file mode 100644 index 0000000..e0eff22 Binary files /dev/null and b/static/images/face/56.gif differ diff --git a/static/images/face/57.gif b/static/images/face/57.gif new file mode 100644 index 0000000..0bf130f Binary files /dev/null and b/static/images/face/57.gif differ diff --git a/static/images/face/58.gif b/static/images/face/58.gif new file mode 100644 index 0000000..0f06508 Binary files /dev/null and b/static/images/face/58.gif differ diff --git a/static/images/face/59.gif b/static/images/face/59.gif new file mode 100644 index 0000000..7081e4f Binary files /dev/null and b/static/images/face/59.gif differ diff --git a/static/images/face/6.gif b/static/images/face/6.gif new file mode 100644 index 0000000..f7715bf Binary files /dev/null and b/static/images/face/6.gif differ diff --git a/static/images/face/60.gif b/static/images/face/60.gif new file mode 100644 index 0000000..6e15f89 Binary files /dev/null and b/static/images/face/60.gif differ diff --git a/static/images/face/61.gif b/static/images/face/61.gif new file mode 100644 index 0000000..f092d7e Binary files /dev/null and b/static/images/face/61.gif differ diff --git a/static/images/face/62.gif b/static/images/face/62.gif new file mode 100644 index 0000000..7fe4984 Binary files /dev/null and b/static/images/face/62.gif differ diff --git a/static/images/face/63.gif b/static/images/face/63.gif new file mode 100644 index 0000000..cf8e23e Binary files /dev/null and b/static/images/face/63.gif differ diff --git a/static/images/face/64.gif b/static/images/face/64.gif new file mode 100644 index 0000000..a779719 Binary files /dev/null and b/static/images/face/64.gif differ diff --git a/static/images/face/65.gif b/static/images/face/65.gif new file mode 100644 index 0000000..7bb98f2 Binary files /dev/null and b/static/images/face/65.gif differ diff --git a/static/images/face/66.gif b/static/images/face/66.gif new file mode 100644 index 0000000..bb6d077 Binary files /dev/null and b/static/images/face/66.gif differ diff --git a/static/images/face/67.gif b/static/images/face/67.gif new file mode 100644 index 0000000..6e33f7c Binary files /dev/null and b/static/images/face/67.gif differ diff --git a/static/images/face/68.gif b/static/images/face/68.gif new file mode 100644 index 0000000..1a6c400 Binary files /dev/null and b/static/images/face/68.gif differ diff --git a/static/images/face/69.gif b/static/images/face/69.gif new file mode 100644 index 0000000..a02f0b2 Binary files /dev/null and b/static/images/face/69.gif differ diff --git a/static/images/face/7.gif b/static/images/face/7.gif new file mode 100644 index 0000000..e6d4db8 Binary files /dev/null and b/static/images/face/7.gif differ diff --git a/static/images/face/70.gif b/static/images/face/70.gif new file mode 100644 index 0000000..416c5c1 Binary files /dev/null and b/static/images/face/70.gif differ diff --git a/static/images/face/71.gif b/static/images/face/71.gif new file mode 100644 index 0000000..c17d60c Binary files /dev/null and b/static/images/face/71.gif differ diff --git a/static/images/face/8.gif b/static/images/face/8.gif new file mode 100644 index 0000000..66f967b Binary files /dev/null and b/static/images/face/8.gif differ diff --git a/static/images/face/9.gif b/static/images/face/9.gif new file mode 100644 index 0000000..6044740 Binary files /dev/null and b/static/images/face/9.gif differ diff --git a/static/images/fire.svg b/static/images/fire.svg new file mode 100644 index 0000000..e5b26f9 --- /dev/null +++ b/static/images/fire.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/images/image-text.png b/static/images/image-text.png new file mode 100644 index 0000000..0daa058 Binary files /dev/null and b/static/images/image-text.png differ diff --git a/static/images/intro1.jpg b/static/images/intro1.jpg new file mode 100644 index 0000000..1636231 Binary files /dev/null and b/static/images/intro1.jpg differ diff --git a/static/images/intro2.jpg b/static/images/intro2.jpg new file mode 100644 index 0000000..7ab98f8 Binary files /dev/null and b/static/images/intro2.jpg differ diff --git a/static/images/intro3.png b/static/images/intro3.png new file mode 100644 index 0000000..0ff74c4 Binary files /dev/null and b/static/images/intro3.png differ diff --git a/static/images/inviteColorBack1.png b/static/images/inviteColorBack1.png new file mode 100644 index 0000000..a8c8b47 Binary files /dev/null and b/static/images/inviteColorBack1.png differ diff --git a/static/images/logo.png b/static/images/logo.png new file mode 100644 index 0000000..1d1b5df Binary files /dev/null and b/static/images/logo.png differ diff --git a/static/images/newintro1.jpg b/static/images/newintro1.jpg new file mode 100644 index 0000000..18bc792 Binary files /dev/null and b/static/images/newintro1.jpg differ diff --git a/static/images/newintro2.jpg b/static/images/newintro2.jpg new file mode 100644 index 0000000..3baa44e Binary files /dev/null and b/static/images/newintro2.jpg differ diff --git a/static/images/newintro3.jpg b/static/images/newintro3.jpg new file mode 100644 index 0000000..e1b040a Binary files /dev/null and b/static/images/newintro3.jpg differ diff --git a/static/images/phone.png b/static/images/phone.png new file mode 100644 index 0000000..3318a0b Binary files /dev/null and b/static/images/phone.png differ diff --git a/static/images/sent.ogg b/static/images/sent.ogg new file mode 100644 index 0000000..1497a53 Binary files /dev/null and b/static/images/sent.ogg differ diff --git a/static/images/smile.png b/static/images/smile.png new file mode 100644 index 0000000..60026a6 Binary files /dev/null and b/static/images/smile.png differ diff --git a/static/images/visitor_title_bg.png b/static/images/visitor_title_bg.png new file mode 100644 index 0000000..9eab486 Binary files /dev/null and b/static/images/visitor_title_bg.png differ diff --git a/static/images/wechatLogo.png b/static/images/wechatLogo.png new file mode 100644 index 0000000..ba2943e Binary files /dev/null and b/static/images/wechatLogo.png differ diff --git a/static/images/zoom_out.png b/static/images/zoom_out.png new file mode 100644 index 0000000..b8164af Binary files /dev/null and b/static/images/zoom_out.png differ diff --git a/static/js/chat-lang.js b/static/js/chat-lang.js new file mode 100644 index 0000000..080b0f9 --- /dev/null +++ b/static/js/chat-lang.js @@ -0,0 +1,30 @@ +var GOFLY_LANG={ + "cn":{ + "sent":"发送", + "connecting":"正在连接...", + "connectok":"连接成功!", + "chating":"正在与您沟通!", + "historymes":"—— 以上是历史消息 ——", + "moremessage":" 点击加载更多记录", + "copyright":"", + "textarea":"请输入内容", + "closemes":"系统自动关闭连接!点击会重连", + "forceclosemes":"客服关闭连接!请重新打开页面", + "autoclosemes":"长时间未回应关闭连接!请刷新页面", + "mesBtn":"全部消息记录", + }, + "en":{ + "sent":"Send", + "connecting":"connecting...", + "connectok":"connection succeeded!", + "chating":"chating with you!", + "historymes":"—— Today ——", + "moremessage":" click buuton show more messages", + "copyright":"We run on GOFLY0.4.1", + "textarea":"Enter your message", + "closemes":"The system automatically closes the connection!", + "forceclosemes":"Admin closes the connection! please reload", + "autoclosemes":"session closed!please reload", + "mesBtn":"all messages", + }, +}; diff --git a/static/js/chat-main.js b/static/js/chat-main.js new file mode 100644 index 0000000..e69de29 diff --git a/static/js/chat-page.js b/static/js/chat-page.js new file mode 100644 index 0000000..e69de29 diff --git a/static/js/echarts.min.js b/static/js/echarts.min.js new file mode 100644 index 0000000..0d455a5 --- /dev/null +++ b/static/js/echarts.min.js @@ -0,0 +1,45 @@ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).echarts={})}(this,(function(t){"use strict"; + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,n)};function n(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var i=function(){return(i=Object.assign||function(t){for(var e,n=1,i=arguments.length;n18);a&&(n.weChat=!0);e.canvasSupported=!!document.createElement("canvas").getContext,e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&+n.version>=11),e.domSupported="undefined"!=typeof document;var s=document.documentElement.style;e.transform3dSupported=(n.ie&&"transition"in s||n.edge||"WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix||"MozPerspective"in s)&&!("OTransition"in s),e.transformSupported=e.transform3dSupported||n.ie&&+n.version>=9}(navigator.userAgent,a);var s={"[object Function]":!0,"[object RegExp]":!0,"[object Date]":!0,"[object Error]":!0,"[object CanvasGradient]":!0,"[object CanvasPattern]":!0,"[object Image]":!0,"[object Canvas]":!0},l={"[object Int8Array]":!0,"[object Uint8Array]":!0,"[object Uint8ClampedArray]":!0,"[object Int16Array]":!0,"[object Uint16Array]":!0,"[object Int32Array]":!0,"[object Uint32Array]":!0,"[object Float32Array]":!0,"[object Float64Array]":!0},u=Object.prototype.toString,h=Array.prototype,c=h.forEach,p=h.filter,d=h.slice,f=h.map,g=function(){}.constructor,y=g?g.prototype:null,v="__proto__",m={};function _(t,e){m[t]=e}var x=2311;function b(){return x++}function w(){for(var t=[],e=0;e>1)%2;a.style.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[s]+":0",r[l]+":0",i[1-s]+":auto",r[1-l]+":auto",""].join("!important;"),t.appendChild(a),n.push(a)}return n}(e,o),o,r);if(s)return s(t,n,i),!0}return!1}function Zt(t){return"CANVAS"===t.nodeName.toUpperCase()}var jt="undefined"!=typeof window&&!!window.addEventListener,qt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Kt=[];function $t(t,e,n,i){return n=n||{},i||!a.canvasSupported?Jt(t,e,n):a.browser.firefox&&a.browser.version<"39"&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):Jt(t,e,n),n}function Jt(t,e,n){if(a.domSupported&&t.getBoundingClientRect){var i=e.clientX,r=e.clientY;if(Zt(t)){var o=t.getBoundingClientRect();return n.zrX=i-o.left,void(n.zrY=r-o.top)}if(Yt(Kt,t,i,r))return n.zrX=Kt[0],void(n.zrY=Kt[1])}n.zrX=n.zrY=0}function Qt(t){return t||window.event}function te(t,e,n){if(null!=(e=Qt(e)).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&$t(t,r,e,n)}else{$t(t,e,e,n);var o=function(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,i=t.deltaY;if(null==n||null==i)return e;return 3*(0!==i?Math.abs(i):Math.abs(n))*(i>0?-1:i<0?1:n>0?-1:1)}(e);e.zrDelta=o?o/120:-(e.detail||0)/3}var a=e.button;return null==e.which&&void 0!==a&&qt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function ee(t,e,n,i){jt?t.addEventListener(e,n,i):t.attachEvent("on"+e,n)}var ne=jt?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};function ie(t){return 2===t.which||3===t.which}var re=function(){function t(){this._track=[]}return t.prototype.recognize=function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},t.prototype.clear=function(){return this._track.length=0,this},t.prototype._doTrack=function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,a=i.length;o1&&r&&r.length>1){var a=oe(r)/oe(o);!isFinite(a)&&(a=1),e.pinchScale=a;var s=[((i=r)[0][0]+i[1][0])/2,(i[0][1]+i[1][1])/2];return e.pinchX=s[0],e.pinchY=s[1],{type:"pinch",target:t[0].target,event:e}}}}},se="silent";function le(){ne(this.event)}var ue=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.handler=null,e}return n(e,t),e.prototype.dispose=function(){},e.prototype.setCursor=function(){},e}(Ft),he=function(t,e){this.x=t,this.y=e},ce=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],pe=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o._hovered=new he(0,0),o.storage=e,o.painter=n,o.painterRoot=r,i=i||new ue,o.proxy=null,o.setHandlerProxy(i),o._draggingMgr=new Gt(o),o}return n(e,t),e.prototype.setHandlerProxy=function(t){this.proxy&&this.proxy.dispose(),t&&(O(ce,(function(e){t.on&&t.on(e,this[e],this)}),this),t.handler=this),this.proxy=t},e.prototype.mousemove=function(t){var e=t.zrX,n=t.zrY,i=fe(this,e,n),r=this._hovered,o=r.target;o&&!o.__zr&&(o=(r=this.findHover(r.x,r.y)).target);var a=this._hovered=i?new he(e,n):this.findHover(e,n),s=a.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),o&&s!==o&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(a,"mousemove",t),s&&s!==o&&this.dispatchToElement(a,"mouseover",t)},e.prototype.mouseout=function(t){var e=t.zrEventControl;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&this.trigger("globalout",{type:"globalout",event:t})},e.prototype.resize=function(){this._hovered=new he(0,0)},e.prototype.dispatch=function(t,e){var n=this[t];n&&n.call(this,e)},e.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},e.prototype.setCursorStyle=function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},e.prototype.dispatchToElement=function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,o=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:le}}(e,t,n);i&&(i[r]&&(o.cancelBubble=!!i[r].call(i,o)),i.trigger(e,o),i=i.__hostTarget?i.__hostTarget:i.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer((function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)})))}},e.prototype.findHover=function(t,e,n){for(var i=this.storage.getDisplayList(),r=new he(t,e),o=i.length-1;o>=0;o--){var a=void 0;if(i[o]!==n&&!i[o].ignore&&(a=de(i[o],t,e))&&(!r.topTarget&&(r.topTarget=i[o]),a!==se)){r.target=i[o];break}}return r},e.prototype.processGesture=function(t,e){this._gestureMgr||(this._gestureMgr=new re);var n=this._gestureMgr;"start"===e&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&n.clear(),i){var r=i.type;t.gestureEvent=r;var o=new he;o.target=i.target,this.dispatchToElement(o,r,i.event)}},e}(Ft);function de(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i=t,r=void 0,o=!1;i;){if(i.ignoreClip&&(o=!0),!o){var a=i.getClipPath();if(a&&!a.contain(e,n))return!1;i.silent&&(r=!0)}var s=i.__hostTarget;i=s||i.parent}return!r||se}return!1}function fe(t,e,n){var i=t.painter;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}O(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],(function(t){pe.prototype[t]=function(e){var n,i,r=e.zrX,o=e.zrY,a=fe(this,r,o);if("mouseup"===t&&a||(i=(n=this.findHover(r,o)).target),"mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||Lt(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}));function ge(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r=0;)r++;return r-e}function ye(t,e,n,i,r){for(i===e&&i++;i>>1])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function ve(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function me(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function _e(t,e){var n,i,r=7,o=0;t.length;var a=[];function s(s){var l=n[s],u=i[s],h=n[s+1],c=i[s+1];i[s]=u+c,s===o-3&&(n[s+1]=n[s+2],i[s+1]=i[s+2]),o--;var p=me(t[h],t,l,u,0,e);l+=p,0!==(u-=p)&&0!==(c=ve(t[l+u-1],t,h,c,c-1,e))&&(u<=c?function(n,i,o,s){var l=0;for(l=0;l=7||d>=7);if(f)break;g<0&&(g=0),g+=2}if((r=g)<1&&(r=1),1===i){for(l=0;l=0;l--)t[d+l]=t[p+l];return void(t[c]=a[h])}var f=r;for(;;){var g=0,y=0,v=!1;do{if(e(a[h],t[u])<0){if(t[c--]=t[u--],g++,y=0,0==--i){v=!0;break}}else if(t[c--]=a[h--],y++,g=0,1==--s){v=!0;break}}while((g|y)=0;l--)t[d+l]=t[p+l];if(0===i){v=!0;break}}if(t[c--]=a[h--],1==--s){v=!0;break}if(0!==(y=s-ve(t[u],a,0,s,s-1,e))){for(s-=y,d=(c-=y)+1,p=(h-=y)+1,l=0;l=7||y>=7);if(v)break;f<0&&(f=0),f+=2}(r=f)<1&&(r=1);if(1===s){for(d=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[d+l]=t[p+l];t[c]=a[h]}else{if(0===s)throw new Error;for(p=c-(s-1),l=0;l1;){var t=o-2;if(t>=1&&i[t-1]<=i[t]+i[t+1]||t>=2&&i[t-2]<=i[t]+i[t-1])i[t-1]i[t+1])break;s(t)}},forceMergeRuns:function(){for(;o>1;){var t=o-2;t>0&&i[t-1]=32;)e|=1&t,t>>=1;return t+e}(r);do{if((o=ge(t,n,i,e))s&&(l=s),ye(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}}var be=!1;function we(){be||(be=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function Se(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var Me=function(){function t(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=Se}return t.prototype.traverse=function(t,e){for(var n=0;n0&&(u.__clipPaths=[]),isNaN(u.z)&&(we(),u.z=0),isNaN(u.z2)&&(we(),u.z2=0),isNaN(u.zlevel)&&(we(),u.zlevel=0),this._displayList[this._displayListLen++]=u}var h=t.getDecalElement&&t.getDecalElement();h&&this._updateAndAddDisplayable(h,e,n);var c=t.getTextGuideLine();c&&this._updateAndAddDisplayable(c,e,n);var p=t.getTextContent();p&&this._updateAndAddDisplayable(p,e,n)}},t.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},t.prototype.delRoot=function(t){if(t instanceof Array)for(var e=0,n=t.length;e=0&&this._roots.splice(i,1)}},t.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},t.prototype.getRoots=function(){return this._roots},t.prototype.dispose=function(){this._displayList=null,this._roots=null},t}(),Ie="undefined"!=typeof window&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){return setTimeout(t,16)},Te={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-Te.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*Te.bounceIn(2*t):.5*Te.bounceOut(2*t-1)+.5}},Ce=function(){function t(t){this._initialized=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart}return t.prototype.step=function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),!this._paused){var n=(t-this._startTime-this._pausedTime)/this._life;n<0&&(n=0),n=Math.min(n,1);var i=this.easing,r="string"==typeof i?Te[i]:i,o="function"==typeof r?r(n):n;if(this.onframe&&this.onframe(o),1===n){if(!this.loop)return!0;this._restart(t),this.onrestart&&this.onrestart()}return!1}this._pausedTime+=e},t.prototype._restart=function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0},t.prototype.pause=function(){this._paused=!0},t.prototype.resume=function(){this._paused=!1},t}(),De=function(t){this.value=t},Ae=function(){function t(){this._len=0}return t.prototype.insert=function(t){var e=new De(t);return this.insertEntry(e),e},t.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},t.prototype.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},t.prototype.len=function(){return this._len},t.prototype.clear=function(){this.head=this.tail=null,this._len=0},t}(),ke=function(){function t(t){this._list=new Ae,this._maxSize=10,this._map={},this._maxSize=t}return t.prototype.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var o=n.len(),a=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}a?a.value=e:a=new De(e),a.key=t,n.insertEntry(a),i[t]=a}return r},t.prototype.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},t.prototype.clear=function(){this._list.clear(),this._map={}},t.prototype.len=function(){return this._list.len()},t}(),Le={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function Pe(t){return(t=Math.round(t))<0?0:t>255?255:t}function Oe(t){return t<0?0:t>1?1:t}function Re(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?Pe(parseFloat(e)/100*255):Pe(parseInt(e,10))}function Ne(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?Oe(parseFloat(e)/100):Oe(parseFloat(e))}function ze(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function Ee(t,e,n){return t+(e-t)*n}function Ve(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function Be(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var Ge=new ke(20),Fe=null;function He(t,e){Fe&&Be(Fe,e),Fe=Ge.put(t,Fe||e.slice())}function We(t,e){if(t){e=e||[];var n=Ge.get(t);if(n)return Be(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in Le)return Be(e,Le[i]),He(t,e),e;var r,o=i.length;if("#"===i.charAt(0))return 4===o||5===o?(r=parseInt(i.slice(1,4),16))>=0&&r<=4095?(Ve(e,(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,5===o?parseInt(i.slice(4),16)/15:1),He(t,e),e):void Ve(e,0,0,0,1):7===o||9===o?(r=parseInt(i.slice(1,7),16))>=0&&r<=16777215?(Ve(e,(16711680&r)>>16,(65280&r)>>8,255&r,9===o?parseInt(i.slice(7),16)/255:1),He(t,e),e):void Ve(e,0,0,0,1):void 0;var a=i.indexOf("("),s=i.indexOf(")");if(-1!==a&&s+1===o){var l=i.substr(0,a),u=i.substr(a+1,s-(a+1)).split(","),h=1;switch(l){case"rgba":if(4!==u.length)return 3===u.length?Ve(e,+u[0],+u[1],+u[2],1):Ve(e,0,0,0,1);h=Ne(u.pop());case"rgb":return 3!==u.length?void Ve(e,0,0,0,1):(Ve(e,Re(u[0]),Re(u[1]),Re(u[2]),h),He(t,e),e);case"hsla":return 4!==u.length?void Ve(e,0,0,0,1):(u[3]=Ne(u[3]),Ue(u,e),He(t,e),e);case"hsl":return 3!==u.length?void Ve(e,0,0,0,1):(Ue(u,e),He(t,e),e);default:return}}Ve(e,0,0,0,1)}}function Ue(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=Ne(t[1]),r=Ne(t[2]),o=r<=.5?r*(i+1):r+i-r*i,a=2*r-o;return Ve(e=e||[],Pe(255*ze(a,o,n+1/3)),Pe(255*ze(a,o,n)),Pe(255*ze(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Xe(t,e){var n=We(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:n[i]<0&&(n[i]=0);return Qe(n,4===n.length?"rgba":"rgb")}}function Ye(t){var e=We(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)}function Ze(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=Pe(Ee(a[0],s[0],l)),n[1]=Pe(Ee(a[1],s[1],l)),n[2]=Pe(Ee(a[2],s[2],l)),n[3]=Oe(Ee(a[3],s[3],l)),n}}var je=Ze;function qe(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=We(e[r]),s=We(e[o]),l=i-r,u=Qe([Pe(Ee(a[0],s[0],l)),Pe(Ee(a[1],s[1],l)),Pe(Ee(a[2],s[2],l)),Oe(Ee(a[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:o,value:i}:u}}var Ke=qe;function $e(t,e,n,i){var r=We(t);if(t)return r=function(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,p=((s-o)/6+l/2)/l;i===s?e=p-c:r===s?e=1/3+h-p:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,u];return null!=t[3]&&d.push(t[3]),d}}(r),null!=e&&(r[0]=function(t){return(t=Math.round(t))<0?0:t>360?360:t}(e)),null!=n&&(r[1]=Ne(n)),null!=i&&(r[2]=Ne(i)),Qe(Ue(r),"rgba")}function Je(t,e){var n=We(t);if(n&&null!=e)return n[3]=Oe(e),Qe(n,"rgba")}function Qe(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function tn(t,e){var n=We(t);return n?(.299*n[0]+.587*n[1]+.114*n[2])*n[3]/255+(1-n[3])*e:0}var en=Object.freeze({__proto__:null,parse:We,lift:Xe,toHex:Ye,fastLerp:Ze,fastMapToColor:je,lerp:qe,mapToColor:Ke,modifyHSL:$e,modifyAlpha:Je,stringify:Qe,lum:tn,random:function(){return"rgb("+Math.round(255*Math.random())+","+Math.round(255*Math.random())+","+Math.round(255*Math.random())+")"}}),nn=Array.prototype.slice;function rn(t,e,n){return(e-t)*n+t}function on(t,e,n,i){for(var r=e.length,o=0;oa)i.length=a;else for(var s=o;s=2&&this.interpolable&&this.maxTime>0},t.prototype.getAdditiveTrack=function(){return this._additiveTrack},t.prototype.addKeyframe=function(t,e){t>=this.maxTime?this.maxTime=t:this._needsSort=!0;var n=this.keyframes,i=n.length;if(this.interpolable)if(P(e)){var r=function(t){return P(t&&t[0])?2:1}(e);if(i>0&&this.arrDim!==r)return void(this.interpolable=!1);if(1===r&&"number"!=typeof e[0]||2===r&&"number"!=typeof e[0][0])return void(this.interpolable=!1);if(i>0){var o=n[i-1];this._isAllValueEqual&&(1===r&&un(e,o.value)||(this._isAllValueEqual=!1))}this.arrDim=r}else{if(this.arrDim>0)return void(this.interpolable=!1);if("string"==typeof e){var a=We(e);a?(e=a,this.isValueColor=!0):this.interpolable=!1}else if("number"!=typeof e||isNaN(e))return void(this.interpolable=!1);if(this._isAllValueEqual&&i>0){o=n[i-1];(this.isValueColor&&!un(o.value,e)||o.value!==e)&&(this._isAllValueEqual=!1)}}var s={time:t,value:e,percent:0};return this.keyframes.push(s),s},t.prototype.prepare=function(t){var e=this.keyframes;this._needsSort&&e.sort((function(t,e){return t.time-e.time}));for(var n=this.arrDim,i=e.length,r=e[i-1],o=0;o0&&o!==i-1&&ln(e[o].value,r.value,n);if(t&&this.needsAnimate()&&t.needsAnimate()&&n===t.arrDim&&this.isValueColor===t.isValueColor&&!t._finished){this._additiveTrack=t;var a=e[0].value;for(o=0;o=0&&!(o[n].percent<=e);n--);n=Math.min(n,a-2)}else{for(n=this._lastFrame;ne);n++);n=Math.min(n-1,a-2)}var h=o[n+1],c=o[n];if(c&&h){this._lastFrame=n,this._lastFramePercent=e;var p=h.percent-c.percent;if(0!==p){var d=(e-c.percent)/p,f=i?this._additiveValue:u?yn:t[s];if((l>0||u)&&!f&&(f=this._additiveValue=[]),this.useSpline){var g=o[n][r],y=o[0===n?n:n-1][r],v=o[n>a-2?a-1:n+1][r],m=o[n>a-3?a-1:n+2][r];if(l>0)1===l?cn(f,y,g,v,m,d,d*d,d*d*d):function(t,e,n,i,r,o,a,s){for(var l=e.length,u=e[0].length,h=0;h0)1===l?on(f,c[r],h[r],d):function(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a.5?e:t}(c[r],h[r],d),i?this._additiveValue=_:t[s]=_}i&&this._addToTarget(t)}}}},t.prototype._addToTarget=function(t){var e=this.arrDim,n=this.propName,i=this._additiveValue;0===e?this.isValueColor?(We(t[n],yn),an(yn,yn,i,1),t[n]=dn(yn)):t[n]=t[n]+i:1===e?an(t[n],t[n],i,1):2===e&&sn(t[n],t[n],i,1)},t}(),mn=function(){function t(t,e,n){this._tracks={},this._trackKeys=[],this._delay=0,this._maxTime=0,this._paused=!1,this._started=0,this._clip=null,this._target=t,this._loop=e,e&&n?w("Can' use additive animation on looped animation."):this._additiveAnimators=n}return t.prototype.getTarget=function(){return this._target},t.prototype.changeTarget=function(t){this._target=t},t.prototype.when=function(t,e){return this.whenWithKeys(t,e,V(e))},t.prototype.whenWithKeys=function(t,e,n){for(var i=this._tracks,r=0;r0)){this._started=1;for(var n=this,i=[],r=0;r1){var a=o.pop();r.addKeyframe(a.time,t[i]),r.prepare(r.getAdditiveTrack())}}}},t}(),_n=function(t){function e(e){var n=t.call(this)||this;return n._running=!1,n._time=0,n._pausedTime=0,n._pauseStart=0,n._paused=!1,e=e||{},n.stage=e.stage||{},n.onframe=e.onframe||function(){},n}return n(e,t),e.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._clipsHead?(this._clipsTail.next=t,t.prev=this._clipsTail,t.next=null,this._clipsTail=t):this._clipsHead=this._clipsTail=t,t.animation=this},e.prototype.addAnimator=function(t){t.animation=this;var e=t.getClip();e&&this.addClip(e)},e.prototype.removeClip=function(t){if(t.animation){var e=t.prev,n=t.next;e?e.next=n:this._clipsHead=n,n?n.prev=e:this._clipsTail=e,t.next=t.prev=t.animation=null}},e.prototype.removeAnimator=function(t){var e=t.getClip();e&&this.removeClip(e),t.animation=null},e.prototype.update=function(t){for(var e=(new Date).getTime()-this._pausedTime,n=e-this._time,i=this._clipsHead;i;){var r=i.next;i.step(e,n)?(i.ondestroy&&i.ondestroy(),this.removeClip(i),i=r):i=r}this._time=e,t||(this.onframe(n),this.trigger("frame",n),this.stage.update&&this.stage.update())},e.prototype._startLoop=function(){var t=this;this._running=!0,Ie((function e(){t._running&&(Ie(e),!t._paused&&t.update())}))},e.prototype.start=function(){this._running||(this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop())},e.prototype.stop=function(){this._running=!1},e.prototype.pause=function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},e.prototype.resume=function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},e.prototype.clear=function(){for(var t=this._clipsHead;t;){var e=t.next;t.prev=t.next=t.animation=null,t=e}this._clipsHead=this._clipsTail=null},e.prototype.isFinished=function(){return null==this._clipsHead},e.prototype.animate=function(t,e){e=e||{},this.start();var n=new mn(t,e.loop);return this.addAnimator(n),n},e}(Ft),xn=a.domSupported,bn=(gn={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},{mouse:fn=["click","dblclick","mousewheel","wheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],touch:["touchstart","touchend","touchmove"],pointer:R(fn,(function(t){var e=t.replace("mouse","pointer");return gn.hasOwnProperty(e)?e:t}))}),wn=["mousemove","mouseup"],Sn=["pointermove","pointerup"],Mn=!1;function In(t){var e=t.pointerType;return"pen"===e||"touch"===e}function Tn(t){t&&(t.zrByTouch=!0)}function Cn(t,e){for(var n=e,i=!1;n&&9!==n.nodeType&&!(i=n.domBelongToZr||n!==e&&n===t.painterRoot);)n=n.parentNode;return i}var Dn=function(t,e){this.stopPropagation=gt,this.stopImmediatePropagation=gt,this.preventDefault=gt,this.type=e.type,this.target=this.currentTarget=t.dom,this.pointerType=e.pointerType,this.clientX=e.clientX,this.clientY=e.clientY},An={mousedown:function(t){t=te(this.dom,t),this.__mayPointerCapture=[t.zrX,t.zrY],this.trigger("mousedown",t)},mousemove:function(t){t=te(this.dom,t);var e=this.__mayPointerCapture;!e||t.zrX===e[0]&&t.zrY===e[1]||this.__togglePointerCapture(!0),this.trigger("mousemove",t)},mouseup:function(t){t=te(this.dom,t),this.__togglePointerCapture(!1),this.trigger("mouseup",t)},mouseout:function(t){Cn(this,(t=te(this.dom,t)).toElement||t.relatedTarget)||(this.__pointerCapturing&&(t.zrEventControl="no_globalout"),this.trigger("mouseout",t))},wheel:function(t){Mn=!0,t=te(this.dom,t),this.trigger("mousewheel",t)},mousewheel:function(t){Mn||(t=te(this.dom,t),this.trigger("mousewheel",t))},touchstart:function(t){Tn(t=te(this.dom,t)),this.__lastTouchMoment=new Date,this.handler.processGesture(t,"start"),An.mousemove.call(this,t),An.mousedown.call(this,t)},touchmove:function(t){Tn(t=te(this.dom,t)),this.handler.processGesture(t,"change"),An.mousemove.call(this,t)},touchend:function(t){Tn(t=te(this.dom,t)),this.handler.processGesture(t,"end"),An.mouseup.call(this,t),+new Date-+this.__lastTouchMoment<300&&An.click.call(this,t)},pointerdown:function(t){An.mousedown.call(this,t)},pointermove:function(t){In(t)||An.mousemove.call(this,t)},pointerup:function(t){An.mouseup.call(this,t)},pointerout:function(t){In(t)||An.mouseout.call(this,t)}};O(["click","dblclick","contextmenu"],(function(t){An[t]=function(e){e=te(this.dom,e),this.trigger(t,e)}}));var kn={pointermove:function(t){In(t)||kn.mousemove.call(this,t)},pointerup:function(t){kn.mouseup.call(this,t)},mousemove:function(t){this.trigger("mousemove",t)},mouseup:function(t){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger("mouseup",t),e&&(t.zrEventControl="only_globalout",this.trigger("mouseout",t))}};function Ln(t,e){var n=e.domHandlers;a.pointerEventsSupported?O(bn.pointer,(function(i){On(e,i,(function(e){n[i].call(t,e)}))})):(a.touchEventsSupported&&O(bn.touch,(function(i){On(e,i,(function(r){n[i].call(t,r),function(t){t.touching=!0,null!=t.touchTimer&&(clearTimeout(t.touchTimer),t.touchTimer=null),t.touchTimer=setTimeout((function(){t.touching=!1,t.touchTimer=null}),700)}(e)}))})),O(bn.mouse,(function(i){On(e,i,(function(r){r=Qt(r),e.touching||n[i].call(t,r)}))})))}function Pn(t,e){function n(n){On(e,n,(function(i){i=Qt(i),Cn(t,i.target)||(i=function(t,e){return te(t.dom,new Dn(t,e),!0)}(t,i),e.domHandlers[n].call(t,i))}),{capture:!0})}a.pointerEventsSupported?O(Sn,n):a.touchEventsSupported||O(wn,n)}function On(t,e,n,i){t.mounted[e]=n,t.listenerOpts[e]=i,ee(t.domTarget,e,n,i)}function Rn(t){var e,n,i,r,o=t.mounted;for(var a in o)o.hasOwnProperty(a)&&(e=t.domTarget,n=a,i=o[a],r=t.listenerOpts[a],jt?e.removeEventListener(n,i,r):e.detachEvent("on"+n,i));t.mounted={}}var Nn=function(t,e){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=e},zn=function(t){function e(e,n){var i=t.call(this)||this;return i.__pointerCapturing=!1,i.dom=e,i.painterRoot=n,i._localHandlerScope=new Nn(e,An),xn&&(i._globalHandlerScope=new Nn(document,kn)),Ln(i,i._localHandlerScope),i}return n(e,t),e.prototype.dispose=function(){Rn(this._localHandlerScope),xn&&Rn(this._globalHandlerScope)},e.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},e.prototype.__togglePointerCapture=function(t){if(this.__mayPointerCapture=null,xn&&+this.__pointerCapturing^+t){this.__pointerCapturing=t;var e=this._globalHandlerScope;t?Pn(this,e):Rn(e)}},e}(Ft),En=1;"undefined"!=typeof window&&(En=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var Vn=En,Bn="#333",Gn="#ccc";function Fn(){return[1,0,0,1,0,0]}function Hn(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function Wn(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function Un(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t}function Xn(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function Yn(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t}function Zn(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function jn(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}function qn(t){var e=[1,0,0,1,0,0];return Wn(e,t),e}var Kn=Object.freeze({__proto__:null,create:Fn,identity:Hn,copy:Wn,mul:Un,translate:Xn,rotate:Yn,scale:Zn,invert:jn,clone:qn}),$n=Hn,Jn=5e-5;function Qn(t){return t>Jn||t<-5e-5}var ti,ei,ni=[],ii=[],ri=[1,0,0,1,0,0],oi=Math.abs,ai=function(){function t(){}return t.prototype.getLocalTransform=function(e){return t.getLocalTransform(this,e)},t.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},t.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},t.prototype.setSkew=function(t){this.skewX=t[0],this.skewY=t[1]},t.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},t.prototype.needLocalTransform=function(){return Qn(this.rotation)||Qn(this.x)||Qn(this.y)||Qn(this.scaleX-1)||Qn(this.scaleY-1)},t.prototype.updateTransform=function(){var t=this.parent&&this.parent.transform,e=this.needLocalTransform(),n=this.transform;e||t?(n=n||[1,0,0,1,0,0],e?this.getLocalTransform(n):$n(n),t&&(e?Un(n,t,n):Wn(n,t)),this.transform=n,this._resolveGlobalScaleRatio(n)):n&&$n(n)},t.prototype._resolveGlobalScaleRatio=function(t){var e=this.globalScaleRatio;if(null!=e&&1!==e){this.getGlobalScale(ni);var n=ni[0]<0?-1:1,i=ni[1]<0?-1:1,r=((ni[0]-n)*e+n)/ni[0]||0,o=((ni[1]-i)*e+i)/ni[1]||0;t[0]*=r,t[1]*=r,t[2]*=o,t[3]*=o}this.invTransform=this.invTransform||[1,0,0,1,0,0],jn(this.invTransform,t)},t.prototype.getComputedTransform=function(){for(var t=this,e=[];t;)e.push(t),t=t.parent;for(;t=e.pop();)t.updateTransform();return this.transform},t.prototype.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=Math.atan2(t[1],t[0]),r=Math.PI/2+i-Math.atan2(t[3],t[2]);n=Math.sqrt(n)*Math.cos(r),e=Math.sqrt(e),this.skewX=r,this.skewY=0,this.rotation=-i,this.x=+t[4],this.y=+t[5],this.scaleX=e,this.scaleY=n,this.originX=0,this.originY=0}},t.prototype.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(Un(ii,t.invTransform,e),e=ii);var n=this.originX,i=this.originY;(n||i)&&(ri[4]=n,ri[5]=i,Un(ii,e,ri),ii[4]-=n,ii[5]-=i,e=ii),this.setLocalTransform(e)}},t.prototype.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},t.prototype.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&Nt(n,n,i),n},t.prototype.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&Nt(n,n,i),n},t.prototype.getLineScale=function(){var t=this.transform;return t&&oi(t[0]-1)>1e-10&&oi(t[3]-1)>1e-10?Math.sqrt(oi(t[0]*t[3]-t[2]*t[1])):1},t.prototype.copyTransform=function(t){for(var e=0;ef&&(f=_,gf&&(f=x,v=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(e){t.copy(this,e)},t.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},t.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},t.prototype.isZero=function(){return 0===this.width||0===this.height},t.create=function(e){return new t(e.x,e.y,e.width,e.height)},t.copy=function(t,e){t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height},t.applyTransform=function(e,n,i){if(i){if(i[1]<1e-5&&i[1]>-1e-5&&i[2]<1e-5&&i[2]>-1e-5){var r=i[0],o=i[3],a=i[4],s=i[5];return e.x=n.x*r+a,e.y=n.y*o+s,e.width=n.width*r,e.height=n.height*o,e.width<0&&(e.x+=e.width,e.width=-e.width),void(e.height<0&&(e.y+=e.height,e.height=-e.height))}ci.x=di.x=n.x,ci.y=fi.y=n.y,pi.x=fi.x=n.x+n.width,pi.y=di.y=n.y+n.height,ci.transform(i),fi.transform(i),pi.transform(i),di.transform(i),e.x=ui(ci.x,pi.x,di.x,fi.x),e.y=ui(ci.y,pi.y,di.y,fi.y);var l=hi(ci.x,pi.x,di.x,fi.x),u=hi(ci.y,pi.y,di.y,fi.y);e.width=l-e.x,e.height=u-e.y}else e!==n&&t.copy(e,n)},t}(),mi={},_i="12px sans-serif";var xi={measureText:function(t,e){return ti||(ti=D().getContext("2d")),ei!==e&&(ei=ti.font=e||_i),ti.measureText(t)}};function bi(t,e){var n=mi[e=e||_i];n||(n=mi[e]=new ke(500));var i=n.get(t);return null==i&&(i=xi.measureText(t,e).width,n.put(t,i)),i}function wi(t,e,n,i){var r=bi(t,e),o=Ti(e),a=Mi(0,r,n),s=Ii(0,o,i);return new vi(a,s,r,o)}function Si(t,e,n,i){var r=((t||"")+"").split("\n");if(1===r.length)return wi(r[0],e,n,i);for(var o=new vi(0,0,0,0),a=0;a=0?parseFloat(t)/100*e:parseFloat(t):t}function Di(t,e,n){var i=e.position||"inside",r=null!=e.distance?e.distance:5,o=n.height,a=n.width,s=o/2,l=n.x,u=n.y,h="left",c="top";if(i instanceof Array)l+=Ci(i[0],n.width),u+=Ci(i[1],n.height),h=null,c=null;else switch(i){case"left":l-=r,u+=s,h="right",c="middle";break;case"right":l+=r+a,u+=s,c="middle";break;case"top":l+=a/2,u-=r,h="center",c="bottom";break;case"bottom":l+=a/2,u+=o+r,h="center";break;case"inside":l+=a/2,u+=s,h="center",c="middle";break;case"insideLeft":l+=r,u+=s,c="middle";break;case"insideRight":l+=a-r,u+=s,h="right",c="middle";break;case"insideTop":l+=a/2,u+=r,h="center";break;case"insideBottom":l+=a/2,u+=o-r,h="center",c="bottom";break;case"insideTopLeft":l+=r,u+=r;break;case"insideTopRight":l+=a-r,u+=r,h="right";break;case"insideBottomLeft":l+=r,u+=o-r,c="bottom";break;case"insideBottomRight":l+=a-r,u+=o-r,h="right",c="bottom"}return(t=t||{}).x=l,t.y=u,t.align=h,t.verticalAlign=c,t}var Ai="__zr_normal__",ki=["x","y","scaleX","scaleY","originX","originY","rotation","ignore"],Li={x:!0,y:!0,scaleX:!0,scaleY:!0,originX:!0,originY:!0,rotation:!0,ignore:!1},Pi={},Oi=new vi(0,0,0,0),Ri=function(){function t(t){this.id=b(),this.animators=[],this.currentStates=[],this.states={},this._init(t)}return t.prototype._init=function(t){this.attr(t)},t.prototype.drift=function(t,e,n){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.markRedraw()},t.prototype.beforeUpdate=function(){},t.prototype.afterUpdate=function(){},t.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},t.prototype.updateInnerText=function(t){var e=this._textContent;if(e&&(!e.ignore||t)){this.textConfig||(this.textConfig={});var n=this.textConfig,i=n.local,r=e.innerTransformable,o=void 0,a=void 0,s=!1;r.parent=i?this:null;var l=!1;if(r.copyTransform(e),null!=n.position){var u=Oi;n.layoutRect?u.copy(n.layoutRect):u.copy(this.getBoundingRect()),i||u.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(Pi,n,u):Di(Pi,n,u),r.x=Pi.x,r.y=Pi.y,o=Pi.align,a=Pi.verticalAlign;var h=n.origin;if(h&&null!=n.rotation){var c=void 0,p=void 0;"center"===h?(c=.5*u.width,p=.5*u.height):(c=Ci(h[0],u.width),p=Ci(h[1],u.height)),l=!0,r.originX=-r.x+c+(i?0:u.x),r.originY=-r.y+p+(i?0:u.y)}}null!=n.rotation&&(r.rotation=n.rotation);var d=n.offset;d&&(r.x+=d[0],r.y+=d[1],l||(r.originX=-d[0],r.originY=-d[1]));var f=null==n.inside?"string"==typeof n.position&&n.position.indexOf("inside")>=0:n.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),y=void 0,v=void 0,m=void 0;f&&this.canBeInsideText()?(y=n.insideFill,v=n.insideStroke,null!=y&&"auto"!==y||(y=this.getInsideTextFill()),null!=v&&"auto"!==v||(v=this.getInsideTextStroke(y),m=!0)):(y=n.outsideFill,v=n.outsideStroke,null!=y&&"auto"!==y||(y=this.getOutsideFill()),null!=v&&"auto"!==v||(v=this.getOutsideStroke(y),m=!0)),(y=y||"#000")===g.fill&&v===g.stroke&&m===g.autoStroke&&o===g.align&&a===g.verticalAlign||(s=!0,g.fill=y,g.stroke=v,g.autoStroke=m,g.align=o,g.verticalAlign=a,e.setDefaultTextStyle(g)),e.__dirty|=1,s&&e.dirtyStyle(!0)}},t.prototype.canBeInsideText=function(){return!0},t.prototype.getInsideTextFill=function(){return"#fff"},t.prototype.getInsideTextStroke=function(t){return"#000"},t.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?Gn:Bn},t.prototype.getOutsideStroke=function(t){var e=this.__zr&&this.__zr.getBackgroundColor(),n="string"==typeof e&&We(e);n||(n=[255,255,255,1]);for(var i=n[3],r=this.__zr.isDarkMode(),o=0;o<3;o++)n[o]=n[o]*i+(r?0:255)*(1-i);return n[3]=1,Qe(n,"rgba")},t.prototype.traverse=function(t,e){},t.prototype.attrKV=function(t,e){"textConfig"===t?this.setTextConfig(e):"textContent"===t?this.setTextContent(e):"clipPath"===t?this.setClipPath(e):"extra"===t?(this.extra=this.extra||{},T(this.extra,e)):this[t]=e},t.prototype.hide=function(){this.ignore=!0,this.markRedraw()},t.prototype.show=function(){this.ignore=!1,this.markRedraw()},t.prototype.attr=function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(Y(t))for(var n=V(t),i=0;i0},t.prototype.getState=function(t){return this.states[t]},t.prototype.ensureState=function(t){var e=this.states;return e[t]||(e[t]={}),e[t]},t.prototype.clearStates=function(t){this.useState(Ai,!1,t)},t.prototype.useState=function(t,e,n,i){var r=t===Ai;if(this.hasState()||!r){var o=this.currentStates,a=this.stateTransition;if(!(A(o,t)>=0)||!e&&1!==o.length){var s;if(this.stateProxy&&!r&&(s=this.stateProxy(t)),s||(s=this.states&&this.states[t]),s||r){r||this.saveCurrentToNormalState(s);var l=!!(s&&s.hoverLayer||i);l&&this._toggleHoverLayerFlag(!0),this._applyStateObj(t,s,this._normalState,e,!n&&!this.__inHover&&a&&a.duration>0,a);var u=this._textContent,h=this._textGuide;return u&&u.useState(t,e,n,l),h&&h.useState(t,e,n,l),r?(this.currentStates=[],this._normalState={}):e?this.currentStates.push(t):this.currentStates=[t],this._updateAnimationTargets(),this.markRedraw(),!l&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2),s}w("State "+t+" not exists.")}}},t.prototype.useStates=function(t,e,n){if(t.length){var i=[],r=this.currentStates,o=t.length,a=o===r.length;if(a)for(var s=0;s0,d);var f=this._textContent,g=this._textGuide;f&&f.useStates(t,e,c),g&&g.useStates(t,e,c),this._updateAnimationTargets(),this.currentStates=t.slice(),this.markRedraw(),!c&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2)}else this.clearStates()},t.prototype._updateAnimationTargets=function(){for(var t=0;t=0){var n=this.currentStates.slice();n.splice(e,1),this.useStates(n)}},t.prototype.replaceState=function(t,e,n){var i=this.currentStates.slice(),r=A(i,t),o=A(i,e)>=0;r>=0?o?i.splice(r,1):i[r]=e:n&&!o&&i.push(e),this.useStates(i)},t.prototype.toggleState=function(t,e){e?this.useState(t,!0):this.removeState(t)},t.prototype._mergeStates=function(t){for(var e,n={},i=0;i=0&&e.splice(n,1)})),this.animators.push(t),n&&n.animation.addAnimator(t),n&&n.wakeUp()},t.prototype.updateDuringAnimation=function(t){this.markRedraw()},t.prototype.stopAnimation=function(t,e){for(var n=this.animators,i=n.length,r=[],o=0;o8)&&(r("position","_legacyPos","x","y"),r("scale","_legacyScale","scaleX","scaleY"),r("origin","_legacyOrigin","originX","originY"))}(),t}();function Ni(t,e,n,i,r){var o=[];Vi(t,"",t,e,n=n||{},i,o,r);var a=o.length,s=!1,l=n.done,u=n.aborted,h=function(){s=!0,--a<=0&&(s?l&&l():u&&u())},c=function(){--a<=0&&(s?l&&l():u&&u())};a||l&&l(),o.length>0&&n.during&&o[0].during((function(t,e){n.during(e)}));for(var p=0;p0||r.force&&!a.length){for(var m=t.animators,_=[],x=0;x=0&&(n.splice(i,0,t),this._doAdd(t))}return this},e.prototype.replace=function(t,e){var n=A(this._children,t);return n>=0&&this.replaceAt(e,n),this},e.prototype.replaceAt=function(t,e){var n=this._children,i=n[e];if(t&&t!==this&&t.parent!==this&&t!==i){n[e]=t,i.parent=null;var r=this.__zr;r&&i.removeSelfFromZr(r),this._doAdd(t)}return this},e.prototype._doAdd=function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__zr;e&&e!==t.__zr&&t.addSelfToZr(e),e&&e.refresh()},e.prototype.remove=function(t){var e=this.__zr,n=this._children,i=A(n,t);return i<0||(n.splice(i,1),t.parent=null,e&&t.removeSelfFromZr(e),e&&e.refresh()),this},e.prototype.removeAll=function(){for(var t=this._children,e=this.__zr,n=0;n0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},t.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},t.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},t.prototype.addHover=function(t){},t.prototype.removeHover=function(t){},t.prototype.clearHover=function(){},t.prototype.refreshHover=function(){this._needsRefreshHover=!0},t.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&"canvas"===this.painter.getType()&&this.painter.refreshHover()},t.prototype.resize=function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},t.prototype.clearAnimation=function(){this.animation.clear()},t.prototype.getWidth=function(){return this.painter.getWidth()},t.prototype.getHeight=function(){return this.painter.getHeight()},t.prototype.pathToImage=function(t,e){if(this.painter.pathToImage)return this.painter.pathToImage(t,e)},t.prototype.setCursorStyle=function(t){this.handler.setCursorStyle(t)},t.prototype.findHover=function(t,e){return this.handler.findHover(t,e)},t.prototype.on=function(t,e,n){return this.handler.on(t,e,n),this},t.prototype.off=function(t,e){this.handler.off(t,e)},t.prototype.trigger=function(t,e){this.handler.trigger(t,e)},t.prototype.clear=function(){for(var t=this.storage.getRoots(),e=0;e0){if(t<=r)return a;if(t>=o)return s}else{if(t>=r)return a;if(t<=o)return s}else{if(t===r)return a;if(t===o)return s}return(t-r)/l*u+a}function qi(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?(n=t,n.replace(/^\s+|\s+$/g,"")).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t;var n}function Ki(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function $i(t){return t.sort((function(t,e){return t-e})),t}function Ji(t){if(t=+t,isNaN(t))return 0;if(t>1e-14)for(var e=1,n=0;n<15;n++,e*=10)if(Math.round(t*e)/e===t)return n;return Qi(t)}function Qi(t){var e=t.toString().toLowerCase(),n=e.indexOf("e"),i=n>0?+e.slice(n+1):0,r=n>0?n:e.length,o=e.indexOf("."),a=o<0?0:r-1-o;return Math.max(0,a-i)}function tr(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20}function er(t,e,n){if(!t[e])return 0;var i=N(t,(function(t,e){return t+(isNaN(e)?0:e)}),0);if(0===i)return 0;for(var r=Math.pow(10,n),o=R(t,(function(t){return(isNaN(t)?0:t)/i*r*100})),a=100*r,s=R(o,(function(t){return Math.floor(t)})),l=N(s,(function(t,e){return t+e}),0),u=R(o,(function(t,e){return t-s[e]}));lh&&(h=u[p],c=p);++s[c],u[c]=0,++l}return s[e]/r}function nr(t,e){var n=Math.max(Ji(t),Ji(e)),i=t+e;return n>20?i:Ki(i,n)}var ir=9007199254740991;function rr(t){var e=2*Math.PI;return(t%e+e)%e}function or(t){return t>-1e-4&&t=10&&e++,e}function hr(t,e){var n=ur(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,n>=-20?+t.toFixed(n<0?-n:0):t}function cr(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),r=+t[i-1],o=n-i;return o?r+o*(t[i]-r):r}function pr(t){t.sort((function(t,e){return s(t,e,0)?-1:1}));for(var e=-1/0,n=1,i=0;i=0||r&&A(r,s)<0)){var l=n.getShallow(s,e);null!=l&&(o[t[a][0]]=l)}}return o}}var eo=to([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),no=function(){function t(){}return t.prototype.getAreaStyle=function(t,e){return eo(this,t,e)},t}(),io=new ke(50);function ro(t){if("string"==typeof t){var e=io.get(t);return e&&e.image}return t}function oo(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var o=io.get(t),a={hostEl:n,cb:i,cbPayload:r};return o?!so(e=o.image)&&o.pending.push(a):((e=new Image).onload=e.onerror=ao,io.put(t,e.__cachedImgObj={image:e,pending:[a]}),e.src=e.__zrImageSrc=t),e}return t}return e}function ao(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e=a;l++)s-=a;var u=bi(n,e);return u>s&&(n="",u=0),s=t-u,r.ellipsis=n,r.ellipsisWidth=u,r.contentWidth=s,r.containerWidth=t,r}function co(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var o=bi(t,i);if(o<=n)return t;for(var a=0;;a++){if(o<=r||a>=e.maxIterations){t+=e.ellipsis;break}var s=0===a?po(t,r,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*r/o):0;o=bi(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function po(t,e,n,i){for(var r=0,o=0,a=t.length;o0&&f+i.accumWidth>i.width&&(o=e.split("\n"),c=!0),i.accumWidth=f}else{var g=xo(e,h,i.width,i.breakAll,i.accumWidth);i.accumWidth=g.accumWidth+d,a=g.linesWidths,o=g.lines}}else o=e.split("\n");for(var y=0;y=33&&e<=255}(t)||!!mo[t]}function xo(t,e,n,i,r){for(var o=[],a=[],s="",l="",u=0,h=0,c=0;cn:r+h+d>n)?h?(s||l)&&(f?(s||(s=l,l="",h=u=0),o.push(s),a.push(h-u),l+=p,s="",h=u+=d):(l&&(s+=l,h+=u,l="",u=0),o.push(s),a.push(h),s=p,h=d)):f?(o.push(l),a.push(u),l=p,u=d):(o.push(p),a.push(d)):(h+=d,f?(l+=p,u+=d):(l&&(s+=l,l="",u=0),s+=p))}else l&&(s+=l,h+=u),o.push(s),a.push(h),s="",l="",u=0,h=0}return o.length||s||(s=t,l="",u=0),l&&(s+=l),s&&(o.push(s),a.push(h)),1===o.length&&(h+=r),{accumWidth:h,lines:o,linesWidths:a}}var bo="__zr_style_"+Math.round(10*Math.random()),wo={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"#000",opacity:1,blend:"source-over"},So={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};wo[bo]=!0;var Mo=["z","z2","invisible"],Io=["invisible"],To=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype._init=function(e){for(var n=V(e),i=0;i-1e-8&&tLo||t<-1e-8}function Go(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function Fo(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function Ho(t,e,n,i,r,o){var a=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),u=t-r,h=s*s-3*a*l,c=s*l-9*a*u,p=l*l-3*s*u,d=0;if(Vo(h)&&Vo(c)){if(Vo(s))o[0]=0;else(M=-l/s)>=0&&M<=1&&(o[d++]=M)}else{var f=c*c-4*h*p;if(Vo(f)){var g=c/h,y=-g/2;(M=-s/a+g)>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y)}else if(f>0){var v=ko(f),m=h*s+1.5*a*(-c+v),_=h*s+1.5*a*(-c-v);(M=(-s-((m=m<0?-Ao(-m,Ro):Ao(m,Ro))+(_=_<0?-Ao(-_,Ro):Ao(_,Ro))))/(3*a))>=0&&M<=1&&(o[d++]=M)}else{var x=(2*h*s-3*a*c)/(2*ko(h*h*h)),b=Math.acos(x)/3,w=ko(h),S=Math.cos(b),M=(-s-2*w*S)/(3*a),I=(y=(-s+w*(S+Oo*Math.sin(b)))/(3*a),(-s+w*(S-Oo*Math.sin(b)))/(3*a));M>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y),I>=0&&I<=1&&(o[d++]=I)}}return d}function Wo(t,e,n,i,r){var o=6*n-12*e+6*t,a=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(Vo(a)){if(Bo(o))(h=-s/o)>=0&&h<=1&&(r[l++]=h)}else{var u=o*o-4*a*s;if(Vo(u))r[0]=-o/(2*a);else if(u>0){var h,c=ko(u),p=(-o-c)/(2*a);(h=(-o+c)/(2*a))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}function Uo(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function Xo(t,e,n,i,r,o,a,s,l,u,h){var c,p,d,f,g,y=.005,v=1/0;No[0]=l,No[1]=u;for(var m=0;m<1;m+=.05)zo[0]=Go(t,n,r,a,m),zo[1]=Go(e,i,o,s,m),(f=Ot(No,zo))=0&&f=0&&y1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(ra[0]=na(r)*n+t,ra[1]=ea(r)*i+e,oa[0]=na(o)*n+t,oa[1]=ea(o)*i+e,u(s,ra,oa),h(l,ra,oa),(r%=ia)<0&&(r+=ia),(o%=ia)<0&&(o+=ia),r>o&&!a?o+=ia:rr&&(aa[0]=na(d)*n+t,aa[1]=ea(d)*i+e,u(s,aa,s),h(l,aa,l))}var fa={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},ga=[],ya=[],va=[],ma=[],_a=[],xa=[],ba=Math.min,wa=Math.max,Sa=Math.cos,Ma=Math.sin,Ia=Math.sqrt,Ta=Math.abs,Ca=Math.PI,Da=2*Ca,Aa="undefined"!=typeof Float32Array,ka=[];function La(t){return Math.round(t/Ca*1e8)/1e8%2*Ca}function Pa(t,e){var n=La(t[0]);n<0&&(n+=Da);var i=n-t[0],r=t[1];r+=i,!e&&r-n>=Da?r=n+Da:e&&n-r>=Da?r=n-Da:!e&&n>r?r=n+(Da-La(n-r)):e&&n0&&(this._ux=Ta(n/Vn/t)||0,this._uy=Ta(n/Vn/e)||0)},t.prototype.setDPR=function(t){this.dpr=t},t.prototype.setContext=function(t){this._ctx=t},t.prototype.getContext=function(){return this._ctx},t.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},t.prototype.reset=function(){this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},t.prototype.moveTo=function(t,e){return this._drawPendingPt(),this.addData(fa.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},t.prototype.lineTo=function(t,e){var n=Ta(t-this._xi),i=Ta(e-this._yi),r=n>this._ux||i>this._uy;if(this.addData(fa.L,t,e),this._ctx&&r&&(this._needsDash?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),r)this._xi=t,this._yi=e,this._pendingPtDist=0;else{var o=n*n+i*i;o>this._pendingPtDist&&(this._pendingPtX=t,this._pendingPtY=e,this._pendingPtDist=o)}return this},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){return this._drawPendingPt(),this.addData(fa.C,t,e,n,i,r,o),this._ctx&&(this._needsDash?this._dashedBezierTo(t,e,n,i,r,o):this._ctx.bezierCurveTo(t,e,n,i,r,o)),this._xi=r,this._yi=o,this},t.prototype.quadraticCurveTo=function(t,e,n,i){return this._drawPendingPt(),this.addData(fa.Q,t,e,n,i),this._ctx&&(this._needsDash?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},t.prototype.arc=function(t,e,n,i,r,o){this._drawPendingPt(),ka[0]=i,ka[1]=r,Pa(ka,o),i=ka[0];var a=(r=ka[1])-i;return this.addData(fa.A,t,e,n,n,i,a,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=Sa(r)*n+t,this._yi=Ma(r)*n+e,this},t.prototype.arcTo=function(t,e,n,i,r){return this._drawPendingPt(),this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},t.prototype.rect=function(t,e,n,i){return this._drawPendingPt(),this._ctx&&this._ctx.rect(t,e,n,i),this.addData(fa.R,t,e,n,i),this},t.prototype.closePath=function(){this._drawPendingPt(),this.addData(fa.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},t.prototype.fill=function(t){t&&t.fill(),this.toStatic()},t.prototype.stroke=function(t){t&&t.stroke(),this.toStatic()},t.prototype.setLineDash=function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,n=0;nu.length&&(this._expandData(),u=this.data);for(var h=0;h0&&(this._ctx&&this._ctx.lineTo(this._pendingPtX,this._pendingPtY),this._pendingPtDist=0)},t.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e0&&d<=t||h<0&&d>=t||0===h&&(c>0&&f<=e||c<0&&f>=e);)d+=h*(n=o[i=this._dashIdx]),f+=c*n,this._dashIdx=(i+1)%g,h>0&&dl||c>0&&fu||a[i%2?"moveTo":"lineTo"](h>=0?ba(d,t):wa(d,t),c>=0?ba(f,e):wa(f,e));h=d-t,c=f-e,this._dashOffset=-Ia(h*h+c*c)},t.prototype._dashedBezierTo=function(t,e,n,i,r,o){var a,s,l,u,h,c=this._ctx,p=this._dashSum,d=this._dashOffset,f=this._lineDash,g=this._xi,y=this._yi,v=0,m=this._dashIdx,_=f.length,x=0;for(d<0&&(d=p+d),d%=p,a=0;a<1;a+=.1)s=Go(g,t,n,r,a+.1)-Go(g,t,n,r,a),l=Go(y,e,i,o,a+.1)-Go(y,e,i,o,a),v+=Ia(s*s+l*l);for(;m<_&&!((x+=f[m])>d);m++);for(a=(x-d)/v;a<=1;)u=Go(g,t,n,r,a),h=Go(y,e,i,o,a),m%2?c.moveTo(u,h):c.lineTo(u,h),a+=f[m]/v,m=(m+1)%_;m%2!=0&&c.lineTo(r,o),s=r-u,l=o-h,this._dashOffset=-Ia(s*s+l*l)},t.prototype._dashedQuadraticTo=function(t,e,n,i){var r=n,o=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,o)},t.prototype.toStatic=function(){if(this._saveData){this._drawPendingPt();var t=this.data;t instanceof Array&&(t.length=this._len,Aa&&this._len>11&&(this.data=new Float32Array(t)))}},t.prototype.getBoundingRect=function(){va[0]=va[1]=_a[0]=_a[1]=Number.MAX_VALUE,ma[0]=ma[1]=xa[0]=xa[1]=-Number.MAX_VALUE;var t,e=this.data,n=0,i=0,r=0,o=0;for(t=0;tn||Ta(y)>i||c===e-1)&&(f=Math.sqrt(A*A+y*y),r=g,o=_);break;case fa.C:var v=t[c++],m=t[c++],_=(g=t[c++],t[c++]),x=t[c++],b=t[c++];f=Yo(r,o,v,m,g,_,x,b,10),r=x,o=b;break;case fa.Q:f=Jo(r,o,v=t[c++],m=t[c++],g=t[c++],_=t[c++],10),r=g,o=_;break;case fa.A:var w=t[c++],S=t[c++],M=t[c++],I=t[c++],T=t[c++],C=t[c++],D=C+T;c+=1;t[c++];d&&(a=Sa(T)*M+w,s=Ma(T)*I+S),f=wa(M,I)*ba(Da,Math.abs(C)),r=Sa(D)*M+w,o=Ma(D)*I+S;break;case fa.R:a=r=t[c++],s=o=t[c++],f=2*t[c++]+2*t[c++];break;case fa.Z:var A=a-r;y=s-o;f=Math.sqrt(A*A+y*y),r=a,o=s}f>=0&&(l[h++]=f,u+=f)}return this._pathLen=u,u},t.prototype.rebuildPath=function(t,e){var n,i,r,o,a,s,l,u,h,c,p=this.data,d=this._ux,f=this._uy,g=this._len,y=e<1,v=0,m=0,_=0;if(!y||(this._pathSegLen||this._calculateLength(),l=this._pathSegLen,u=e*this._pathLen))t:for(var x=0;x0&&(t.lineTo(h,c),_=0),b){case fa.M:n=r=p[x++],i=o=p[x++],t.moveTo(r,o);break;case fa.L:a=p[x++],s=p[x++];var S=Ta(a-r),M=Ta(s-o);if(S>d||M>f){if(y){if(v+(j=l[m++])>u){var I=(u-v)/j;t.lineTo(r*(1-I)+a*I,o*(1-I)+s*I);break t}v+=j}t.lineTo(a,s),r=a,o=s,_=0}else{var T=S*S+M*M;T>_&&(h=a,c=s,_=T)}break;case fa.C:var C=p[x++],D=p[x++],A=p[x++],k=p[x++],L=p[x++],P=p[x++];if(y){if(v+(j=l[m++])>u){Uo(r,C,A,L,I=(u-v)/j,ga),Uo(o,D,k,P,I,ya),t.bezierCurveTo(ga[1],ya[1],ga[2],ya[2],ga[3],ya[3]);break t}v+=j}t.bezierCurveTo(C,D,A,k,L,P),r=L,o=P;break;case fa.Q:C=p[x++],D=p[x++],A=p[x++],k=p[x++];if(y){if(v+(j=l[m++])>u){Ko(r,C,A,I=(u-v)/j,ga),Ko(o,D,k,I,ya),t.quadraticCurveTo(ga[1],ya[1],ga[2],ya[2]);break t}v+=j}t.quadraticCurveTo(C,D,A,k),r=A,o=k;break;case fa.A:var O=p[x++],R=p[x++],N=p[x++],z=p[x++],E=p[x++],V=p[x++],B=p[x++],G=!p[x++],F=N>z?N:z,H=Ta(N-z)>.001,W=E+V,U=!1;if(y)v+(j=l[m++])>u&&(W=E+V*(u-v)/j,U=!0),v+=j;if(H&&t.ellipse?t.ellipse(O,R,N,z,B,E,W,G):t.arc(O,R,F,E,W,G),U)break t;w&&(n=Sa(E)*N+O,i=Ma(E)*z+R),r=Sa(W)*N+O,o=Ma(W)*z+R;break;case fa.R:n=r=p[x],i=o=p[x+1],a=p[x++],s=p[x++];var X=p[x++],Y=p[x++];if(y){if(v+(j=l[m++])>u){var Z=u-v;t.moveTo(a,s),t.lineTo(a+ba(Z,X),s),(Z-=X)>0&&t.lineTo(a+X,s+ba(Z,Y)),(Z-=Y)>0&&t.lineTo(a+wa(X-Z,0),s+Y),(Z-=X)>0&&t.lineTo(a,s+wa(Y-Z,0));break t}v+=j}t.rect(a,s,X,Y);break;case fa.Z:if(y){var j;if(v+(j=l[m++])>u){I=(u-v)/j;t.lineTo(r*(1-I)+n*I,o*(1-I)+i*I);break t}v+=j}t.closePath(),r=n,o=i}}},t.prototype.clone=function(){var e=new t,n=this.data;return e.data=n.slice?n.slice():Array.prototype.slice.call(n),e._len=this._len,e},t.CMD=fa,t.initDefaultProps=function(){var e=t.prototype;e._saveData=!0,e._needsDash=!1,e._dashOffset=0,e._dashIdx=0,e._dashSum=0,e._ux=0,e._uy=0,e._pendingPtDist=0,e._version=0}(),t}();function Ra(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0;if(a>e+s&&a>i+s||at+s&&o>n+s||oe+c&&h>i+c&&h>o+c&&h>s+c||ht+c&&u>n+c&&u>r+c&&u>a+c||ue+u&&l>i+u&&l>o+u||lt+u&&s>n+u&&s>r+u||sn||h+ur&&(r+=Ba);var p=Math.atan2(l,s);return p<0&&(p+=Ba),p>=i&&p<=r||p+Ba>=i&&p+Ba<=r}function Fa(t,e,n,i,r,o){if(o>e&&o>i||or?s:0}var Ha=Oa.CMD,Wa=2*Math.PI;var Ua=[-1,-1,-1],Xa=[-1,-1];function Ya(t,e,n,i,r,o,a,s,l,u){if(u>e&&u>i&&u>o&&u>s||u1&&(h=void 0,h=Xa[0],Xa[0]=Xa[1],Xa[1]=h),f=Go(e,i,o,s,Xa[0]),d>1&&(g=Go(e,i,o,s,Xa[1]))),2===d?ve&&s>i&&s>o||s=0&&h<=1&&(r[l++]=h);else{var u=a*a-4*o*s;if(Vo(u))(h=-a/(2*o))>=0&&h<=1&&(r[l++]=h);else if(u>0){var h,c=ko(u),p=(-a-c)/(2*o);(h=(-a+c)/(2*o))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}(e,i,o,s,Ua);if(0===l)return 0;var u=qo(e,i,o);if(u>=0&&u<=1){for(var h=0,c=Zo(e,i,o,u),p=0;pn||s<-n)return 0;var l=Math.sqrt(n*n-s*s);Ua[0]=-l,Ua[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u>=Wa-1e-4){i=0,r=Wa;var h=o?1:-1;return a>=Ua[0]+t&&a<=Ua[1]+t?h:0}if(i>r){var c=i;i=r,r=c}i<0&&(i+=Wa,r+=Wa);for(var p=0,d=0;d<2;d++){var f=Ua[d];if(f+t>a){var g=Math.atan2(s,f);h=o?1:-1;g<0&&(g=Wa+g),(g>=i&&g<=r||g+Wa>=i&&g+Wa<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),p+=h)}}return p}function qa(t,e,n,i,r){for(var o,a,s,l,u=t.data,h=t.len(),c=0,p=0,d=0,f=0,g=0,y=0;y1&&(n||(c+=Fa(p,d,f,g,i,r))),m&&(f=p=u[y],g=d=u[y+1]),v){case Ha.M:p=f=u[y++],d=g=u[y++];break;case Ha.L:if(n){if(Ra(p,d,u[y],u[y+1],e,i,r))return!0}else c+=Fa(p,d,u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case Ha.C:if(n){if(Na(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=Ya(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case Ha.Q:if(n){if(za(p,d,u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=Za(p,d,u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case Ha.A:var _=u[y++],x=u[y++],b=u[y++],w=u[y++],S=u[y++],M=u[y++];y+=1;var I=!!(1-u[y++]);o=Math.cos(S)*b+_,a=Math.sin(S)*w+x,m?(f=o,g=a):c+=Fa(p,d,o,a,i,r);var T=(i-_)*w/b+_;if(n){if(Ga(_,x,w,S,S+M,I,e,T,r))return!0}else c+=ja(_,x,w,S,S+M,I,T,r);p=Math.cos(S+M)*b+_,d=Math.sin(S+M)*w+x;break;case Ha.R:if(f=p=u[y++],g=d=u[y++],o=f+u[y++],a=g+u[y++],n){if(Ra(f,g,o,g,e,i,r)||Ra(o,g,o,a,e,i,r)||Ra(o,a,f,a,e,i,r)||Ra(f,a,f,g,e,i,r))return!0}else c+=Fa(o,g,o,a,i,r),c+=Fa(f,a,f,g,i,r);break;case Ha.Z:if(n){if(Ra(p,d,f,g,e,i,r))return!0}else c+=Fa(p,d,f,g,i,r);p=f,d=g}}return n||(s=d,l=g,Math.abs(s-l)<1e-4)||(c+=Fa(p,d,f,g,i,r)||0),0!==c}var Ka=C({fill:"#000",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:"butt",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},wo),$a={style:C({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},So.style)},Ja=["x","y","rotation","scaleX","scaleY","originX","originY","invisible","culling","z","z2","zlevel","parent"],Qa=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype.update=function(){var n=this;t.prototype.update.call(this);var i=this.style;if(i.decal){var r=this._decalEl=this._decalEl||new e;r.buildPath===e.prototype.buildPath&&(r.buildPath=function(t){n.buildPath(t,n.shape)}),r.silent=!0;var o=r.style;for(var a in i)o[a]!==i[a]&&(o[a]=i[a]);o.fill=i.fill?i.decal:null,o.decal=null,o.shadowColor=null,i.strokeFirst&&(o.stroke=null);for(var s=0;s.5?Bn:e>.2?"#eee":Gn}if(t)return Gn}return Bn},e.prototype.getInsideTextStroke=function(t){var e=this.style.fill;if(W(e)){var n=this.__zr;if(!(!n||!n.isDarkMode())===tn(t,0)<.4)return e}},e.prototype.buildPath=function(t,e,n){},e.prototype.pathUpdated=function(){this.__dirty&=-5},e.prototype.getUpdatedPathProxy=function(t){return!this.path&&this.createPathProxy(),this.path.beginPath(),this.buildPath(this.path,this.shape,t),this.path},e.prototype.createPathProxy=function(){this.path=new Oa(!1)},e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.getBoundingRect=function(){var t=this._rect,e=this.style,n=!t;if(n){var i=!1;this.path||(i=!0,this.createPathProxy());var r=this.path;(i||4&this.__dirty)&&(r.beginPath(),this.buildPath(r,this.shape,!1),this.pathUpdated()),t=r.getBoundingRect()}if(this._rect=t,this.hasStroke()&&this.path&&this.path.len()>0){var o=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||n){o.copy(t);var a=e.strokeNoScale?this.getLineScale():1,s=e.lineWidth;if(!this.hasFill()){var l=this.strokeContainThreshold;s=Math.max(s,null==l?4:l)}a>1e-10&&(o.width+=s/a,o.height+=s/a,o.x-=s/a/2,o.y-=s/a/2)}return o}return t},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path;if(this.hasStroke()){var a=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(this.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),function(t,e,n,i){return qa(t,e,!0,n,i)}(o,a/s,t,e)))return!0}if(this.hasFill())return function(t,e,n){return qa(t,0,!1,e,n)}(o,t,e)}return!1},e.prototype.dirtyShape=function(){this.__dirty|=4,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},e.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},e.prototype.animateShape=function(t){return this.animate("shape",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():"shape"===t?this.dirtyShape():this.markRedraw()},e.prototype.attrKV=function(e,n){"shape"===e?this.setShape(n):t.prototype.attrKV.call(this,e,n)},e.prototype.setShape=function(t,e){var n=this.shape;return n||(n=this.shape={}),"string"==typeof t?n[t]=e:T(n,t),this.dirtyShape(),this},e.prototype.shapeChanged=function(){return!!(4&this.__dirty)},e.prototype.createStyle=function(t){return dt(Ka,t)},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.shape&&!n.shape&&(n.shape=T({},this.shape))},e.prototype._applyStateObj=function(e,n,i,r,o,a){t.prototype._applyStateObj.call(this,e,n,i,r,o,a);var s,l=!(n&&r);if(n&&n.shape?o?r?s=n.shape:(s=T({},i.shape),T(s,n.shape)):(s=T({},r?this.shape:i.shape),T(s,n.shape)):l&&(s=i.shape),s)if(o){this.shape=T({},this.shape);for(var u={},h=V(s),c=0;c0},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.createStyle=function(t){return dt(ts,t)},e.prototype.setBoundingRect=function(t){this._rect=t},e.prototype.getBoundingRect=function(){var t=this.style;if(!this._rect){var e=t.text;null!=e?e+="":e="";var n=Si(e,t.font,t.textAlign,t.textBaseline);if(n.x+=t.x||0,n.y+=t.y||0,this.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect},e.initDefaultProps=void(e.prototype.dirtyRectTolerance=10),e}(To);es.prototype.type="tspan";var ns=C({x:0,y:0},wo),is={style:C({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},So.style)};var rs=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.createStyle=function(t){return dt(ns,t)},e.prototype._getSize=function(t){var e=this.style,n=e[t];if(null!=n)return n;var i,r=(i=e.image)&&"string"!=typeof i&&i.width&&i.height?e.image:this.__image;if(!r)return 0;var o="width"===t?"height":"width",a=e[o];return null==a?r[t]:r[t]/r[o]*a},e.prototype.getWidth=function(){return this._getSize("width")},e.prototype.getHeight=function(){return this._getSize("height")},e.prototype.getAnimationStyleProps=function(){return is},e.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new vi(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},e}(To);rs.prototype.type="image";var os=Math.round;function as(t,e,n){if(e){var i=e.x1,r=e.x2,o=e.y1,a=e.y2;t.x1=i,t.x2=r,t.y1=o,t.y2=a;var s=n&&n.lineWidth;return s?(os(2*i)===os(2*r)&&(t.x1=t.x2=ls(i,s,!0)),os(2*o)===os(2*a)&&(t.y1=t.y2=ls(o,s,!0)),t):t}}function ss(t,e,n){if(e){var i=e.x,r=e.y,o=e.width,a=e.height;t.x=i,t.y=r,t.width=o,t.height=a;var s=n&&n.lineWidth;return s?(t.x=ls(i,s,!0),t.y=ls(r,s,!0),t.width=Math.max(ls(i+o,s,!1)-t.x,0===o?0:1),t.height=Math.max(ls(r+a,s,!1)-t.y,0===a?0:1),t):t}}function ls(t,e,n){if(!e)return t;var i=os(2*t);return(i+os(e))%2==0?i/2:(i+(n?1:-1))/2}var us=function(){this.x=0,this.y=0,this.width=0,this.height=0},hs={},cs=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new us},e.prototype.buildPath=function(t,e){var n,i,r,o;if(this.subPixelOptimize){var a=ss(hs,e,this.style);n=a.x,i=a.y,r=a.width,o=a.height,a.r=e.r,e=a}else n=e.x,i=e.y,r=e.width,o=e.height;e.r?function(t,e){var n,i,r,o,a,s=e.x,l=e.y,u=e.width,h=e.height,c=e.r;u<0&&(s+=u,u=-u),h<0&&(l+=h,h=-h),"number"==typeof c?n=i=r=o=c:c instanceof Array?1===c.length?n=i=r=o=c[0]:2===c.length?(n=r=c[0],i=o=c[1]):3===c.length?(n=c[0],i=o=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],o=c[3]):n=i=r=o=0,n+i>u&&(n*=u/(a=n+i),i*=u/a),r+o>u&&(r*=u/(a=r+o),o*=u/a),i+r>h&&(i*=h/(a=i+r),r*=h/a),n+o>h&&(n*=h/(a=n+o),o*=h/a),t.moveTo(s+n,l),t.lineTo(s+u-i,l),0!==i&&t.arc(s+u-i,l+i,i,-Math.PI/2,0),t.lineTo(s+u,l+h-r),0!==r&&t.arc(s+u-r,l+h-r,r,0,Math.PI/2),t.lineTo(s+o,l+h),0!==o&&t.arc(s+o,l+h-o,o,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}(t,e):t.rect(n,i,r,o)},e.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},e}(Qa);cs.prototype.type="rect";var ps={fill:"#000"},ds={style:C({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},So.style)},fs=function(t){function e(e){var n=t.call(this)||this;return n.type="text",n._children=[],n._defaultStyle=ps,n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.update=function(){t.prototype.update.call(this),this.styleChanged()&&this._updateSubTexts();for(var e=0;ep&&u){var d=Math.floor(p/l);n=n.slice(0,d)}var f=p,g=h;if(r&&(f+=r[0]+r[2],null!=g&&(g+=r[1]+r[3])),t&&a&&null!=g)for(var y=ho(h,o,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),v=0;v0,M=null!=t.width&&("truncate"===t.overflow||"break"===t.overflow||"breakAll"===t.overflow),I=i.calculatedLineHeight,T=0;Tl&&vo(n,t.substring(l,u),e,s),vo(n,i[2],e,s,i[1]),l=lo.lastIndex}lo){b>0?(m.tokens=m.tokens.slice(0,b),y(m,x,_),n.lines=n.lines.slice(0,v+1)):n.lines=n.lines.slice(0,v);break t}var C=w.width,D=null==C||"auto"===C;if("string"==typeof C&&"%"===C.charAt(C.length-1))P.percentWidth=C,h.push(P),P.contentWidth=bi(P.text,I);else{if(D){var A=w.backgroundColor,k=A&&A.image;k&&so(k=ro(k))&&(P.width=Math.max(P.width,k.width*T/k.height))}var L=f&&null!=r?r-x:null;null!=L&&L=0&&"right"===(C=_[T]).align;)this._placeToken(C,t,b,f,I,"right",y),w-=C.width,I-=C.width,T--;for(M+=(n-(M-d)-(g-I)-w)/2;S<=T;)C=_[S],this._placeToken(C,t,b,f,M+C.width/2,"center",y),M+=C.width,S++;f+=b}},e.prototype._placeToken=function(t,e,n,i,r,o,a){var s=e.rich[t.styleName]||{};s.text=t.text;var l=t.verticalAlign,u=i+n/2;"top"===l?u=i+t.height/2:"bottom"===l&&(u=i+n-t.height/2),!t.isLineHolder&&ws(s)&&this._renderBackground(s,e,"right"===o?r-t.width:"center"===o?r-t.width/2:r,u-t.height/2,t.width,t.height);var h=!!s.backgroundColor,c=t.textPadding;c&&(r=xs(r,o,c),u-=t.height/2-c[0]-t.innerHeight/2);var p=this._getOrCreateChild(es),d=p.createStyle();p.useStyle(d);var f=this._defaultStyle,g=!1,y=0,v=_s("fill"in s?s.fill:"fill"in e?e.fill:(g=!0,f.fill)),m=ms("stroke"in s?s.stroke:"stroke"in e?e.stroke:h||a||f.autoStroke&&!g?null:(y=2,f.stroke)),_=s.textShadowBlur>0||e.textShadowBlur>0;d.text=t.text,d.x=r,d.y=u,_&&(d.shadowBlur=s.textShadowBlur||e.textShadowBlur||0,d.shadowColor=s.textShadowColor||e.textShadowColor||"transparent",d.shadowOffsetX=s.textShadowOffsetX||e.textShadowOffsetX||0,d.shadowOffsetY=s.textShadowOffsetY||e.textShadowOffsetY||0),d.textAlign=o,d.textBaseline="middle",d.font=t.font||_i,d.opacity=nt(s.opacity,e.opacity,1),m&&(d.lineWidth=nt(s.lineWidth,e.lineWidth,y),d.lineDash=et(s.lineDash,e.lineDash),d.lineDashOffset=e.lineDashOffset||0,d.stroke=m),v&&(d.fill=v);var x=t.contentWidth,b=t.contentHeight;p.setBoundingRect(new vi(Mi(d.x,x,d.textAlign),Ii(d.y,b,d.textBaseline),x,b))},e.prototype._renderBackground=function(t,e,n,i,r,o){var a,s,l,u=t.backgroundColor,h=t.borderWidth,c=t.borderColor,p=u&&u.image,d=u&&!p,f=t.borderRadius,g=this;if(d||t.lineHeight||h&&c){(a=this._getOrCreateChild(cs)).useStyle(a.createStyle()),a.style.fill=null;var y=a.shape;y.x=n,y.y=i,y.width=r,y.height=o,y.r=f,a.dirtyShape()}if(d)(l=a.style).fill=u||null,l.fillOpacity=et(t.fillOpacity,1);else if(p){(s=this._getOrCreateChild(rs)).onload=function(){g.dirtyStyle()};var v=s.style;v.image=u.image,v.x=n,v.y=i,v.width=r,v.height=o}h&&c&&((l=a.style).lineWidth=h,l.stroke=c,l.strokeOpacity=et(t.strokeOpacity,1),l.lineDash=t.borderDash,l.lineDashOffset=t.borderDashOffset||0,a.strokeContainThreshold=0,a.hasFill()&&a.hasStroke()&&(l.strokeFirst=!0,l.lineWidth*=2));var m=(a||s).style;m.shadowBlur=t.shadowBlur||0,m.shadowColor=t.shadowColor||"transparent",m.shadowOffsetX=t.shadowOffsetX||0,m.shadowOffsetY=t.shadowOffsetY||0,m.opacity=nt(t.opacity,e.opacity,1)},e.makeFont=function(t){var e="";if(t.fontSize||t.fontFamily||t.fontWeight){var n="";n="string"!=typeof t.fontSize||-1===t.fontSize.indexOf("px")&&-1===t.fontSize.indexOf("rem")&&-1===t.fontSize.indexOf("em")?isNaN(+t.fontSize)?"12px":t.fontSize+"px":t.fontSize,e=[t.fontStyle,t.fontWeight,n,t.fontFamily||"sans-serif"].join(" ")}return e&&at(e)||t.textFont||t.font},e}(To),gs={left:!0,right:1,center:1},ys={top:1,bottom:1,middle:1};function vs(t){if(t){t.font=fs.makeFont(t);var e=t.align;"middle"===e&&(e="center"),t.align=null==e||gs[e]?e:"left";var n=t.verticalAlign;"center"===n&&(n="middle"),t.verticalAlign=null==n||ys[n]?n:"top",t.padding&&(t.padding=rt(t.padding))}}function ms(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function _s(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function xs(t,e,n){return"right"===e?t-n[1]:"center"===e?t+n[3]/2-n[1]/2:t+n[3]}function bs(t){var e=t.text;return null!=e&&(e+=""),e}function ws(t){return!!(t.backgroundColor||t.lineHeight||t.borderWidth&&t.borderColor)}var Ss=Rr(),Ms=function(t,e,n,i){if(i){var r=Ss(i);r.dataIndex=n,r.dataType=e,r.seriesIndex=t,"group"===i.type&&i.traverse((function(i){var r=Ss(i);r.seriesIndex=t,r.dataIndex=n,r.dataType=e}))}},Is=1,Ts={},Cs=Rr(),Ds=["emphasis","blur","select"],As=["normal","emphasis","blur","select"],ks=10,Ls="highlight",Ps="downplay",Os="select",Rs="unselect",Ns="toggleSelect";function zs(t){return null!=t&&"none"!==t}var Es=new ke(100);function Vs(t){if("string"!=typeof t)return t;var e=Es.get(t);return e||(e=Xe(t,-.1),Es.put(t,e)),e}function Bs(t,e,n){t.onHoverStateChange&&(t.hoverState||0)!==n&&t.onHoverStateChange(e),t.hoverState=n}function Gs(t){Bs(t,"emphasis",2)}function Fs(t){2===t.hoverState&&Bs(t,"normal",0)}function Hs(t){Bs(t,"blur",1)}function Ws(t){1===t.hoverState&&Bs(t,"normal",0)}function Us(t){t.selected=!0}function Xs(t){t.selected=!1}function Ys(t,e,n){e(t,n)}function Zs(t,e,n){Ys(t,e,n),t.isGroup&&t.traverse((function(t){Ys(t,e,n)}))}function js(t,e){switch(e){case"emphasis":t.hoverState=2;break;case"normal":t.hoverState=0;break;case"blur":t.hoverState=1;break;case"select":t.selected=!0}}function qs(t,e){var n=this.states[t];if(this.style){if("emphasis"===t)return function(t,e,n,i){var r=n&&A(n,"select")>=0,o=!1;if(t instanceof Qa){var a=Cs(t),s=r&&a.selectFill||a.normalFill,l=r&&a.selectStroke||a.normalStroke;if(zs(s)||zs(l)){var u=(i=i||{}).style||{};"inherit"===u.fill?(o=!0,i=T({},i),(u=T({},u)).fill=s):!zs(u.fill)&&zs(s)?(o=!0,i=T({},i),(u=T({},u)).fill=Vs(s)):!zs(u.stroke)&&zs(l)&&(o||(i=T({},i),u=T({},u)),u.stroke=Vs(l)),i.style=u}}if(i&&null==i.z2){o||(i=T({},i));var h=t.z2EmphasisLift;i.z2=t.z2+(null!=h?h:ks)}return i}(this,0,e,n);if("blur"===t)return function(t,e,n){var i=A(t.currentStates,e)>=0,r=t.style.opacity,o=i?null:function(t,e,n,i){for(var r=t.style,o={},a=0;a0){var o={dataIndex:r,seriesIndex:t.seriesIndex};null!=i&&(o.dataType=i),e.push(o)}}))})),e}function pl(t,e,n){vl(t,!0),Zs(t,Ks),dl(t,e,n)}function dl(t,e,n){var i=Ss(t);null!=e?(i.focus=e,i.blurScope=n):i.focus&&(i.focus=null)}var fl=["emphasis","blur","select"],gl={itemStyle:"getItemStyle",lineStyle:"getLineStyle",areaStyle:"getAreaStyle"};function yl(t,e,n,i){n=n||"itemStyle";for(var r=0;r1&&(a*=Tl(f),s*=Tl(f));var g=(r===o?-1:1)*Tl((a*a*(s*s)-a*a*(d*d)-s*s*(p*p))/(a*a*(d*d)+s*s*(p*p)))||0,y=g*a*d/s,v=g*-s*p/a,m=(t+n)/2+Dl(c)*y-Cl(c)*v,_=(e+i)/2+Cl(c)*y+Dl(c)*v,x=Pl([1,0],[(p-y)/a,(d-v)/s]),b=[(p-y)/a,(d-v)/s],w=[(-1*p-y)/a,(-1*d-v)/s],S=Pl(b,w);if(Ll(b,w)<=-1&&(S=Al),Ll(b,w)>=1&&(S=0),S<0){var M=Math.round(S/Al*1e6)/1e6;S=2*Al+M%2*Al}h.addData(u,m,_,a,s,x,S,c,o)}var Rl=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,Nl=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;var zl=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.applyTransform=function(t){},e}(Qa);function El(t){return null!=t.setData}function Vl(t,e){var n=function(t){var e=new Oa;if(!t)return e;var n,i=0,r=0,o=i,a=r,s=Oa.CMD,l=t.match(Rl);if(!l)return e;for(var u=0;uk*k+L*L&&(M=T,I=C),{cx:M,cy:I,x01:-h,y01:-c,x11:M*(r/b-1),y11:I*(r/b-1)}}function iu(t,e){var n=Ql(e.r,0),i=Ql(e.r0||0,0),r=n>0;if(r||i>0){if(r||(n=i,i=0),i>n){var o=n;n=i,i=o}var a,s=!!e.clockwise,l=e.startAngle,u=e.endAngle;if(l===u)a=0;else{var h=[l,u];Pa(h,!s),a=$l(h[0]-h[1])}var c=e.cx,p=e.cy,d=e.cornerRadius||0,f=e.innerCornerRadius||0;if(n>eu)if(a>Yl-eu)t.moveTo(c+n*jl(l),p+n*Zl(l)),t.arc(c,p,n,l,u,!s),i>eu&&(t.moveTo(c+i*jl(u),p+i*Zl(u)),t.arc(c,p,i,u,l,s));else{var g=$l(n-i)/2,y=tu(g,d),v=tu(g,f),m=v,_=y,x=n*jl(l),b=n*Zl(l),w=i*jl(u),S=i*Zl(u),M=void 0,I=void 0,T=void 0,C=void 0;if((y>eu||v>eu)&&(M=n*jl(u),I=n*Zl(u),T=i*jl(l),C=i*Zl(l),aeu)if(_>eu){var N=nu(T,C,x,b,n,_,s),z=nu(M,I,w,S,n,_,s);t.moveTo(c+N.cx+N.x01,p+N.cy+N.y01),_eu&&a>eu)if(m>eu){N=nu(w,S,M,I,i,-m,s),z=nu(x,b,T,C,i,-m,s);t.lineTo(c+N.cx+N.x01,p+N.cy+N.y01),m=2){if(i&&"spline"!==i){var o=function(t,e,n,i){var r,o,a,s,l=[],u=[],h=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var p=0,d=t.length;pn-2?n-1:l+1],d=t[l>n-3?n-1:l+2]);var f=u*u,g=u*f;i.push([lu(h[0],c[0],p[0],d[0],u,f,g),lu(h[1],c[1],p[1],d[1],u,f,g)])}return i}(r,n)),t.moveTo(r[0][0],r[0][1]);s=1;for(var c=r.length;sDu[1]){if(a=!1,r)return a;var u=Math.abs(Du[0]-Cu[1]),h=Math.abs(Cu[0]-Du[1]);Math.min(u,h)>i.len()&&(u0){var c={duration:h.duration,delay:h.delay||0,easing:h.easing,done:o,force:!!o||!!a,setToFinal:!u,scope:t,during:a};l?e.animateFrom(n,c):e.animateTo(n,c)}else e.stopAnimation(),!l&&e.attr(n),a&&a(1),o&&o()}function Eu(t,e,n,i,r,o){zu("update",t,e,n,i,r,o)}function Vu(t,e,n,i,r,o){zu("init",t,e,n,i,r,o)}function Bu(t){if(!t.__zr)return!0;for(var e=0;eMath.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function sh(t){return!t.isGroup}function lh(t,e,n){if(t&&e){var i,r=(i={},t.traverse((function(t){sh(t)&&t.anid&&(i[t.anid]=t)})),i);e.traverse((function(t){if(sh(t)&&t.anid){var e=r[t.anid];if(e){var i=o(t);t.attr(o(e)),Eu(t,i,n,Ss(t).dataIndex)}}}))}function o(t){var e={x:t.x,y:t.y,rotation:t.rotation};return function(t){return null!=t.shape}(t)&&(e.shape=T({},t.shape)),e}}function uh(t,e){return R(t,(function(t){var n=t[0];n=Uu(n,e.x),n=Xu(n,e.x+e.width);var i=t[1];return i=Uu(i,e.y),[n,i=Xu(i,e.y+e.height)]}))}function hh(t,e){var n=Uu(t.x,e.x),i=Xu(t.x+t.width,e.x+e.width),r=Uu(t.y,e.y),o=Xu(t.y+t.height,e.y+e.height);if(i>=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}}function ch(t,e,n){var i=T({rectHover:!0},e),r=i.style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(r.image=t.slice(8),C(r,n),new rs(i)):Ju(t.replace("path://",""),i,n,"center")}function ph(t,e,n,i,r){for(var o=0,a=r[r.length-1];o=-1e-6)return!1;var f=t-r,g=e-o,y=fh(f,g,u,h)/d;if(y<0||y>1)return!1;var v=fh(f,g,c,p)/d;return!(v<0||v>1)}function fh(t,e,n,i){return t*i-n*e}function gh(t){var e=t.itemTooltipOption,n=t.componentModel,i=t.itemName,r=W(e)?{formatter:e}:e,o=n.mainType,a=n.componentIndex,s={componentType:o,name:i,$vars:["name"]};s[o+"Index"]=a;var l=t.formatterParamsExtra;l&&O(V(l),(function(t){ft(s,t)||(s[t]=l[t],s.$vars.push(t))}));var u=Ss(t.el);u.componentMainType=o,u.componentIndex=a,u.tooltipConfig={name:i,option:C({content:i,formatterParams:s},r)}}Ku("circle",Hl),Ku("ellipse",Ul),Ku("sector",ou),Ku("ring",su),Ku("polygon",cu),Ku("polyline",du),Ku("rect",cs),Ku("line",yu),Ku("bezierCurve",xu),Ku("arc",wu);var yh=Object.freeze({__proto__:null,updateProps:Eu,initProps:Vu,removeElement:Gu,removeElementWithFadeOut:Hu,isElementRemoved:Bu,extendShape:Zu,extendPath:qu,registerShape:Ku,getShapeClass:$u,makePath:Ju,makeImage:Qu,mergePath:eh,resizePath:nh,subPixelOptimizeLine:function(t){return as(t.shape,t.shape,t.style),t},subPixelOptimizeRect:function(t){return ss(t.shape,t.shape,t.style),t},subPixelOptimize:ih,getTransform:rh,applyTransform:oh,transformDirection:ah,groupTransition:lh,clipPointsByRect:uh,clipRectByRect:hh,createIcon:ch,linePolygonIntersect:ph,lineLineIntersect:dh,setTooltipConfig:gh,Group:Bi,Image:rs,Text:fs,Circle:Hl,Ellipse:Ul,Sector:ou,Ring:su,Polygon:cu,Polyline:du,Rect:cs,Line:yu,BezierCurve:xu,Arc:wu,IncrementalDisplayable:Ou,CompoundPath:Su,LinearGradient:Iu,RadialGradient:Tu,BoundingRect:vi,OrientedBoundingRect:Lu,Point:li,Path:Qa}),vh={};function mh(t,e){for(var n=0;n-1?Zh:qh;function Qh(t,e){t=t.toUpperCase(),$h[t]=new Wh(e),Kh[t]=e}Qh(jh,{time:{month:["January","February","March","April","May","June","July","August","September","October","November","December"],monthAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayOfWeekAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},series:{typeNames:{pie:"Pie chart",bar:"Bar chart",line:"Line chart",scatter:"Scatter plot",effectScatter:"Ripple scatter plot",radar:"Radar chart",tree:"Tree",treemap:"Treemap",boxplot:"Boxplot",candlestick:"Candlestick",k:"K line chart",heatmap:"Heat map",map:"Map",parallel:"Parallel coordinate map",lines:"Line graph",graph:"Relationship graph",sankey:"Sankey diagram",funnel:"Funnel chart",gauge:"Gauge",pictorialBar:"Pictorial bar",themeRiver:"Theme River Map",sunburst:"Sunburst"}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:", ",end:". "}}}}),Qh(Zh,{time:{month:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthAbbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayOfWeekAbbr:["日","一","二","三","四","五","六"]},legend:{selector:{all:"全选",inverse:"反选"}},toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}});var tc=1e3,ec=6e4,nc=36e5,ic=864e5,rc=31536e6,oc={year:"{yyyy}",month:"{MMM}",day:"{d}",hour:"{HH}:{mm}",minute:"{HH}:{mm}",second:"{HH}:{mm}:{ss}",millisecond:"{HH}:{mm}:{ss} {SSS}",none:"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}"},ac="{yyyy}-{MM}-{dd}",sc={year:"{yyyy}",month:"{yyyy}-{MM}",day:ac,hour:"{yyyy}-{MM}-{dd} "+oc.hour,minute:"{yyyy}-{MM}-{dd} "+oc.minute,second:"{yyyy}-{MM}-{dd} "+oc.second,millisecond:oc.none},lc=["year","month","day","hour","minute","second","millisecond"],uc=["year","half-year","quarter","month","week","half-week","day","half-day","quarter-day","hour","minute","second","millisecond"];function hc(t,e){return"0000".substr(0,e-(t+="").length)+t}function cc(t){switch(t){case"half-year":case"quarter":return"month";case"week":case"half-week":return"day";case"half-day":case"quarter-day":return"hour";default:return t}}function pc(t){return t===cc(t)}function dc(t,e,n,i){var r=sr(t),o=r[yc(n)](),a=r[vc(n)]()+1,s=Math.floor((a-1)/4)+1,l=r[mc(n)](),u=r["get"+(n?"UTC":"")+"Day"](),h=r[_c(n)](),c=(h-1)%12+1,p=r[xc(n)](),d=r[bc(n)](),f=r[wc(n)](),g=(i instanceof Wh?i:function(t){return $h[t]}(i||Jh)||$h.EN).getModel("time"),y=g.get("month"),v=g.get("monthAbbr"),m=g.get("dayOfWeek"),_=g.get("dayOfWeekAbbr");return(e||"").replace(/{yyyy}/g,o+"").replace(/{yy}/g,o%100+"").replace(/{Q}/g,s+"").replace(/{MMMM}/g,y[a-1]).replace(/{MMM}/g,v[a-1]).replace(/{MM}/g,hc(a,2)).replace(/{M}/g,a+"").replace(/{dd}/g,hc(l,2)).replace(/{d}/g,l+"").replace(/{eeee}/g,m[u]).replace(/{ee}/g,_[u]).replace(/{e}/g,u+"").replace(/{HH}/g,hc(h,2)).replace(/{H}/g,h+"").replace(/{hh}/g,hc(c+"",2)).replace(/{h}/g,c+"").replace(/{mm}/g,hc(p,2)).replace(/{m}/g,p+"").replace(/{ss}/g,hc(d,2)).replace(/{s}/g,d+"").replace(/{SSS}/g,hc(f,3)).replace(/{S}/g,f+"")}function fc(t,e){var n=sr(t),i=n[vc(e)]()+1,r=n[mc(e)](),o=n[_c(e)](),a=n[xc(e)](),s=n[bc(e)](),l=0===n[wc(e)](),u=l&&0===s,h=u&&0===a,c=h&&0===o,p=c&&1===r;return p&&1===i?"year":p?"month":c?"day":h?"hour":u?"minute":l?"second":"millisecond"}function gc(t,e,n){var i="number"==typeof t?sr(t):t;switch(e=e||fc(t,n)){case"year":return i[yc(n)]();case"half-year":return i[vc(n)]()>=6?1:0;case"quarter":return Math.floor((i[vc(n)]()+1)/4);case"month":return i[vc(n)]();case"day":return i[mc(n)]();case"half-day":return i[_c(n)]()/24;case"hour":return i[_c(n)]();case"minute":return i[xc(n)]();case"second":return i[bc(n)]();case"millisecond":return i[wc(n)]()}}function yc(t){return t?"getUTCFullYear":"getFullYear"}function vc(t){return t?"getUTCMonth":"getMonth"}function mc(t){return t?"getUTCDate":"getDate"}function _c(t){return t?"getUTCHours":"getHours"}function xc(t){return t?"getUTCMinutes":"getMinutes"}function bc(t){return t?"getUTCSeconds":"getSeconds"}function wc(t){return t?"getUTCMilliseconds":"getMilliseconds"}function Sc(t){return t?"setUTCFullYear":"setFullYear"}function Mc(t){return t?"setUTCMonth":"setMonth"}function Ic(t){return t?"setUTCDate":"setDate"}function Tc(t){return t?"setUTCHours":"setHours"}function Cc(t){return t?"setUTCMinutes":"setMinutes"}function Dc(t){return t?"setUTCSeconds":"setSeconds"}function Ac(t){return t?"setUTCMilliseconds":"setMilliseconds"}function kc(t){if(!fr(t))return W(t)?t:"-";var e=(t+"").split(".");return e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:"")}function Lc(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,(function(t,e){return e.toUpperCase()})),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}var Pc=rt,Oc=/([&<>"'])/g,Rc={"&":"&","<":"<",">":">",'"':""","'":"'"};function Nc(t){return null==t?"":(t+"").replace(Oc,(function(t,e){return Rc[e]}))}function zc(t,e,n){function i(t){return t&&at(t)?t:"-"}function r(t){return!(null==t||isNaN(t)||!isFinite(t))}var o="time"===e,a=t instanceof Date;if(o||a){var s=o?sr(t):t;if(!isNaN(+s))return dc(s,"{yyyy}-{MM}-{dd} {hh}:{mm}:{ss}",n);if(a)return"-"}if("ordinal"===e)return U(t)?i(t):X(t)&&r(t)?t+"":"-";var l=dr(t);return r(l)?kc(l):U(t)?i(t):"-"}var Ec=["a","b","c","d","e","f","g"],Vc=function(t,e){return"{"+t+(null==e?"":e)+"}"};function Bc(t,e,n){F(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o':'':{renderMode:o,content:"{"+(n.markerId||"markerX")+"|} ",style:"subItem"===r?{width:4,height:4,borderRadius:2,backgroundColor:i}:{width:10,height:10,borderRadius:5,backgroundColor:i}}:""}function Fc(t,e){return e=e||"transparent",W(t)?t:Y(t)&&t.colorStops&&(t.colorStops[0]||{}).color||e}function Hc(t,e){if("_blank"===e||"blank"===e){var n=window.open();n.opener=null,n.location.href=t}else window.open(t,e)}var Wc=O,Uc=["left","right","top","bottom","width","height"],Xc=[["width","left","right"],["height","top","bottom"]];function Yc(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild((function(l,u){var h,c,p=l.getBoundingRect(),d=e.childAt(u+1),f=d&&d.getBoundingRect();if("horizontal"===t){var g=p.width+(f?-f.x+p.x:0);(h=o+g)>i||l.newline?(o=0,h=g,a+=s+n,s=p.height):s=Math.max(s,p.height)}else{var y=p.height+(f?-f.y+p.y:0);(c=a+y)>r||l.newline?(o+=s+n,a=0,c=y,s=p.width):s=Math.max(s,p.width)}l.newline||(l.x=o,l.y=a,l.markRedraw(),"horizontal"===t?o=h+n:a=c+n)}))}var Zc=Yc;G(Yc,"vertical"),G(Yc,"horizontal");function jc(t,e,n){n=Pc(n||0);var i=e.width,r=e.height,o=qi(t.left,i),a=qi(t.top,r),s=qi(t.right,i),l=qi(t.bottom,r),u=qi(t.width,i),h=qi(t.height,r),c=n[2]+n[0],p=n[1]+n[3],d=t.aspect;switch(isNaN(u)&&(u=i-s-p-o),isNaN(h)&&(h=r-l-c-a),null!=d&&(isNaN(u)&&isNaN(h)&&(d>i/r?u=.8*i:h=.8*r),isNaN(u)&&(u=d*h),isNaN(h)&&(h=u/d)),isNaN(o)&&(o=i-s-u-p),isNaN(a)&&(a=r-l-h-c),t.left||t.right){case"center":o=i/2-u/2-n[3];break;case"right":o=i-u-p}switch(t.top||t.bottom){case"middle":case"center":a=r/2-h/2-n[0];break;case"bottom":a=r-h-c}o=o||0,a=a||0,isNaN(u)&&(u=i-p-o-(s||0)),isNaN(h)&&(h=r-c-a-(l||0));var f=new vi(o+n[3],a+n[0],u,h);return f.margin=n,f}function qc(t,e,n,i,r){var o=!r||!r.hv||r.hv[0],a=!r||!r.hv||r.hv[1],s=r&&r.boundingMode||"all";if(o||a){var l;if("raw"===s)l="group"===t.type?new vi(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(l=t.getBoundingRect(),t.needLocalTransform()){var u=t.getLocalTransform();(l=l.clone()).applyTransform(u)}var h=jc(C({width:l.width,height:l.height},e),n,i),c=o?h.x-l.x:0,p=a?h.y-l.y:0;"raw"===s?(t.x=c,t.y=p):(t.x+=c,t.y+=p),t.markRedraw()}}function Kc(t){var e=t.layoutMode||t.constructor.layoutMode;return Y(e)?e:e?{type:e}:null}function $c(t,e,n){var i=n&&n.ignoreSize;!F(i)&&(i=[i,i]);var r=a(Xc[0],0),o=a(Xc[1],1);function a(n,r){var o={},a=0,u={},h=0;if(Wc(n,(function(e){u[e]=t[e]})),Wc(n,(function(t){s(e,t)&&(o[t]=u[t]=e[t]),l(o,t)&&a++,l(u,t)&&h++})),i[r])return l(e,n[1])?u[n[2]]=null:l(e,n[2])&&(u[n[1]]=null),u;if(2!==h&&a){if(a>=2)return o;for(var c=0;c=0;a--)o=M(o,n[a],!0);e.defaultOption=o}return e.defaultOption},e.prototype.getReferringComponents=function(t,e){var n=t+"Index",i=t+"Id";return Gr(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},e)},e.prototype.getBoxLayoutParams=function(){var t=this;return{left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")}},e.protoInitialize=function(){var t=e.prototype;t.type="component",t.id="",t.name="",t.mainType="",t.subType="",t.componentIndex=0}(),e}(Wh);qr(ep,Wh),Qr(ep),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){var i=Yr(t);e[i.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=Yr(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r}}(ep),function(t,e){function n(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}t.topologicalTravel=function(t,i,r,o){if(t.length){var a=function(t){var i={},r=[];return O(t,(function(o){var a=n(i,o),s=function(t,e){var n=[];return O(t,(function(t){A(e,t)>=0&&n.push(t)})),n}(a.originalDeps=e(o),t);a.entryCount=s.length,0===a.entryCount&&r.push(o),O(s,(function(t){A(a.predecessor,t)<0&&a.predecessor.push(t);var e=n(i,t);A(e.successor,t)<0&&e.successor.push(o)}))})),{graph:i,noEntryList:r}}(i),s=a.graph,l=a.noEntryList,u={};for(O(t,(function(t){u[t]=!0}));l.length;){var h=l.pop(),c=s[h],p=!!u[h];p&&(r.call(o,h,c.originalDeps.slice()),delete u[h]),O(c.successor,p?f:d)}O(u,(function(){var t="";throw new Error(t)}))}function d(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}function f(t){u[t]=!0,d(t)}}}(ep,(function(t){var e=[];O(ep.getClassesByMainType(t),(function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])})),e=R(e,(function(t){return Yr(t).main})),"dataset"!==t&&A(e,"dataset")<=0&&e.unshift("dataset");return e}));var np="";"undefined"!=typeof navigator&&(np=navigator.platform||"");var ip="rgba(0, 0, 0, 0.2)",rp={darkMode:"auto",colorBy:"series",color:["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],gradientColor:["#f6efa6","#d88273","#bf444c"],aria:{decal:{decals:[{color:ip,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:ip,symbol:"circle",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:ip,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:ip,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:ip,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:ip,symbol:"triangle",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:np.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,stateAnimation:{duration:300,easing:"cubicOut"},animation:"auto",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicInOut",animationEasingUpdate:"cubicInOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},op=ct(["tooltip","label","itemName","itemId","itemGroupId","seriesName"]),ap="original",sp="arrayRows",lp="objectRows",up="keyedColumns",hp="typedArray",cp="unknown",pp="column",dp="row",fp=1,gp=2,yp=3,vp=Rr();function mp(t,e,n){var i={},r=xp(e);if(!r||!t)return i;var o,a,s=[],l=[],u=e.ecModel,h=vp(u).datasetMap,c=r.uid+"_"+n.seriesLayoutBy;O(t=t.slice(),(function(e,n){var r=Y(e)?e:t[n]={name:e};"ordinal"===r.type&&null==o&&(o=n,a=f(r)),i[r.name]=[]}));var p=h.get(c)||h.set(c,{categoryWayDim:a,valueWayDim:0});function d(t,e,n){for(var i=0;ie)return t[i];return t[n-1]}(i,a):n;if((h=h||n)&&h.length){var c=h[l];return r&&(u[r]=c),s.paletteIdx=(l+1)%h.length,c}}var Pp=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(t,e,n,i,r,o){i=i||{},this.option=null,this._theme=new Wh(i),this._locale=new Wh(r),this._optionManager=o},e.prototype.setOption=function(t,e,n){var i=Np(e);this._optionManager.setOption(t,n,i),this._resetOption(null,i)},e.prototype.resetOption=function(t,e){return this._resetOption(t,Np(e))},e.prototype._resetOption=function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var r=i.mountOption("recreate"===t);0,this.option&&"recreate"!==t?(this.restoreData(),this._mergeOption(r,e)):Tp(this,r),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(n=!0,this._mergeOption(o,e))}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this);a.length&&O(a,(function(t){n=!0,this._mergeOption(t,e)}),this)}return n},e.prototype.mergeOption=function(t){this._mergeOption(t,null)},e.prototype._mergeOption=function(t,e){var n=this.option,i=this._componentsMap,r=this._componentsCount,o=[],a=ct(),s=e&&e.replaceMergeMainTypeMap;vp(this).datasetMap=ct(),O(t,(function(t,e){null!=t&&(ep.hasClass(e)?e&&(o.push(e),a.set(e,!0)):n[e]=null==n[e]?S(t):M(n[e],t,!0))})),s&&s.each((function(t,e){ep.hasClass(e)&&!a.get(e)&&(o.push(e),a.set(e,!0))})),ep.topologicalTravel(o,ep.getAllClassMainTypes(),(function(e){var o=function(t,e,n){var i=Sp.get(e);if(!i)return n;var r=i(t);return r?n.concat(r):n}(this,e,wr(t[e])),a=i.get(e),l=a?s&&s.get(e)?"replaceMerge":"normalMerge":"replaceAll",u=Cr(a,o,l);(function(t,e,n){O(t,(function(t){var i=t.newOption;Y(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=function(t,e,n,i){return e.type?e.type:n?n.subType:i.determineSubType(t,e)}(e,i,t.existing,n))}))})(u,e,ep),n[e]=null,i.set(e,null),r.set(e,0);var h=[],c=[],p=0;O(u,(function(t,n){var i=t.existing,r=t.newOption;if(r){var o="series"===e,a=ep.getClass(e,t.keyInfo.subType,!o);if(!a)return;if(i&&i.constructor===a)i.name=t.keyInfo.name,i.mergeOption(r,this),i.optionUpdated(r,!1);else{var s=T({componentIndex:n},t.keyInfo);T(i=new a(r,this,this,s),s),t.brandNew&&(i.__requireNewView=!0),i.init(r,this,this),i.optionUpdated(null,!0)}}else i&&(i.mergeOption({},this),i.optionUpdated({},!1));i?(h.push(i.option),c.push(i),p++):(h.push(void 0),c.push(void 0))}),this),n[e]=h,i.set(e,c),r.set(e,p),"series"===e&&Mp(this)}),this),this._seriesIndices||Mp(this)},e.prototype.getOption=function(){var t=S(this.option);return O(t,(function(e,n){if(ep.hasClass(n)){for(var i=wr(e),r=i.length,o=!1,a=r-1;a>=0;a--)i[a]&&!Pr(i[a])?o=!0:(i[a]=null,!o&&r--);i.length=r,t[n]=i}})),delete t["\0_ec_inner"],t},e.prototype.getTheme=function(){return this._theme},e.prototype.getLocaleModel=function(){return this._locale},e.prototype.setUpdatePayload=function(t){this._payload=t},e.prototype.getUpdatePayload=function(){return this._payload},e.prototype.getComponent=function(t,e){var n=this._componentsMap.get(t);if(n){var i=n[e||0];if(i)return i;if(null==e)for(var r=0;r=e:"max"===n?t<=e:t===e})(i[a],t,o)||(r=!1)}})),r}var Wp=O,Up=Y,Xp=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function Yp(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=Xp.length;n=0;f--){var g=t[f];if(s||(c=g.data.rawIndexOf(g.stackedByDimension,h)),c>=0){var y=g.data.getByRawIndex(g.stackResultDimension,c);if(p>=0&&y>0||p<=0&&y<0){p=nr(p,y),d=y;break}}}return i[0]=p,i[1]=d,i}))}))}var hd,cd,pd,dd,fd,gd=function(t){this.data=t.data||(t.sourceFormat===up?{}:[]),this.sourceFormat=t.sourceFormat||cp,this.seriesLayoutBy=t.seriesLayoutBy||pp,this.startIndex=t.startIndex||0,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.metaRawOption=t.metaRawOption;var e=this.dimensionsDefine=t.dimensionsDefine;if(e)for(var n=0;nu&&(u=d)}s[0]=l,s[1]=u}},i=function(){return this._data?this._data.length/this._dimSize:0};function r(t){for(var e=0;e=0&&(s=o.interpolatedValue[l])}return null!=s?s+"":""})):void 0},t.prototype.getRawValue=function(t,e){return Rd(this.getData(e),t)},t.prototype.formatTooltip=function(t,e,n){},t}();function Ed(t){var e,n;return Y(t)?t.type&&(n=t):e=t,{markupText:e,markupFragment:n}}function Vd(t){return new Bd(t)}var Bd=function(){function t(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}return t.prototype.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var o,a=h(this._modBy),s=this._modDataCount||0,l=h(t&&t.modBy),u=t&&t.modDataCount||0;function h(t){return!(t>=1)&&(t=1),t}a===l&&s===u||(e="reset"),(this._dirty||"reset"===e)&&(this._dirty=!1,o=this._doReset(i)),this._modBy=l,this._modDataCount=u;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var p=this._dueIndex,d=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(o||p1&&i>0?s:a}};return o;function a(){return e=t?null:oe},gte:function(t,e){return t>=e}},Xd=function(){function t(t,e){if("number"!=typeof e){var n="";0,_r(n)}this._opFn=Ud[t],this._rvalFloat=dr(e)}return t.prototype.evaluate=function(t){return"number"==typeof t?this._opFn(t,this._rvalFloat):this._opFn(dr(t),this._rvalFloat)},t}(),Yd=function(){function t(t,e){var n="desc"===t;this._resultLT=n?1:-1,null==e&&(e=n?"min":"max"),this._incomparable="min"===e?-1/0:1/0}return t.prototype.evaluate=function(t,e){var n=typeof t,i=typeof e,r="number"===n?t:dr(t),o="number"===i?e:dr(e),a=isNaN(r),s=isNaN(o);if(a&&(r=this._incomparable),s&&(o=this._incomparable),a&&s){var l="string"===n,u="string"===i;l&&(r=u?t:0),u&&(o=l?e:0)}return ro?-this._resultLT:0},t}(),Zd=function(){function t(t,e){this._rval=e,this._isEQ=t,this._rvalTypeof=typeof e,this._rvalFloat=dr(e)}return t.prototype.evaluate=function(t){var e=t===this._rval;if(!e){var n=typeof t;n===this._rvalTypeof||"number"!==n&&"number"!==this._rvalTypeof||(e=dr(t)===this._rvalFloat)}return this._isEQ?e:!e},t}();function jd(t,e){return"eq"===t||"ne"===t?new Zd("eq"===t,e):ft(Ud,t)?new Xd(t,e):null}var qd=function(){function t(){}return t.prototype.getRawData=function(){throw new Error("not supported")},t.prototype.getRawDataItem=function(t){throw new Error("not supported")},t.prototype.cloneRawData=function(){},t.prototype.getDimensionInfo=function(t){},t.prototype.cloneAllDimensionInfo=function(){},t.prototype.count=function(){},t.prototype.retrieveValue=function(t,e){},t.prototype.retrieveValueFromItem=function(t,e){},t.prototype.convertValue=function(t,e){return Fd(t,e)},t}();function Kd(t){var e=t.sourceFormat;if(!nf(e)){var n="";0,_r(n)}return t.data}function $d(t){var e=t.sourceFormat,n=t.data;if(!nf(e)){var i="";0,_r(i)}if(e===sp){for(var r=[],o=0,a=n.length;o65535?af:sf}function pf(t,e,n,i,r){var o=hf[n||"float"];if(r){var a=t[e],s=a&&a.length;if(s!==i){for(var l=new o(i),u=0;ug[1]&&(g[1]=f)}return this._rawCount=this._count=s,{start:a,end:s}},t.prototype._initDataFromProvider=function(t,e,n){for(var i=this._provider,r=this._chunks,o=this._dimensions,a=o.length,s=this._rawExtent,l=R(o,(function(t){return t.property})),u=0;uy[1]&&(y[1]=g)}}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=e,this._extent=[]},t.prototype.count=function(){return this._count},t.prototype.get=function(t,e){if(!(e>=0&&e=0&&e=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&nt))return o;r=o-1}}return-1},t.prototype.indicesOfNearest=function(t,e,n){var i=this._chunks[t],r=[];if(!i)return r;null==n&&(n=1/0);for(var o=1/0,a=-1,s=0,l=0,u=this.count();l=0&&a<0)&&(o=c,a=h,s=0),h===a&&(r[s++]=l))}return r.length=s,r},t.prototype.getIndices=function(){var t,e=this._indices;if(e){var n=e.constructor,i=this._count;if(n===Array){t=new n(i);for(var r=0;r=u&&_<=h||isNaN(_))&&(a[s++]=d),d++}p=!0}else if(2===r){f=c[i[0]];var y=c[i[1]],v=t[i[1]][0],m=t[i[1]][1];for(g=0;g=u&&_<=h||isNaN(_))&&(x>=v&&x<=m||isNaN(x))&&(a[s++]=d),d++}p=!0}}if(!p)if(1===r)for(g=0;g=u&&_<=h||isNaN(_))&&(a[s++]=b)}else for(g=0;gt[M][1])&&(w=!1)}w&&(a[s++]=e.getRawIndex(g))}return sy[1]&&(y[1]=g)}}}},t.prototype.lttbDownSample=function(t,e){var n,i,r,o=this.clone([t],!0),a=o._chunks[t],s=this.count(),l=0,u=Math.floor(1/e),h=this.getRawIndex(0),c=new(cf(this._rawCount))(Math.ceil(s/u)+2);c[l++]=h;for(var p=1;pn&&(n=i,r=S)}c[l++]=r,h=r}return c[l++]=this.getRawIndex(s-1),o._count=l,o._indices=c,o.getRawIndex=this._getRawIdx,o},t.prototype.downSample=function(t,e,n,i){for(var r=this.clone([t],!0),o=r._chunks,a=[],s=Math.floor(1/e),l=o[t],u=this.count(),h=r._rawExtent[t]=[1/0,-1/0],c=new(cf(this._rawCount))(Math.ceil(u/s)),p=0,d=0;du-d&&(s=u-d,a.length=s);for(var f=0;fh[1]&&(h[1]=y),c[p++]=v}return r._count=p,r._indices=c,r._updateGetRawIdx(),r},t.prototype.each=function(t,e){if(this._count)for(var n=t.length,i=this._chunks,r=0,o=this.count();ra&&(a=l)}return i=[o,a],this._extent[t]=i,i},t.prototype.getRawDataItem=function(t){var e=this.getRawIndex(t);if(this._provider.persistent)return this._provider.getItem(e);for(var n=[],i=this._chunks,r=0;r=0?this._indices[t]:-1},t.prototype._updateGetRawIdx=function(){this.getRawIndex=this._indices?this._getRawIdx:this._getRawIdxIdentity},t.internalField=function(){function t(t,e,n,i){return Fd(t[i],this._dimensions[i])}rf={arrayRows:t,objectRows:function(t,e,n,i){return Fd(t[e],this._dimensions[i])},keyedColumns:t,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return Fd(r instanceof Array?r[i]:r,this._dimensions[i])},typedArray:function(t,e,n,i){return t[i]}}}(),t}(),ff=function(){function t(t){this._sourceList=[],this._storeList=[],this._upstreamSignList=[],this._versionSignBase=0,this._dirty=!0,this._sourceHost=t}return t.prototype.dirty=function(){this._setLocalSource([],[]),this._storeList=[],this._dirty=!0},t.prototype._setLocalSource=function(t,e){this._sourceList=t,this._upstreamSignList=e,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},t.prototype._getVersionSign=function(){return this._sourceHost.uid+"_"+this._versionSignBase},t.prototype.prepareSource=function(){this._isDirty()&&(this._createSource(),this._dirty=!1)},t.prototype._createSource=function(){this._setLocalSource([],[]);var t,e,n=this._sourceHost,i=this._getUpstreamSourceManagers(),r=!!i.length;if(yf(n)){var o=n,a=void 0,s=void 0,l=void 0;if(r){var u=i[0];u.prepareSource(),a=(l=u.getSource()).data,s=l.sourceFormat,e=[u._getVersionSign()]}else s=j(a=o.get("data",!0))?hp:ap,e=[];var h=this._getSourceMetaRawOption()||{},c=l&&l.metaRawOption||{},p=et(h.seriesLayoutBy,c.seriesLayoutBy)||null,d=et(h.sourceHeader,c.sourceHeader)||null,f=et(h.dimensions,c.dimensions);t=p!==c.seriesLayoutBy||!!d!=!!c.sourceHeader||f?[vd(a,{seriesLayoutBy:p,sourceHeader:d,dimensions:f},s)]:[]}else{var g=n;if(r){var y=this._applyTransform(i);t=y.sourceList,e=y.upstreamSignList}else{t=[vd(g.get("source",!0),this._getSourceMetaRawOption(),null)],e=[]}}this._setLocalSource(t,e)},t.prototype._applyTransform=function(t){var e,n=this._sourceHost,i=n.get("transform",!0),r=n.get("fromTransformResult",!0);if(null!=r){var o="";1!==t.length&&vf(o)}var a,s=[],l=[];return O(t,(function(t){t.prepareSource();var e=t.getSource(r||0),n="";null==r||e||vf(n),s.push(e),l.push(t._getVersionSign())})),i?e=function(t,e,n){var i=wr(t),r=i.length,o="";r||_r(o);for(var a=0,s=r;a1||e>0&&!t.noHeader,i=0;O(t.blocks,(function(t){wf(t).planLayout(t);var e=t.__gapLevelBetweenSubBlocks;e>=i&&(i=e+(!n||e&&("section"!==t.type||t.noHeader)?0:1))})),t.__gapLevelBetweenSubBlocks=i},build:function(t,e,n,i){var r=e.noHeader,o=If(e),a=function(t,e,n,i){var r=[],o=e.blocks||[];ot(!o||F(o)),o=o||[];var a=t.orderMode;if(e.sortBlocks&&a){o=o.slice();var s={valueAsc:"asc",valueDesc:"desc"};if(ft(s,a)){var l=new Yd(s[a],null);o.sort((function(t,e){return l.evaluate(t.sortParam,e.sortParam)}))}else"seriesDesc"===a&&o.reverse()}var u=If(e);if(O(o,(function(e,n){var o=wf(e).build(t,e,n>0?u.html:0,i);null!=o&&r.push(o)})),!r.length)return;return"richText"===t.renderMode?r.join(u.richText):Tf(r.join(""),n)}(t,e,r?n:o.html,i);if(r)return a;var s=zc(e.header,"ordinal",t.useUTC),l=mf(i,t.renderMode).nameStyle;return"richText"===t.renderMode?Cf(t,s,l)+o.richText+a:Tf('
'+Nc(s)+"
"+a,n)}},nameValue:{planLayout:function(t){t.__gapLevelBetweenSubBlocks=0},build:function(t,e,n,i){var r=t.renderMode,o=e.noName,a=e.noValue,s=!e.markerType,l=e.name,u=e.value,h=t.useUTC;if(!o||!a){var c=s?"":t.markupStyleCreator.makeTooltipMarker(e.markerType,e.markerColor||"#333",r),p=o?"":zc(l,"ordinal",h),d=e.valueType,f=a?[]:F(u)?R(u,(function(t,e){return zc(t,F(d)?d[e]:d,h)})):[zc(u,F(d)?d[0]:d,h)],g=!s||!o,y=!s&&o,v=mf(i,r),m=v.nameStyle,_=v.valueStyle;return"richText"===r?(s?"":c)+(o?"":Cf(t,p,m))+(a?"":function(t,e,n,i,r){var o=[r],a=i?10:20;return n&&o.push({padding:[0,0,0,a],align:"right"}),t.markupStyleCreator.wrapRichTextStyle(e.join(" "),o)}(t,f,g,y,_)):Tf((s?"":c)+(o?"":function(t,e,n){return''+Nc(t)+""}(p,!s,m))+(a?"":function(t,e,n,i){var r=n?"10px":"20px";return''+R(t,(function(t){return Nc(t)})).join("  ")+""}(f,g,y,_)),n)}}}};function Mf(t,e,n,i,r,o){if(t){var a=wf(t);a.planLayout(t);var s={useUTC:r,renderMode:n,orderMode:i,markupStyleCreator:e};return a.build(s,t,0,o)}}function If(t){var e=t.__gapLevelBetweenSubBlocks;return{html:_f[e],richText:xf[e]}}function Tf(t,e){return'
'+t+'
'}function Cf(t,e,n){return t.markupStyleCreator.wrapRichTextStyle(e,n)}function Df(t,e){return Fc(t.getData().getItemVisual(e,"style")[t.visualDrawType])}function Af(t,e){var n=t.get("padding");return null!=n?n:"richText"===e?[8,10]:10}var kf=function(){function t(){this.richTextStyles={},this._nextStyleNameId=gr()}return t.prototype._generateStyleName=function(){return"__EC_aUTo_"+this._nextStyleNameId++},t.prototype.makeTooltipMarker=function(t,e,n){var i="richText"===n?this._generateStyleName():null,r=Gc({color:e,type:t,renderMode:n,markerId:i});return W(r)?r:(this.richTextStyles[i]=r.style,r.content)},t.prototype.wrapRichTextStyle=function(t,e){var n={};F(e)?O(e,(function(t){return T(n,t)})):T(n,e);var i=this._generateStyleName();return this.richTextStyles[i]=n,"{"+i+"|"+t+"}"},t}();function Lf(t){var e,n,i,r,o=t.series,a=t.dataIndex,s=t.multipleSeries,l=o.getData(),u=l.mapDimensionsAll("defaultedTooltip"),h=u.length,c=o.getRawValue(a),p=F(c),d=Df(o,a);if(h>1||p&&!h){var f=function(t,e,n,i,r){var o=e.getData(),a=N(t,(function(t,e,n){var i=o.getDimensionInfo(n);return t||i&&!1!==i.tooltip&&null!=i.displayName}),!1),s=[],l=[],u=[];function h(t,e){var n=o.getDimensionInfo(e);n&&!1!==n.otherDims.tooltip&&(a?u.push(bf("nameValue",{markerType:"subItem",markerColor:r,name:n.displayName,value:t,valueType:n.type})):(s.push(t),l.push(n.type)))}return i.length?O(i,(function(t){h(Rd(o,n,t),t)})):O(t,h),{inlineValues:s,inlineValueTypes:l,blocks:u}}(c,o,a,u,d);e=f.inlineValues,n=f.inlineValueTypes,i=f.blocks,r=f.inlineValues[0]}else if(h){var g=l.getDimensionInfo(u[0]);r=e=Rd(l,a,u[0]),n=g.type}else r=e=p?c[0]:c;var y=Lr(o),v=y&&o.name||"",m=l.getName(a),_=s?v:m;return bf("section",{header:v,noHeader:s||!y,sortParam:r,blocks:[bf("nameValue",{markerType:"item",markerColor:d,name:_,noName:!at(_),value:e,valueType:n})].concat(i||[])})}var Pf=Rr();function Of(t,e){return t.getName(e)||t.getId(e)}var Rf=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._selectedDataIndicesMap={},e}return n(e,t),e.prototype.init=function(t,e,n){this.seriesIndex=this.componentIndex,this.dataTask=Vd({count:zf,reset:Ef}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),(Pf(this).sourceManager=new ff(this)).prepareSource();var i=this.getInitialData(t,n);Bf(i,this),this.dataTask.context.data=i,Pf(this).dataBeforeProcessed=i,Nf(this),this._initSelectedMapFromData(i)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=Kc(this),i=n?Jc(t):{},r=this.subType;ep.hasClass(r)&&(r+="Series"),M(t,e.getTheme().get(this.subType)),M(t,this.getDefaultOption()),Sr(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&$c(t,i,n)},e.prototype.mergeOption=function(t,e){t=M(this.option,t,!0),this.fillDataTextStyle(t.data);var n=Kc(this);n&&$c(this.option,t,n);var i=Pf(this).sourceManager;i.dirty(),i.prepareSource();var r=this.getInitialData(t,e);Bf(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,Pf(this).dataBeforeProcessed=r,Nf(this),this._initSelectedMapFromData(r)},e.prototype.fillDataTextStyle=function(t){if(t&&!j(t))for(var e=["show"],n=0;nthis.getShallow("animationThreshold")&&(t=!1),!!t},e.prototype.restoreData=function(){this.dataTask.dirty()},e.prototype.getColorFromPalette=function(t,e,n){var i=this.ecModel,r=Ap.prototype.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},e.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},e.prototype.getProgressive=function(){return this.get("progressive")},e.prototype.getProgressiveThreshold=function(){return this.get("progressiveThreshold")},e.prototype.select=function(t,e){this._innerSelect(this.getData(e),t)},e.prototype.unselect=function(t,e){var n=this.option.selectedMap;if(n)for(var i=this.getData(e),r=0;r=0&&n.push(r)}return n},e.prototype.isSelected=function(t,e){var n=this.option.selectedMap;return n&&n[Of(this.getData(e),t)]||!1},e.prototype.isUniversalTransitionEnabled=function(){if(this.__universalTransitionEnabled)return!0;var t=this.option.universalTransition;return!!t&&(!0===t||t&&t.enabled)},e.prototype._innerSelect=function(t,e){var n,i,r=this.option.selectedMode,o=e.length;if(r&&o)if("multiple"===r)for(var a=this.option.selectedMap||(this.option.selectedMap={}),s=0;s0&&this._innerSelect(t,e)}},e.registerClass=function(t){return ep.registerClass(t)},e.protoInitialize=function(){var t=e.prototype;t.type="series.__base__",t.seriesIndex=0,t.ignoreStyleOnData=!1,t.hasSymbolVisual=!1,t.defaultSymbol="circle",t.visualStyleAccessPath="itemStyle",t.visualDrawType="fill"}(),e}(ep);function Nf(t){var e=t.name;Lr(t)||(t.name=function(t){var e=t.getRawData(),n=e.mapDimensionsAll("seriesName"),i=[];return O(n,(function(t){var n=e.getDimensionInfo(t);n.displayName&&i.push(n.displayName)})),i.join(" ")}(t)||e)}function zf(t){return t.model.getRawData().count()}function Ef(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),Vf}function Vf(t,e){e.outputData&&t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function Bf(t,e){O(pt(t.CHANGABLE_METHODS,t.DOWNSAMPLE_METHODS),(function(n){t.wrapMethod(n,G(Gf,e))}))}function Gf(t,e){var n=Ff(t);return n&&n.setOutputEnd((e||this).count()),e}function Ff(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}L(Rf,zd),L(Rf,Ap),qr(Rf,ep);var Hf=function(){function t(){this.group=new Bi,this.uid=Xh("viewComponent")}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){},t.prototype.updateLayout=function(t,e,n,i){},t.prototype.updateVisual=function(t,e,n,i){},t.prototype.blurSeries=function(t,e){},t}();function Wf(){var t=Rr();return function(e){var n=t(e),i=e.pipelineContext,r=!!n.large,o=!!n.progressiveRender,a=n.large=!(!i||!i.large),s=n.progressiveRender=!(!i||!i.progressiveRender);return!(r===a&&o===s)&&"reset"}}Zr(Hf),Qr(Hf);var Uf=Rr(),Xf=Wf(),Yf=function(){function t(){this.group=new Bi,this.uid=Xh("viewChart"),this.renderTask=Vd({plan:qf,reset:Kf}),this.renderTask.context={view:this}}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.highlight=function(t,e,n,i){jf(t.getData(),i,"emphasis")},t.prototype.downplay=function(t,e,n,i){jf(t.getData(),i,"normal")},t.prototype.remove=function(t,e){this.group.removeAll()},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateLayout=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},t.markUpdateMethod=function(t,e){Uf(t).updateMethod=e},t.protoInitialize=void(t.prototype.type="chart"),t}();function Zf(t,e,n){t&&("emphasis"===e?Qs:tl)(t,n)}function jf(t,e,n){var i=Or(t,e),r=e&&null!=e.highlightKey?function(t){var e=Ts[t];return null==e&&Is<=32&&(e=Ts[t]=Is++),e}(e.highlightKey):null;null!=i?O(wr(i),(function(e){Zf(t.getItemGraphicEl(e),n,r)})):t.eachItemGraphicEl((function(t){Zf(t,n,r)}))}function qf(t){return Xf(t.model)}function Kf(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,o=e.pipelineContext.progressiveRender,a=t.view,s=r&&Uf(r).updateMethod,l=o?"incrementalPrepareRender":s&&a[s]?s:"render";return"render"!==l&&a[l](e,n,i,r),$f[l]}Zr(Yf),Qr(Yf);var $f={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},Jf="\0__throttleOriginMethod",Qf="\0__throttleRate",tg="\0__throttleType";function eg(t,e,n){var i,r,o,a,s,l=0,u=0,h=null;function c(){u=(new Date).getTime(),h=null,t.apply(o,a||[])}e=e||0;var p=function(){for(var t=[],p=0;p=0?c():h=setTimeout(c,-r),l=i};return p.clear=function(){h&&(clearTimeout(h),h=null)},p.debounceNextCall=function(t){s=t},p}function ng(t,e,n,i){var r=t[e];if(r){var o=r[Jf]||r,a=r[tg];if(r[Qf]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=eg(o,n,"debounce"===i))[Jf]=o,r[tg]=i,r[Qf]=n}return r}}var ig=Rr(),rg={itemStyle:to(Gh,!0),lineStyle:to(Eh,!0)},og={lineStyle:"stroke",itemStyle:"fill"};function ag(t,e){var n=t.visualStyleMapper||rg[e];return n||(console.warn("Unkown style type '"+e+"'."),rg.itemStyle)}function sg(t,e){var n=t.visualDrawType||og[e];return n||(console.warn("Unkown style type '"+e+"'."),"fill")}var lg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=t.getModel(i),o=ag(t,i)(r),a=r.getShallow("decal");a&&(n.setVisual("decal",a),a.dirty=!0);var s=sg(t,i),l=o[s],u=H(l)?l:null,h="auto"===o.fill||"auto"===o.stroke;if(!o[s]||u||h){var c=t.getColorFromPalette(t.name,null,e.getSeriesCount());o[s]||(o[s]=c,n.setVisual("colorFromPalette",!0)),o.fill="auto"===o.fill||"function"==typeof o.fill?c:o.fill,o.stroke="auto"===o.stroke||"function"==typeof o.stroke?c:o.stroke}if(n.setVisual("style",o),n.setVisual("drawType",s),!e.isSeriesFiltered(t)&&u)return n.setVisual("colorFromPalette",!1),{dataEach:function(e,n){var i=t.getDataParams(n),r=T({},o);r[s]=u(i),e.setItemVisual(n,"style",r)}}}},ug=new Wh,hg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(!t.ignoreStyleOnData&&!e.isSeriesFiltered(t)){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=ag(t,i),o=n.getVisual("drawType");return{dataEach:n.hasItemOption?function(t,e){var n=t.getRawDataItem(e);if(n&&n[i]){ug.option=n[i];var a=r(ug);T(t.ensureUniqueItemVisual(e,"style"),a),ug.option.decal&&(t.setItemVisual(e,"decal",ug.option.decal),ug.option.decal.dirty=!0),o in a&&t.setItemVisual(e,"colorFromPalette",!1)}}:null}}}},cg={performRawSeries:!0,overallReset:function(t){var e=ct();t.eachSeries((function(t){var n=t.getColorBy();if(!t.isColorBySeries()){var i=t.type+"-"+n,r=e.get(i);r||(r={},e.set(i,r)),ig(t).scope=r}})),t.eachSeries((function(e){if(!e.isColorBySeries()&&!t.isSeriesFiltered(e)){var n=e.getRawData(),i={},r=e.getData(),o=ig(e).scope,a=e.visualStyleAccessPath||"itemStyle",s=sg(e,a);r.each((function(t){var e=r.getRawIndex(t);i[e]=t})),n.each((function(t){var a=i[t];if(r.getItemVisual(a,"colorFromPalette")){var l=r.ensureUniqueItemVisual(a,"style"),u=n.getName(t)||t+"",h=n.count();l[s]=e.getColorFromPalette(u,o,h)}}))}}))}},pg=Math.PI;var dg=function(){function t(t,e,n,i){this._stageTaskMap=ct(),this.ecInstance=t,this.api=e,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}return t.prototype.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each((function(t){var e=t.overallTask;e&&e.dirty()}))},t.prototype.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,o=i&&i.modDataCount;return{step:r,modBy:null!=o?Math.ceil(o/r):null,modDataCount:o}}},t.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},t.prototype.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,o=t.get("large")&&i>=t.get("largeThreshold"),a="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:a,large:o}},t.prototype.restorePipelines=function(t){var e=this,n=e._pipelineMap=ct();t.eachSeries((function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),e._pipe(t,t.dataTask)}))},t.prototype.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.api.getModel(),n=this.api;O(this._allHandlers,(function(i){var r=t.get(i.uid)||t.set(i.uid,{}),o="";ot(!(i.reset&&i.overallReset),o),i.reset&&this._createSeriesStageTask(i,r,e,n),i.overallReset&&this._createOverallStageTask(i,r,e,n)}),this)},t.prototype.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,this._pipe(e,r)},t.prototype.performDataProcessorTasks=function(t,e){this._performStageTasks(this._dataProcessorHandlers,t,e,{block:!0})},t.prototype.performVisualTasks=function(t,e,n){this._performStageTasks(this._visualHandlers,t,e,n)},t.prototype._performStageTasks=function(t,e,n,i){i=i||{};var r=!1,o=this;function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}O(t,(function(t,s){if(!i.visualType||i.visualType===t.visualType){var l=o._stageTaskMap.get(t.uid),u=l.seriesTaskMap,h=l.overallTask;if(h){var c,p=h.agentStubMap;p.each((function(t){a(i,t)&&(t.dirty(),c=!0)})),c&&h.dirty(),o.updatePayload(h,n);var d=o.getPerformArgs(h,i.block);p.each((function(t){t.perform(d)})),h.perform(d)&&(r=!0)}else u&&u.each((function(s,l){a(i,s)&&s.dirty();var u=o.getPerformArgs(s,i.block);u.skip=!t.performRawSeries&&e.isSeriesFiltered(s.context.model),o.updatePayload(s,n),s.perform(u)&&(r=!0)}))}})),this.unfinished=r||this.unfinished},t.prototype.performSeriesTasks=function(t){var e;t.eachSeries((function(t){e=t.dataTask.perform()||e})),this.unfinished=e||this.unfinished},t.prototype.plan=function(){this._pipelineMap.each((function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)}))},t.prototype.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},t.prototype._createSeriesStageTask=function(t,e,n,i){var r=this,o=e.seriesTaskMap,a=e.seriesTaskMap=ct(),s=t.seriesType,l=t.getTargetSeries;function u(e){var s=e.uid,l=a.set(s,o&&o.get(s)||Vd({plan:mg,reset:_g,count:wg}));l.context={model:e,ecModel:n,api:i,useClearVisual:t.isVisual&&!t.isLayout,plan:t.plan,reset:t.reset,scheduler:r},r._pipe(e,l)}t.createOnAllSeries?n.eachRawSeries(u):s?n.eachRawSeriesByType(s,u):l&&l(n,i).each(u)},t.prototype._createOverallStageTask=function(t,e,n,i){var r=this,o=e.overallTask=e.overallTask||Vd({reset:fg});o.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:r};var a=o.agentStubMap,s=o.agentStubMap=ct(),l=t.seriesType,u=t.getTargetSeries,h=!0,c=!1,p="";function d(t){var e=t.uid,n=s.set(e,a&&a.get(e)||(c=!0,Vd({reset:gg,onDirty:vg})));n.context={model:t,overallProgress:h},n.agent=o,n.__block=h,r._pipe(t,n)}ot(!t.createOnAllSeries,p),l?n.eachRawSeriesByType(l,d):u?u(n,i).each(d):(h=!1,O(n.getSeries(),d)),c&&o.dirty()},t.prototype._pipe=function(t,e){var n=t.uid,i=this._pipelineMap.get(n);!i.head&&(i.head=e),i.tail&&i.tail.pipe(e),i.tail=e,e.__idxInPipeline=i.count++,e.__pipeline=i},t.wrapStageHandler=function(t,e){return H(t)&&(t={overallReset:t,seriesType:Sg(t)}),t.uid=Xh("stageHandler"),e&&(t.visualType=e),t},t}();function fg(t){t.overallReset(t.ecModel,t.api,t.payload)}function gg(t){return t.overallProgress&&yg}function yg(){this.agent.dirty(),this.getDownstream().dirty()}function vg(){this.agent&&this.agent.dirty()}function mg(t){return t.plan?t.plan(t.model,t.ecModel,t.api,t.payload):null}function _g(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=wr(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?R(e,(function(t,e){return bg(e)})):xg}var xg=bg(0);function bg(t){return function(e,n){var i=n.data,r=n.resetDefines[t];if(r&&r.dataEach)for(var o=e.start;o0&&h===r.length-u.length){var c=r.slice(0,h);"data"!==c&&(e.mainType=c,e[u.toLowerCase()]=t,s=!0)}}a.hasOwnProperty(r)&&(n[r]=t,s=!0),s||(i[r]=t)}))}return{cptQuery:e,dataQuery:n,otherQuery:i}},t.prototype.filter=function(t,e){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,r=n.packedEvent,o=n.model,a=n.view;if(!o||!a)return!0;var s=e.cptQuery,l=e.dataQuery;return u(s,o,"mainType")&&u(s,o,"subType")&&u(s,o,"index","componentIndex")&&u(s,o,"name")&&u(s,o,"id")&&u(l,r,"name")&&u(l,r,"dataIndex")&&u(l,r,"dataType")&&(!a.filterForExposedEvent||a.filterForExposedEvent(t,e.otherQuery,i,r));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},t.prototype.afterTrigger=function(){this.eventInfo=null},t}(),zg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData();if(t.legendIcon&&n.setVisual("legendIcon",t.legendIcon),t.hasSymbolVisual){var i=t.get("symbol"),r=t.get("symbolSize"),o=t.get("symbolKeepAspect"),a=t.get("symbolRotate"),s=t.get("symbolOffset"),l=H(i),u=H(r),h=H(a),c=H(s),p=l||u||h||c,d=!l&&i?i:t.defaultSymbol,f=u?null:r,g=h?null:a,y=c?null:s;if(n.setVisual({legendIcon:t.legendIcon||d,symbol:d,symbolSize:f,symbolKeepAspect:o,symbolRotate:g,symbolOffset:y}),!e.isSeriesFiltered(t))return{dataEach:p?function(e,n){var o=t.getRawValue(n),p=t.getDataParams(n);l&&e.setItemVisual(n,"symbol",i(o,p)),u&&e.setItemVisual(n,"symbolSize",r(o,p)),h&&e.setItemVisual(n,"symbolRotate",a(o,p)),c&&e.setItemVisual(n,"symbolOffset",s(o,p))}:null}}}};function Eg(t,e,n){switch(n){case"color":return t.getItemVisual(e,"style")[t.getVisual("drawType")];case"opacity":return t.getItemVisual(e,"style").opacity;case"symbol":case"symbolSize":case"liftZ":return t.getItemVisual(e,n);default:0}}function Vg(t,e){switch(e){case"color":return t.getVisual("style")[t.getVisual("drawType")];case"opacity":return t.getVisual("style").opacity;case"symbol":case"symbolSize":case"liftZ":return t.getVisual(e);default:0}}function Bg(t,e,n,i){switch(n){case"color":t.ensureUniqueItemVisual(e,"style")[t.getVisual("drawType")]=i,t.setItemVisual(e,"colorFromPalette",!1);break;case"opacity":t.ensureUniqueItemVisual(e,"style").opacity=i;break;case"symbol":case"symbolSize":case"liftZ":t.setItemVisual(e,n,i);break;default:0}}function Gg(t,e){function n(e,n){var i=[];return e.eachComponent({mainType:"series",subType:t,query:n},(function(t){i.push(t.seriesIndex)})),i}O([[t+"ToggleSelect","toggleSelect"],[t+"Select","select"],[t+"UnSelect","unselect"]],(function(t){e(t[0],(function(e,i,r){e=T({},e),r.dispatchAction(T(e,{type:t[1],seriesIndex:n(i,e)}))}))}))}function Fg(t,e,n,i,r){var o=t+e;n.isSilent(o)||i.eachComponent({mainType:"series",subType:"pie"},(function(t){for(var e=t.seriesIndex,i=r.selected,a=0;a0?(e=e||1,"dashed"===t?[4*e,2*e]:"dotted"===t?[e]:X(t)?[t]:F(t)?t:null):null}var ay=new Oa(!0);function sy(t){var e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))}function ly(t){return"string"==typeof t&&"none"!==t}function uy(t){var e=t.fill;return null!=e&&"none"!==e}function hy(t,e){if(null!=e.fillOpacity&&1!==e.fillOpacity){var n=t.globalAlpha;t.globalAlpha=e.fillOpacity*e.opacity,t.fill(),t.globalAlpha=n}else t.fill()}function cy(t,e){if(null!=e.strokeOpacity&&1!==e.strokeOpacity){var n=t.globalAlpha;t.globalAlpha=e.strokeOpacity*e.opacity,t.stroke(),t.globalAlpha=n}else t.stroke()}function py(t,e,n){var i=oo(e.image,e.__image,n);if(so(i)){var r=t.createPattern(i,e.repeat||"repeat");if("function"==typeof DOMMatrix&&r.setTransform){var o=new DOMMatrix;o.rotateSelf(0,0,(e.rotation||0)/Math.PI*180),o.scaleSelf(e.scaleX||1,e.scaleY||1),o.translateSelf(e.x||0,e.y||0),r.setTransform(o)}return r}}var dy=["shadowBlur","shadowOffsetX","shadowOffsetY"],fy=[["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]];function gy(t,e,n,i,r){var o=!1;if(!i&&e===(n=n||{}))return!1;if(i||e.opacity!==n.opacity){o||(my(t,r),o=!0);var a=Math.max(Math.min(e.opacity,1),0);t.globalAlpha=isNaN(a)?wo.opacity:a}(i||e.blend!==n.blend)&&(o||(my(t,r),o=!0),t.globalCompositeOperation=e.blend||wo.blend);for(var s=0;s0&&oy(n.lineDash,n.lineWidth),w=n.lineDashOffset,S=!!t.setLineDash,M=e.getGlobalScale();if(u.setScale(M[0],M[1],e.segmentIgnoreThreshold),b){var I=n.strokeNoScale&&e.getLineScale?e.getLineScale():1;I&&1!==I&&(b=R(b,(function(t){return t/I})),w/=I)}var T=!0;(l||4&e.__dirty||b&&!S&&r)&&(u.setDPR(t.dpr),s?u.setContext(null):(u.setContext(t),T=!1),u.reset(),b&&!S&&(u.setLineDash(b),u.setLineDashOffset(w)),e.buildPath(u,e.shape,i),u.toStatic(),e.pathUpdated()),T&&u.rebuildPath(t,s?a:1),b&&S&&(t.setLineDash(b),t.lineDashOffset=w),i||(n.strokeFirst?(r&&cy(t,n),o&&hy(t,n)):(o&&hy(t,n),r&&cy(t,n))),b&&S&&t.setLineDash([])}(t,e,d,p),p&&(n.batchFill=d.fill||"",n.batchStroke=d.stroke||"")):e instanceof es?(3!==n.lastDrawType&&(l=!0,n.lastDrawType=3),yy(t,e,u,l,n),function(t,e,n){var i=n.text;if(null!=i&&(i+=""),i){t.font=n.font||_i,t.textAlign=n.textAlign,t.textBaseline=n.textBaseline;var r=void 0;if(t.setLineDash){var o=n.lineDash&&n.lineWidth>0&&oy(n.lineDash,n.lineWidth),a=n.lineDashOffset;if(o){var s=n.strokeNoScale&&e.getLineScale?e.getLineScale():1;s&&1!==s&&(o=R(o,(function(t){return t/s})),a/=s),t.setLineDash(o),t.lineDashOffset=a,r=!0}}n.strokeFirst?(sy(n)&&t.strokeText(i,n.x,n.y),uy(n)&&t.fillText(i,n.x,n.y)):(uy(n)&&t.fillText(i,n.x,n.y),sy(n)&&t.strokeText(i,n.x,n.y)),r&&t.setLineDash([])}}(t,e,d)):e instanceof rs?(2!==n.lastDrawType&&(l=!0,n.lastDrawType=2),function(t,e,n,i,r){gy(t,_y(e,r.inHover),n&&_y(n,r.inHover),i,r)}(t,e,u,l,n),function(t,e,n){var i=e.__image=oo(n.image,e.__image,e,e.onload);if(i&&so(i)){var r=n.x||0,o=n.y||0,a=e.getWidth(),s=e.getHeight(),l=i.width/i.height;if(null==a&&null!=s?a=s*l:null==s&&null!=a?s=a/l:null==a&&null==s&&(a=i.width,s=i.height),n.sWidth&&n.sHeight){var u=n.sx||0,h=n.sy||0;t.drawImage(i,u,h,n.sWidth,n.sHeight,r,o,a,s)}else if(n.sx&&n.sy){var c=a-(u=n.sx),p=s-(h=n.sy);t.drawImage(i,u,h,c,p,r,o,a,s)}else t.drawImage(i,r,o,a,s)}}(t,e,d)):e instanceof Ou&&(4!==n.lastDrawType&&(l=!0,n.lastDrawType=4),function(t,e,n){var i=e.getDisplayables(),r=e.getTemporalDisplayables();t.save();var o,a,s={prevElClipPaths:null,prevEl:null,allClipped:!1,viewWidth:n.viewWidth,viewHeight:n.viewHeight,inHover:n.inHover};for(o=e.getCursor(),a=i.length;o=4&&(l={x:parseFloat(c[0]||0),y:parseFloat(c[1]||0),width:parseFloat(c[2]),height:parseFloat(c[3])})}if(l&&null!=a&&null!=s&&(u=Ky(l,{x:0,y:0,width:a,height:s}),!e.ignoreViewBox)){var p=i;(i=new Bi).add(p),p.scaleX=p.scaleY=u.scale,p.x=u.x,p.y=u.y}return e.ignoreRootClip||null==a||null==s||i.setClipPath(new cs({shape:{x:0,y:0,width:a,height:s}})),{root:i,width:a,height:s,viewBoxRect:l,viewBoxTransform:u,named:r}},t.prototype._parseNode=function(t,e,n,i,r,o){var a,s=t.nodeName.toLowerCase(),l=i;if("defs"===s&&(r=!0),"text"===s&&(o=!0),"defs"===s||"switch"===s)a=e;else{if(!r){var u=wy[s];if(u&&ft(wy,s)){a=u.call(this,t,e);var h=t.getAttribute("name");if(h){var c={name:h,namedFrom:null,svgNodeTagLower:s,el:a};n.push(c),"g"===s&&(l=c)}else i&&n.push({name:i.name,namedFrom:i,svgNodeTagLower:s,el:a});e.add(a)}}var p=zy[s];if(p&&ft(zy,s)){var d=p.call(this,t),f=t.getAttribute("id");f&&(this._defs[f]=d)}}if(a&&a.isGroup)for(var g=t.firstChild;g;)1===g.nodeType?this._parseNode(g,a,n,l,r,o):3===g.nodeType&&o&&this._parseText(g,a),g=g.nextSibling},t.prototype._parseText=function(t,e){var n=new es({style:{text:t.textContent},silent:!0,x:this._textX||0,y:this._textY||0});By(e,n),Fy(t,n,this._defsUsePending,!1,!1),function(t,e){var n=e.__selfStyle;if(n){var i=n.textBaseline,r=i;i&&"auto"!==i?"baseline"===i?r="alphabetic":"before-edge"===i||"text-before-edge"===i?r="top":"after-edge"===i||"text-after-edge"===i?r="bottom":"central"!==i&&"mathematical"!==i||(r="middle"):r="alphabetic",t.style.textBaseline=r}var o=e.__inheritedStyle;if(o){var a=o.textAlign,s=a;a&&("middle"===a&&(s="center"),t.style.textAlign=s)}}(n,e);var i=n.style,r=i.fontSize;r&&r<9&&(i.fontSize=9,n.scaleX*=r/9,n.scaleY*=r/9);var o=(i.fontSize||i.fontFamily)&&[i.fontStyle,i.fontWeight,(i.fontSize||12)+"px",i.fontFamily||"sans-serif"].join(" ");i.font=o;var a=n.getBoundingRect();return this._textX+=a.width,e.add(n),n},t.internalField=void(wy={g:function(t,e){var n=new Bi;return By(e,n),Fy(t,n,this._defsUsePending,!1,!1),n},rect:function(t,e){var n=new cs;return By(e,n),Fy(t,n,this._defsUsePending,!1,!1),n.setShape({x:parseFloat(t.getAttribute("x")||"0"),y:parseFloat(t.getAttribute("y")||"0"),width:parseFloat(t.getAttribute("width")||"0"),height:parseFloat(t.getAttribute("height")||"0")}),n.silent=!0,n},circle:function(t,e){var n=new Hl;return By(e,n),Fy(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),r:parseFloat(t.getAttribute("r")||"0")}),n.silent=!0,n},line:function(t,e){var n=new yu;return By(e,n),Fy(t,n,this._defsUsePending,!1,!1),n.setShape({x1:parseFloat(t.getAttribute("x1")||"0"),y1:parseFloat(t.getAttribute("y1")||"0"),x2:parseFloat(t.getAttribute("x2")||"0"),y2:parseFloat(t.getAttribute("y2")||"0")}),n.silent=!0,n},ellipse:function(t,e){var n=new Ul;return By(e,n),Fy(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),rx:parseFloat(t.getAttribute("rx")||"0"),ry:parseFloat(t.getAttribute("ry")||"0")}),n.silent=!0,n},polygon:function(t,e){var n,i=t.getAttribute("points");i&&(n=Gy(i));var r=new cu({shape:{points:n||[]},silent:!0});return By(e,r),Fy(t,r,this._defsUsePending,!1,!1),r},polyline:function(t,e){var n,i=t.getAttribute("points");i&&(n=Gy(i));var r=new du({shape:{points:n||[]},silent:!0});return By(e,r),Fy(t,r,this._defsUsePending,!1,!1),r},image:function(t,e){var n=new rs;return By(e,n),Fy(t,n,this._defsUsePending,!1,!1),n.setStyle({image:t.getAttribute("xlink:href")||t.getAttribute("href"),x:+t.getAttribute("x"),y:+t.getAttribute("y"),width:+t.getAttribute("width"),height:+t.getAttribute("height")}),n.silent=!0,n},text:function(t,e){var n=t.getAttribute("x")||"0",i=t.getAttribute("y")||"0",r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0";this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(o);var a=new Bi;return By(e,a),Fy(t,a,this._defsUsePending,!1,!0),a},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0",a=new Bi;return By(e,a),Fy(t,a,this._defsUsePending,!1,!0),this._textX+=parseFloat(r),this._textY+=parseFloat(o),a},path:function(t,e){var n=Bl(t.getAttribute("d")||"");return By(e,n),Fy(t,n,this._defsUsePending,!1,!1),n.silent=!0,n}}),t}(),zy={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||"0",10),n=parseInt(t.getAttribute("y1")||"0",10),i=parseInt(t.getAttribute("x2")||"10",10),r=parseInt(t.getAttribute("y2")||"0",10),o=new Iu(e,n,i,r);return Ey(t,o),Vy(t,o),o},radialgradient:function(t){var e=parseInt(t.getAttribute("cx")||"0",10),n=parseInt(t.getAttribute("cy")||"0",10),i=parseInt(t.getAttribute("r")||"0",10),r=new Tu(e,n,i);return Ey(t,r),Vy(t,r),r}};function Ey(t,e){"userSpaceOnUse"===t.getAttribute("gradientUnits")&&(e.global=!0)}function Vy(t,e){for(var n=t.firstChild;n;){if(1===n.nodeType&&"stop"===n.nodeName.toLocaleLowerCase()){var i=n.getAttribute("offset"),r=void 0;r=i&&i.indexOf("%")>0?parseInt(i,10)/100:i?parseFloat(i):0;var o={};qy(n,o,o);var a=o.stopColor||n.getAttribute("stop-color")||"#000000";e.colorStops.push({offset:r,color:a})}n=n.nextSibling}}function By(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),C(e.__inheritedStyle,t.__inheritedStyle))}function Gy(t){for(var e=Xy(t),n=[],i=0;i0;o-=2){var a=i[o],s=i[o-1],l=Xy(a);switch(r=r||[1,0,0,1,0,0],s){case"translate":Xn(r,r,[parseFloat(l[0]),parseFloat(l[1]||"0")]);break;case"scale":Zn(r,r,[parseFloat(l[0]),parseFloat(l[1]||l[0])]);break;case"rotate":Yn(r,r,-parseFloat(l[0])*Zy);break;case"skewX":Un(r,[1,0,Math.tan(parseFloat(l[0])*Zy),1,0,0],r);break;case"skewY":Un(r,[1,Math.tan(parseFloat(l[0])*Zy),0,1,0,0],r);break;case"matrix":r[0]=parseFloat(l[0]),r[1]=parseFloat(l[1]),r[2]=parseFloat(l[2]),r[3]=parseFloat(l[3]),r[4]=parseFloat(l[4]),r[5]=parseFloat(l[5])}}e.setLocalTransform(r)}}(t,e),qy(t,a,s),i||function(t,e,n){for(var i=0;i>1^-(1&s),l=l>>1^-(1&l),r=s+=r,o=l+=o,i.push([s/n,l/n])}return i}function av(t,e){return R(z((t=function(t){if(!t.UTF8Encoding)return t;var e=t,n=e.UTF8Scale;null==n&&(n=1024);for(var i=e.features,r=0;r0})),(function(t){var n=t.properties,i=t.geometry,r=[];if("Polygon"===i.type){var o=i.coordinates;r.push({type:"polygon",exterior:o[0],interiors:o.slice(1)})}"MultiPolygon"===i.type&&O(o=i.coordinates,(function(t){t[0]&&r.push({type:"polygon",exterior:t[0],interiors:t.slice(1)})}));var a=new ev(n[e||"name"],r,n.cp);return a.properties=n,a}))}for(var sv=[126,25],lv="南海诸岛",uv=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],hv=0;hv0&&t.unfinished);t.unfinished||this._zr.flush()}}},e.prototype.getDom=function(){return this._dom},e.prototype.getId=function(){return this.id},e.prototype.getZr=function(){return this._zr},e.prototype.setOption=function(t,e,n){if(this._disposed)nm(this.id);else{var i,r,o;if(Y(e)&&(n=e.lazyUpdate,i=e.silent,r=e.replaceMerge,o=e.transition,e=e.notMerge),this.__flagInMainProcess=!0,!this._model||e){var a=new Fp(this._api),s=this._theme,l=this._model=new Pp;l.scheduler=this._scheduler,l.init(null,null,null,s,this._locale,a)}this._model.setOption(t,{replaceMerge:r},am);var u={seriesTransition:o,optionChanged:!0};n?(this.__pendingUpdate={silent:i,updateParams:u},this.__flagInMainProcess=!1,this.getZr().wakeUp()):(Pv(this),Nv.update.call(this,null,u),this._zr.flush(),this.__pendingUpdate=null,this.__flagInMainProcess=!1,Bv.call(this,i),Gv.call(this,i))}},e.prototype.setTheme=function(){console.error("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},e.prototype.getModel=function(){return this._model},e.prototype.getOption=function(){return this._model&&this._model.getOption()},e.prototype.getWidth=function(){return this._zr.getWidth()},e.prototype.getHeight=function(){return this._zr.getHeight()},e.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||Sv&&window.devicePixelRatio||1},e.prototype.getRenderedCanvas=function(t){if(a.canvasSupported)return t=t||{},this._zr.painter.getRenderedCanvas({backgroundColor:t.backgroundColor||this._model.get("backgroundColor"),pixelRatio:t.pixelRatio||this.getDevicePixelRatio()})},e.prototype.getSvgDataURL=function(){if(a.svgSupported){var t=this._zr;return O(t.storage.getDisplayList(),(function(t){t.stopAnimation(null,!0)})),t.painter.toDataURL()}},e.prototype.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;O(e,(function(t){n.eachComponent({mainType:t},(function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)}))}));var o="svg"===this._zr.painter.getType()?this.getSvgDataURL():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return O(i,(function(t){t.group.ignore=!1})),o}nm(this.id)},e.prototype.getConnectedDataURL=function(t){if(this._disposed)nm(this.id);else if(a.canvasSupported){var e="svg"===t.type,n=this.group,i=Math.min,r=Math.max,o=1/0;if(cm[n]){var s=o,l=o,u=-1/0,h=-1/0,c=[],p=t&&t.pixelRatio||this.getDevicePixelRatio();O(hm,(function(o,a){if(o.group===n){var p=e?o.getZr().painter.getSvgDom().innerHTML:o.getRenderedCanvas(S(t)),d=o.getDom().getBoundingClientRect();s=i(d.left,s),l=i(d.top,l),u=r(d.right,u),h=r(d.bottom,h),c.push({dom:p,left:d.left,top:d.top})}}));var d=(u*=p)-(s*=p),f=(h*=p)-(l*=p),g=D(),y=Ui(g,{renderer:e?"svg":"canvas"});if(y.resize({width:d,height:f}),e){var v="";return O(c,(function(t){var e=t.left-s,n=t.top-l;v+=''+t.dom+""})),y.painter.getSvgRoot().innerHTML=v,t.connectedBackgroundColor&&y.painter.setBackgroundColor(t.connectedBackgroundColor),y.refreshImmediately(),y.painter.toDataURL()}return t.connectedBackgroundColor&&y.add(new cs({shape:{x:0,y:0,width:d,height:f},style:{fill:t.connectedBackgroundColor}})),O(c,(function(t){var e=new rs({style:{x:t.left*p-s,y:t.top*p-l,image:t.dom}});y.add(e)})),y.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},e.prototype.convertToPixel=function(t,e){return zv(this,"convertToPixel",t,e)},e.prototype.convertFromPixel=function(t,e){return zv(this,"convertFromPixel",t,e)},e.prototype.containPixel=function(t,e){var n;if(!this._disposed)return O(zr(this._model,t),(function(t,i){i.indexOf("Models")>=0&&O(t,(function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n=n||!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n=n||o.containPoint(e,t))}else 0}),this)}),this),!!n;nm(this.id)},e.prototype.getVisual=function(t,e){var n=zr(this._model,t,{defaultMainType:"series"}),i=n.seriesModel;var r=i.getData(),o=n.hasOwnProperty("dataIndexInside")?n.dataIndexInside:n.hasOwnProperty("dataIndex")?r.indexOfRawIndex(n.dataIndex):null;return null!=o?Eg(r,o,e):Vg(r,e)},e.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},e.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},e.prototype._initEvents=function(){var t,e,n,i=this;O(em,(function(t){var e=function(e){var n,r=i.getModel(),o=e.target,a="globalout"===t;if(a?n={}:o&&Hg(o,(function(t){var e=Ss(t);if(e&&null!=e.dataIndex){var i=e.dataModel||r.getSeriesByIndex(e.seriesIndex);return n=i&&i.getDataParams(e.dataIndex,e.dataType)||{},!0}if(e.eventData)return n=T({},e.eventData),!0}),!0),n){var s=n.componentType,l=n.componentIndex;"markLine"!==s&&"markPoint"!==s&&"markArea"!==s||(s="series",l=n.seriesIndex);var u=s&&null!=l&&r.getComponent(s,l),h=u&&i["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];0,n.event=e,n.type=t,i._$eventProcessor.eventInfo={targetEl:o,packedEvent:n,model:u,view:h},i.trigger(t,n)}};e.zrEventfulCallAtLast=!0,i._zr.on(t,e,i)})),O(rm,(function(t,e){i._messageCenter.on(e,(function(t){this.trigger(e,t)}),i)})),O(["selectchanged"],(function(t){i._messageCenter.on(t,(function(e){this.trigger(t,e)}),i)})),t=this._messageCenter,e=this,n=this._api,t.on("selectchanged",(function(t){var i=n.getModel();t.isFromClick?(Fg("map","selectchanged",e,i,t),Fg("pie","selectchanged",e,i,t)):"select"===t.fromAction?(Fg("map","selected",e,i,t),Fg("pie","selected",e,i,t)):"unselect"===t.fromAction&&(Fg("map","unselected",e,i,t),Fg("pie","unselected",e,i,t))}))},e.prototype.isDisposed=function(){return this._disposed},e.prototype.clear=function(){this._disposed?nm(this.id):this.setOption({series:[]},!0)},e.prototype.dispose=function(){if(this._disposed)nm(this.id);else{this._disposed=!0,Fr(this.getDom(),fm,"");var t=this,e=t._api,n=t._model;O(t._componentsViews,(function(t){t.dispose(n,e)})),O(t._chartsViews,(function(t){t.dispose(n,e)})),t._zr.dispose(),t._dom=t._model=t._chartsMap=t._componentsMap=t._chartsViews=t._componentsViews=t._scheduler=t._api=t._zr=t._throttledZrFlush=t._theme=t._coordSysMgr=t._messageCenter=null,delete hm[t.id]}},e.prototype.resize=function(t){if(this._disposed)nm(this.id);else{this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this.__pendingUpdate&&(null==i&&(i=this.__pendingUpdate.silent),n=!0,this.__pendingUpdate=null),this.__flagInMainProcess=!0,n&&Pv(this),Nv.update.call(this,{type:"resize",animation:T({duration:0},t&&t.animation)}),this.__flagInMainProcess=!1,Bv.call(this,i),Gv.call(this,i)}}},e.prototype.showLoading=function(t,e){if(this._disposed)nm(this.id);else if(Y(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),um[t]){var n=um[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},e.prototype.hideLoading=function(){this._disposed?nm(this.id):(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},e.prototype.makeActionFromEvent=function(t){var e=T({},t);return e.type=rm[t.type],e},e.prototype.dispatchAction=function(t,e){if(this._disposed)nm(this.id);else if(Y(e)||(e={silent:!!e}),im[t.type]&&this._model)if(this.__flagInMainProcess)this._pendingActions.push(t);else{var n=e.silent;Vv.call(this,t,n);var i=e.flush;i?this._zr.flush():!1!==i&&a.browser.weChat&&this._throttledZrFlush(),Bv.call(this,n),Gv.call(this,n)}},e.prototype.updateLabelLayout=function(){wv.trigger("series:layoutlabels",this._model,this._api,{updatedSeries:[]})},e.prototype.appendData=function(t){if(this._disposed)nm(this.id);else{var e=t.seriesIndex,n=this.getModel().getSeriesByIndex(e);0,n.appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp()}},e.internalField=function(){function t(t){for(var e=[],n=t.currentStates,i=0;i0?{duration:o,delay:i.get("delay"),easing:i.get("easing")}:null;n.group.traverse((function(e){if(e.states&&e.states.emphasis){if(Bu(e))return;if(e instanceof Qa&&function(t){var e=Cs(t);e.normalFill=t.style.fill,e.normalStroke=t.style.stroke;var n=t.states.select||{};e.selectFill=n.style&&n.style.fill||null,e.selectStroke=n.style&&n.style.stroke||null}(e),e.__dirty){var n=e.prevStates;n&&e.useStates(n)}if(r){e.stateTransition=a;var i=e.getTextContent(),o=e.getTextGuideLine();i&&(i.stateTransition=a),o&&(o.stateTransition=a)}e.__dirty&&t(e)}}))}Pv=function(t){var e=t._scheduler;e.restorePipelines(t._model),e.prepareStageTasks(),Ov(t,!0),Ov(t,!1),e.plan()},Ov=function(t,e){for(var n=t._model,i=t._scheduler,r=e?t._componentsViews:t._chartsViews,o=e?t._componentsMap:t._chartsMap,a=t._zr,s=t._api,l=0;le.get("hoverLayerThreshold")&&!a.node&&!a.worker&&e.eachSeries((function(e){if(!e.preventUsingHoverLayer){var n=t._chartsMap[e.__viewId];n.__alive&&n.group.traverse((function(t){t.states.emphasis&&(t.states.emphasis.hoverLayer=!0)}))}}))}(t,n),wv.trigger("series:afterupdate",n,i,l)},qv=function(t){t.__needsUpdateStatus=!0,t.getZr().wakeUp()},Kv=function(e){e.__needsUpdateStatus&&(e.getZr().storage.traverse((function(e){Bu(e)||t(e)})),e.__needsUpdateStatus=!1)},Zv=function(t){return new(function(e){function i(){return null!==e&&e.apply(this,arguments)||this}return n(i,e),i.prototype.getCoordinateSystems=function(){return t._coordSysMgr.getCoordinateSystems()},i.prototype.getComponentByElement=function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}},i.prototype.enterEmphasis=function(e,n){Qs(e,n),qv(t)},i.prototype.leaveEmphasis=function(e,n){tl(e,n),qv(t)},i.prototype.enterBlur=function(e){el(e),qv(t)},i.prototype.leaveBlur=function(e){nl(e),qv(t)},i.prototype.enterSelect=function(e){il(e),qv(t)},i.prototype.leaveSelect=function(e){rl(e),qv(t)},i.prototype.getModel=function(){return t.getModel()},i.prototype.getViewOfComponentModel=function(e){return t.getViewOfComponentModel(e)},i.prototype.getViewOfSeriesModel=function(e){return t.getViewOfSeriesModel(e)},i}(Ep))(t)},jv=function(t){function e(t,e){for(var n=0;n=0)){Dm.push(n);var o=dg.wrapStageHandler(n,r);o.__prio=e,o.__raw=n,t.push(o)}}function km(t,e){um[t]=e}function Lm(t,e,n){mv(t,e,n)}var Pm=function(t){var e=(t=S(t)).type,n="";e||_r(n);var i=e.split(":");2!==i.length&&_r(n);var r=!1;"echarts"===i[0]&&(e=i[1],r=!0),t.__isBuiltIn=r,tf.set(e,t)};Cm(Mv,lg),Cm(Iv,hg),Cm(Iv,cg),Cm(Mv,zg),Cm(Iv,{createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(t.hasSymbolVisual&&!e.isSeriesFiltered(t))return{dataEach:t.getData().hasItemOption?function(t,e){var n=t.getItemModel(e),i=n.getShallow("symbol",!0),r=n.getShallow("symbolSize",!0),o=n.getShallow("symbolRotate",!0),a=n.getShallow("symbolOffset",!0),s=n.getShallow("symbolKeepAspect",!0);null!=i&&t.setItemVisual(e,"symbol",i),null!=r&&t.setItemVisual(e,"symbolSize",r),null!=o&&t.setItemVisual(e,"symbolRotate",o),null!=a&&t.setItemVisual(e,"symbolOffset",a),null!=s&&t.setItemVisual(e,"symbolKeepAspect",s)}:null}}}),Cm(7e3,(function(t,e){t.eachRawSeries((function(n){if(!t.isSeriesFiltered(n)){var i=n.getData();i.hasItemVisual()&&i.each((function(t){var n=i.getItemVisual(t,"decal");n&&(i.ensureUniqueItemVisual(t,"style").decal=Ty(n,e))}));var r=i.getVisual("decal");if(r)i.getVisual("style").decal=Ty(r,e)}}))})),_m(ld),xm(900,(function(t){var e=ct();t.eachSeries((function(t){var n=t.get("stack");if(n){var i=e.get(n)||e.set(n,[]),r=t.getData(),o={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!o.stackedDimension||!o.isStackedByIndex&&!o.stackedByDimension)return;i.length&&r.setCalculationInfo("stackedOnSeries",i[i.length-1].seriesModel),i.push(o)}})),e.each(ud)})),km("default",(function(t,e){C(e=e||{},{text:"loading",textColor:"#000",fontSize:12,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif",maskColor:"rgba(255, 255, 255, 0.8)",showSpinner:!0,color:"#5470c6",spinnerRadius:10,lineWidth:5,zlevel:0});var n=new Bi,i=new cs({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4});n.add(i);var r,o=new fs({style:{text:e.text,fill:e.textColor,fontSize:e.fontSize,fontWeight:e.fontWeight,fontStyle:e.fontStyle,fontFamily:e.fontFamily},zlevel:e.zlevel,z:10001}),a=new cs({style:{fill:"none"},textContent:o,textConfig:{position:"right",distance:10},zlevel:e.zlevel,z:10001});return n.add(a),e.showSpinner&&((r=new wu({shape:{startAngle:-pg/2,endAngle:-pg/2+.1,r:e.spinnerRadius},style:{stroke:e.color,lineCap:"round",lineWidth:e.lineWidth},zlevel:e.zlevel,z:10001})).animateShape(!0).when(1e3,{endAngle:3*pg/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*pg/2}).delay(300).start("circularInOut"),n.add(r)),n.resize=function(){var n=o.getBoundingRect().width,s=e.showSpinner?e.spinnerRadius:0,l=(t.getWidth()-2*s-(e.showSpinner&&n?10:0)-n)/2-(e.showSpinner&&n?0:5+n/2)+(e.showSpinner?0:n/2)+(n?0:s),u=t.getHeight()/2;e.showSpinner&&r.setShape({cx:l,cy:u}),a.setShape({x:l-s,y:u-s,width:2*s,height:2*s}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},n.resize(),n})),Mm({type:Ls,event:Ls,update:Ls},gt),Mm({type:Ps,event:Ps,update:Ps},gt),Mm({type:Os,event:Os,update:Os},gt),Mm({type:Rs,event:Rs,update:Rs},gt),Mm({type:Ns,event:Ns,update:Ns},gt),mm("light",Ag),mm("dark",Rg);var Om=[],Rm={registerPreprocessor:_m,registerProcessor:xm,registerPostInit:bm,registerPostUpdate:wm,registerUpdateLifecycle:Sm,registerAction:Mm,registerCoordinateSystem:Im,registerLayout:Tm,registerVisual:Cm,registerTransform:Pm,registerLoading:km,registerMap:Lm,PRIORITY:Tv,ComponentModel:ep,ComponentView:Hf,SeriesModel:Rf,ChartView:Yf,registerComponentModel:function(t){ep.registerClass(t)},registerComponentView:function(t){Hf.registerClass(t)},registerSeriesModel:function(t){Rf.registerClass(t)},registerChartView:function(t){Yf.registerClass(t)},registerSubTypeDefaulter:function(t,e){ep.registerSubTypeDefaulter(t,e)},registerPainter:function(t,e){Xi(t,e)}};function Nm(t){F(t)?O(t,(function(t){Nm(t)})):A(Om,t)>=0||(Om.push(t),H(t)&&(t={install:t}),t.install(Rm))}function zm(t){return null==t?0:t.length||1}function Em(t){return t}var Vm=function(){function t(t,e,n,i,r,o){this._old=t,this._new=e,this._oldKeyGetter=n||Em,this._newKeyGetter=i||Em,this.context=r,this._diffModeMultiple="multiple"===o}return t.prototype.add=function(t){return this._add=t,this},t.prototype.update=function(t){return this._update=t,this},t.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},t.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},t.prototype.updateManyToMany=function(t){return this._updateManyToMany=t,this},t.prototype.remove=function(t){return this._remove=t,this},t.prototype.execute=function(){this[this._diffModeMultiple?"_executeMultiple":"_executeOneToOne"]()},t.prototype._executeOneToOne=function(){var t=this._old,e=this._new,n={},i=new Array(t.length),r=new Array(e.length);this._initIndexMap(t,null,i,"_oldKeyGetter"),this._initIndexMap(e,n,r,"_newKeyGetter");for(var o=0;o1){var u=s.shift();1===s.length&&(n[a]=s[0]),this._update&&this._update(u,o)}else 1===l?(n[a]=null,this._update&&this._update(s,o)):this._remove&&this._remove(o)}this._performRestAdd(r,n)},t.prototype._executeMultiple=function(){var t=this._old,e=this._new,n={},i={},r=[],o=[];this._initIndexMap(t,n,r,"_oldKeyGetter"),this._initIndexMap(e,i,o,"_newKeyGetter");for(var a=0;a1&&1===c)this._updateManyToOne&&this._updateManyToOne(u,l),i[s]=null;else if(1===h&&c>1)this._updateOneToMany&&this._updateOneToMany(u,l),i[s]=null;else if(1===h&&1===c)this._update&&this._update(u,l),i[s]=null;else if(h>1&&c>1)this._updateManyToMany&&this._updateManyToMany(u,l),i[s]=null;else if(h>1)for(var p=0;p1)for(var a=0;a30}var Km,$m,Jm,Qm,t_,e_,n_,i_=Y,r_=R,o_="undefined"==typeof Int32Array?Array:Int32Array,a_=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_dimSummary","userOutput","_rawData","_dimValueGetter","_nameDimIdx","_idDimIdx","_nameRepeatCount"],s_=["_approximateExtent"],l_=function(){function t(t,e){var n;this.type="list",this._dimOmitted=!1,this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!1,this.TRANSFERABLE_METHODS=["cloneShallow","downSample","lttbDownSample","map"],this.CHANGABLE_METHODS=["filterSelf","selectRange"],this.DOWNSAMPLE_METHODS=["downSample","lttbDownSample"];var i=!1;Ym(t)?(n=t.dimensions,this._dimOmitted=t.isDimensionOmitted(),this._schema=t):(i=!0,n=t),n=n||["x","y"];for(var r={},o=[],a={},s=!1,l={},u=0;u=e)){var n=this._store.getProvider();this._updateOrdinalMeta();var i=this._nameList,r=this._idList;if(n.getSource().sourceFormat===ap&&!n.pure)for(var o=[],a=t;a0},t.prototype.ensureUniqueItemVisual=function(t,e){var n=this._itemVisuals,i=n[t];i||(i=n[t]={});var r=i[e];return null==r&&(F(r=this.getVisual(e))?r=r.slice():i_(r)&&(r=T({},r)),i[e]=r),r},t.prototype.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,i_(e)?T(i,e):i[e]=n},t.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},t.prototype.setLayout=function(t,e){if(i_(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},t.prototype.getLayout=function(t){return this._layout[t]},t.prototype.getItemLayout=function(t){return this._itemLayouts[t]},t.prototype.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?T(this._itemLayouts[t]||{},e):e},t.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},t.prototype.setItemGraphicEl=function(t,e){var n=this.hostModel&&this.hostModel.seriesIndex;Ms(n,this.dataType,t,e),this._graphicEls[t]=e},t.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},t.prototype.eachItemGraphicEl=function(t,e){O(this._graphicEls,(function(n,i){n&&t&&t.call(e,n,i)}))},t.prototype.cloneShallow=function(e){return e||(e=new t(this._schema?this._schema:r_(this.dimensions,this._getDimInfo,this),this.hostModel)),t_(e,this),e._store=this._store,e},t.prototype.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(it(arguments)))})},t.internalField=(Km=function(t){var e=t._invertedIndicesMap;O(e,(function(n,i){var r=t._dimInfos[i],o=r.ordinalMeta,a=t._store;if(o){n=e[i]=new o_(o.categories.length);for(var s=0;s1&&(s+="__ec__"+u),i[e]=s}})),t}();function u_(t,e){yd(t)||(t=md(t));var n=(e=e||{}).coordDimensions||[],i=e.dimensionsDefine||t.dimensionsDefine||[],r=ct(),o=[],a=function(t,e,n,i){var r=Math.max(t.dimensionsDetectedCount||1,e.length,n.length,i||0);return O(e,(function(t){var e;Y(t)&&(e=t.dimsDef)&&(r=Math.max(r,e.length))})),r}(t,n,i,e.dimensionsCount),s=e.canOmitUnusedDimensions&&qm(a),l=i===t.dimensionsDefine,u=l?jm(t):Zm(i),h=e.encodeDefine;!h&&e.encodeDefaulter&&(h=e.encodeDefaulter(t,a));for(var c=ct(h),p=new lf(a),d=0;d0&&(i.name=r+(o-1)),o++,e.set(r,o)}}(o),new Xm({source:t,dimensions:o,fullDimensionCount:a,dimensionOmitted:s})}function h_(t,e,n){var i=e.data;if(n||i.hasOwnProperty(t)){for(var r=0;i.hasOwnProperty(t+r);)r++;t+=r}return e.set(t,!0),t}var c_=function(t){this.coordSysDims=[],this.axisMap=ct(),this.categoryAxisMap=ct(),this.coordSysName=t};var p_={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis",Vr).models[0],o=t.getReferringComponents("yAxis",Vr).models[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",o),d_(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),d_(o)&&(i.set("y",o),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis",Vr).models[0];e.coordSysDims=["single"],n.set("single",r),d_(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar",Vr).models[0],o=r.findAxisModel("radiusAxis"),a=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",o),n.set("angle",a),d_(o)&&(i.set("radius",o),e.firstCategoryDimIndex=0),d_(a)&&(i.set("angle",a),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,o=r.getComponent("parallel",t.get("parallelIndex")),a=e.coordSysDims=o.dimensions.slice();O(o.parallelAxisIndex,(function(t,o){var s=r.getComponent("parallelAxis",t),l=a[o];n.set(l,s),d_(s)&&(i.set(l,s),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=o))}))}};function d_(t){return"category"===t.get("type")}function f_(t,e,n){var i,r,o,a=(n=n||{}).byIndex,s=n.stackedCoordDimension;!function(t){return!Ym(t.schema)}(e)?(r=e.schema,i=r.dimensions,o=e.store):i=e;var l,u,h,c,p=!(!t||!t.get("stack"));if(O(i,(function(t,e){W(t)&&(i[e]=t={name:t}),p&&!t.isExtraCoord&&(a||l||!t.ordinalMeta||(l=t),u||"ordinal"===t.type||"time"===t.type||s&&s!==t.coordDim||(u=t))})),!u||a||l||(a=!0),u){h="__\0ecstackresult_"+t.id,c="__\0ecstackedover_"+t.id,l&&(l.createInvertedIndices=!0);var d=u.coordDim,f=u.type,g=0;O(i,(function(t){t.coordDim===d&&g++}));var y={name:h,coordDim:d,coordDimIndex:g,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length},v={name:c,coordDim:c,coordDimIndex:g+1,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length+1};r?(o&&(y.storeDimIndex=o.ensureCalculationDimension(c,f),v.storeDimIndex=o.ensureCalculationDimension(h,f)),r.appendCalculationDimension(y),r.appendCalculationDimension(v)):(i.push(y),i.push(v))}return{stackedDimension:u&&u.name,stackedByDimension:l&&l.name,isStackedByIndex:a,stackedOverDimension:c,stackResultDimension:h}}function g_(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function y_(t,e){return g_(t,e)?t.getCalculationInfo("stackResultDimension"):e}function v_(t,e,n){n=n||{};var i,r=e.getSourceManager(),o=!1;t?(o=!0,i=md(t)):o=(i=r.getSource()).sourceFormat===ap;var a=function(t){var e=t.get("coordinateSystem"),n=new c_(e),i=p_[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}(e),s=function(t,e){var n,i=t.get("coordinateSystem"),r=Bp.get(i);return e&&e.coordSysDims&&(n=R(e.coordSysDims,(function(t){var n={name:t},i=e.axisMap.get(t);if(i){var r=i.get("type");n.type=Fm(r)}return n}))),n||(n=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"]),n}(e,a),l=n.useEncodeDefaulter,u=H(l)?l:l?G(mp,s,e):null,h=u_(i,{coordDimensions:s,generateCoord:n.generateCoord,encodeDefine:e.getEncode(),encodeDefaulter:u,canOmitUnusedDimensions:!o}),c=function(t,e,n){var i,r;return n&&O(t,(function(t,o){var a=t.coordDim,s=n.categoryAxisMap.get(a);s&&(null==i&&(i=o),t.ordinalMeta=s.getOrdinalMeta(),e&&(t.createInvertedIndices=!0)),null!=t.otherDims.itemName&&(r=!0)})),r||null==i||(t[i].otherDims.itemName=0),i}(h.dimensions,n.createInvertedIndices,a),p=o?null:r.getSharedDataStore(h),d=f_(e,{schema:h,store:p}),f=new l_(h,e);f.setCalculationInfo(d);var g=null!=c&&function(t){if(t.sourceFormat===ap){var e=function(t){var e=0;for(;ee[1]&&(e[1]=t[1])},t.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},t.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},t.prototype.isBlank=function(){return this._isBlank},t.prototype.setBlank=function(t){this._isBlank=t},t}();Qr(m_);var __=0,x_=function(){function t(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this.uid=++__}return t.createByAxisModel=function(e){var n=e.option,i=n.data,r=i&&R(i,b_);return new t({categories:r,needCollect:!r,deduplication:!1!==n.dedplication})},t.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},t.prototype.parseAndCollect=function(t){var e,n=this._needCollect;if("string"!=typeof t&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=this._getOrCreateMap();return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e},t.prototype._getOrCreateMap=function(){return this._map||(this._map=ct(this.categories))},t}();function b_(t){return Y(t)&&null!=t.value?t.value:t+""}var w_=Ki;function S_(t,e,n,i){var r={},o=t[1]-t[0],a=r.interval=hr(o/e,!0);null!=n&&ai&&(a=r.interval=i);var s=r.intervalPrecision=M_(a);return function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),I_(t,0,e),I_(t,1,e),t[0]>t[1]&&(t[0]=t[1])}(r.niceTickExtent=[w_(Math.ceil(t[0]/a)*a,s),w_(Math.floor(t[1]/a)*a,s)],t),r}function M_(t){return Ji(t)+2}function I_(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function T_(t,e){return t>=e[0]&&t<=e[1]}function C_(t,e){return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])}function D_(t,e){return t*(e[1]-e[0])+e[0]}var A_=function(t){function e(e){var n=t.call(this,e)||this;n.type="ordinal";var i=n.getSetting("ordinalMeta");return i||(i=new x_({})),F(i)&&(i=new x_({categories:R(i,(function(t){return Y(t)?t.value:t}))})),n._ordinalMeta=i,n._extent=n.getSetting("extent")||[0,i.categories.length-1],n}return n(e,t),e.prototype.parse=function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},e.prototype.contain=function(t){return T_(t=this.parse(t),this._extent)&&null!=this._ordinalMeta.categories[t]},e.prototype.normalize=function(t){return C_(t=this._getTickNumber(this.parse(t)),this._extent)},e.prototype.scale=function(t){return t=Math.round(D_(t,this._extent)),this.getRawOrdinalNumber(t)},e.prototype.getTicks=function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push({value:n}),n++;return t},e.prototype.getMinorTicks=function(t){},e.prototype.setSortInfo=function(t){if(null!=t){for(var e=t.ordinalNumbers,n=this._ordinalNumbersByTick=[],i=this._ticksByOrdinalNumber=[],r=0,o=this._ordinalMeta.categories.length,a=Math.min(o,e.length);r=0&&t=0&&t=t},e.prototype.getOrdinalMeta=function(){return this._ordinalMeta},e.prototype.niceTicks=function(){},e.prototype.niceExtent=function(){},e.type="ordinal",e}(m_);m_.registerClass(A_);var k_=Ki,L_=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="interval",e._interval=0,e._intervalPrecision=2,e}return n(e,t),e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return T_(t,this._extent)},e.prototype.normalize=function(t){return C_(t,this._extent)},e.prototype.scale=function(t){return D_(t,this._extent)},e.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},e.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),this.setExtent(e[0],e[1])},e.prototype.getInterval=function(){return this._interval},e.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=M_(t)},e.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=this._niceExtent,r=this._intervalPrecision,o=[];if(!e)return o;n[0]1e4)return[];var s=o.length?o[o.length-1].value:i[1];return n[1]>s&&(t?o.push({value:k_(s+e,r)}):o.push({value:n[1]})),o},e.prototype.getMinorTicks=function(t){for(var e=this.getTicks(!0),n=[],i=this.getExtent(),r=1;ri[0]&&h0&&(o=null===o?s:Math.min(o,s))}n[i]=o}}return n}(t),n=[];return O(t,(function(t){var i,r=t.coordinateSystem.getBaseAxis(),o=r.getExtent();if("category"===r.type)i=r.getBandWidth();else if("value"===r.type||"time"===r.type){var a=r.dim+"_"+r.index,s=e[a],l=Math.abs(o[1]-o[0]),u=r.scale.getExtent(),h=Math.abs(u[1]-u[0]);i=s?l/h*s:l}else{var c=t.getData();i=Math.abs(o[1]-o[0])/c.count()}var p=qi(t.get("barWidth"),i),d=qi(t.get("barMaxWidth"),i),f=qi(t.get("barMinWidth")||1,i),g=t.get("barGap"),y=t.get("barCategoryGap");n.push({bandWidth:i,barWidth:p,barMaxWidth:d,barMinWidth:f,barGap:g,barCategoryGap:y,axisKey:N_(r),stackId:R_(t)})})),V_(n)}function V_(t){var e={};O(t,(function(t,n){var i=t.axisKey,r=t.bandWidth,o=e[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:null,gap:"20%",stacks:{}},a=o.stacks;e[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(a[s].width=l,l=Math.min(o.remainedWidth,l),o.remainedWidth-=l);var u=t.barMaxWidth;u&&(a[s].maxWidth=u);var h=t.barMinWidth;h&&(a[s].minWidth=h);var c=t.barGap;null!=c&&(o.gap=c);var p=t.barCategoryGap;null!=p&&(o.categoryGap=p)}));var n={};return O(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=t.categoryGap;if(null==o){var a=V(i).length;o=Math.max(35-4*a,15)+"%"}var s=qi(o,r),l=qi(t.gap,1),u=t.remainedWidth,h=t.autoWidthCount,c=(u-s)/(h+(h-1)*l);c=Math.max(c,0),O(i,(function(t){var e=t.maxWidth,n=t.minWidth;if(t.width){i=t.width;e&&(i=Math.min(i,e)),n&&(i=Math.max(i,n)),t.width=i,u-=i+l*i,h--}else{var i=c;e&&ei&&(i=n),i!==c&&(t.width=i,u-=i+l*i,h--)}})),c=(u-s)/(h+(h-1)*l),c=Math.max(c,0);var p,d=0;O(i,(function(t,e){t.width||(t.width=c),p=t,d+=t.width*(1+l)})),p&&(d-=p.width*l);var f=-d/2;O(i,(function(t,i){n[e][i]=n[e][i]||{bandWidth:r,offset:f,width:t.width},f+=t.width*(1+l)}))})),n}function B_(t,e,n){if(t&&e){var i=t[N_(e)];return null!=i&&null!=n?i[R_(n)]:i}}function G_(t,e){var n=z_(t,e),i=E_(n),r={};O(n,(function(t){var e=t.getData(),n=t.coordinateSystem,o=n.getBaseAxis(),a=R_(t),s=i[N_(o)][a],l=s.offset,u=s.width,h=n.getOtherAxis(o),c=t.get("barMinHeight")||0;r[a]=r[a]||[],e.setLayout({bandWidth:s.bandWidth,offset:l,size:u});for(var p=e.mapDimension(h.dim),d=e.mapDimension(o.dim),f=g_(e,p),g=h.isHorizontal(),y=U_(o,h),v=e.getStore(),m=e.getDimensionIndex(p),_=e.getDimensionIndex(d),x=0,b=v.count();x=0?"p":"n",I=y;f&&(r[a][S]||(r[a][S]={p:y,n:y}),I=r[a][S][M]);var T,C=void 0,D=void 0,A=void 0,k=void 0;if(g)C=I,D=(T=n.dataToPoint([w,S]))[1]+l,A=T[0]-y,k=u,Math.abs(A).5||(h=.5),{progress:function(t,e){for(var c,p=t.count,d=new O_(2*p),f=new O_(2*p),g=new O_(p),y=[],v=[],m=0,_=0,x=e.getStore();null!=(c=t.next());)v[u]=x.get(a,c),v[1-u]=x.get(s,c),y=n.dataToPoint(v,null),f[m]=l?i.x+i.width:y[0],d[m++]=y[0],f[m]=l?y[1]:i.y+i.height,d[m++]=y[1],g[_++]=c;e.setLayout({largePoints:d,largeDataIndices:g,largeBackgroundPoints:f,barWidth:h,valueAxisStart:U_(r,o),backgroundStart:l?i.x:i.y,valueAxisHorizontal:l})}}}}};function H_(t){return t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}function W_(t){return t.pipelineContext&&t.pipelineContext.large}function U_(t,e,n){return e.toGlobalCoord(e.dataToCoord("log"===e.type?1:0))}var X_=function(t){function e(e){var n=t.call(this,e)||this;return n.type="time",n}return n(e,t),e.prototype.getLabel=function(t){var e=this.getSetting("useUTC");return dc(t.value,sc[function(t){switch(t){case"year":case"month":return"day";case"millisecond":return"millisecond";default:return"second"}}(cc(this._minLevelUnit))]||sc.second,e,this.getSetting("locale"))},e.prototype.getFormattedLabel=function(t,e,n){var i=this.getSetting("useUTC");return function(t,e,n,i,r){var o=null;if("string"==typeof n)o=n;else if("function"==typeof n)o=n(t.value,e,{level:t.level});else{var a=T({},oc);if(t.level>0)for(var s=0;s=0;--s)if(l[u]){o=l[u];break}o=o||a.none}if(F(o)){var h=null==t.level?0:t.level>=0?t.level:o.length+t.level;o=o[h=Math.min(h,o.length-1)]}}return dc(new Date(t.value),o,r,i)}(t,e,n,this.getSetting("locale"),i)},e.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=[];if(!e)return i;i.push({value:n[0],level:0});var r=this.getSetting("useUTC"),o=function(t,e,n,i){var r=1e4,o=uc,a=0;function s(t,e,n,r,o,a,s){for(var l=new Date(e),u=e,h=l[r]();u1&&0===u&&o.unshift({value:o[0].value-p})}}for(u=0;u=i[0]&&v<=i[1]&&c++)}var m=(i[1]-i[0])/e;if(c>1.5*m&&p>m/1.5)break;if(u.push(g),c>m||t===o[d])break}h=[]}}0;var _=z(R(u,(function(t){return z(t,(function(t){return t.value>=i[0]&&t.value<=i[1]&&!t.notAdd}))})),(function(t){return t.length>0})),x=[],b=_.length-1;for(d=0;d<_.length;++d)for(var w=_[d],S=0;Sn&&(this._approxInterval=n);var o=Y_.length,a=Math.min(function(t,e,n,i){for(;n>>1;t[r][1]16?16:t>7.5?7:t>3.5?4:t>1.5?2:1}function j_(t){return(t/=2592e6)>6?6:t>3?3:t>2?2:1}function q_(t){return(t/=nc)>12?12:t>6?6:t>3.5?4:t>2?2:1}function K_(t,e){return(t/=e?ec:tc)>30?30:t>20?20:t>15?15:t>10?10:t>5?5:t>2?2:1}function $_(t){return hr(t,!0)}function J_(t,e,n){var i=new Date(t);switch(cc(e)){case"year":case"month":i[Mc(n)](0);case"day":i[Ic(n)](1);case"hour":i[Tc(n)](0);case"minute":i[Cc(n)](0);case"second":i[Dc(n)](0),i[Ac(n)](0)}return i.getTime()}m_.registerClass(X_);var Q_=m_.prototype,tx=L_.prototype,ex=Ki,nx=Math.floor,ix=Math.ceil,rx=Math.pow,ox=Math.log,ax=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="log",e.base=10,e._originalScale=new L_,e._interval=0,e}return n(e,t),e.prototype.getTicks=function(t){var e=this._originalScale,n=this._extent,i=e.getExtent();return R(tx.getTicks.call(this,t),(function(t){var e=t.value,r=Ki(rx(this.base,e));return r=e===n[0]&&this._fixMin?lx(r,i[0]):r,{value:r=e===n[1]&&this._fixMax?lx(r,i[1]):r}}),this)},e.prototype.setExtent=function(t,e){var n=this.base;t=ox(t)/ox(n),e=ox(e)/ox(n),tx.setExtent.call(this,t,e)},e.prototype.getExtent=function(){var t=this.base,e=Q_.getExtent.call(this);e[0]=rx(t,e[0]),e[1]=rx(t,e[1]);var n=this._originalScale.getExtent();return this._fixMin&&(e[0]=lx(e[0],n[0])),this._fixMax&&(e[1]=lx(e[1],n[1])),e},e.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=ox(t[0])/ox(e),t[1]=ox(t[1])/ox(e),Q_.unionExtent.call(this,t)},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.niceTicks=function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=lr(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[Ki(ix(e[0]/i)*i),Ki(nx(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},e.prototype.niceExtent=function(t){tx.niceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return T_(t=ox(t)/ox(this.base),this._extent)},e.prototype.normalize=function(t){return C_(t=ox(t)/ox(this.base),this._extent)},e.prototype.scale=function(t){return t=D_(t,this._extent),rx(this.base,t)},e.type="log",e}(m_),sx=ax.prototype;function lx(t,e){return ex(t,Ji(e))}sx.getMinorTicks=tx.getMinorTicks,sx.getLabel=tx.getLabel,m_.registerClass(ax);var ux=function(){function t(t,e,n){this._prepareParams(t,e,n)}return t.prototype._prepareParams=function(t,e,n){n[1]s&&(a=NaN,s=NaN);var h=Q(a)||Q(s)||t&&!i;this._needCrossZero&&(a>0&&s>0&&!l&&(a=0),a<0&&s<0&&!u&&(s=0));var c=this._determinedMin,p=this._determinedMax;return null!=c&&(a=c,l=!0),null!=p&&(s=p,u=!0),{min:a,max:s,minFixed:l,maxFixed:u,isBlank:h}},t.prototype.modifyDataMinMax=function(t,e){this[cx[t]]=e},t.prototype.setDeterminedMinMax=function(t,e){var n=hx[t];this[n]=e},t.prototype.freeze=function(){this.frozen=!0},t}(),hx={min:"_determinedMin",max:"_determinedMax"},cx={min:"_dataMin",max:"_dataMax"};function px(t,e,n){var i=t.rawExtentInfo;return i||(i=new ux(t,e,n),t.rawExtentInfo=i,i)}function dx(t,e){return null==e?null:Q(e)?NaN:t.parse(e)}function fx(t,e){var n=t.type,i=px(t,e,t.getExtent()).calculate();t.setBlank(i.isBlank);var r=i.min,o=i.max,a=e.ecModel;if(a&&"time"===n){var s=z_("bar",a),l=!1;if(O(s,(function(t){l=l||t.getBaseAxis()===e.axis})),l){var u=E_(s),h=function(t,e,n,i){var r=n.axis.getExtent(),o=r[1]-r[0],a=B_(i,n.axis);if(void 0===a)return{min:t,max:e};var s=1/0;O(a,(function(t){s=Math.min(t.offset,s)}));var l=-1/0;O(a,(function(t){l=Math.max(t.offset+t.width,l)})),s=Math.abs(s),l=Math.abs(l);var u=s+l,h=e-t,c=h/(1-(s+l)/o)-h;return{min:t-=c*(s/u),max:e+=c*(l/u)}}(r,o,e,u);r=h.min,o=h.max}}return{extent:[r,o],fixMin:i.minFixed,fixMax:i.maxFixed}}function gx(t,e){var n=e,i=fx(t,n),r=i.extent,o=n.get("splitNumber");t instanceof ax&&(t.base=n.get("logBase"));var a=t.type;t.setExtent(r[0],r[1]),t.niceExtent({splitNumber:o,fixMin:i.fixMin,fixMax:i.fixMax,minInterval:"interval"===a||"time"===a?n.get("minInterval"):null,maxInterval:"interval"===a||"time"===a?n.get("maxInterval"):null});var s=n.get("interval");null!=s&&t.setInterval&&t.setInterval(s)}function yx(t,e){if(e=e||t.get("type"))switch(e){case"category":return new A_({ordinalMeta:t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),extent:[1/0,-1/0]});case"time":return new X_({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new(m_.getClass(e)||L_)}}function vx(t){var e,n,i=t.getLabelModel().get("formatter"),r="category"===t.type?t.scale.getExtent()[0]:null;return"time"===t.scale.type?(n=i,function(e,i){return t.scale.getFormattedLabel(e,i,n)}):"string"==typeof i?function(e){return function(n){var i=t.scale.getLabel(n);return e.replace("{value}",null!=i?i:"")}}(i):"function"==typeof i?(e=i,function(n,i){return null!=r&&(i=n.value-r),e(mx(t,n),i,null!=n.level?{level:n.level}:null)}):function(e){return t.scale.getLabel(e)}}function mx(t,e){return"category"===t.type?t.scale.getLabel(e):e.value}function _x(t,e){var n=e*Math.PI/180,i=t.width,r=t.height,o=i*Math.abs(Math.cos(n))+Math.abs(r*Math.sin(n)),a=i*Math.abs(Math.sin(n))+Math.abs(r*Math.cos(n));return new vi(t.x,t.y,o,a)}function xx(t){var e=t.get("interval");return null==e?"auto":e}function bx(t){return"category"===t.type&&0===xx(t.getLabelModel())}function Sx(t,e){var n={};return O(t.mapDimensionsAll(e),(function(e){n[y_(t,e)]=!0})),V(n)}var Mx=function(){function t(){}return t.prototype.getNeedCrossZero=function(){return!this.option.scale},t.prototype.getCoordSysModel=function(){},t}();var Ix={isDimensionStacked:g_,enableDataStack:f_,getStackedDimension:y_};var Tx=Object.freeze({__proto__:null,createList:function(t){return v_(null,t)},getLayoutRect:jc,dataStack:Ix,createScale:function(t,e){var n=e;e instanceof Wh||(n=new Wh(e));var i=yx(n);return i.setExtent(t[0],t[1]),gx(i,n),i},mixinAxisModelCommonMethods:function(t){L(t,Mx)},getECData:Ss,createTextStyle:function(t,e){return wh(t,null,null,"normal"!==(e=e||{}).state)},createDimensions:function(t,e){return u_(t,e).dimensions},createSymbol:ty,enableHoverEmphasis:pl}),Cx=Object.freeze({__proto__:null,linearMap:ji,round:Ki,asc:$i,getPrecision:Ji,getPrecisionSafe:Qi,getPixelPrecision:tr,getPercentWithPrecision:er,MAX_SAFE_INTEGER:ir,remRadian:rr,isRadianAroundZero:or,parseDate:sr,quantity:lr,quantityExponent:ur,nice:hr,quantile:cr,reformIntervals:pr,isNumeric:fr,numericToNumber:dr}),Dx=Object.freeze({__proto__:null,parse:sr,format:dc}),Ax=Object.freeze({__proto__:null,extendShape:Zu,extendPath:qu,makePath:Ju,makeImage:Qu,mergePath:eh,resizePath:nh,createIcon:ch,updateProps:Eu,initProps:Vu,getTransform:rh,clipPointsByRect:uh,clipRectByRect:hh,registerShape:Ku,getShapeClass:$u,Group:Bi,Image:rs,Text:fs,Circle:Hl,Ellipse:Ul,Sector:ou,Ring:su,Polygon:cu,Polyline:du,Rect:cs,Line:yu,BezierCurve:xu,Arc:wu,IncrementalDisplayable:Ou,CompoundPath:Su,LinearGradient:Iu,RadialGradient:Tu,BoundingRect:vi}),kx=Object.freeze({__proto__:null,addCommas:kc,toCamelCase:Lc,normalizeCssArray:Pc,encodeHTML:Nc,formatTpl:Bc,getTooltipMarker:Gc,formatTime:function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=sr(e),r=n?"UTC":"",o=i["get"+r+"FullYear"](),a=i["get"+r+"Month"]()+1,s=i["get"+r+"Date"](),l=i["get"+r+"Hours"](),u=i["get"+r+"Minutes"](),h=i["get"+r+"Seconds"](),c=i["get"+r+"Milliseconds"]();return t=t.replace("MM",hc(a,2)).replace("M",a).replace("yyyy",o).replace("yy",o%100+"").replace("dd",hc(s,2)).replace("d",s).replace("hh",hc(l,2)).replace("h",l).replace("mm",hc(u,2)).replace("m",u).replace("ss",hc(h,2)).replace("s",h).replace("SSS",hc(c,3))},capitalFirst:function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},truncateText:uo,getTextRect:function(t,e,n,i,r,o,a,s){return mr(),new fs({style:{text:t,font:e,align:n,verticalAlign:i,padding:r,rich:o,overflow:a?"truncate":null,lineHeight:s}}).getBoundingRect()}}),Lx=Object.freeze({__proto__:null,map:R,each:O,indexOf:A,inherits:k,reduce:N,filter:z,bind:B,curry:G,isArray:F,isString:W,isObject:Y,isFunction:H,extend:T,defaults:C,clone:S,merge:M}),Px=Rr();function Ox(t){return"category"===t.type?function(t){var e=t.getLabelModel(),n=Nx(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(t){var e=t.scale.getTicks(),n=vx(t);return{labels:R(e,(function(e,i){return{level:e.level,formattedLabel:n(e,i),rawLabel:t.scale.getLabel(e),tickValue:e.value}}))}}(t)}function Rx(t,e){return"category"===t.type?function(t,e){var n,i,r=zx(t,"ticks"),o=xx(e),a=Ex(r,o);if(a)return a;e.get("show")&&!t.scale.isBlank()||(n=[]);if(H(o))n=Gx(t,o,!0);else if("auto"===o){var s=Nx(t,t.getLabelModel());i=s.labelCategoryInterval,n=R(s.labels,(function(t){return t.tickValue}))}else n=Bx(t,i=o,!0);return Vx(r,o,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:R(t.scale.getTicks(),(function(t){return t.value}))}}function Nx(t,e){var n,i,r=zx(t,"labels"),o=xx(e),a=Ex(r,o);return a||(H(o)?n=Gx(t,o):(i="auto"===o?function(t){var e=Px(t).autoInterval;return null!=e?e:Px(t).autoInterval=t.calculateCategoryInterval()}(t):o,n=Bx(t,i)),Vx(r,o,{labels:n,labelCategoryInterval:i}))}function zx(t,e){return Px(t)[e]||(Px(t)[e]=[])}function Ex(t,e){for(var n=0;n1&&h/l>2&&(u=Math.round(Math.ceil(u/l)*l));var c=bx(t),p=a.get("showMinLabel")||c,d=a.get("showMaxLabel")||c;p&&u!==o[0]&&g(o[0]);for(var f=u;f<=o[1];f+=l)g(f);function g(t){var e={value:t};s.push(n?t:{formattedLabel:i(e),rawLabel:r.getLabel(e),tickValue:t})}return d&&f-l!==o[1]&&g(o[1]),s}function Gx(t,e,n){var i=t.scale,r=vx(t),o=[];return O(i.getTicks(),(function(t){var a=i.getLabel(t),s=t.value;e(t.value,a)&&o.push(n?s:{formattedLabel:r(t),rawLabel:a,tickValue:s})})),o}var Fx=[0,1],Hx=function(){function t(t,e,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=e,this._extent=n||[0,0]}return t.prototype.contain=function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},t.prototype.containData=function(t){return this.scale.contain(t)},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.getPixelPrecision=function(t){return tr(t||this.scale.getExtent(),this._extent)},t.prototype.setExtent=function(t,e){var n=this._extent;n[0]=t,n[1]=e},t.prototype.dataToCoord=function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&Wx(n=n.slice(),i.count()),ji(t,Fx,n,e)},t.prototype.coordToData=function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&Wx(n=n.slice(),i.count());var r=ji(t,n,Fx,e);return this.scale.scale(r)},t.prototype.pointToData=function(t,e){},t.prototype.getTicksCoords=function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=R(Rx(this,e).ticks,(function(t){return{coord:this.dataToCoord("ordinal"===this.scale.type?this.scale.getRawOrdinalNumber(t):t),tickValue:t}}),this);return function(t,e,n,i){var r=e.length;if(!t.onBand||n||!r)return;var o,a,s=t.getExtent();if(1===r)e[0].coord=s[0],o=e[1]={coord:s[0]};else{var l=e[r-1].tickValue-e[0].tickValue,u=(e[r-1].coord-e[0].coord)/l;O(e,(function(t){t.coord-=u/2})),a=1+t.scale.getExtent()[1]-e[r-1].tickValue,o={coord:e[r-1].coord+u*a},e.push(o)}var h=s[0]>s[1];c(e[0].coord,s[0])&&(i?e[0].coord=s[0]:e.shift());i&&c(s[0],e[0].coord)&&e.unshift({coord:s[0]});c(s[1],o.coord)&&(i?o.coord=s[1]:e.pop());i&&c(o.coord,s[1])&&e.push({coord:s[1]});function c(t,e){return t=Ki(t),e=Ki(e),h?t>e:t0&&t<100||(t=5),R(this.scale.getMinorTicks(t),(function(t){return R(t,(function(t){return{coord:this.dataToCoord(t),tickValue:t}}),this)}),this)},t.prototype.getViewLabels=function(){return Ox(this).labels},t.prototype.getLabelModel=function(){return this.model.getModel("axisLabel")},t.prototype.getTickModel=function(){return this.model.getModel("axisTick")},t.prototype.getBandWidth=function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},t.prototype.calculateCategoryInterval=function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=vx(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,o=r.getExtent(),a=r.count();if(o[1]-o[0]<1)return 0;var s=1;a>40&&(s=Math.max(1,Math.floor(a/40)));for(var l=o[0],u=t.dataToCoord(l+1)-t.dataToCoord(l),h=Math.abs(u*Math.cos(i)),c=Math.abs(u*Math.sin(i)),p=0,d=0;l<=o[1];l+=s){var f,g,y=Si(n({value:l}),e.font,"center","top");f=1.3*y.width,g=1.3*y.height,p=Math.max(p,f,7),d=Math.max(d,g,7)}var v=p/h,m=d/c;isNaN(v)&&(v=1/0),isNaN(m)&&(m=1/0);var _=Math.max(0,Math.floor(Math.min(v,m))),x=Px(t.model),b=t.getExtent(),w=x.lastAutoInterval,S=x.lastTickCount;return null!=w&&null!=S&&Math.abs(w-_)<=1&&Math.abs(S-a)<=1&&w>_&&x.axisExtent0===b[0]&&x.axisExtent1===b[1]?_=w:(x.lastTickCount=a,x.lastAutoInterval=_,x.axisExtent0=b[0],x.axisExtent1=b[1]),_}(this)},t}();function Wx(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}var Ux=2*Math.PI,Xx=Oa.CMD,Yx=["top","right","bottom","left"];function Zx(t,e,n,i,r){var o=n.width,a=n.height;switch(t){case"top":i.set(n.x+o/2,n.y-e),r.set(0,-1);break;case"bottom":i.set(n.x+o/2,n.y+a+e),r.set(0,1);break;case"left":i.set(n.x-e,n.y+a/2),r.set(-1,0);break;case"right":i.set(n.x+o+e,n.y+a/2),r.set(1,0)}}function jx(t,e,n,i,r,o,a,s,l){a-=t,s-=e;var u=Math.sqrt(a*a+s*s),h=(a/=u)*n+t,c=(s/=u)*n+e;if(Math.abs(i-r)%Ux<1e-4)return l[0]=h,l[1]=c,u-n;if(o){var p=i;i=Va(r),r=Va(p)}else i=Va(i),r=Va(r);i>r&&(r+=Ux);var d=Math.atan2(s,a);if(d<0&&(d+=Ux),d>=i&&d<=r||d+Ux>=i&&d+Ux<=r)return l[0]=h,l[1]=c,u-n;var f=n*Math.cos(i)+t,g=n*Math.sin(i)+e,y=n*Math.cos(r)+t,v=n*Math.sin(r)+e,m=(f-a)*(f-a)+(g-s)*(g-s),_=(y-a)*(y-a)+(v-s)*(v-s);return m<_?(l[0]=f,l[1]=g,Math.sqrt(m)):(l[0]=y,l[1]=v,Math.sqrt(_))}function qx(t,e,n,i,r,o,a,s){var l=r-t,u=o-e,h=n-t,c=i-e,p=Math.sqrt(h*h+c*c),d=(l*(h/=p)+u*(c/=p))/p;s&&(d=Math.min(Math.max(d,0),1)),d*=p;var f=a[0]=t+d*h,g=a[1]=e+d*c;return Math.sqrt((f-r)*(f-r)+(g-o)*(g-o))}function Kx(t,e,n,i,r,o,a){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i);var s=t+n,l=e+i,u=a[0]=Math.min(Math.max(r,t),s),h=a[1]=Math.min(Math.max(o,e),l);return Math.sqrt((u-r)*(u-r)+(h-o)*(h-o))}var $x=[];function Jx(t,e,n){var i=Kx(e.x,e.y,e.width,e.height,t.x,t.y,$x);return n.set($x[0],$x[1]),i}function Qx(t,e,n){for(var i,r,o=0,a=0,s=0,l=0,u=1/0,h=e.data,c=t.x,p=t.y,d=0;d0){e=e/180*Math.PI,tb.fromArray(t[0]),eb.fromArray(t[1]),nb.fromArray(t[2]),li.sub(ib,tb,eb),li.sub(rb,nb,eb);var n=ib.len(),i=rb.len();if(!(n<.001||i<.001)){ib.scale(1/n),rb.scale(1/i);var r=ib.dot(rb);if(Math.cos(e)1&&li.copy(sb,nb),sb.toArray(t[1])}}}}function ub(t,e,n){if(n<=180&&n>0){n=n/180*Math.PI,tb.fromArray(t[0]),eb.fromArray(t[1]),nb.fromArray(t[2]),li.sub(ib,eb,tb),li.sub(rb,nb,eb);var i=ib.len(),r=rb.len();if(!(i<.001||r<.001))if(ib.scale(1/i),rb.scale(1/r),ib.dot(e)=a)li.copy(sb,nb);else{sb.scaleAndAdd(rb,o/Math.tan(Math.PI/2-s));var l=nb.x!==eb.x?(sb.x-eb.x)/(nb.x-eb.x):(sb.y-eb.y)/(nb.y-eb.y);if(isNaN(l))return;l<0?li.copy(sb,eb):l>1&&li.copy(sb,nb)}sb.toArray(t[1])}}}function hb(t,e,n,i){var r="normal"===n,o=r?t:t.ensureState(n);o.ignore=e;var a=i.get("smooth");a&&!0===a&&(a=.3),o.shape=o.shape||{},a>0&&(o.shape.smooth=a);var s=i.getModel("lineStyle").getLineStyle();r?t.useStyle(s):o.style=s}function cb(t,e){var n=e.smooth,i=e.points;if(i)if(t.moveTo(i[0][0],i[0][1]),n>0&&i.length>=3){var r=Lt(i[0],i[1]),o=Lt(i[1],i[2]);if(!r||!o)return t.lineTo(i[1][0],i[1][1]),void t.lineTo(i[2][0],i[2][1]);var a=Math.min(r,o)*n,s=Rt([],i[1],i[0],a/r),l=Rt([],i[1],i[2],a/o),u=Rt([],s,l,.5);t.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),t.bezierCurveTo(l[0],l[1],l[0],l[1],i[2][0],i[2][1])}else for(var h=1;h0&&o&&x(-h/a,0,a);var f,g,y=t[0],v=t[a-1];return m(),f<0&&b(-f,.8),g<0&&b(g,.8),m(),_(f,g,1),_(g,f,-1),m(),f<0&&w(-f),g<0&&w(g),u}function m(){f=y.rect[e]-i,g=r-v.rect[e]-v.rect[n]}function _(t,e,n){if(t<0){var i=Math.min(e,-t);if(i>0){x(i*n,0,a);var r=i+t;r<0&&b(-r*n,1)}else b(-t*n,1)}}function x(n,i,r){0!==n&&(u=!0);for(var o=i;o0)for(l=0;l0;l--){x(-(o[l-1]*c),l,a)}}}function w(t){var e=t<0?-1:1;t=Math.abs(t);for(var n=Math.ceil(t/(a-1)),i=0;i0?x(n,0,i+1):x(-n,a-i-1,a),(t-=n)<=0)return}}function yb(t,e,n,i){return gb(t,"y","height",e,n,i)}function vb(t){var e=[];t.sort((function(t,e){return e.priority-t.priority}));var n=new vi(0,0,0,0);function i(t){if(!t.ignore){var e=t.ensureState("emphasis");null==e.ignore&&(e.ignore=!1)}t.ignore=!0}for(var r=0;r=0&&n.attr(d.oldLayoutSelect),A(u,"emphasis")>=0&&n.attr(d.oldLayoutEmphasis)),Eu(n,s,e,a)}else if(n.attr(s),!Ah(n).valueAnimation){var h=et(n.style.opacity,1);n.style.opacity=0,Vu(n,{style:{opacity:h}},e,a)}if(d.oldLayout=s,n.states.select){var c=d.oldLayoutSelect={};Mb(c,s,Ib),Mb(c,n.states.select,Ib)}if(n.states.emphasis){var p=d.oldLayoutEmphasis={};Mb(p,s,Ib),Mb(p,n.states.emphasis,Ib)}Lh(n,a,l,e,e)}if(i&&!i.ignore&&!i.invisible){r=(d=Sb(i)).oldLayout;var d,f={points:i.shape.points};r?(i.attr({shape:r}),Eu(i,{shape:f},e)):(i.setShape(f),i.style.strokePercent=0,Vu(i,{style:{strokePercent:1}},e)),d.oldLayout=f}},t}(),Cb=Rr();function Db(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}function Ab(t){var e;if(t&&"transparent"!==t){if("string"==typeof t&&t.indexOf("rgba")>-1){var n=We(t);n&&(t="rgb("+n[0]+","+n[1]+","+n[2]+")",e=n[3])}}else t="none";return{color:t,opacity:null==e?1:e}}function kb(t,e,n,i,r){for(var o=e.length,a=n.length,s=t.newPos,l=s-i,u=0;s+1=i&&l+1>=r){for(var u=[],h=0;h=i&&c+1>=r)return Pb(l.components);s[a]=l}else s[a]=void 0}var f;o++}for(;o<=a;){var p=c();if(p)return p}}(t,e,n)}var Rb="none",Nb=Math.round,zb=Math.sin,Eb=Math.cos,Vb=Math.PI,Bb=2*Math.PI,Gb=180/Vb,Fb=1e-4;function Hb(t){return Nb(1e3*t)/1e3}function Wb(t){return Nb(1e4*t)/1e4}function Ub(t){return t-1e-4}function Xb(t,e){e&&Yb(t,"transform","matrix("+Hb(e[0])+","+Hb(e[1])+","+Hb(e[2])+","+Hb(e[3])+","+Wb(e[4])+","+Wb(e[5])+")")}function Yb(t,e,n){(!n||"linear"!==n.type&&"radial"!==n.type)&&t.setAttribute(e,n)}function Zb(t,e,n){var i=null==e.opacity?1:e.opacity;if(n instanceof rs)Yb(t,"opacity",i+"");else{if(function(t){var e=t.fill;return null!=e&&e!==Rb}(e)){var r=Ab(e.fill);Yb(t,"fill",r.color),Yb(t,"fill-opacity",(null!=e.fillOpacity?e.fillOpacity*r.opacity*i:r.opacity*i)+"")}else Yb(t,"fill",Rb);if(function(t){var e=t.stroke;return null!=e&&e!==Rb}(e)){var o=Ab(e.stroke);Yb(t,"stroke",o.color);var a=e.lineWidth,s=e.strokeNoScale?n.getLineScale():1;Yb(t,"stroke-width",(s?a/s:0)+""),Yb(t,"paint-order",e.strokeFirst?"stroke":"fill"),Yb(t,"stroke-opacity",(null!=e.strokeOpacity?e.strokeOpacity*o.opacity*i:o.opacity*i)+"");var l=e.lineDash&&a>0&&oy(e.lineDash,a);if(l){var u=e.lineDashOffset;s&&1!==s&&(l=R(l,(function(t){return t/s})),u&&(u=Nb(u/=s))),Yb(t,"stroke-dasharray",l.join(",")),Yb(t,"stroke-dashoffset",(u||0)+"")}else Yb(t,"stroke-dasharray",Rb);e.lineCap&&Yb(t,"stroke-linecap",e.lineCap),e.lineJoin&&Yb(t,"stroke-linejoin",e.lineJoin),e.miterLimit&&Yb(t,"stroke-miterlimit",e.miterLimit+"")}else Yb(t,"stroke",Rb)}}var jb=function(){function t(){}return t.prototype.reset=function(){this._d=[],this._str=""},t.prototype.moveTo=function(t,e){this._add("M",t,e)},t.prototype.lineTo=function(t,e){this._add("L",t,e)},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){this._add("C",t,e,n,i,r,o)},t.prototype.quadraticCurveTo=function(t,e,n,i){this._add("Q",t,e,n,i)},t.prototype.arc=function(t,e,n,i,r,o){this.ellipse(t,e,n,n,0,i,r,o)},t.prototype.ellipse=function(t,e,n,i,r,o,a,s){var l=0===this._d.length,u=a-o,h=!s,c=Math.abs(u),p=Ub(c-Bb)||(h?u>=Bb:-u>=Bb),d=u>0?u%Bb:u%Bb+Bb,f=!1;f=!!p||!Ub(c)&&d>=Vb==!!h;var g=Wb(t+n*Eb(o)),y=Wb(e+i*zb(o));p&&(u=h?Bb-1e-4:1e-4-Bb,f=!0,l&&this._d.push("M",g,y));var v=Wb(t+n*Eb(o+u)),m=Wb(e+i*zb(o+u));if(isNaN(g)||isNaN(y)||isNaN(n)||isNaN(i)||isNaN(r)||isNaN(Gb)||isNaN(v)||isNaN(m))return"";this._d.push("A",Wb(n),Wb(i),Nb(r*Gb),+f,+h,v,m)},t.prototype.rect=function(t,e,n,i){this._add("M",t,e),this._add("L",t+n,e),this._add("L",t+n,e+i),this._add("L",t,e+i),this._add("L",t,e),this._add("Z")},t.prototype.closePath=function(){this._d.length>0&&this._add("Z")},t.prototype._add=function(t,e,n,i,r,o,a,s,l){this._d.push(t);for(var u=1;u=0;--n)if(e[n]===t)return!0;return!1}),i}return null}return n[0]},t.prototype.doUpdate=function(t,e){if(t){var n=this.getDefs(!1);if(t[this._domName]&&n.contains(t[this._domName]))"function"==typeof e&&e(t);else{var i=this.add(t);i&&(t[this._domName]=i)}}},t.prototype.add=function(t){return null},t.prototype.addDom=function(t){var e=this.getDefs(!0);t.parentNode!==e&&e.appendChild(t)},t.prototype.removeDom=function(t){var e=this.getDefs(!1);e&&t[this._domName]&&(e.removeChild(t[this._domName]),t[this._domName]=null)},t.prototype.getDoms=function(){var t=this.getDefs(!1);if(!t)return[];var e=[];return O(this._tagNames,(function(n){for(var i=t.getElementsByTagName(n),r=0;r-1){var s=We(a)[3],l=Ye(a);o.setAttribute("stop-color","#"+l),o.setAttribute("stop-opacity",s+"")}else o.setAttribute("stop-color",n[i].color);e.appendChild(o)}t.__dom=e},e.prototype.markUsed=function(e){if(e.style){var n=e.style.fill;n&&n.__dom&&t.prototype.markDomUsed.call(this,n.__dom),(n=e.style.stroke)&&n.__dom&&t.prototype.markDomUsed.call(this,n.__dom)}},e}(Qb);function rw(t){return t&&(!!t.image||!!t.svgElement)}var ow=new Xg,aw=function(t){function e(e,n){return t.call(this,e,n,["pattern"],"__pattern_in_use__")||this}return n(e,t),e.prototype.addWithoutUpdate=function(t,e){if(e&&e.style){var n=this;O(["fill","stroke"],(function(i){var r=e.style[i];if(rw(r)){var o=n.getDefs(!0),a=ow.get(r);a?o.contains(a)||n.addDom(a):a=n.add(r),n.markUsed(e);var s=a.getAttribute("id");t.setAttribute(i,"url(#"+s+")")}}))}},e.prototype.add=function(t){if(rw(t)){var e=this.createElement("pattern");return t.id=null==t.id?this.nextId++:t.id,e.setAttribute("id","zr"+this._zrId+"-pattern-"+t.id),e.setAttribute("x","0"),e.setAttribute("y","0"),e.setAttribute("patternUnits","userSpaceOnUse"),this.updateDom(t,e),this.addDom(e),e}},e.prototype.update=function(t){if(rw(t)){var e=this;this.doUpdate(t,(function(){var n=ow.get(t);e.updateDom(t,n)}))}},e.prototype.updateDom=function(t,e){var n=t.svgElement;if(n instanceof SVGElement)n.parentNode!==e&&(e.innerHTML="",e.appendChild(n),e.setAttribute("width",t.svgWidth+""),e.setAttribute("height",t.svgHeight+""));else{var i=void 0,r=e.getElementsByTagName("image");if(r.length){if(!t.image)return void e.removeChild(r[0]);i=r[0]}else t.image&&(i=this.createElement("image"));if(i){var o=void 0,a=t.image;if("string"==typeof a?o=a:a instanceof HTMLImageElement?o=a.src:a instanceof HTMLCanvasElement&&(o=a.toDataURL()),o){i.setAttribute("href",o),i.setAttribute("x","0"),i.setAttribute("y","0");var s=oo(o,i,{dirty:function(){}},(function(t){e.setAttribute("width",t.width+""),e.setAttribute("height",t.height+"")}));s&&s.width&&s.height&&(e.setAttribute("width",s.width+""),e.setAttribute("height",s.height+"")),e.appendChild(i)}}}var l="translate("+(t.x||0)+", "+(t.y||0)+") rotate("+(t.rotation||0)/Math.PI*180+") scale("+(t.scaleX||1)+", "+(t.scaleY||1)+")";e.setAttribute("patternTransform",l),ow.set(t,e)},e.prototype.markUsed=function(e){e.style&&(rw(e.style.fill)&&t.prototype.markDomUsed.call(this,ow.get(e.style.fill)),rw(e.style.stroke)&&t.prototype.markDomUsed.call(this,ow.get(e.style.stroke)))},e}(Qb);function sw(t){var e=t.__clipPaths;return e&&e.length>0}var lw=function(t){function e(e,n){var i=t.call(this,e,n,"clipPath","__clippath_in_use__")||this;return i._refGroups={},i._keyDuplicateCount={},i}return n(e,t),e.prototype.markAllUnused=function(){t.prototype.markAllUnused.call(this);var e=this._refGroups;for(var n in e)e.hasOwnProperty(n)&&this.markDomUnused(e[n]);this._keyDuplicateCount={}},e.prototype._getClipPathGroup=function(t,e){if(sw(t)){var n=t.__clipPaths,i=this._keyDuplicateCount,r=function(t){var e=[];if(t)for(var n=0;n0){var n=this.getDefs(!0),i=e[0],r=void 0,o=void 0;i._dom?(o=i._dom.getAttribute("id"),r=i._dom,n.contains(r)||n.appendChild(r)):(o="zr"+this._zrId+"-clip-"+this.nextId,++this.nextId,(r=this.createElement("clipPath")).setAttribute("id",o),n.appendChild(r),i._dom=r),this.getSvgProxy(i).brush(i);var a=this.getSvgElement(i);r.innerHTML="",r.appendChild(a),t.setAttribute("clip-path","url(#"+o+")"),e.length>1&&this.updateDom(r,e.slice(1))}else t&&t.setAttribute("clip-path","none")},e.prototype.markUsed=function(e){var n=this;e.__clipPaths&&O(e.__clipPaths,(function(e){e._dom&&t.prototype.markDomUsed.call(n,e._dom)}))},e.prototype.removeUnused=function(){t.prototype.removeUnused.call(this);var e={},n=this._refGroups;for(var i in n)if(n.hasOwnProperty(i)){var r=n[i];this.isDomUnused(r)?r.parentNode&&r.parentNode.removeChild(r):e[i]=r}this._refGroups=e},e}(Qb),uw=function(t){function e(e,n){var i=t.call(this,e,n,["filter"],"__filter_in_use__","_shadowDom")||this;return i._shadowDomMap={},i._shadowDomPool=[],i}return n(e,t),e.prototype._getFromPool=function(){var t=this._shadowDomPool.pop();if(!t){(t=this.createElement("filter")).setAttribute("id","zr"+this._zrId+"-shadow-"+this.nextId++);var e=this.createElement("feDropShadow");t.appendChild(e),this.addDom(t)}return t},e.prototype.update=function(t,e){if(function(t){return t&&(t.shadowBlur||t.shadowOffsetX||t.shadowOffsetY)}(e.style)){var n=function(t){var e=t.style,n=t.getGlobalScale();return[e.shadowColor,(e.shadowBlur||0).toFixed(2),(e.shadowOffsetX||0).toFixed(2),(e.shadowOffsetY||0).toFixed(2),n[0],n[1]].join(",")}(e),i=e._shadowDom=this._shadowDomMap[n];i||(i=this._getFromPool(),this._shadowDomMap[n]=i),this.updateDom(t,e,i)}else this.remove(t,e)},e.prototype.remove=function(t,e){null!=e._shadowDom&&(e._shadowDom=null,t.removeAttribute("filter"))},e.prototype.updateDom=function(t,e,n){var i=n.children[0],r=e.style,o=e.getGlobalScale(),a=o[0],s=o[1];if(a&&s){var l=r.shadowOffsetX||0,u=r.shadowOffsetY||0,h=r.shadowBlur,c=Ab(r.shadowColor);i.setAttribute("dx",l/a+""),i.setAttribute("dy",u/s+""),i.setAttribute("flood-color",c.color),i.setAttribute("flood-opacity",c.opacity+"");var p=h/2/a+" "+h/2/s;i.setAttribute("stdDeviation",p),n.setAttribute("x","-100%"),n.setAttribute("y","-100%"),n.setAttribute("width","300%"),n.setAttribute("height","300%"),e._shadowDom=n;var d=n.getAttribute("id");t.setAttribute("filter","url(#"+d+")")}},e.prototype.removeUnused=function(){if(this.getDefs(!1)){var t=this._shadowDomPool,e=this._shadowDomMap;for(var n in e)e.hasOwnProperty(n)&&t.push(e[n]);this._shadowDomMap={}}},e}(Qb);function hw(t){return parseInt(t,10)}function cw(t){return t instanceof Qa?qb:t instanceof rs?Kb:t instanceof es?Jb:qb}function pw(t,e){return e&&t&&e.parentNode!==t}function dw(t,e,n){if(pw(t,e)&&n){var i=n.nextSibling;i?t.insertBefore(e,i):t.appendChild(e)}}function fw(t,e){if(pw(t,e)){var n=t.firstChild;n?t.insertBefore(e,n):t.appendChild(e)}}function gw(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)}function yw(t){return t.__svgEl}var vw=function(){function t(t,e,n,i){this.type="svg",this.refreshHover=mw("refreshHover"),this.pathToImage=mw("pathToImage"),this.configLayer=mw("configLayer"),this.root=t,this.storage=e,this._opts=n=T({},n||{});var r=Db("svg");r.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","http://www.w3.org/2000/svg"),r.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),r.setAttribute("version","1.1"),r.setAttribute("baseProfile","full"),r.style.cssText="user-select:none;position:absolute;left:0;top:0;";var o=Db("g");r.appendChild(o);var a=Db("g");r.appendChild(a),this._gradientManager=new iw(i,a),this._patternManager=new aw(i,a),this._clipPathManager=new lw(i,a),this._shadowManager=new uw(i,a);var s=document.createElement("div");s.style.cssText="overflow:hidden;position:relative",this._svgDom=r,this._svgRoot=a,this._backgroundRoot=o,this._viewport=s,t.appendChild(s),s.appendChild(r),this.resize(n.width,n.height),this._visibleList=[]}return t.prototype.getType=function(){return"svg"},t.prototype.getViewportRoot=function(){return this._viewport},t.prototype.getSvgDom=function(){return this._svgDom},t.prototype.getSvgRoot=function(){return this._svgRoot},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.refresh=function(){var t=this.storage.getDisplayList(!0);this._paintList(t)},t.prototype.setBackgroundColor=function(t){this._backgroundRoot&&this._backgroundNode&&this._backgroundRoot.removeChild(this._backgroundNode);var e=Db("rect");e.setAttribute("width",this.getWidth()),e.setAttribute("height",this.getHeight()),e.setAttribute("x",0),e.setAttribute("y",0),e.setAttribute("id",0);var n=Ab(t),i=n.color,r=n.opacity;e.setAttribute("fill",i),e.setAttribute("fill-opacity",r),this._backgroundRoot.appendChild(e),this._backgroundNode=e},t.prototype.createSVGElement=function(t){return Db(t)},t.prototype.paintOne=function(t){var e=cw(t);return e&&e.brush(t),yw(t)},t.prototype._paintList=function(t){var e=this._gradientManager,n=this._patternManager,i=this._clipPathManager,r=this._shadowManager;e.markAllUnused(),n.markAllUnused(),i.markAllUnused(),r.markAllUnused();for(var o=this._svgRoot,a=this._visibleList,s=t.length,l=[],u=0;u\n\r<"))},t}();function mw(t){return function(){w('In SVG mode painter not support method "'+t+'"')}}function _w(){return!1}function xw(t,e,n){var i=D(),r=e.getWidth(),o=e.getHeight(),a=i.style;return a&&(a.position="absolute",a.left="0",a.top="0",a.width=r+"px",a.height=o+"px",i.setAttribute("data-zr-dom-id",t)),i.width=r*n,i.height=o*n,i}var bw=function(t){function e(e,n,i){var r,o=t.call(this)||this;o.motionBlur=!1,o.lastFrameAlpha=.7,o.dpr=1,o.virtual=!1,o.config={},o.incremental=!1,o.zlevel=0,o.maxRepaintRectCount=5,o.__dirty=!0,o.__firstTimePaint=!0,o.__used=!1,o.__drawIndex=0,o.__startIndex=0,o.__endIndex=0,o.__prevStartIndex=null,o.__prevEndIndex=null,i=i||Vn,"string"==typeof e?r=xw(e,n,i):Y(e)&&(e=(r=e).id),o.id=e,o.dom=r;var a=r.style;return a&&(r.onselectstart=_w,a.webkitUserSelect="none",a.userSelect="none",a.webkitTapHighlightColor="rgba(0,0,0,0)",a["-webkit-touch-callout"]="none",a.padding="0",a.margin="0",a.borderWidth="0"),o.domBack=null,o.ctxBack=null,o.painter=n,o.config=null,o.dpr=i,o}return n(e,t),e.prototype.getElementCount=function(){return this.__endIndex-this.__startIndex},e.prototype.afterBrush=function(){this.__prevStartIndex=this.__startIndex,this.__prevEndIndex=this.__endIndex},e.prototype.initContext=function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},e.prototype.setUnpainted=function(){this.__firstTimePaint=!0},e.prototype.createBackBuffer=function(){var t=this.dpr;this.domBack=xw("back-"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!==t&&this.ctxBack.scale(t,t)},e.prototype.createRepaintRects=function(t,e,n,i){if(this.__firstTimePaint)return this.__firstTimePaint=!1,null;var r,o=[],a=this.maxRepaintRectCount,s=!1,l=new vi(0,0,0,0);function u(t){if(t.isFinite()&&!t.isZero())if(0===o.length){(e=new vi(0,0,0,0)).copy(t),o.push(e)}else{for(var e,n=!1,i=1/0,r=0,u=0;u=a)}}for(var h=this.__startIndex;h15)break}n.prevElClipPaths&&u.restore()};if(p)if(0===p.length)s=l.__endIndex;else for(var x=d.dpr,b=0;b0&&t>i[0]){for(s=0;st);s++);a=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?o.insertBefore(e.dom,l.nextSibling):o.appendChild(e.dom)}else o.firstChild?o.insertBefore(e.dom,o.firstChild):o.appendChild(e.dom);e.__painter=this}else w("Layer of zlevel "+t+" is not valid")},t.prototype.eachLayer=function(t,e){for(var n=this._zlevelList,i=0;i0?Mw:0),this._needsManuallyCompositing),u.__builtin__||w("ZLevel "+l+" has been used by unkown layer "+u.id),u!==o&&(u.__used=!0,u.__startIndex!==r&&(u.__dirty=!0),u.__startIndex=r,u.incremental?u.__drawIndex=-1:u.__drawIndex=r,e(r),o=u),1&s.__dirty&&!s.__inHover&&(u.__dirty=!0,u.incremental&&u.__drawIndex<0&&(u.__drawIndex=r))}e(r),this.eachBuiltinLayer((function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)}))},t.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},t.prototype._clearLayer=function(t){t.clear()},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t,O(this._layers,(function(t){t.setUnpainted()}))},t.prototype.configLayer=function(t,e){if(e){var n=this._layerConfig;n[t]?M(n[t],e,!0):n[t]=e;for(var i=0;i-1&&(s.style.stroke=s.style.fill,s.style.fill="#fff",s.style.lineWidth=2),e},e.type="series.line",e.dependencies=["grid","polar"],e.defaultOption={zlevel:0,z:3,coordinateSystem:"cartesian2d",legendHoverLink:!0,clip:!0,label:{position:"top"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:"solid"},emphasis:{scale:!0,lineStyle:{width:"bolder"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0,universalTransition:{divideShape:"clone"}},e}(Rf);function Dw(t,e){var n=t.mapDimensionsAll("defaultedLabel"),i=n.length;if(1===i){var r=Rd(t,e,n[0]);return null!=r?r+"":null}if(i){for(var o=[],a=0;a=0&&i.push(e[o])}return i.join(" ")}var kw=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o.updateData(e,n,i,r),o}return n(e,t),e.prototype._createSymbol=function(t,e,n,i,r){this.removeAll();var o=ty(t,-1,-1,2,2,null,r);o.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),o.drift=Lw,this._symbolType=t,this.add(o)},e.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},e.prototype.getSymbolType=function(){return this._symbolType},e.prototype.getSymbolPath=function(){return this.childAt(0)},e.prototype.highlight=function(){Qs(this.childAt(0))},e.prototype.downplay=function(){tl(this.childAt(0))},e.prototype.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},e.prototype.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":e.cursor},e.prototype.updateData=function(t,n,i,r){this.silent=!1;var o=t.getItemVisual(n,"symbol")||"circle",a=t.hostModel,s=e.getSymbolSize(t,n),l=o!==this._symbolType,u=r&&r.disableAnimation;if(l){var h=t.getItemVisual(n,"symbolKeepAspect");this._createSymbol(o,t,n,s,h)}else{(p=this.childAt(0)).silent=!1;var c={scaleX:s[0]/2,scaleY:s[1]/2};u?p.attr(c):Eu(p,c,a,n),Wu(p)}if(this._updateCommon(t,n,s,i,r),l){var p=this.childAt(0);if(!u){c={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:p.style.opacity}};p.scaleX=p.scaleY=0,p.style.opacity=0,Vu(p,c,a,n)}}u&&this.childAt(0).stopAnimation("remove"),this._seriesModel=a},e.prototype._updateCommon=function(t,e,n,i,r){var o,a,s,l,u,h,c,p,d=this.childAt(0),f=t.hostModel;if(i&&(o=i.emphasisItemStyle,a=i.blurItemStyle,s=i.selectItemStyle,l=i.focus,u=i.blurScope,h=i.labelStatesModels,c=i.hoverScale,p=i.cursorStyle),!i||t.hasItemOption){var g=i&&i.itemModel?i.itemModel:t.getItemModel(e),y=g.getModel("emphasis");o=y.getModel("itemStyle").getItemStyle(),s=g.getModel(["select","itemStyle"]).getItemStyle(),a=g.getModel(["blur","itemStyle"]).getItemStyle(),l=y.get("focus"),u=y.get("blurScope"),h=bh(g),c=y.getShallow("scale"),p=g.getShallow("cursor")}var v=t.getItemVisual(e,"symbolRotate");d.attr("rotation",(v||0)*Math.PI/180||0);var m=ny(t.getItemVisual(e,"symbolOffset"),n);m&&(d.x=m[0],d.y=m[1]),p&&d.attr("cursor",p);var _=t.getItemVisual(e,"style"),x=_.fill;if(d instanceof rs){var b=d.style;d.useStyle(T({image:b.image,x:b.x,y:b.y,width:b.width,height:b.height},_))}else d.__isEmptyBrush?d.useStyle(T({},_)):d.useStyle(_),d.style.decal=null,d.setColor(x,r&&r.symbolInnerColor),d.style.strokeNoScale=!0;var w=t.getItemVisual(e,"liftZ"),S=this._z2;null!=w?null==S&&(this._z2=d.z2,d.z2+=w):null!=S&&(d.z2=S,this._z2=null);var M=r&&r.useNameLabel;xh(d,h,{labelFetcher:f,labelDataIndex:e,defaultText:function(e){return M?t.getName(e):Dw(t,e)},inheritColor:x,defaultOpacity:_.opacity}),this._sizeX=n[0]/2,this._sizeY=n[1]/2;var I=d.ensureState("emphasis");if(I.style=o,d.ensureState("select").style=s,d.ensureState("blur").style=a,c){var C=Math.max(1.1,3/this._sizeY);I.scaleX=this._sizeX*C,I.scaleY=this._sizeY*C}this.setSymbolScale(1),pl(this,l,u)},e.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},e.prototype.fadeOut=function(t,e){var n=this.childAt(0),i=this._seriesModel,r=Ss(this).dataIndex,o=e&&e.animation;if(this.silent=n.silent=!0,e&&e.fadeLabel){var a=n.getTextContent();a&&Gu(a,{style:{opacity:0}},i,{dataIndex:r,removeOpt:o,cb:function(){n.removeTextContent()}})}else n.removeTextContent();Gu(n,{style:{opacity:0},scaleX:0,scaleY:0},i,{dataIndex:r,cb:t,removeOpt:o})},e.getSymbolSize=function(t,e){return ey(t.getItemVisual(e,"symbolSize"))},e}(Bi);function Lw(t,e){this.parent.drift(t,e)}function Pw(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function Ow(t){return null==t||Y(t)||(t={isIgnore:t}),t||{}}function Rw(t){var e=t.hostModel,n=e.getModel("emphasis");return{emphasisItemStyle:n.getModel("itemStyle").getItemStyle(),blurItemStyle:e.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:e.getModel(["select","itemStyle"]).getItemStyle(),focus:n.get("focus"),blurScope:n.get("blurScope"),hoverScale:n.get("scale"),labelStatesModels:bh(e),cursorStyle:e.get("cursor")}}var Nw=function(){function t(t){this.group=new Bi,this._SymbolCtor=t||kw}return t.prototype.updateData=function(t,e){e=Ow(e);var n=this.group,i=t.hostModel,r=this._data,o=this._SymbolCtor,a=e.disableAnimation,s=Rw(t),l={disableAnimation:a},u=e.getSymbolPoint||function(e){return t.getItemLayout(e)};r||n.removeAll(),t.diff(r).add((function(i){var r=u(i);if(Pw(t,r,i,e)){var a=new o(t,i,s,l);a.setPosition(r),t.setItemGraphicEl(i,a),n.add(a)}})).update((function(h,c){var p=r.getItemGraphicEl(c),d=u(h);if(Pw(t,d,h,e)){var f=t.getItemVisual(h,"symbol")||"circle",g=p&&p.getSymbolType&&p.getSymbolType();if(!p||g&&g!==f)n.remove(p),(p=new o(t,h,s,l)).setPosition(d);else{p.updateData(t,h,s,l);var y={x:d[0],y:d[1]};a?p.attr(y):Eu(p,y,i)}n.add(p),t.setItemGraphicEl(h,p)}else n.remove(p)})).remove((function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut((function(){n.remove(e)}))})).execute(),this._getSymbolPoint=u,this._data=t},t.prototype.isPersistent=function(){return!0},t.prototype.updateLayout=function(){var t=this,e=this._data;e&&e.eachItemGraphicEl((function(e,n){var i=t._getSymbolPoint(n);e.setPosition(i),e.markRedraw()}))},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=Rw(t),this._data=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}n=Ow(n);for(var r=t.start;r0?n=i[0]:i[1]<0&&(n=i[1]);return n}(r,n),a=i.dim,s=r.dim,l=e.mapDimension(s),u=e.mapDimension(a),h="x"===s||"radius"===s?1:0,c=R(t.dimensions,(function(t){return e.mapDimension(t)})),p=!1,d=e.getCalculationInfo("stackResultDimension");return g_(e,c[0])&&(p=!0,c[0]=d),g_(e,c[1])&&(p=!0,c[1]=d),{dataDimsForPoint:c,valueStart:o,valueAxisDim:s,baseAxisDim:a,stacked:!!p,valueDim:l,baseDim:u,baseDataOffset:h,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function Ew(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var o=t.baseDataOffset,a=[];return a[o]=n.get(t.baseDim,i),a[1-o]=r,e.dataToPoint(a)}var Vw="undefined"!=typeof Float32Array,Bw=Vw?Float32Array:Array;function Gw(t){return F(t)?Vw?new Float32Array(t):t:new Bw(t)}var Fw=Math.min,Hw=Math.max;function Ww(t,e){return isNaN(t)||isNaN(e)}function Uw(t,e,n,i,r,o,a,s,l){for(var u,h,c,p,d,f,g=n,y=0;y=r||g<0)break;if(Ww(v,m)){if(l){g+=o;continue}break}if(g===n)t[o>0?"moveTo":"lineTo"](v,m),c=v,p=m;else{var _=v-u,x=m-h;if(_*_+x*x<.5){g+=o;continue}if(a>0){var b=g+o,w=e[2*b],S=e[2*b+1],M=y+1;if(l)for(;Ww(w,S)&&M=i||Ww(w,S))d=v,f=m;else{T=w-u,C=S-h;var k=v-u,L=w-v,P=m-h,O=S-m,R=void 0,N=void 0;"x"===s?(R=Math.abs(k),N=Math.abs(L),d=v-R*a,f=m,D=v+R*a,A=m):"y"===s?(R=Math.abs(P),N=Math.abs(O),d=v,f=m-R*a,D=v,A=m+R*a):(R=Math.sqrt(k*k+P*P),d=v-T*a*(1-(I=(N=Math.sqrt(L*L+O*O))/(N+R))),f=m-C*a*(1-I),A=m+C*a*I,D=Fw(D=v+T*a*I,Hw(w,v)),A=Fw(A,Hw(S,m)),D=Hw(D,Fw(w,v)),f=m-(C=(A=Hw(A,Fw(S,m)))-m)*R/N,d=Fw(d=v-(T=D-v)*R/N,Hw(u,v)),f=Fw(f,Hw(h,m)),D=v+(T=v-(d=Hw(d,Fw(u,v))))*N/R,A=m+(C=m-(f=Hw(f,Fw(h,m))))*N/R)}t.bezierCurveTo(c,p,d,f,v,m),c=D,p=A}else t.lineTo(v,m)}u=v,h=m,g+=o}return y}var Xw=function(){this.smooth=0,this.smoothConstraint=!0},Yw=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polyline",n}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Xw},e.prototype.buildPath=function(t,e){var n=e.points,i=0,r=n.length/2;if(e.connectNulls){for(;r>0&&Ww(n[2*r-2],n[2*r-1]);r--);for(;i=0){var y=a?(h-i)*g+i:(u-n)*g+n;return a?[t,y]:[y,t]}n=u,i=h;break;case o.C:u=r[l++],h=r[l++],c=r[l++],p=r[l++],d=r[l++],f=r[l++];var v=a?Ho(n,u,c,d,t,s):Ho(i,h,p,f,t,s);if(v>0)for(var m=0;m=0){y=a?Go(i,h,p,f,_):Go(n,u,c,d,_);return a?[t,y]:[y,t]}}n=d,i=f}}},e}(Qa),Zw=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(Xw),jw=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polygon",n}return n(e,t),e.prototype.getDefaultShape=function(){return new Zw},e.prototype.buildPath=function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,o=n.length/2,a=e.smoothMonotone;if(e.connectNulls){for(;o>0&&Ww(n[2*o-2],n[2*o-1]);o--);for(;r=0;a--){var s=t.getDimensionInfo(i[a].dimension);if("x"===(r=s&&s.coordDim)||"y"===r){o=i[a];break}}if(o){var l=e.getAxis(r),u=R(o.stops,(function(t){return{coord:l.toGlobalCoord(l.dataToCoord(t.value)),color:t.color}})),h=u.length,c=o.outerColors.slice();h&&u[0].coord>u[h-1].coord&&(u.reverse(),c.reverse());var p=function(t,e){var n,i,r=[],o=t.length;function a(t,e,n){var i=t.coord;return{coord:n,color:qe((n-i)/(e.coord-i),[t.color,e.color])}}for(var s=0;se){i&&r.push(a(i,l,e));break}n&&(r.push(a(n,l,0)),n=null),r.push(l),i=l}}return r}(u,"x"===r?n.getWidth():n.getHeight()),d=p.length;if(!d&&h)return u[0].coord<0?c[1]?c[1]:u[h-1].color:c[0]?c[0]:u[0].color;var f=p[0].coord-0,g=p[d-1].coord+0,y=g-f;if(y<.001)return"transparent";O(p,(function(t){t.offset=(t.coord-f)/y})),p.push({offset:d?p[d-1].offset:.5,color:c[1]||"transparent"}),p.unshift({offset:d?p[0].offset:.5,color:c[0]||"transparent"});var v=new Iu(0,0,0,0,p,!0);return v[r]=f,v[r+"2"]=g,v}}}function oS(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var o=n.getAxesByScale("ordinal")[0];if(o&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),o=Math.max(1,Math.round(r/5)),a=0;ai)return!1;return!0}(o,e))){var a=e.mapDimension(o.dim),s={};return O(o.getViewLabels(),(function(t){var e=o.scale.getRawOrdinalNumber(t.tickValue);s[e]=1})),function(t){return!s.hasOwnProperty(e.get(a,t))}}}}function aS(t,e){return[t[2*e],t[2*e+1]]}function sS(t){if(t.get(["endLabel","show"]))return!0;for(var e=0;e0&&"bolder"===t.get(["emphasis","lineStyle","width"]))&&(d.getState("emphasis").style.lineWidth=+d.style.lineWidth+1);Ss(d).seriesIndex=t.seriesIndex,pl(d,A,k);var L=nS(t.get("smooth")),P=t.get("smoothMonotone"),O=t.get("connectNulls");if(d.setShape({smooth:L,smoothMonotone:P,connectNulls:O}),f){var R=a.getCalculationInfo("stackedOnSeries"),N=0;f.useStyle(C(l.getAreaStyle(),{fill:T,opacity:.7,lineJoin:"bevel",decal:a.getVisual("style").decal})),R&&(N=nS(R.get("smooth"))),f.setShape({smooth:L,stackedOnSmooth:N,smoothMonotone:P,connectNulls:O}),yl(f,t,"areaStyle"),Ss(f).seriesIndex=t.seriesIndex,pl(f,A,k)}var z=function(t){i._changePolyState(t)};a.eachItemGraphicEl((function(t){t&&(t.onHoverStateChange=z)})),this._polyline.onHoverStateChange=z,this._data=a,this._coordSys=r,this._stackedOnPoints=x,this._points=u,this._step=I,this._valueOrigin=m},e.prototype.dispose=function(){},e.prototype.highlight=function(t,e,n,i){var r=t.getData(),o=Or(r,i);if(this._changePolyState("emphasis"),!(o instanceof Array)&&null!=o&&o>=0){var a=r.getLayout("points"),s=r.getItemGraphicEl(o);if(!s){var l=a[2*o],u=a[2*o+1];if(isNaN(l)||isNaN(u))return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(l,u))return;var h=t.get("zlevel"),c=t.get("z");(s=new kw(r,o)).x=l,s.y=u,s.setZ(h,c);var p=s.getSymbolPath().getTextContent();p&&(p.zlevel=h,p.z=c,p.z2=this._polyline.z2+1),s.__temp=!0,r.setItemGraphicEl(o,s),s.stopSymbolAnimation(!0),this.group.add(s)}s.highlight()}else Yf.prototype.highlight.call(this,t,e,n,i)},e.prototype.downplay=function(t,e,n,i){var r=t.getData(),o=Or(r,i);if(this._changePolyState("normal"),null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else Yf.prototype.downplay.call(this,t,e,n,i)},e.prototype._changePolyState=function(t){var e=this._polygon;js(this._polyline,t),e&&js(e,t)},e.prototype._newPolyline=function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new Yw({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(e),this._polyline=e,e},e.prototype._newPolygon=function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new jw({shape:{points:t,stackedOnPoints:e},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n,n},e.prototype._initSymbolLabelAnimation=function(t,e,n){var i,r,o=e.getBaseAxis(),a=o.inverse;"cartesian2d"===e.type?(i=o.isHorizontal(),r=!1):"polar"===e.type&&(i="angle"===o.dim,r=!0);var s=t.hostModel,l=s.get("animationDuration");"function"==typeof l&&(l=l(null));var u=s.get("animationDelay")||0,h="function"==typeof u?u(null):u;t.eachItemGraphicEl((function(t,o){var s=t;if(s){var c=[t.x,t.y],p=void 0,d=void 0,f=void 0;if(n)if(r){var g=n,y=e.pointToCoord(c);i?(p=g.startAngle,d=g.endAngle,f=-y[1]/180*Math.PI):(p=g.r0,d=g.r,f=y[0])}else{var v=n;i?(p=v.x,d=v.x+v.width,f=t.x):(p=v.y+v.height,d=v.y,f=t.y)}var m=d===p?0:(f-p)/(d-p);a&&(m=1-m);var _="function"==typeof u?u(o):l*m+h,x=s.getSymbolPath(),b=x.getTextContent();s.attr({scaleX:0,scaleY:0}),s.animateTo({scaleX:1,scaleY:1},{duration:200,setToFinal:!0,delay:_}),b&&b.animateFrom({style:{opacity:0}},{duration:300,delay:_}),x.disableLabelAnimation=!0}}))},e.prototype._initOrUpdateEndLabel=function(t,e,n){var i=t.getModel("endLabel");if(sS(t)){var r=t.getData(),o=this._polyline,a=this._endLabel;a||((a=this._endLabel=new fs({z2:200})).ignoreClip=!0,o.setTextContent(this._endLabel),o.disableLabelAnimation=!0);var s=function(t){for(var e,n,i=t.length/2;i>0&&(e=t[2*i-2],n=t[2*i-1],isNaN(e)||isNaN(n));i--);return i-1}(r.getLayout("points"));s>=0&&(xh(o,bh(t,"endLabel"),{inheritColor:n,labelFetcher:t,labelDataIndex:s,defaultText:function(t,e,n){return null!=n?Aw(r,n):Dw(r,t)},enableTextSetter:!0},function(t,e){var n=e.getBaseAxis(),i=n.isHorizontal(),r=n.inverse,o=i?r?"right":"left":"center",a=i?"middle":r?"top":"bottom";return{normal:{align:t.get("align")||o,verticalAlign:t.get("verticalAlign")||a}}}(i,e)),o.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},e.prototype._endLabelOnDuring=function(t,e,n,i,r,o,a){var s=this._endLabel,l=this._polyline;if(s){t<1&&null==i.originalX&&(i.originalX=s.x,i.originalY=s.y);var u=n.getLayout("points"),h=n.hostModel,c=h.get("connectNulls"),p=o.get("precision"),d=o.get("distance")||0,f=a.getBaseAxis(),g=f.isHorizontal(),y=f.inverse,v=e.shape,m=y?g?v.x:v.y+v.height:g?v.x+v.width:v.y,_=(g?d:0)*(y?-1:1),x=(g?0:-d)*(y?-1:1),b=g?"x":"y",w=function(t,e,n){for(var i,r,o=t.length/2,a="x"===n?0:1,s=0,l=-1,u=0;u=e||i>=e&&r<=e){l=u;break}s=u,i=r}else i=r;return{range:[s,l],t:(e-i)/(r-i)}}(u,m,b),S=w.range,M=S[1]-S[0],I=void 0;if(M>=1){if(M>1&&!c){var T=aS(u,S[0]);s.attr({x:T[0]+_,y:T[1]+x}),r&&(I=h.getRawValue(S[0]))}else{(T=l.getPointOn(m,b))&&s.attr({x:T[0]+_,y:T[1]+x});var C=h.getRawValue(S[0]),D=h.getRawValue(S[1]);r&&(I=Wr(n,p,C,D,w.t))}i.lastFrameIndex=S[0]}else{var A=1===t||i.lastFrameIndex>0?S[0]:0;T=aS(u,A);r&&(I=h.getRawValue(A)),s.attr({x:T[0]+_,y:T[1]+x})}r&&Ah(s).setLabelText(I)}},e.prototype._doUpdateAnimation=function(t,e,n,i,r,o){var a=this._polyline,s=this._polygon,l=t.hostModel,u=function(t,e,n,i,r,o,a,s){for(var l=function(t,e){var n=[];return e.diff(t).add((function(t){n.push({cmd:"+",idx:t})})).update((function(t,e){n.push({cmd:"=",idx:e,idx1:t})})).remove((function(t){n.push({cmd:"-",idx:t})})).execute(),n}(t,e),u=[],h=[],c=[],p=[],d=[],f=[],g=[],y=zw(r,e,a),v=t.getLayout("points")||[],m=e.getLayout("points")||[],_=0;_3e3||s&&eS(c,d)>3e3)return a.stopAnimation(),a.setShape({points:p}),void(s&&(s.stopAnimation(),s.setShape({points:p,stackedOnPoints:d})));a.shape.__points=u.current,a.shape.points=h;var f={shape:{points:p}};u.current!==h&&(f.shape.__points=u.next),a.stopAnimation(),Eu(a,f,l),s&&(s.setShape({points:h,stackedOnPoints:c}),s.stopAnimation(),Eu(s,{shape:{stackedOnPoints:d}},l),a.shape.points!==s.shape.points&&(s.shape.points=a.shape.points));for(var g=[],y=u.status,v=0;ve&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n10&&"cartesian2d"===o.type&&r){var s=o.getBaseAxis(),l=o.getOtherAxis(s),u=s.getExtent(),h=n.getDevicePixelRatio(),c=Math.abs(u[1]-u[0])*(h||1),p=Math.round(a/c);if(p>1){"lttb"===r&&t.setData(i.lttbDownSample(i.mapDimension(l.dim),1/p));var d=void 0;"string"==typeof r?d=cS[r]:"function"==typeof r&&(d=r),d&&t.setData(i.downSample(i.mapDimension(l.dim),1/p,d,pS))}}}}}var fS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){return v_(null,this,{useEncodeDefaulter:!0})},e.prototype.getMarkerPosition=function(t){var e=this.coordinateSystem;if(e&&e.clampData){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+o/2,n}return[NaN,NaN]},e.type="series.__base_bar__",e.defaultOption={zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod"},e}(Rf);Rf.registerClass(fS);var gS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(){return v_(null,this,{useEncodeDefaulter:!0,createInvertedIndices:!!this.get("realtimeSort",!0)||null})},e.prototype.getProgressive=function(){return!!this.get("large")&&this.get("progressive")},e.prototype.getProgressiveThreshold=function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return e>t&&(t=e),t},e.prototype.brushSelector=function(t,e,n){return n.rect(e.getItemLayout(t))},e.type="series.bar",e.dependencies=["grid","polar"],e.defaultOption=Yh(fS.defaultOption,{clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:"rgba(180, 180, 180, 0.2)",borderColor:null,borderWidth:0,borderType:"solid",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:"#212121"}},realtimeSort:!1}),e}(fS),yS=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},vS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="sausage",n}return n(e,t),e.prototype.getDefaultShape=function(){return new yS},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=.5*(o-r),s=r+a,l=e.startAngle,u=e.endAngle,h=e.clockwise,c=Math.cos(l),p=Math.sin(l),d=Math.cos(u),f=Math.sin(u);(h?u-l<2*Math.PI:l-u<2*Math.PI)&&(t.moveTo(c*r+n,p*r+i),t.arc(c*s+n,p*s+i,a,-Math.PI+l,l,!h)),t.arc(n,i,o,l,u,!h),t.moveTo(d*o+n,f*o+i),t.arc(d*s+n,f*s+i,a,u-2*Math.PI,u-Math.PI,!h),0!==r&&(t.arc(n,i,r,u,l,h),t.moveTo(c*r+n,f*r+i)),t.closePath()},e}(Qa);function mS(t,e,n){return e*Math.sin(t)*(n?-1:1)}function _S(t,e,n){return e*Math.cos(t)*(n?1:-1)}var xS=[0,0],bS=Math.max,wS=Math.min;var SS=function(t){function e(){var n=t.call(this)||this;return n.type=e.type,n._isFirstFrame=!0,n}return n(e,t),e.prototype.render=function(t,e,n,i){this._model=t,this._removeOnRenderedListener(n),this._updateDrawMode(t);var r=t.get("coordinateSystem");("cartesian2d"===r||"polar"===r)&&(this._isLargeDraw?this._renderLarge(t,e,n):this._renderNormal(t,e,n,i))},e.prototype.incrementalPrepareRender=function(t){this._clear(),this._updateDrawMode(t),this._updateLargeClip(t)},e.prototype.incrementalRender=function(t,e){this._incrementalRenderLarge(t,e)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t,e,n,i){var r,o=this.group,a=t.getData(),s=this._data,l=t.coordinateSystem,u=l.getBaseAxis();"cartesian2d"===l.type?r=u.isHorizontal():"polar"===l.type&&(r="angle"===u.dim);var h=t.isAnimationEnabled()?t:null,c=function(t,e){var n=t.get("realtimeSort",!0),i=e.getBaseAxis();0;if(n&&"category"===i.type&&"cartesian2d"===e.type)return{baseAxis:i,otherAxis:e.getOtherAxis(i)}}(t,l);c&&this._enableRealtimeSort(c,a,n);var p=t.get("clip",!0)||c,d=function(t,e){var n=t.getArea&&t.getArea();if(Jw(t,"cartesian2d")){var i=t.getBaseAxis();if("category"!==i.type||!i.onBand){var r=e.getLayout("bandWidth");i.isHorizontal()?(n.x-=r,n.width+=2*r):(n.y-=r,n.height+=2*r)}}return n}(l,a);o.removeClipPath();var f=t.get("roundCap",!0),g=t.get("showBackground",!0),y=t.getModel("backgroundStyle"),v=y.get("borderRadius")||0,m=[],_=this._backgroundEls,x=i&&i.isInitSort,b=i&&"changeAxisOrder"===i.type;function w(t){var e=LS[l.type](a,t),n=function(t,e,n){return new("polar"===t.type?ou:cs)({shape:VS(e,n,t),silent:!0,z2:0})}(l,r,e);return n.useStyle(y.getItemStyle()),"cartesian2d"===l.type&&n.setShape("r",v),m[t]=n,n}a.diff(s).add((function(e){var n=a.getItemModel(e),i=LS[l.type](a,e,n);if(g&&w(e),a.hasValue(e)&&kS[l.type](i)){var s=!1;p&&(s=MS[l.type](d,i));var y=IS[l.type](t,a,e,i,r,h,u.model,!1,f);OS(y,a,e,n,i,t,r,"polar"===l.type),x?y.attr({shape:i}):c?TS(c,h,y,i,e,r,!1,!1):Vu(y,{shape:i},t,e),a.setItemGraphicEl(e,y),o.add(y),y.ignore=s}})).update((function(e,n){var i=a.getItemModel(e),S=LS[l.type](a,e,i);if(g){var M=void 0;0===_.length?M=w(n):((M=_[n]).useStyle(y.getItemStyle()),"cartesian2d"===l.type&&M.setShape("r",v),m[e]=M);var I=LS[l.type](a,e);Eu(M,{shape:VS(r,I,l)},h,e)}var T=s.getItemGraphicEl(n);if(a.hasValue(e)&&kS[l.type](S)){var C=!1;p&&(C=MS[l.type](d,S))&&o.remove(T),T?Wu(T):T=IS[l.type](t,a,e,S,r,h,u.model,!!T,f),b||OS(T,a,e,i,S,t,r,"polar"===l.type),x?T.attr({shape:S}):c?TS(c,h,T,S,e,r,!0,b):Eu(T,{shape:S},t,e,null),a.setItemGraphicEl(e,T),T.ignore=C,o.add(T)}else o.remove(T)})).remove((function(e){var n=s.getItemGraphicEl(e);n&&Hu(n,t,e)})).execute();var S=this._backgroundGroup||(this._backgroundGroup=new Bi);S.removeAll();for(var M=0;Mo)return!0;o=u}return!1},e.prototype._isOrderDifferentInView=function(t,e){for(var n=e.scale,i=n.getExtent(),r=Math.max(0,i[0]),o=Math.min(i[1],n.getOrdinalMeta().categories.length-1);r<=o;++r)if(t.ordinalNumbers[r]!==n.getRawOrdinalNumber(r))return!0},e.prototype._updateSortWithinSameData=function(t,e,n,i){if(this._isOrderChangedWithinSameData(t,e,n)){var r=this._dataSort(t,n,e);this._isOrderDifferentInView(r,n)&&(this._removeOnRenderedListener(i),i.dispatchAction({type:"changeAxisOrder",componentType:n.dim+"Axis",axisId:n.index,sortInfo:r}))}},e.prototype._dispatchInitSort=function(t,e,n){var i=e.baseAxis,r=this._dataSort(t,i,(function(n){return t.get(t.mapDimension(e.otherAxis.dim),n)}));n.dispatchAction({type:"changeAxisOrder",componentType:i.dim+"Axis",isInitSort:!0,axisId:i.index,sortInfo:r})},e.prototype.remove=function(t,e){this._clear(this._model),this._removeOnRenderedListener(e)},e.prototype.dispose=function(t,e){this._removeOnRenderedListener(e)},e.prototype._removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off("rendered",this._onRendered),this._onRendered=null)},e.prototype._clear=function(t){var e=this.group,n=this._data;t&&t.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl((function(e){Hu(e,t,Ss(e).dataIndex)}))):e.removeAll(),this._data=null,this._isFirstFrame=!0},e.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},e.type="bar",e}(Yf),MS={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=t.x+t.width,o=t.y+t.height,a=bS(e.x,t.x),s=wS(e.x+e.width,r),l=bS(e.y,t.y),u=wS(e.y+e.height,o),h=sr?s:a,e.y=c&&l>o?u:l,e.width=h?0:s-a,e.height=c?0:u-l,n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),h||c},polar:function(t,e){var n=e.r0<=e.r?1:-1;if(n<0){var i=e.r;e.r=e.r0,e.r0=i}var r=wS(e.r,t.r),o=bS(e.r0,t.r0);e.r=r,e.r0=o;var a=r-o<0;if(n<0){i=e.r;e.r=e.r0,e.r0=i}return a}},IS={cartesian2d:function(t,e,n,i,r,o,a,s,l){var u=new cs({shape:T({},i),z2:1});(u.__dataIndex=n,u.name="item",o)&&(u.shape[r?"height":"width"]=0);return u},polar:function(t,e,n,i,r,o,a,s,l){var u=!r&&l?vS:ou,h=new u({shape:i,z2:1});h.name="item";var c,p,d=PS(r);if(h.calculateTextPosition=(c=d,p=({isRoundCap:u===vS}||{}).isRoundCap,function(t,e,n){var i=e.position;if(!i||i instanceof Array)return Di(t,e,n);var r=c(i),o=null!=e.distance?e.distance:5,a=this.shape,s=a.cx,l=a.cy,u=a.r,h=a.r0,d=(u+h)/2,f=a.startAngle,g=a.endAngle,y=(f+g)/2,v=p?Math.abs(u-h)/2:0,m=Math.cos,_=Math.sin,x=s+u*m(f),b=l+u*_(f),w="left",S="top";switch(r){case"startArc":x=s+(h-o)*m(y),b=l+(h-o)*_(y),w="center",S="top";break;case"insideStartArc":x=s+(h+o)*m(y),b=l+(h+o)*_(y),w="center",S="bottom";break;case"startAngle":x=s+d*m(f)+mS(f,o+v,!1),b=l+d*_(f)+_S(f,o+v,!1),w="right",S="middle";break;case"insideStartAngle":x=s+d*m(f)+mS(f,-o+v,!1),b=l+d*_(f)+_S(f,-o+v,!1),w="left",S="middle";break;case"middle":x=s+d*m(y),b=l+d*_(y),w="center",S="middle";break;case"endArc":x=s+(u+o)*m(y),b=l+(u+o)*_(y),w="center",S="bottom";break;case"insideEndArc":x=s+(u-o)*m(y),b=l+(u-o)*_(y),w="center",S="top";break;case"endAngle":x=s+d*m(g)+mS(g,o+v,!0),b=l+d*_(g)+_S(g,o+v,!0),w="left",S="middle";break;case"insideEndAngle":x=s+d*m(g)+mS(g,-o+v,!0),b=l+d*_(g)+_S(g,-o+v,!0),w="right",S="middle";break;default:return Di(t,e,n)}return(t=t||{}).x=x,t.y=b,t.align=w,t.verticalAlign=S,t}),o){var f=r?"r":"endAngle",g={};h.shape[f]=r?0:i.startAngle,g[f]=i[f],(s?Eu:Vu)(h,{shape:g},o)}return h}};function TS(t,e,n,i,r,o,a,s){var l,u;o?(u={x:i.x,width:i.width},l={y:i.y,height:i.height}):(u={y:i.y,height:i.height},l={x:i.x,width:i.width}),s||(a?Eu:Vu)(n,{shape:l},e,r,null),(a?Eu:Vu)(n,{shape:u},e?t.baseAxis.model:null,r)}function CS(t,e){for(var n=0;n0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}}};function PS(t){return function(t){var e=t?"Arc":"Angle";return function(t){switch(t){case"start":case"insideStart":case"end":case"insideEnd":return t+e;default:return t}}}(t)}function OS(t,e,n,i,r,o,a,s){var l=e.getItemVisual(n,"style");s||t.setShape("r",i.get(["itemStyle","borderRadius"])||0),t.useStyle(l);var u=i.getShallow("cursor");u&&t.attr("cursor",u);var h=s?a?r.r>=r.r0?"endArc":"startArc":r.endAngle>=r.startAngle?"endAngle":"startAngle":a?r.height>=0?"bottom":"top":r.width>=0?"right":"left",c=bh(i);xh(t,c,{labelFetcher:o,labelDataIndex:n,defaultText:Dw(o.getData(),n),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:h});var p=t.getTextContent();if(s&&p){var d=i.get(["label","position"]);t.textConfig.inside="middle"===d||null,function(t,e,n,i){if("number"!=typeof i)if(F(e))t.setTextConfig({rotation:0});else{var r,o=t.shape,a=o.clockwise?o.startAngle:o.endAngle,s=o.clockwise?o.endAngle:o.startAngle,l=(a+s)/2,u=n(e);switch(u){case"startArc":case"insideStartArc":case"middle":case"insideEndArc":case"endArc":r=l;break;case"startAngle":case"insideStartAngle":r=a;break;case"endAngle":case"insideEndAngle":r=s;break;default:return void t.setTextConfig({rotation:0})}var h=1.5*Math.PI-r;"middle"===u&&h>Math.PI/2&&h<1.5*Math.PI&&(h-=Math.PI),t.setTextConfig({rotation:h})}else t.setTextConfig({rotation:i})}(t,"outside"===d?h:d,PS(a),i.get(["label","rotate"]))}kh(p,c,o.getRawValue(n),(function(t){return Aw(e,t)}));var f=i.getModel(["emphasis"]);pl(t,f.get("focus"),f.get("blurScope")),yl(t,i),function(t){return null!=t.startAngle&&null!=t.endAngle&&t.startAngle===t.endAngle}(r)&&(t.style.fill="none",t.style.stroke="none",O(t.states,(function(t){t.style&&(t.style.fill=t.style.stroke="none")})))}var RS=function(){},NS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="largeBar",n}return n(e,t),e.prototype.getDefaultShape=function(){return new RS},e.prototype.buildPath=function(t,e){for(var n=e.points,i=this.__startPoint,r=this.__baseDimIdx,o=0;o=c&&y<=p&&(l<=v?h>=l&&h<=v:h>=v&&h<=l))return a[d]}return-1}(this,t.offsetX,t.offsetY);Ss(this).dataIndex=e>=0?e:null}),30,!1);function VS(t,e,n){if(Jw(n,"cartesian2d")){var i=e,r=n.getArea();return{x:t?i.x:r.x,y:t?r.y:i.y,width:t?i.width:r.width,height:t?r.height:i.height}}var o=e;return{cx:(r=n.getArea()).cx,cy:r.cy,r0:t?r.r0:o.r0,r:t?r.r:o.r,startAngle:t?o.startAngle:0,endAngle:t?o.endAngle:2*Math.PI}}var BS=2*Math.PI,GS=Math.PI/180;function FS(t,e){return jc(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function HS(t,e){var n=FS(t,e),i=t.get("center"),r=t.get("radius");F(r)||(r=[0,r]),F(i)||(i=[i,i]);var o=qi(n.width,e.getWidth()),a=qi(n.height,e.getHeight()),s=Math.min(o,a);return{cx:qi(i[0],o)+n.x,cy:qi(i[1],a)+n.y,r0:qi(r[0],s/2),r:qi(r[1],s/2)}}function WS(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.getData(),i=e.mapDimension("value"),r=FS(t,n),o=HS(t,n),a=o.cx,s=o.cy,l=o.r,u=o.r0,h=-t.get("startAngle")*GS,c=t.get("minAngle")*GS,p=0;e.each(i,(function(t){!isNaN(t)&&p++}));var d=e.getSum(i),f=Math.PI/(d||p)*2,g=t.get("clockwise"),y=t.get("roseType"),v=t.get("stillShowZeroSum"),m=e.getDataExtent(i);m[0]=0;var _=BS,x=0,b=h,w=g?1:-1;if(e.setLayout({viewRect:r,r:l}),e.each(i,(function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:g,cx:a,cy:s,r0:u,r:y?NaN:l});else{(i="area"!==y?0===d&&v?f:t*f:BS/p)n?a:o,h=Math.abs(l.label.y-n);if(h>u.maxY){var c=l.label.x-e-l.len2*r,p=i+l.len,f=Math.abs(c)0?"right":"left":k>0?"left":"right"}var G=y.get("rotate");if("number"==typeof G)P=G*(Math.PI/180);else if("center"===v)P=0;else{var F=k<0?-A+Math.PI:-A;"radial"===G||!0===G?P=F:"tangential"===G&&"outside"!==v&&"outer"!==v?(P=F+Math.PI/2)>Math.PI/2&&(P-=Math.PI):P=0}if(o=!!P,p.x=I,p.y=T,p.rotation=P,p.setStyle({verticalAlign:"middle"}),R){p.setStyle({align:D});var H=p.states.select;H&&(H.x+=p.x,H.y+=p.y)}else{var W=p.getBoundingRect().clone();W.applyTransform(p.getComputedTransform());var U=(p.style.margin||0)+2.1;W.y-=U/2,W.height+=U,r.push({label:p,labelLine:f,position:v,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new li(k,L),linePoints:C,textAlign:D,labelDistance:m,labelAlignTo:_,edgeDistance:x,bleedMargin:b,rect:W})}s.setTextConfig({inside:R})}})),!o&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,o,a,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p0){for(var l=o.getItemLayout(0),u=1;isNaN(l&&l.startAngle)&&u=n.r0}},e.type="pie",e}(Yf);function JS(t,e,n){e=F(e)&&{coordDimensions:e}||T({encodeDefine:t.getEncode()},e);var i=t.getSource(),r=u_(i,e).dimensions,o=new l_(r,t);return o.initData(i,n),o}var QS=function(){function t(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}return t.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},t.prototype.containName=function(t){return this._getRawData().indexOfName(t)>=0},t.prototype.indexOfName=function(t){return this._getDataWithEncodedVisual().indexOfName(t)},t.prototype.getItemVisual=function(t,e){return this._getDataWithEncodedVisual().getItemVisual(t,e)},t}(),tM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new QS(B(this.getData,this),B(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.mergeOption=function(){t.prototype.mergeOption.apply(this,arguments)},e.prototype.getInitialData=function(){return JS(this,{coordDimensions:["value"],encodeDefaulter:G(_p,this)})},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=[];return n.each(n.mapDimension("value"),(function(t){r.push(t)})),i.percent=er(r,e,n.hostModel.get("percentPrecision")),i.$vars.push("percent"),i},e.prototype._defaultLabelLine=function(t){Sr(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.type="series.pie",e.defaultOption={zlevel:0,z:2,legendHoverLink:!0,colorBy:"data",center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:"truncate",position:"outer",alignTo:"none",edgeDistance:"25%",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1,borderJoin:"round"},showEmptyCircle:!0,emptyCircleStyle:{color:"lightgray",opacity:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:"expansion",animationDuration:1e3,animationTypeUpdate:"transition",animationEasingUpdate:"cubicInOut",animationDurationUpdate:500,animationEasing:"cubicInOut"},e}(Rf);var eM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){return v_(null,this,{useEncodeDefaulter:!0})},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},e.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},e.type="series.scatter",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},emphasis:{scale:!0},clip:!0,select:{itemStyle:{borderColor:"#212121"}},universalTransition:{divideShape:"clone"}},e}(Rf),nM=function(){},iM=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new nM},e.prototype.buildPath=function(t,e){var n=e.points,i=e.size,r=this.symbolProxy,o=r.shape,a=t.getContext?t.getContext():t;if(a&&i[0]<4)this._ctx=a;else{this._ctx=null;for(var s=0;s=0;s--){var l=2*s,u=i[l]-o/2,h=i[l+1]-a/2;if(t>=u&&e>=h&&t<=u+o&&e<=h+a)return s}return-1},e}(Qa),rM=function(){function t(){this.group=new Bi}return t.prototype.isPersistent=function(){return!this._incremental},t.prototype.updateData=function(t,e){this.group.removeAll();var n=new iM({rectHover:!0,cursor:"default"});n.setShape({points:t.getLayout("points")}),this._setCommon(n,t,!1,e),this.group.add(n),this._incremental=null},t.prototype.updateLayout=function(t){if(!this._incremental){var e=t.getLayout("points");this.group.eachChild((function(t){if(null!=t.startIndex){var n=2*(t.endIndex-t.startIndex),i=4*t.startIndex*2;e=new Float32Array(e.buffer,i,n)}t.setShape("points",e)}))}},t.prototype.incrementalPrepareUpdate=function(t){this.group.removeAll(),this._clearIncremental(),t.count()>2e6?(this._incremental||(this._incremental=new Ou({silent:!0})),this.group.add(this._incremental)):this._incremental=null},t.prototype.incrementalUpdate=function(t,e,n){var i;this._incremental?(i=new iM,this._incremental.addDisplayable(i,!0)):((i=new iM({rectHover:!0,cursor:"default",startIndex:t.start,endIndex:t.end})).incremental=!0,this.group.add(i)),i.setShape({points:e.getLayout("points")}),this._setCommon(i,e,!!this._incremental,n)},t.prototype._setCommon=function(t,e,n,i){var r=e.hostModel;i=i||{};var o=e.getVisual("symbolSize");t.setShape("size",o instanceof Array?o:[o,o]),t.softClipShape=i.clipShape||null,t.symbolProxy=ty(e.getVisual("symbol"),0,0,0,0),t.setColor=t.symbolProxy.setColor;var a=t.shape.size[0]<4;t.useStyle(r.getModel("itemStyle").getItemStyle(a?["color","shadowBlur","shadowColor"]:["color"]));var s=e.getVisual("style"),l=s&&s.fill;if(l&&t.setColor(l),!n){var u=Ss(t);u.seriesIndex=r.seriesIndex,t.on("mousemove",(function(e){u.dataIndex=null;var n=t.findDataIndex(e.offsetX,e.offsetY);n>=0&&(u.dataIndex=n+(t.startIndex||0))}))}},t.prototype.remove=function(){this._clearIncremental(),this._incremental=null,this.group.removeAll()},t.prototype._clearIncremental=function(){var t=this._incremental;t&&t.clearDisplaybles()},t}(),oM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i,{clipShape:this._getClipShape(t)}),this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData(),{clipShape:this._getClipShape(e)}),this._finished=t.end===e.getData().count()},e.prototype.updateTransform=function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4||!this._symbolDraw.isPersistent())return{update:!0};var r=hS("").reset(t,e,n);r.progress&&r.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout(i)},e.prototype._getClipShape=function(t){var e=t.coordinateSystem,n=e&&e.getArea&&e.getArea();return t.get("clip",!0)?n:null},e.prototype._updateSymbolDraw=function(t,e){var n=this._symbolDraw,i=e.pipelineContext.large;return n&&i===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=i?new rM:new Nw,this._isLargeDraw=i,this.group.removeAll()),this.group.add(n.group),n},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},e.prototype.dispose=function(){},e.type="scatter",e}(Yf),aM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.type="grid",e.dependencies=["xAxis","yAxis"],e.layoutMode="box",e.defaultOption={show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:70,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"},e}(ep),sM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("grid",Vr).models[0]},e.type="cartesian2dAxis",e}(ep);L(sM,Mx);var lM={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#6E7079",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#E0E6F1"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(210,219,238,0.2)"]}}},uM=M({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},lM),hM=M({boundaryGap:[0,0],axisLine:{show:"auto"},axisTick:{show:"auto"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#F4F7FD",width:1}}},lM),cM={category:uM,value:hM,time:M({scale:!0,splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:"bold"}}},splitLine:{show:!1}},hM),log:C({scale:!0,logBase:10},hM)},pM={value:1,category:1,time:1,log:1};function dM(t,e,i,r){O(pM,(function(o,a){var s=M(M({},cM[a],!0),r,!0),l=function(t){function i(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e+"Axis."+a,n}return n(i,t),i.prototype.mergeDefaultAndTheme=function(t,e){var n=Kc(this),i=n?Jc(t):{};M(t,e.getTheme().get(a+"Axis")),M(t,this.getDefaultOption()),t.type=fM(t),n&&$c(t,i,n)},i.prototype.optionUpdated=function(){"category"===this.option.type&&(this.__ordinalMeta=x_.createByAxisModel(this))},i.prototype.getCategories=function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},i.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},i.type=e+"Axis."+a,i.defaultOption=s,i}(i);t.registerComponentModel(l)})),t.registerSubTypeDefaulter(e+"Axis",fM)}function fM(t){return t.type||(t.data?"category":"value")}var gM=function(){function t(t){this.type="cartesian",this._dimList=[],this._axes={},this.name=t||""}return t.prototype.getAxis=function(t){return this._axes[t]},t.prototype.getAxes=function(){return R(this._dimList,(function(t){return this._axes[t]}),this)},t.prototype.getAxesByScale=function(t){return t=t.toLowerCase(),z(this.getAxes(),(function(e){return e.scale.type===t}))},t.prototype.addAxis=function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},t}(),yM=["x","y"];function vM(t){return"interval"===t.type||"time"===t.type}var mM=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="cartesian2d",e.dimensions=yM,e}return n(e,t),e.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t=this.getAxis("x").scale,e=this.getAxis("y").scale;if(vM(t)&&vM(e)){var n=t.getExtent(),i=e.getExtent(),r=this.dataToPoint([n[0],i[0]]),o=this.dataToPoint([n[1],i[1]]),a=n[1]-n[0],s=i[1]-i[0];if(a&&s){var l=(o[0]-r[0])/a,u=(o[1]-r[1])/s,h=r[0]-n[0]*l,c=r[1]-i[0]*u,p=this._transform=[l,0,0,u,h,c];this._invTransform=jn([],p)}}},e.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},e.prototype.containPoint=function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},e.prototype.containData=function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},e.prototype.dataToPoint=function(t,e,n){n=n||[];var i=t[0],r=t[1];if(this._transform&&null!=i&&isFinite(i)&&null!=r&&isFinite(r))return Nt(n,t,this._transform);var o=this.getAxis("x"),a=this.getAxis("y");return n[0]=o.toGlobalCoord(o.dataToCoord(i,e)),n[1]=a.toGlobalCoord(a.dataToCoord(r,e)),n},e.prototype.clampData=function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),o=i.getExtent(),a=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),a),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(o[0],o[1]),s),Math.max(o[0],o[1])),e},e.prototype.pointToData=function(t,e){var n=[];if(this._invTransform)return Nt(n,t,this._invTransform);var i=this.getAxis("x"),r=this.getAxis("y");return n[0]=i.coordToData(i.toLocalCoord(t[0]),e),n[1]=r.coordToData(r.toLocalCoord(t[1]),e),n},e.prototype.getOtherAxis=function(t){return this.getAxis("x"===t.dim?"y":"x")},e.prototype.getArea=function(){var t=this.getAxis("x").getGlobalExtent(),e=this.getAxis("y").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(e[0],e[1]),r=Math.max(t[0],t[1])-n,o=Math.max(e[0],e[1])-i;return new vi(n,i,r,o)},e}(gM),_M=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.index=0,a.type=r||"value",a.position=o||"bottom",a}return n(e,t),e.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},e.prototype.getGlobalExtent=function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},e.prototype.pointToData=function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},e.prototype.setCategorySortInfo=function(t){if("category"!==this.type)return!1;this.model.option.categorySortInfo=t,this.scale.setSortInfo(t)},e}(Hx);function xM(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,o={},a=r.getAxesOnZeroOf()[0],s=r.position,l=a?"onZero":s,u=r.dim,h=i.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],p={left:0,right:1,top:0,bottom:1,onZero:2},d=e.get("offset")||0,f="x"===u?[c[2]-d,c[3]+d]:[c[0]-d,c[1]+d];if(a){var g=a.toGlobalCoord(a.dataToCoord(0));f[p.onZero]=Math.max(Math.min(g,f[1]),f[0])}o.position=["y"===u?f[p[l]]:c[0],"x"===u?f[p[l]]:c[3]],o.rotation=Math.PI/2*("x"===u?0:1);o.labelDirection=o.tickDirection=o.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],o.labelOffset=a?f[p[s]]-f[p.onZero]:0,e.get(["axisTick","inside"])&&(o.tickDirection=-o.tickDirection),tt(n.labelInside,e.get(["axisLabel","inside"]))&&(o.labelDirection=-o.labelDirection);var y=e.get(["axisLabel","rotate"]);return o.labelRotate="top"===l?-y:y,o.z2=1,o}function bM(t){return"cartesian2d"===t.get("coordinateSystem")}function wM(t){var e={xAxisModel:null,yAxisModel:null};return O(e,(function(n,i){var r=i.replace(/Model$/,""),o=t.getReferringComponents(r,Vr).models[0];e[i]=o})),e}var SM=function(){function t(t,e,n){this.type="grid",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=yM,this._initCartesian(t,e,n),this.model=t}return t.prototype.getRect=function(){return this._rect},t.prototype.update=function(t,e){var n=this._axesMap;this._updateScale(t,this.model),O(n.x,(function(t){gx(t.scale,t.model)})),O(n.y,(function(t){gx(t.scale,t.model)}));var i={};O(n.x,(function(t){IM(n,"y",t,i)})),O(n.y,(function(t){IM(n,"x",t,i)})),this.resize(this.model,e)},t.prototype.resize=function(t,e,n){var i=t.getBoxLayoutParams(),r=!n&&t.get("containLabel"),o=jc(i,{width:e.getWidth(),height:e.getHeight()});this._rect=o;var a=this._axesList;function s(){O(a,(function(t){var e=t.isHorizontal(),n=e?[0,o.width]:[0,o.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?o.x:o.y)}))}s(),r&&(O(a,(function(t){if(!t.model.get(["axisLabel","inside"])){var e=function(t){var e=t.model,n=t.scale;if(e.get(["axisLabel","show"])&&!n.isBlank()){var i,r,o=n.getExtent();r=n instanceof A_?n.count():(i=n.getTicks()).length;var a,s=t.getLabelModel(),l=vx(t),u=1;r>40&&(u=Math.ceil(r/40));for(var h=0;h0&&i>0||n<0&&i<0)}(t)}var CM=Math.PI,DM=function(){function t(t,e){this.group=new Bi,this.opt=e,this.axisModel=t,C(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var n=new Bi({x:e.position[0],y:e.position[1],rotation:e.rotation});n.updateTransform(),this._transformGroup=n}return t.prototype.hasBuilder=function(t){return!!AM[t]},t.prototype.add=function(t){AM[t](this.opt,this.axisModel,this.group,this._transformGroup)},t.prototype.getGroup=function(){return this.group},t.innerTextLayout=function(t,e,n){var i,r,o=rr(e-t);return or(o)?(r=n>0?"top":"bottom",i="center"):or(o-CM)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},t.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},t.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)},t}(),AM={axisLine:function(t,e,n,i){var r=e.get(["axisLine","show"]);if("auto"===r&&t.handleAutoShown&&(r=t.handleAutoShown("axisLine")),r){var o=e.axis.getExtent(),a=i.transform,s=[o[0],0],l=[o[1],0];a&&(Nt(s,s,a),Nt(l,l,a));var u=T({lineCap:"round"},e.getModel(["axisLine","lineStyle"]).getLineStyle()),h=new yu({subPixelOptimize:!0,shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:u,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1});h.anid="line",n.add(h);var c=e.get(["axisLine","symbol"]);if(null!=c){var p=e.get(["axisLine","symbolSize"]);"string"==typeof c&&(c=[c,c]),"string"!=typeof p&&"number"!=typeof p||(p=[p,p]);var d=ny(e.get(["axisLine","symbolOffset"])||0,p),f=p[0],g=p[1];O([{rotate:t.rotation+Math.PI/2,offset:d[0],r:0},{rotate:t.rotation-Math.PI/2,offset:d[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],(function(e,i){if("none"!==c[i]&&null!=c[i]){var r=ty(c[i],-f/2,-g/2,f,g,u.stroke,!0),o=e.r+e.offset;r.attr({rotation:e.rotate,x:s[0]+o*Math.cos(t.rotation),y:s[1]-o*Math.sin(t.rotation),silent:!0,z2:11}),n.add(r)}}))}}},axisTickLabel:function(t,e,n,i){var r=function(t,e,n,i){var r=n.axis,o=n.getModel("axisTick"),a=o.get("show");"auto"===a&&i.handleAutoShown&&(a=i.handleAutoShown("axisTick"));if(!a||r.scale.isBlank())return;for(var s=o.getModel("lineStyle"),l=i.tickDirection*o.get("length"),u=OM(r.getTicksCoords(),e.transform,l,C(s.getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])}),"ticks"),h=0;hc[1]?-1:1,d=["start"===s?c[0]-p*h:"end"===s?c[1]+p*h:(c[0]+c[1])/2,PM(s)?t.labelOffset+l*h:0],f=e.get("nameRotate");null!=f&&(f=f*CM/180),PM(s)?o=DM.innerTextLayout(t.rotation,null!=f?f:t.rotation,l):(o=function(t,e,n,i){var r,o,a=rr(n-t),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;or(a-CM/2)?(o=l?"bottom":"top",r="center"):or(a-1.5*CM)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*CM&&a>CM/2?l?"left":"right":l?"right":"left");return{rotation:a,textAlign:r,textVerticalAlign:o}}(t.rotation,s,f||0,c),null!=(a=t.axisNameAvailableWidth)&&(a=Math.abs(a/Math.sin(o.rotation)),!isFinite(a)&&(a=null)));var g=u.getFont(),y=e.get("nameTruncate",!0)||{},v=y.ellipsis,m=tt(t.nameTruncateMaxWidth,y.maxWidth,a),_=new fs({x:d[0],y:d[1],rotation:o.rotation,silent:DM.isLabelSilent(e),style:wh(u,{text:r,font:g,overflow:"truncate",width:m,ellipsis:v,fill:u.getTextColor()||e.get(["axisLine","lineStyle","color"]),align:u.get("align")||o.textAlign,verticalAlign:u.get("verticalAlign")||o.textVerticalAlign}),z2:1});if(gh({el:_,componentModel:e,itemName:r}),_.__fullText=r,_.anid="name",e.get("triggerEvent")){var x=DM.makeAxisEventDataBase(e);x.targetType="axisName",x.name=r,Ss(_).eventData=x}i.add(_),_.updateTransform(),n.add(_),_.decomposeTransform()}}};function kM(t){t&&(t.ignore=!0)}function LM(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=Hn([]);return Yn(r,r,-t.rotation),n.applyTransform(Un([],r,t.getLocalTransform())),i.applyTransform(Un([],r,e.getLocalTransform())),n.intersect(i)}}function PM(t){return"middle"===t||"center"===t}function OM(t,e,n,i,r){for(var o=[],a=[],s=[],l=0;l=0||t===e}function zM(t){var e=EM(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=VM(n);null==o&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==a||a>l[1])&&(a=l[1]),a0&&!c.min?c.min=0:null!=c.min&&c.min<0&&!c.max&&(c.max=0);var p=a;null!=c.color&&(p=C({color:c.color},a));var d=M(S(c),{boundaryGap:t,splitNumber:e,scale:n,axisLine:i,axisTick:r,axisLabel:o,name:c.text,nameLocation:"end",nameGap:u,nameTextStyle:p,triggerEvent:h},!1);if(s||(d.name=""),"string"==typeof l){var f=d.name;d.name=l.replace("{value}",null!=f?f:"")}else"function"==typeof l&&(d.name=l(d.name,d));var g=new Wh(d,null,this.ecModel);return L(g,Mx.prototype),g.mainType="radar",g.componentIndex=this.componentIndex,g}),this);this._indicatorModels=c},e.prototype.getIndicatorModels=function(){return this._indicatorModels},e.type="radar",e.defaultOption={zlevel:0,z:0,center:["50%","50%"],radius:"75%",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:"polygon",axisLine:M({lineStyle:{color:"#bbb"}},aI.axisLine),axisLabel:sI(aI.axisLabel,!1),axisTick:sI(aI.axisTick,!1),splitLine:sI(aI.splitLine,!0),splitArea:sI(aI.splitArea,!0),indicator:[]},e}(ep),uI=["axisLine","axisTickLabel","axisName"],hI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},e.prototype._buildAxes=function(t){var e=t.coordinateSystem;O(R(e.getIndicatorAxes(),(function(t){return new DM(t.model,{position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1})})),(function(t){O(uI,t.add,t),this.group.add(t.getGroup())}),this)},e.prototype._buildSplitLineAndArea=function(t){var e=t.coordinateSystem,n=e.getIndicatorAxes();if(n.length){var i=t.get("shape"),r=t.getModel("splitLine"),o=t.getModel("splitArea"),a=r.getModel("lineStyle"),s=o.getModel("areaStyle"),l=r.get("show"),u=o.get("show"),h=a.get("color"),c=s.get("color"),p=F(h)?h:[h],d=F(c)?c:[c],f=[],g=[];if("circle"===i)for(var y=n[0].getTicksCoords(),v=e.cx,m=e.cy,_=0;_n[0]&&isFinite(c)&&isFinite(n[0]))}else{a.getTicks().length-1>r&&(u=o(u));c=Ki((h=Math.ceil(n[1]/u)*u)-u*r);a.setExtent(c,h),a.setInterval(u)}}))},t.prototype.convertToPixel=function(t,e,n){return console.warn("Not implemented."),null},t.prototype.convertFromPixel=function(t,e,n){return console.warn("Not implemented."),null},t.prototype.containPoint=function(t){return console.warn("Not implemented."),!1},t.create=function(e,n){var i=[];return e.eachComponent("radar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeriesByType("radar",(function(t){"radar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("radarIndex")||0])})),i},t.dimensions=[],t}();function dI(t){t.registerCoordinateSystem("radar",pI),t.registerComponentModel(lI),t.registerComponentView(hI),t.registerVisual({seriesType:"radar",reset:function(t){var e=t.getData();e.each((function(t){e.setItemVisual(t,"legendIcon","roundRect")})),e.setVisual("legendIcon","roundRect")}})}var fI="\0_ec_interaction_mutex";function gI(t,e){return!!yI(t)[e]}function yI(t){return t[fI]||(t[fI]={})}Mm({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},(function(){}));var vI=function(t){function e(e){var n=t.call(this)||this;n._zr=e;var i=B(n._mousedownHandler,n),r=B(n._mousemoveHandler,n),o=B(n._mouseupHandler,n),a=B(n._mousewheelHandler,n),s=B(n._pinchHandler,n);return n.enable=function(t,n){this.disable(),this._opt=C(S(n)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),null==t&&(t=!0),!0!==t&&"move"!==t&&"pan"!==t||(e.on("mousedown",i),e.on("mousemove",r),e.on("mouseup",o)),!0!==t&&"scale"!==t&&"zoom"!==t||(e.on("mousewheel",a),e.on("pinch",s))},n.disable=function(){e.off("mousedown",i),e.off("mousemove",r),e.off("mouseup",o),e.off("mousewheel",a),e.off("pinch",s)},n}return n(e,t),e.prototype.isDragging=function(){return this._dragging},e.prototype.isPinching=function(){return this._pinching},e.prototype.setPointerChecker=function(t){this.pointerChecker=t},e.prototype.dispose=function(){this.disable()},e.prototype._mousedownHandler=function(t){if(!(ie(t)||t.target&&t.target.draggable)){var e=t.offsetX,n=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,n)&&(this._x=e,this._y=n,this._dragging=!0)}},e.prototype._mousemoveHandler=function(t){if(this._dragging&&xI("moveOnMouseMove",t,this._opt)&&"pinch"!==t.gestureEvent&&!gI(this._zr,"globalPan")){var e=t.offsetX,n=t.offsetY,i=this._x,r=this._y,o=e-i,a=n-r;this._x=e,this._y=n,this._opt.preventDefaultMouseMove&&ne(t.event),_I(this,"pan","moveOnMouseMove",t,{dx:o,dy:a,oldX:i,oldY:r,newX:e,newY:n,isAvailableBehavior:null})}},e.prototype._mouseupHandler=function(t){ie(t)||(this._dragging=!1)},e.prototype._mousewheelHandler=function(t){var e=xI("zoomOnMouseWheel",t,this._opt),n=xI("moveOnMouseWheel",t,this._opt),i=t.wheelDelta,r=Math.abs(i),o=t.offsetX,a=t.offsetY;if(0!==i&&(e||n)){if(e){var s=r>3?1.4:r>1?1.2:1.1;mI(this,"zoom","zoomOnMouseWheel",t,{scale:i>0?s:1/s,originX:o,originY:a,isAvailableBehavior:null})}if(n){var l=Math.abs(i);mI(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:(i>0?1:-1)*(l>3?.4:l>1?.15:.05),originX:o,originY:a,isAvailableBehavior:null})}}},e.prototype._pinchHandler=function(t){gI(this._zr,"globalPan")||mI(this,"zoom",null,t,{scale:t.pinchScale>1?1.1:1/1.1,originX:t.pinchX,originY:t.pinchY,isAvailableBehavior:null})},e}(Ft);function mI(t,e,n,i,r){t.pointerChecker&&t.pointerChecker(i,r.originX,r.originY)&&(ne(i.event),_I(t,e,n,i,r))}function _I(t,e,n,i,r){r.isAvailableBehavior=B(xI,null,n,i),t.trigger(e,r)}function xI(t,e,n){var i=n[t];return!t||i&&(!W(i)||e.event[i+"Key"])}function bI(t,e,n){var i=t.target;i.x+=e,i.y+=n,i.dirty()}function wI(t,e,n,i){var r=t.target,o=t.zoomLimit,a=t.zoom=t.zoom||1;if(a*=e,o){var s=o.min||0,l=o.max||1/0;a=Math.max(Math.min(l,a),s)}var u=a/t.zoom;t.zoom=a,r.x-=(n-r.x)*(u-1),r.y-=(i-r.y)*(u-1),r.scaleX*=u,r.scaleY*=u,r.dirty()}var SI={axisPointer:1,tooltip:1,brush:1};function MI(t,e,n){var i=e.getComponentByElement(t.topTarget),r=i&&i.coordinateSystem;return i&&i!==n&&!SI.hasOwnProperty(i.mainType)&&r&&r.model!==n}var II=["rect","circle","line","ellipse","polygon","polyline","path"],TI=ct(II),CI=ct(II.concat(["g"])),DI=ct(II.concat(["g"])),AI=Rr();function kI(t){var e=t.getItemStyle(),n=t.get("areaColor");return null!=n&&(e.fill=n),e}var LI=function(){function t(t){var e=new Bi;this.uid=Xh("ec_map_draw"),this._controller=new vI(t.getZr()),this._controllerHost={target:e},this.group=e,e.add(this._regionsGroup=new Bi),e.add(this._svgGroup=new Bi)}return t.prototype.draw=function(t,e,n,i,r){var o="geo"===t.mainType,a=t.getData&&t.getData();o&&e.eachComponent({mainType:"series",subType:"map"},(function(e){a||e.getHostGeoModel()!==t||(a=e.getData())}));var s=t.coordinateSystem,l=this._regionsGroup,u=this.group,h=s.getTransformInfo(),c=h.raw,p=h.roam;!l.childAt(0)||r?(u.x=p.x,u.y=p.y,u.scaleX=p.scaleX,u.scaleY=p.scaleY,u.dirty()):Eu(u,p,t);var d=a&&a.getVisual("visualMeta")&&a.getVisual("visualMeta").length>0,f={api:n,geo:s,mapOrGeoModel:t,data:a,isVisualEncodedByVisualMap:d,isGeo:o,transformInfoRaw:c};"geoJSON"===s.resourceType?this._buildGeoJSON(f):"geoSVG"===s.resourceType&&this._buildSVG(f),this._updateController(t,e,n),this._updateMapSelectHandler(t,l,n,i)},t.prototype._buildGeoJSON=function(t){var e=this._regionsGroupByName=ct(),n=ct(),i=this._regionsGroup,r=t.transformInfoRaw,o=t.mapOrGeoModel,a=t.data,s=function(t){return[t[0]*r.scaleX+r.x,t[1]*r.scaleY+r.y]};i.removeAll(),O(t.geo.regions,(function(r){var l=r.name,u=e.get(l),h=n.get(l)||{},c=h.dataIdx,p=h.regionModel;u||(u=e.set(l,new Bi),i.add(u),c=a?a.indexOfName(l):null,p=t.isGeo?o.getRegionModel(l):a?a.getItemModel(c):null,n.set(l,{dataIdx:c,regionModel:p}));var d=new Su({segmentIgnoreThreshold:1,shape:{paths:[]}});u.add(d),O(r.geometries,(function(t){if("polygon"===t.type){for(var e=[],n=0;n=0)&&(p=r);var d=a?{normal:{align:"center",verticalAlign:"middle"}}:null;xh(e,bh(i),{labelFetcher:p,labelDataIndex:c,defaultText:n},d);var f=e.getTextContent();if(f&&(AI(f).ignore=f.ignore,e.textConfig&&a)){var g=e.getBoundingRect().clone();e.textConfig.layoutRect=g,e.textConfig.position=[(a[0]-g.x)/g.width*100+"%",(a[1]-g.y)/g.height*100+"%"]}e.disableLabelAnimation=!0}else e.removeTextContent(),e.removeTextConfig(),e.disableLabelAnimation=null}function RI(t,e,n,i,r,o){t.data?t.data.setItemGraphicEl(o,e):Ss(e).eventData={componentType:"geo",componentIndex:r.componentIndex,geoIndex:r.componentIndex,name:n,region:i&&i.option||{}}}function NI(t,e,n,i,r){t.data||gh({el:e,componentModel:r,itemName:n,itemTooltipOption:i.get("tooltip")})}function zI(t,e,n,i,r){e.highDownSilentOnTouch=!!r.get("selectedMode");var o=i.getModel("emphasis"),a=o.get("focus");return pl(e,a,o.get("blurScope")),t.isGeo&&function(t,e,n){var i=Ss(t);i.componentMainType=e.mainType,i.componentIndex=e.componentIndex,i.componentHighDownName=n}(e,r,n),a}var EI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){if(!i||"mapToggleSelect"!==i.type||i.from!==this.uid){var r=this.group;if(r.removeAll(),!t.getHostGeoModel()){if(this._mapDraw&&i&&"geoRoam"===i.type&&this._mapDraw.resetForLabelLayout(),i&&"geoRoam"===i.type&&"series"===i.componentType&&i.seriesId===t.id)(o=this._mapDraw)&&r.add(o.group);else if(t.needsDrawMap){var o=this._mapDraw||new LI(n);r.add(o.group),o.draw(t,e,n,this,i),this._mapDraw=o}else this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;t.get("showLegendSymbol")&&e.getComponent("legend")&&this._renderSymbols(t,e,n)}}},e.prototype.remove=function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null,this.group.removeAll()},e.prototype.dispose=function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null},e.prototype._renderSymbols=function(t,e,n){var i=t.originalData,r=this.group;i.each(i.mapDimension("value"),(function(e,n){if(!isNaN(e)){var o=i.getItemLayout(n);if(o&&o.point){var a=o.point,s=o.offset,l=new Hl({style:{fill:t.getData().getVisual("style").fill},shape:{cx:a[0]+9*s,cy:a[1],r:3},silent:!0,z2:8+(s?0:11)});if(!s){var u=t.mainSeries.getData(),h=i.getName(n),c=u.indexOfName(h),p=i.getItemModel(n),d=p.getModel("label"),f=u.getItemGraphicEl(c);xh(l,bh(p),{labelFetcher:{getFormattedLabel:function(e,n){return t.getFormattedLabel(c,n)}}}),l.disableLabelAnimation=!0,d.get("position")||l.setTextConfig({position:"bottom"}),f.onHoverStateChange=function(t){js(l,t)}}r.add(l)}}}))},e.type="map",e}(Yf),VI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.needsDrawMap=!1,n.seriesGroup=[],n.getTooltipPosition=function(t){if(null!=t){var e=this.getData().getName(t),n=this.coordinateSystem,i=n.getRegion(e);return i&&n.dataToPoint(i.getCenter())}},n}return n(e,t),e.prototype.getInitialData=function(t){for(var e=JS(this,{coordDimensions:["value"],encodeDefaulter:G(_p,this)}),n=ct(),i=[],r=0,o=e.count();r-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2),n},e.type="series.map",e.dependencies=["geo"],e.layoutMode="box",e.defaultOption={zlevel:0,z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:null,showLegendSymbol:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,selectedMode:!0,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}},select:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},nameProperty:"name"},e}(Rf);function BI(t){var e={};t.eachSeriesByType("map",(function(t){var n=t.getHostGeoModel(),i=n?"o"+n.id:"i"+t.getMapType();(e[i]=e[i]||[]).push(t)})),O(e,(function(t,e){for(var n,i,r,o=(n=R(t,(function(t){return t.getData()})),i=t[0].get("mapValueCalculation"),r={},O(n,(function(t){t.each(t.mapDimension("value"),(function(e,n){var i="ec-"+t.getName(n);r[i]=r[i]||[],isNaN(e)||r[i].push(e)}))})),n[0].map(n[0].mapDimension("value"),(function(t,e){for(var o="ec-"+n[0].getName(e),a=0,s=1/0,l=-1/0,u=r[o].length,h=0;h1?(s.width=a,s.height=a/d):(s.height=a,s.width=a*d),s.y=o[1]-s.height/2,s.x=o[0]-s.width/2;else{var g=t.getBoxLayoutParams();g.aspect=d,s=jc(g,{width:c,height:p})}this.setViewRect(s.x,s.y,s.width,s.height),this.setCenter(t.get("center")),this.setZoom(t.get("zoom"))}L(YI,HI);var qI=new(function(){function t(){this.dimensions=XI}return t.prototype.create=function(t,e){var n=[];t.eachComponent("geo",(function(t,i){var r=t.get("map"),o=new YI(r+i,r,{nameMap:t.get("nameMap"),nameProperty:t.get("nameProperty"),aspectScale:t.get("aspectScale")});o.zoomLimit=t.get("scaleLimit"),n.push(o),t.coordinateSystem=o,o.model=t,o.resize=jI,o.resize(t,e)})),t.eachSeries((function(t){if("geo"===t.get("coordinateSystem")){var e=t.get("geoIndex")||0;t.coordinateSystem=n[e]}}));var i={};return t.eachSeriesByType("map",(function(t){if(!t.getHostGeoModel()){var e=t.getMapType();i[e]=i[e]||[],i[e].push(t)}})),O(i,(function(t,i){var r=R(t,(function(t){return t.get("nameMap")})),o=new YI(i,i,{nameMap:I(r),nameProperty:t[0].get("nameProperty"),aspectScale:t[0].get("aspectScale")});o.zoomLimit=tt.apply(null,R(t,(function(t){return t.get("scaleLimit")}))),n.push(o),o.resize=jI,o.resize(t[0],e),O(t,(function(t){t.coordinateSystem=o,function(t,e){O(e.get("geoCoord"),(function(e,n){t.addGeoCoord(n,e)}))}(o,t)}))})),n},t.prototype.getFilledRegions=function(t,e,n,i){for(var r=(t||[]).slice(),o=ct(),a=0;a=0;){var o=e[n];o.hierNode.prelim+=i,o.hierNode.modifier+=i,r+=o.hierNode.change,i+=o.hierNode.shift+r}}(t);var o=(n[0].hierNode.prelim+n[n.length-1].hierNode.prelim)/2;r?(t.hierNode.prelim=r.hierNode.prelim+e(t,r),t.hierNode.modifier=t.hierNode.prelim-o):t.hierNode.prelim=o}else r&&(t.hierNode.prelim=r.hierNode.prelim+e(t,r));t.parentNode.hierNode.defaultAncestor=function(t,e,n,i){if(e){for(var r=t,o=t,a=o.parentNode.children[0],s=e,l=r.hierNode.modifier,u=o.hierNode.modifier,h=a.hierNode.modifier,c=s.hierNode.modifier;s=rT(s),o=oT(o),s&&o;){r=rT(r),a=oT(a),r.hierNode.ancestor=t;var p=s.hierNode.prelim+c-o.hierNode.prelim-u+i(s,o);p>0&&(sT(aT(s,t,n),t,p),u+=p,l+=p),c+=s.hierNode.modifier,u+=o.hierNode.modifier,l+=r.hierNode.modifier,h+=a.hierNode.modifier}s&&!rT(r)&&(r.hierNode.thread=s,r.hierNode.modifier+=c-l),o&&!oT(a)&&(a.hierNode.thread=o,a.hierNode.modifier+=u-h,n=t)}return n}(t,r,t.parentNode.hierNode.defaultAncestor||i[0],e)}function eT(t){var e=t.hierNode.prelim+t.parentNode.hierNode.modifier;t.setLayout({x:e},!0),t.hierNode.modifier+=t.parentNode.hierNode.modifier}function nT(t){return arguments.length?t:lT}function iT(t,e){return t-=Math.PI/2,{x:e*Math.cos(t),y:e*Math.sin(t)}}function rT(t){var e=t.children;return e.length&&t.isExpand?e[e.length-1]:t.hierNode.thread}function oT(t){var e=t.children;return e.length&&t.isExpand?e[0]:t.hierNode.thread}function aT(t,e,n){return t.hierNode.ancestor.parentNode===e.parentNode?t.hierNode.ancestor:n}function sT(t,e,n){var i=n/(e.hierNode.i-t.hierNode.i);e.hierNode.change-=i,e.hierNode.shift+=n,e.hierNode.modifier+=n,e.hierNode.prelim+=n,t.hierNode.change+=i}function lT(t,e){return t.parentNode===e.parentNode?1:2}var uT=function(){this.parentPoint=[],this.childPoints=[]},hT=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new uT},e.prototype.buildPath=function(t,e){var n=e.childPoints,i=n.length,r=e.parentPoint,o=n[0],a=n[i-1];if(1===i)return t.moveTo(r[0],r[1]),void t.lineTo(o[0],o[1]);var s=e.orient,l="TB"===s||"BT"===s?0:1,u=1-l,h=qi(e.forkPosition,1),c=[];c[l]=r[l],c[u]=r[u]+(a[u]-r[u])*h,t.moveTo(r[0],r[1]),t.lineTo(c[0],c[1]),t.moveTo(o[0],o[1]),c[l]=o[l],t.lineTo(c[0],c[1]),c[l]=a[l],t.lineTo(c[0],c[1]),t.lineTo(a[0],a[1]);for(var p=1;pm.x)||(x-=Math.PI);var S=b?"left":"right",M=s.getModel("label"),I=M.get("rotate"),T=I*(Math.PI/180),D=y.getTextContent();D&&(y.setTextConfig({position:M.get("position")||S,rotation:null==I?-x:T,origin:"center"}),D.setStyle("verticalAlign","middle"))}var A=s.get(["emphasis","focus"]),k="ancestor"===A?a.getAncestorsIndices():"descendant"===A?a.getDescendantIndices():null;k&&(Ss(n).focus=k),function(t,e,n,i,r,o,a,s){var l=e.getModel(),u=t.get("edgeShape"),h=t.get("layout"),c=t.getOrient(),p=t.get(["lineStyle","curveness"]),d=t.get("edgeForkPosition"),f=l.getModel("lineStyle").getLineStyle(),g=i.__edge;if("curve"===u)e.parentNode&&e.parentNode!==n&&(g||(g=i.__edge=new xu({shape:vT(h,c,p,r,r)})),Eu(g,{shape:vT(h,c,p,o,a)},t));else if("polyline"===u)if("orthogonal"===h){if(e!==n&&e.children&&0!==e.children.length&&!0===e.isExpand){for(var y=e.children,v=[],m=0;me&&(e=i.height)}this.height=e+1},t.prototype.getNodeById=function(t){if(this.getId()===t)return this;for(var e=0,n=this.children,i=n.length;e=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},t.prototype.getLayout=function(){return this.hostTree.data.getItemLayout(this.dataIndex)},t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostTree.data.getItemModel(this.dataIndex).getModel(t)},t.prototype.getLevelModel=function(){return(this.hostTree.levelModels||[])[this.depth]},t.prototype.setVisual=function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},t.prototype.getVisual=function(t){return this.hostTree.data.getItemVisual(this.dataIndex,t)},t.prototype.getRawIndex=function(){return this.hostTree.data.getRawIndex(this.dataIndex)},t.prototype.getId=function(){return this.hostTree.data.getId(this.dataIndex)},t.prototype.getChildIndex=function(){if(this.parentNode){for(var t=this.parentNode.children,e=0;e=0){var i=n.getData().tree.root,r=t.targetNode;if("string"==typeof r&&(r=i.getNodeById(r)),r&&i.contains(r))return{node:r};var o=t.targetNodeId;if(null!=o&&(r=i.getNodeById(o)))return{node:r}}}function kT(t){for(var e=[];t;)(t=t.parentNode)&&e.push(t);return e.reverse()}function LT(t,e){return A(kT(t),e)>=0}function PT(t,e){for(var n=[];t;){var i=t.dataIndex;n.push({name:t.name,dataIndex:i,value:e.getRawValue(i)}),t=t.parentNode}return n.reverse(),n}var OT=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.hasSymbolVisual=!0,e.ignoreStyleOnData=!0,e}return n(e,t),e.prototype.getInitialData=function(t){var e={name:t.name,children:t.data},n=t.leaves||{},i=new Wh(n,this,this.ecModel),r=DT.createTree(e,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e);return n&&n.children.length&&n.isExpand||(t.parentModel=i),t}))}));var o=0;r.eachNode("preorder",(function(t){t.depth>o&&(o=t.depth)}));var a=t.expandAndCollapse&&t.initialTreeDepth>=0?t.initialTreeDepth:o;return r.root.eachNode("preorder",(function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=a})),r.data},e.prototype.getOrient=function(){var t=this.get("orient");return"horizontal"===t?t="LR":"vertical"===t&&(t="TB"),t},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.formatTooltip=function(t,e,n){for(var i=this.getData().tree,r=i.root.children[0],o=i.getNodeByDataIndex(t),a=o.getValue(),s=o.name;o&&o!==r;)s=o.parentNode.name+"."+s,o=o.parentNode;return bf("nameValue",{name:s,value:a,noValue:isNaN(a)||null==a})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=PT(i,this),n},e.type="series.tree",e.layoutMode="box",e.defaultOption={zlevel:0,z:2,coordinateSystem:"view",left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",edgeShape:"curve",edgeForkPosition:"50%",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:"LR",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderWidth:1.5},label:{show:!0},animationEasing:"linear",animationDuration:700,animationDurationUpdate:500},e}(Rf);function RT(t,e){for(var n,i=[t];n=i.pop();)if(e(n),n.isExpand){var r=n.children;if(r.length)for(var o=r.length-1;o>=0;o--)i.push(r[o])}}function NT(t,e){t.eachSeriesByType("tree",(function(t){!function(t,e){var n=function(t,e){return jc(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=n;var i=t.get("layout"),r=0,o=0,a=null;"radial"===i?(r=2*Math.PI,o=Math.min(n.height,n.width)/2,a=nT((function(t,e){return(t.parentNode===e.parentNode?1:2)/t.depth}))):(r=n.width,o=n.height,a=nT());var s=t.getData().tree.root,l=s.children[0];if(l){!function(t){var e=t;e.hierNode={defaultAncestor:null,ancestor:e,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var n,i,r=[e];n=r.pop();)if(i=n.children,n.isExpand&&i.length)for(var o=i.length-1;o>=0;o--){var a=i[o];a.hierNode={defaultAncestor:null,ancestor:a,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},r.push(a)}}(s),function(t,e,n){for(var i,r=[t],o=[];i=r.pop();)if(o.push(i),i.isExpand){var a=i.children;if(a.length)for(var s=0;sh.getLayout().x&&(h=t),t.depth>c.depth&&(c=t)}));var p=u===h?1:a(u,h)/2,d=p-u.getLayout().x,f=0,g=0,y=0,v=0;if("radial"===i)f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),RT(l,(function(t){y=(t.getLayout().x+d)*f,v=(t.depth-1)*g;var e=iT(y,v);t.setLayout({x:e.x,y:e.y,rawX:y,rawY:v},!0)}));else{var m=t.getOrient();"RL"===m||"LR"===m?(g=o/(h.getLayout().x+p+d),f=r/(c.depth-1||1),RT(l,(function(t){v=(t.getLayout().x+d)*g,y="LR"===m?(t.depth-1)*f:r-(t.depth-1)*f,t.setLayout({x:y,y:v},!0)}))):"TB"!==m&&"BT"!==m||(f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),RT(l,(function(t){y=(t.getLayout().x+d)*f,v="TB"===m?(t.depth-1)*g:o-(t.depth-1)*g,t.setLayout({x:y,y:v},!0)})))}}}(t,e)}))}function zT(t){t.eachSeriesByType("tree",(function(t){var e=t.getData();e.tree.eachNode((function(t){var n=t.getModel().getModel("itemStyle").getItemStyle();T(e.ensureUniqueItemVisual(t.dataIndex,"style"),n)}))}))}var ET=function(){},VT=["treemapZoomToNode","treemapRender","treemapMove"];function BT(t){var e=t.getData().tree,n={};e.eachNode((function(e){for(var i=e;i&&i.depth>1;)i=i.parentNode;var r=kp(t.ecModel,i.name||i.dataIndex+"",n);e.setVisual("decal",r)}))}var GT=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.preventUsingHoverLayer=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};FT(n);var i=t.levels||[],r=this.designatedVisualItemStyle={},o=new Wh({itemStyle:r},this,e),a=R((i=t.levels=function(t,e){var n,i,r=wr(e.get("color")),o=wr(e.get(["aria","decal","decals"]));if(!r)return;O(t=t||[],(function(t){var e=new Wh(t),r=e.get("color"),o=e.get("decal");(e.get(["itemStyle","color"])||r&&"none"!==r)&&(n=!0),(e.get(["itemStyle","decal"])||o&&"none"!==o)&&(i=!0)}));var a=t[0]||(t[0]={});n||(a.color=r.slice());!i&&o&&(a.decal=o.slice());return t}(i,e))||[],(function(t){return new Wh(t,o,e)}),this),s=DT.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=s.getNodeByDataIndex(e),i=n?a[n.depth]:null;return t.parentModel=i||o,t}))}));return s.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t);return bf("nameValue",{name:i.getName(t),value:r})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=PT(i,this),n.treePathInfo=n.treeAncestors,n},e.prototype.setLayoutInfo=function(t){this.layoutInfo=this.layoutInfo||{},T(this.layoutInfo,t)},e.prototype.mapIdToIndex=function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=ct(),this._idIndexMapCount=0);var n=e.get(t);return null==n&&e.set(t,n=this._idIndexMapCount++),n},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){BT(this)},e.type="series.treemap",e.layoutMode="box",e.defaultOption={progressive:0,left:"center",top:"middle",width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",textStyle:{color:"#fff"}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",overflow:"truncate"},upperLabel:{show:!1,position:[0,"50%"],height:20,overflow:"truncate",verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],ellipsis:!0,verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},e}(Rf);function FT(t){var e=0;O(t.children,(function(t){FT(t);var n=t.value;F(n)&&(n=n[0]),e+=n}));var n=t.value;F(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),F(t.value)?t.value[0]=n:t.value=n}var HT=function(){function t(t){this.group=new Bi,t.add(this.group)}return t.prototype.render=function(t,e,n,i){var r=t.getModel("breadcrumb"),o=this.group;if(o.removeAll(),r.get("show")&&n){var a=r.getModel("itemStyle"),s=a.getModel("textStyle"),l={pos:{left:r.get("left"),right:r.get("right"),top:r.get("top"),bottom:r.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:r.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(n,l,s),this._renderContent(t,l,a,s,i),qc(o,l.pos,l.box)}},t.prototype._prepare=function(t,e,n){for(var i=t;i;i=i.parentNode){var r=kr(i.getModel().get("name"),""),o=n.getTextRect(r),a=Math.max(o.width+16,e.emptyItemWidth);e.totalWidth+=a+8,e.renderList.push({node:i,text:r,width:a})}},t.prototype._renderContent=function(t,e,n,i,r){for(var o,a,s,l,u,h,c,p,d,f=0,g=e.emptyItemWidth,y=t.get(["breadcrumb","height"]),v=(o=e.pos,a=e.box,l=a.width,u=a.height,h=qi(o.left,l),c=qi(o.top,u),p=qi(o.right,l),d=qi(o.bottom,u),(isNaN(h)||isNaN(parseFloat(o.left)))&&(h=0),(isNaN(p)||isNaN(parseFloat(o.right)))&&(p=l),(isNaN(c)||isNaN(parseFloat(o.top)))&&(c=0),(isNaN(d)||isNaN(parseFloat(o.bottom)))&&(d=u),s=Pc(s||0),{width:Math.max(p-h-s[1]-s[3],0),height:Math.max(d-c-s[0]-s[2],0)}),m=e.totalWidth,_=e.renderList,x=_.length-1;x>=0;x--){var b=_[x],w=b.node,S=b.width,M=b.text;m>v.width&&(m-=S-g,S=g,M=null);var I=new cu({shape:{points:WT(f,0,S,y,x===_.length-1,0===x)},style:C(n.getItemStyle(),{lineJoin:"bevel"}),textContent:new fs({style:{text:M,fill:i.getTextColor(),font:i.getFont()}}),textConfig:{position:"inside"},z2:1e5,onclick:G(r,w)});I.disableLabelAnimation=!0,this.group.add(I),UT(I,t,w),f+=S+8}},t.prototype.remove=function(){this.group.removeAll()},t}();function WT(t,e,n,i,r,o){var a=[[r?t:t-5,e],[t+n,e],[t+n,e+i],[r?t:t-5,e+i]];return!o&&a.splice(2,0,[t+n+5,e+i/2]),!r&&a.push([t,e+i/2]),a}function UT(t,e,n){Ss(t).eventData={componentType:"series",componentSubType:"treemap",componentIndex:e.componentIndex,seriesIndex:e.componentIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:n&&n.dataIndex,name:n&&n.name},treePathInfo:n&&PT(n,e)}}var XT=function(){function t(){this._storage=[],this._elExistsMap={}}return t.prototype.add=function(t,e,n,i,r){return!this._elExistsMap[t.id]&&(this._elExistsMap[t.id]=!0,this._storage.push({el:t,target:e,duration:n,delay:i,easing:r}),!0)},t.prototype.finished=function(t){return this._finishedCallback=t,this},t.prototype.start=function(){for(var t=this,e=this._storage.length,n=function(){--e<=0&&(t._storage.length=0,t._elExistsMap={},t._finishedCallback&&t._finishedCallback())},i=0,r=this._storage.length;i3||Math.abs(t.dy)>3)){var e=this.seriesModel.getData().tree.root;if(!e)return;var n=e.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t.dx,y:n.y+t.dy,width:n.width,height:n.height}})}},e.prototype._onZoom=function(t){var e=t.originX,n=t.originY;if("animating"!==this._state){var i=this.seriesModel.getData().tree.root;if(!i)return;var r=i.getLayout();if(!r)return;var o=new vi(r.x,r.y,r.width,r.height),a=this.seriesModel.layoutInfo,s=[1,0,0,1,0,0];Xn(s,s,[-(e-=a.x),-(n-=a.y)]),Zn(s,s,[t.scale,t.scale]),Xn(s,s,[e,n]),o.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},e.prototype._initEvents=function(t){var e=this;t.on("click",(function(t){if("ready"===e._state){var n=e.seriesModel.get("nodeClick",!0);if(n){var i=e.findTarget(t.offsetX,t.offsetY);if(i){var r=i.node;if(r.getLayout().isLeafRoot)e._rootToNode(i);else if("zoomToNode"===n)e._zoomToNode(i);else if("link"===n){var o=r.hostTree.data.getItemModel(r.dataIndex),a=o.get("link",!0),s=o.get("target",!0)||"blank";a&&Hc(a,s)}}}}}),this)},e.prototype._renderBreadcrumb=function(t,e,n){var i=this;n||(n=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2))||(n={node:t.getData().tree.root}),(this._breadcrumb||(this._breadcrumb=new HT(this.group))).render(t,e,n.node,(function(e){"animating"!==i._state&&(LT(t.getViewRoot(),e)?i._rootToNode({node:e}):i._zoomToNode({node:e}))}))},e.prototype.remove=function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage={nodeGroup:[],background:[],content:[]},this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},e.prototype.dispose=function(){this._clearController()},e.prototype._zoomToNode=function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype._rootToNode=function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype.findTarget=function(t,e){var n;return this.seriesModel.getViewRoot().eachNode({attr:"viewChildren",order:"preorder"},(function(i){var r=this._storage.background[i.getRawIndex()];if(r){var o=r.transformCoordToLocal(t,e),a=r.shape;if(!(a.x<=o[0]&&o[0]<=a.x+a.width&&a.y<=o[1]&&o[1]<=a.y+a.height))return!1;n={node:i,offsetX:o[0],offsetY:o[1]}}}),this),n},e.type="treemap",e}(Yf);var tC=O,eC=Y,nC=-1,iC=function(){function t(e){var n=e.mappingMethod,i=e.type,r=this.option=S(e);this.type=i,this.mappingMethod=n,this._normalizeData=dC[n];var o=t.visualHandlers[i];this.applyVisual=o.applyVisual,this.getColorMapper=o.getColorMapper,this._normalizedToVisual=o._normalizedToVisual[n],"piecewise"===n?(rC(r),function(t){var e=t.pieceList;t.hasSpecialVisual=!1,O(e,(function(e,n){e.originIndex=n,null!=e.visual&&(t.hasSpecialVisual=!0)}))}(r)):"category"===n?r.categories?function(t){var e=t.categories,n=t.categoryMap={},i=t.visual;if(tC(e,(function(t,e){n[t]=e})),!F(i)){var r=[];Y(i)?tC(i,(function(t,e){var i=n[e];r[null!=i?i:nC]=t})):r[-1]=i,i=pC(t,r)}for(var o=e.length-1;o>=0;o--)null==i[o]&&(delete n[e[o]],e.pop())}(r):rC(r,!0):(ot("linear"!==n||r.dataExtent),rC(r))}return t.prototype.mapValueToVisual=function(t){var e=this._normalizeData(t);return this._normalizedToVisual(e,t)},t.prototype.getNormalizer=function(){return B(this._normalizeData,this)},t.listVisualTypes=function(){return V(t.visualHandlers)},t.isValidType=function(e){return t.visualHandlers.hasOwnProperty(e)},t.eachVisual=function(t,e,n){Y(t)?O(t,e,n):e.call(n,t)},t.mapVisual=function(e,n,i){var r,o=F(e)?[]:Y(e)?{}:(r=!0,null);return t.eachVisual(e,(function(t,e){var a=n.call(i,t,e);r?o=a:o[e]=a})),o},t.retrieveVisuals=function(e){var n,i={};return e&&tC(t.visualHandlers,(function(t,r){e.hasOwnProperty(r)&&(i[r]=e[r],n=!0)})),n?i:null},t.prepareVisualTypes=function(t){if(F(t))t=t.slice();else{if(!eC(t))return[];var e=[];tC(t,(function(t,n){e.push(n)})),t=e}return t.sort((function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1})),t},t.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},t.findPieceIndex=function(t,e,n){for(var i,r=1/0,o=0,a=e.length;ou[1]&&(u[1]=l);var h=e.get("colorMappingBy"),c={type:a.name,dataExtent:u,visual:a.range};"color"!==c.type||"index"!==h&&"id"!==h?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var p=new iC(c);return gC(p).drColorMappingBy=h,p}(0,r,o,0,u,d);O(d,(function(t,e){if(t.depth>=n.length||t===n[t.depth]){var o=function(t,e,n,i,r,o){var a=T({},e);if(r){var s=r.type,l="color"===s&&gC(r).drColorMappingBy,u="index"===l?i:"id"===l?o.mapIdToIndex(n.getId()):n.getValue(t.get("visualDimension"));a[s]=r.mapValueToVisual(u)}return a}(r,u,t,e,f,i);vC(t,o,n,i)}}))}else s=mC(u),h.fill=s}}function mC(t){var e=_C(t,"color");if(e){var n=_C(t,"colorAlpha"),i=_C(t,"colorSaturation");return i&&(e=$e(e,null,null,i)),n&&(e=Je(e,n)),e}}function _C(t,e){var n=t[e];if(null!=n&&"none"!==n)return n}function xC(t,e){var n=t.get(e);return F(n)&&n.length?{name:e,range:n}:null}var bC=Math.max,wC=Math.min,SC=tt,MC=O,IC=["itemStyle","borderWidth"],TC=["itemStyle","gapWidth"],CC=["upperLabel","show"],DC=["upperLabel","height"],AC={seriesType:"treemap",reset:function(t,e,n,i){var r=n.getWidth(),o=n.getHeight(),a=t.option,s=jc(t.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()}),l=a.size||[],u=qi(SC(s.width,l[0]),r),h=qi(SC(s.height,l[1]),o),c=i&&i.type,p=AT(i,["treemapZoomToNode","treemapRootToNode"],t),d="treemapRender"===c||"treemapMove"===c?i.rootRect:null,f=t.getViewRoot(),g=kT(f);if("treemapMove"!==c){var y="treemapZoomToNode"===c?function(t,e,n,i,r){var o,a=(e||{}).node,s=[i,r];if(!a||a===n)return s;var l=i*r,u=l*t.option.zoomToNodeRatio;for(;o=a.parentNode;){for(var h=0,c=o.children,p=0,d=c.length;pir&&(u=ir),a=o}ua[1]&&(a[1]=e)}))):a=[NaN,NaN];return{sum:i,dataExtent:a}}(e,a,s);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,n,i,r){if(!i)return n;for(var o=t.get("visibleMin"),a=r.length,s=a,l=a-1;l>=0;l--){var u=r["asc"===i?a-l-1:l].getValue();u/n*ei&&(i=a));var l=t.area*t.area,u=e*e*n;return l?bC(u*i/l,l/(u*r)):1/0}function PC(t,e,n,i,r){var o=e===n.width?0:1,a=1-o,s=["x","y"],l=["width","height"],u=n[s[o]],h=e?t.area/e:0;(r||h>n[l[a]])&&(h=n[l[a]]);for(var c=0,p=t.length;ci&&(i=e);var o=i%2?i+2:i+3;r=[];for(var a=0;a0&&(m[0]=-m[0],m[1]=-m[1]);var x=v[0]<0?-1:1;if("start"!==i.__position&&"end"!==i.__position){var b=-Math.atan2(v[1],v[0]);u[0].8?"left":h[0]<-.8?"right":"center",p=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";break;case"start":i.x=-h[0]*f+l[0],i.y=-h[1]*g+l[1],c=h[0]>.8?"right":h[0]<-.8?"left":"center",p=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";break;case"insideStartTop":case"insideStart":case"insideStartBottom":i.x=f*x+l[0],i.y=l[1]+w,c=v[0]<0?"right":"left",i.originX=-f*x,i.originY=-w;break;case"insideMiddleTop":case"insideMiddle":case"insideMiddleBottom":case"middle":i.x=_[0],i.y=_[1]+w,c="center",i.originY=-w;break;case"insideEndTop":case"insideEnd":case"insideEndBottom":i.x=-f*x+u[0],i.y=u[1]+w,c=v[0]>=0?"right":"left",i.originX=f*x,i.originY=-w}i.scaleX=i.scaleY=r,i.setStyle({verticalAlign:i.__verticalAlign||p,align:i.__align||c})}}}function S(t,e){var n=t.__specifiedRotation;if(null==n){var i=a.tangentAt(e);t.attr("rotation",(1===e?-1:1)*Math.PI/2-Math.atan2(i[1],i[0]))}else t.attr("rotation",n)}},e}(Bi),gD=function(){function t(t){this.group=new Bi,this._LineCtor=t||fD}return t.prototype.isPersistent=function(){return!0},t.prototype.updateData=function(t){var e=this,n=this,i=n.group,r=n._lineData;n._lineData=t,r||i.removeAll();var o=yD(t);t.diff(r).add((function(n){e._doAdd(t,n,o)})).update((function(n,i){e._doUpdate(r,t,i,n,o)})).remove((function(t){i.remove(r.getItemGraphicEl(t))})).execute()},t.prototype.updateLayout=function(){var t=this._lineData;t&&t.eachItemGraphicEl((function(e,n){e.updateLayout(t,n)}),this)},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=yD(t),this._lineData=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e){function n(t){t.isGroup||function(t){return t.animators&&t.animators.length>0}(t)||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}for(var i=t.start;i=0?i+=u:i-=u:f>=0?i-=u:i+=u}return i}function TD(t,e){var n=[],i=Ko,r=[[],[],[]],o=[[],[]],a=[];e/=2,t.eachEdge((function(t,s){var l=t.getLayout(),u=t.getVisual("fromSymbol"),h=t.getVisual("toSymbol");l.__original||(l.__original=[_t(l[0]),_t(l[1])],l[2]&&l.__original.push(_t(l[2])));var c=l.__original;if(null!=l[2]){if(mt(r[0],c[0]),mt(r[1],c[2]),mt(r[2],c[1]),u&&"none"!==u){var p=KC(t.node1),d=ID(r,c[0],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[0][0]=n[3],r[1][0]=n[4],i(r[0][1],r[1][1],r[2][1],d,n),r[0][1]=n[3],r[1][1]=n[4]}if(h&&"none"!==h){p=KC(t.node2),d=ID(r,c[1],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[1][0]=n[1],r[2][0]=n[2],i(r[0][1],r[1][1],r[2][1],d,n),r[1][1]=n[1],r[2][1]=n[2]}mt(l[0],r[0]),mt(l[1],r[2]),mt(l[2],r[1])}else{if(mt(o[0],c[0]),mt(o[1],c[1]),St(a,o[1],o[0]),At(a,a),u&&"none"!==u){p=KC(t.node1);wt(o[0],o[0],a,p*e)}if(h&&"none"!==h){p=KC(t.node2);wt(o[1],o[1],a,-p*e)}mt(l[0],o[0]),mt(l[1],o[1])}}))}function CD(t){return"view"===t.type}var DD=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){var n=new Nw,i=new gD,r=this.group;this._controller=new vI(e.getZr()),this._controllerHost={target:r},r.add(n.group),r.add(i.group),this._symbolDraw=n,this._lineDraw=i,this._firstRender=!0},e.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem;this._model=t;var o=this._symbolDraw,a=this._lineDraw,s=this.group;if(CD(r)){var l={x:r.x,y:r.y,scaleX:r.scaleX,scaleY:r.scaleY};this._firstRender?s.attr(l):Eu(s,l,t)}TD(t.getGraph(),qC(t));var u=t.getData();o.updateData(u);var h=t.getEdgeData();a.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,n),clearTimeout(this._layoutTimeout);var c=t.forceLayout,p=t.get(["force","layoutAnimation"]);c&&this._startForceLayoutIteration(c,p),u.graph.eachNode((function(t){var e=t.dataIndex,n=t.getGraphicEl(),r=t.getModel();n.off("drag").off("dragend");var o=r.get("draggable");o&&n.on("drag",(function(){c&&(c.warmUp(),!i._layouting&&i._startForceLayoutIteration(c,p),c.setFixed(e),u.setItemLayout(e,[n.x,n.y]))})).on("dragend",(function(){c&&c.setUnfixed(e)})),n.setDraggable(o&&!!c),"adjacency"===r.get(["emphasis","focus"])&&(Ss(n).focus=t.getAdjacentDataIndices())})),u.graph.eachEdge((function(t){var e=t.getGraphicEl();"adjacency"===t.getModel().get(["emphasis","focus"])&&(Ss(e).focus={edge:[t.dataIndex],node:[t.node1.dataIndex,t.node2.dataIndex]})}));var d="circular"===t.get("layout")&&t.get(["circular","rotateLabel"]),f=u.getLayout("cx"),g=u.getLayout("cy");u.eachItemGraphicEl((function(t,e){var n=u.getItemModel(e).get(["label","rotate"])||0,i=t.getSymbolPath();if(d){var r=u.getItemLayout(e),o=Math.atan2(r[1]-g,r[0]-f);o<0&&(o=2*Math.PI+o);var a=r[0]=0&&t.call(e,n[r],r)},t.prototype.eachEdge=function(t,e){for(var n=this.edges,i=n.length,r=0;r=0&&n[r].node1.dataIndex>=0&&n[r].node2.dataIndex>=0&&t.call(e,n[r],r)},t.prototype.breadthFirstTraverse=function(t,e,n,i){if(e instanceof LD||(e=this._nodesMap[AD(e)]),e){for(var r="out"===n?"outEdges":"in"===n?"inEdges":"edges",o=0;o=0&&n.node2.dataIndex>=0}));for(r=0,o=i.length;r=0&&this[t][e].setItemVisual(this.dataIndex,n,i)},getVisual:function(n){return this[t][e].getItemVisual(this.dataIndex,n)},setLayout:function(n,i){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,n,i)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}}function RD(t,e,n,i,r){for(var o=new kD(i),a=0;a "+p)),u++)}var d,f=n.get("coordinateSystem");if("cartesian2d"===f||"polar"===f)d=v_(t,n);else{var g=Bp.get(f),y=g&&g.dimensions||[];A(y,"value")<0&&y.concat(["value"]);var v=u_(t,{coordDimensions:y,encodeDefine:n.getEncode()}).dimensions;(d=new l_(v,n)).initData(t)}var m=new l_(["value"],n);return m.initData(l,s),r&&r(d,m),_T({mainData:d,struct:o,structAttr:"graph",datas:{node:d,edge:m},datasAttr:{node:"data",edge:"edgeData"}}),o.update(),o}L(LD,OD("hostGraph","data")),L(PD,OD("hostGraph","edgeData"));var ND=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments);var n=this;function i(){return n._categoriesData}this.legendVisualProvider=new QS(i,i),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeDefaultAndTheme=function(e){t.prototype.mergeDefaultAndTheme.apply(this,arguments),Sr(e,"edgeLabel",["show"])},e.prototype.getInitialData=function(t,e){var n,i=t.edges||t.links||[],r=t.data||t.nodes||[],o=this;if(r&&i){GC(n=this)&&(n.__curvenessList=[],n.__edgeMap={},FC(n));var a=RD(r,i,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t){var e=o._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t}));var n=Wh.prototype.getModel;function i(t,e){var i=n.call(this,t,e);return i.resolveParentPath=r,i}function r(t){if(t&&("label"===t[0]||"label"===t[1])){var e=t.slice();return"label"===t[0]?e[0]="edgeLabel":"label"===t[1]&&(e[1]="edgeLabel"),e}return t}e.wrapMethod("getItemModel",(function(t){return t.resolveParentPath=r,t.getModel=i,t}))}));return O(a.edges,(function(t){!function(t,e,n,i){if(GC(n)){var r=HC(t,e,n),o=n.__edgeMap,a=o[WC(r)];o[r]&&!a?o[r].isForward=!0:a&&o[r]&&(a.isForward=!0,o[r].isForward=!1),o[r]=o[r]||[],o[r].push(i)}}(t.node1,t.node2,this,t.dataIndex)}),this),a.data}},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.getCategoriesData=function(){return this._categoriesData},e.prototype.formatTooltip=function(t,e,n){if("edge"===n){var i=this.getData(),r=this.getDataParams(t,n),o=i.graph.getEdgeByIndex(t),a=i.getName(o.node1.dataIndex),s=i.getName(o.node2.dataIndex),l=[];return null!=a&&l.push(a),null!=s&&l.push(s),bf("nameValue",{name:l.join(" > "),value:r.value,noValue:null==r.value})}return Lf({series:this,dataIndex:t,multipleSeries:e})},e.prototype._updateCategoriesData=function(){var t=R(this.option.categories||[],(function(t){return null!=t.value?t:T({value:0},t)})),e=new l_(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray((function(t){return e.getItemModel(t)}))},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.isAnimationEnabled=function(){return t.prototype.isAnimationEnabled.call(this)&&!("force"===this.get("layout")&&this.get(["force","layoutAnimation"]))},e.type="series.graph",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={zlevel:0,z:2,coordinateSystem:"view",legendHoverLink:!0,layout:null,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,opacity:.5},emphasis:{scale:!0,label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(Rf),zD={type:"graphRoam",event:"graphRoam",update:"none"};var ED=function(){this.angle=0,this.width=10,this.r=10,this.x=0,this.y=0},VD=function(t){function e(e){var n=t.call(this,e)||this;return n.type="pointer",n}return n(e,t),e.prototype.getDefaultShape=function(){return new ED},e.prototype.buildPath=function(t,e){var n=Math.cos,i=Math.sin,r=e.r,o=e.width,a=e.angle,s=e.x-n(a)*o*(o>=r/3?1:2),l=e.y-i(a)*o*(o>=r/3?1:2);a=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+n(a)*o,e.y+i(a)*o),t.lineTo(e.x+n(e.angle)*r,e.y+i(e.angle)*r),t.lineTo(e.x-n(a)*o,e.y-i(a)*o),t.lineTo(s,l)},e}(Qa);function BD(t,e){var n=null==t?"":t+"";return e&&("string"==typeof e?n=e.replace("{value}",n):"function"==typeof e&&(n=e(t))),n}var GD=2*Math.PI,FD=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll();var i=t.get(["axisLine","lineStyle","color"]),r=function(t,e){var n=t.get("center"),i=e.getWidth(),r=e.getHeight(),o=Math.min(i,r);return{cx:qi(n[0],e.getWidth()),cy:qi(n[1],e.getHeight()),r:qi(t.get("radius"),o/2)}}(t,n);this._renderMain(t,e,n,i,r),this._data=t.getData()},e.prototype.dispose=function(){},e.prototype._renderMain=function(t,e,n,i,r){for(var o=this.group,a=t.get("clockwise"),s=-t.get("startAngle")/180*Math.PI,l=-t.get("endAngle")/180*Math.PI,u=t.getModel("axisLine"),h=u.get("roundCap")?vS:ou,c=u.get("show"),p=u.getModel("lineStyle"),d=p.get("width"),f=(l-s)%GD||l===s?(l-s)%GD:GD,g=s,y=0;c&&y=t&&(0===e?0:i[e-1][0]).8?"bottom":"middle",align:u<-.4?"left":u>.4?"right":"center"},{inheritColor:R}),silent:!0}))}if(m.get("show")&&k!==x){P=(P=m.get("distance"))?P+l:l;for(var N=0;N<=b;N++){u=Math.cos(M),h=Math.sin(M);var z=new yu({shape:{x1:u*(f-P)+p,y1:h*(f-P)+d,x2:u*(f-S-P)+p,y2:h*(f-S-P)+d},silent:!0,style:D});"auto"===D.stroke&&z.setStyle({stroke:i((k+N/b)/x)}),c.add(z),M+=T}M-=T}else M+=I}},e.prototype._renderPointer=function(t,e,n,i,r,o,a,s,l){var u=this.group,h=this._data,c=this._progressEls,p=[],d=t.get(["pointer","show"]),f=t.getModel("progress"),g=f.get("show"),y=t.getData(),v=y.mapDimension("value"),m=+t.get("min"),_=+t.get("max"),x=[m,_],b=[o,a];function w(e,n){var i,o=y.getItemModel(e).getModel("pointer"),a=qi(o.get("width"),r.r),s=qi(o.get("length"),r.r),l=t.get(["pointer","icon"]),u=o.get("offsetCenter"),h=qi(u[0],r.r),c=qi(u[1],r.r),p=o.get("keepAspect");return(i=l?ty(l,h-a/2,c-s,a,s,null,p):new VD({shape:{angle:-Math.PI/2,width:a,r:s,x:h,y:c}})).rotation=-(n+Math.PI/2),i.x=r.cx,i.y=r.cy,i}function S(t,e){var n=f.get("roundCap")?vS:ou,i=f.get("overlap"),a=i?f.get("width"):l/y.count(),u=i?r.r-a:r.r-(t+1)*a,h=i?r.r:r.r-t*a,c=new n({shape:{startAngle:o,endAngle:e,cx:r.cx,cy:r.cy,clockwise:s,r0:u,r:h}});return i&&(c.z2=_-y.get(v,t)%_),c}(g||d)&&(y.diff(h).add((function(e){if(d){var n=w(e,o);Vu(n,{rotation:-(ji(y.get(v,e),x,b,!0)+Math.PI/2)},t),u.add(n),y.setItemGraphicEl(e,n)}if(g){var i=S(e,o),r=f.get("clip");Vu(i,{shape:{endAngle:ji(y.get(v,e),x,b,r)}},t),u.add(i),Ms(t.seriesIndex,y.dataType,e,i),p[e]=i}})).update((function(e,n){if(d){var i=h.getItemGraphicEl(n),r=i?i.rotation:o,a=w(e,r);a.rotation=r,Eu(a,{rotation:-(ji(y.get(v,e),x,b,!0)+Math.PI/2)},t),u.add(a),y.setItemGraphicEl(e,a)}if(g){var s=c[n],l=S(e,s?s.shape.endAngle:o),m=f.get("clip");Eu(l,{shape:{endAngle:ji(y.get(v,e),x,b,m)}},t),u.add(l),Ms(t.seriesIndex,y.dataType,e,l),p[e]=l}})).execute(),y.each((function(t){var e=y.getItemModel(t),n=e.getModel("emphasis");if(d){var r=y.getItemGraphicEl(t),o=y.getItemVisual(t,"style"),a=o.fill;if(r instanceof rs){var s=r.style;r.useStyle(T({image:s.image,x:s.x,y:s.y,width:s.width,height:s.height},o))}else r.useStyle(o),"pointer"!==r.type&&r.setColor(a);r.setStyle(e.getModel(["pointer","itemStyle"]).getItemStyle()),"auto"===r.style.fill&&r.setStyle("fill",i(ji(y.get(v,t),x,[0,1],!0))),r.z2EmphasisLift=0,yl(r,e),pl(r,n.get("focus"),n.get("blurScope"))}if(g){var l=p[t];l.useStyle(y.getItemVisual(t,"style")),l.setStyle(e.getModel(["progress","itemStyle"]).getItemStyle()),l.z2EmphasisLift=0,yl(l,e),pl(l,n.get("focus"),n.get("blurScope"))}})),this._progressEls=p)},e.prototype._renderAnchor=function(t,e){var n=t.getModel("anchor");if(n.get("show")){var i=n.get("size"),r=n.get("icon"),o=n.get("offsetCenter"),a=n.get("keepAspect"),s=ty(r,e.cx-i/2+qi(o[0],e.r),e.cy-i/2+qi(o[1],e.r),i,i,null,a);s.z2=n.get("showAbove")?1:0,s.setStyle(n.getModel("itemStyle").getItemStyle()),this.group.add(s)}},e.prototype._renderTitleAndDetail=function(t,e,n,i,r){var o=this,a=t.getData(),s=a.mapDimension("value"),l=+t.get("min"),u=+t.get("max"),h=new Bi,c=[],p=[],d=t.isAnimationEnabled(),f=t.get(["pointer","showAbove"]);a.diff(this._data).add((function(t){c[t]=new fs({silent:!0}),p[t]=new fs({silent:!0})})).update((function(t,e){c[t]=o._titleEls[e],p[t]=o._detailEls[e]})).execute(),a.each((function(e){var n=a.getItemModel(e),o=a.get(s,e),g=new Bi,y=i(ji(o,[l,u],[0,1],!0)),v=n.getModel("title");if(v.get("show")){var m=v.get("offsetCenter"),_=r.cx+qi(m[0],r.r),x=r.cy+qi(m[1],r.r);(D=c[e]).attr({z2:f?0:2,style:wh(v,{x:_,y:x,text:a.getName(e),align:"center",verticalAlign:"middle"},{inheritColor:y})}),g.add(D)}var b=n.getModel("detail");if(b.get("show")){var w=b.get("offsetCenter"),S=r.cx+qi(w[0],r.r),M=r.cy+qi(w[1],r.r),I=qi(b.get("width"),r.r),T=qi(b.get("height"),r.r),C=t.get(["progress","show"])?a.getItemVisual(e,"style").fill:y,D=p[e],A=b.get("formatter");D.attr({z2:f?0:2,style:wh(b,{x:S,y:M,text:BD(o,A),width:isNaN(I)?null:I,height:isNaN(T)?null:T,align:"center",verticalAlign:"middle"},{inheritColor:C})}),kh(D,{normal:b},o,(function(t){return BD(t,A)})),d&&Lh(D,e,a,t,{getFormattedLabel:function(t,e,n,i,r,a){return BD(a?a.interpolatedValue:o,A)}}),g.add(D)}h.add(g)})),this.group.add(h),this._titleEls=c,this._detailEls=p},e.type="gauge",e}(Yf),HD=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="itemStyle",n}return n(e,t),e.prototype.getInitialData=function(t,e){return JS(this,["value"])},e.type="series.gauge",e.defaultOption={zlevel:0,z:2,colorBy:"data",center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,roundCap:!1,lineStyle:{color:[[1,"#E6EBF8"]],width:10}},progress:{show:!1,overlap:!0,width:10,roundCap:!1,clip:!0},splitLine:{show:!0,length:10,distance:10,lineStyle:{color:"#63677A",width:3,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:6,distance:10,lineStyle:{color:"#63677A",width:1,type:"solid"}},axisLabel:{show:!0,distance:15,color:"#464646",fontSize:12},pointer:{icon:null,offsetCenter:[0,0],show:!0,showAbove:!0,length:"60%",width:6,keepAspect:!1},anchor:{show:!1,showAbove:!1,size:6,icon:"circle",offsetCenter:[0,0],keepAspect:!1,itemStyle:{color:"#fff",borderWidth:0,borderColor:"#5470c6"}},title:{show:!0,offsetCenter:[0,"20%"],color:"#464646",fontSize:16,valueAnimation:!1},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:null,padding:[5,10],offsetCenter:[0,"40%"],color:"#464646",fontSize:30,fontWeight:"bold",lineHeight:30,valueAnimation:!1}},e}(Rf);var WD=["itemStyle","opacity"],UD=function(t){function e(e,n){var i=t.call(this)||this,r=i,o=new du,a=new fs;return r.setTextContent(a),i.setTextGuideLine(o),i.updateData(e,n,!0),i}return n(e,t),e.prototype.updateData=function(t,e,n){var i=this,r=t.hostModel,o=t.getItemModel(e),a=t.getItemLayout(e),s=o.getModel("emphasis"),l=o.get(WD);l=null==l?1:l,n||Wu(i),i.useStyle(t.getItemVisual(e,"style")),i.style.lineJoin="round",n?(i.setShape({points:a.points}),i.style.opacity=0,Vu(i,{style:{opacity:l}},r,e)):Eu(i,{style:{opacity:l},shape:{points:a.points}},r,e),yl(i,o),this._updateLabel(t,e),pl(this,s.get("focus"),s.get("blurScope"))},e.prototype._updateLabel=function(t,e){var n=this,i=this.getTextGuideLine(),r=n.getTextContent(),o=t.hostModel,a=t.getItemModel(e),s=t.getItemLayout(e).label,l=t.getItemVisual(e,"style"),u=l.fill;xh(r,bh(a),{labelFetcher:t.hostModel,labelDataIndex:e,defaultOpacity:l.opacity,defaultText:t.getName(e)},{normal:{align:s.textAlign,verticalAlign:s.verticalAlign}}),n.setTextConfig({local:!0,inside:!!s.inside,insideStroke:u,outsideFill:u});var h=s.linePoints;i.setShape({points:h}),n.textGuideLineConfig={anchor:h?new li(h[0][0],h[0][1]):null},Eu(r,{style:{x:s.x,y:s.y}},o,e),r.attr({rotation:s.rotation,originX:s.x,originY:s.y,z2:10}),pb(n,db(a),{stroke:u})},e}(cu),XD=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreLabelLineUpdate=!0,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this._data,o=this.group;i.diff(r).add((function(t){var e=new UD(i,t);i.setItemGraphicEl(t,e),o.add(e)})).update((function(t,e){var n=r.getItemGraphicEl(e);n.updateData(i,t),o.add(n),i.setItemGraphicEl(t,n)})).remove((function(e){Hu(r.getItemGraphicEl(e),t,e)})).execute(),this._data=i},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.prototype.dispose=function(){},e.type="funnel",e}(Yf),YD=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new QS(B(this.getData,this),B(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.getInitialData=function(t,e){return JS(this,{coordDimensions:["value"],encodeDefaulter:G(_p,this)})},e.prototype._defaultLabelLine=function(t){Sr(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=n.mapDimension("value"),o=n.getSum(r);return i.percent=o?+(n.get(r,e)/o*100).toFixed(2):0,i.$vars.push("percent"),i},e.type="series.funnel",e.defaultOption={zlevel:0,z:2,legendHoverLink:!0,colorBy:"data",left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",orient:"vertical",gap:0,funnelAlign:"center",label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1}},itemStyle:{borderColor:"#fff",borderWidth:1},emphasis:{label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(Rf);function ZD(t,e){t.eachSeriesByType("funnel",(function(t){var n=t.getData(),i=n.mapDimension("value"),r=t.get("sort"),o=function(t,e){return jc(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e),a=t.get("orient"),s=o.width,l=o.height,u=function(t,e){for(var n=t.mapDimension("value"),i=t.mapArray(n,(function(t){return t})),r=[],o="ascending"===e,a=0,s=t.count();a5)return;var i=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==i.behavior&&this._dispatchExpand({axisExpandWindow:i.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&aA(this,"mousemove")){var e=this._model,n=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),i=n.behavior;"jump"===i&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===i?null:{axisExpandWindow:n.axisExpandWindow,animation:"jump"===i?null:{duration:0}})}}};function aA(t,e){var n=t._model;return n.get("axisExpandable")&&n.get("axisExpandTriggerOn")===e}var sA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){t.prototype.init.apply(this,arguments),this.mergeOption({})},e.prototype.mergeOption=function(t){var e=this.option;t&&M(e,t,!0),this._initDimensions()},e.prototype.contains=function(t,e){var n=t.get("parallelIndex");return null!=n&&e.getComponent("parallel",n)===this},e.prototype.setAxisExpand=function(t){O(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],(function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])}),this)},e.prototype._initDimensions=function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[];O(z(this.ecModel.queryComponents({mainType:"parallelAxis"}),(function(t){return(t.get("parallelIndex")||0)===this.componentIndex}),this),(function(n){t.push("dim"+n.get("dim")),e.push(n.componentIndex)}))},e.type="parallel",e.dependencies=["parallelAxis"],e.layoutMode="box",e.defaultOption={zlevel:0,z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},e}(ep),lA=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.type=r||"value",a.axisIndex=o,a}return n(e,t),e.prototype.isHorizontal=function(){return"horizontal"!==this.coordinateSystem.getModel().get("layout")},e}(Hx);function uA(t,e,n,i,r,o){t=t||0;var a=n[1]-n[0];if(null!=r&&(r=cA(r,[0,a])),null!=o&&(o=Math.max(o,null!=r?r:0)),"all"===i){var s=Math.abs(e[1]-e[0]);s=cA(s,[0,a]),r=o=cA(s,[r,o]),i=0}e[0]=cA(e[0],n),e[1]=cA(e[1],n);var l=hA(e,i);e[i]+=t;var u,h=r||0,c=n.slice();return l.sign<0?c[0]+=h:c[1]-=h,e[i]=cA(e[i],c),u=hA(e,i),null!=r&&(u.sign!==l.sign||u.spano&&(e[1-i]=e[i]+u.sign*o),e}function hA(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function cA(t,e){return Math.min(null!=e[1]?e[1]:1/0,Math.max(null!=e[0]?e[0]:-1/0,t))}var pA=O,dA=Math.min,fA=Math.max,gA=Math.floor,yA=Math.ceil,vA=Ki,mA=Math.PI,_A=function(){function t(t,e,n){this.type="parallel",this._axesMap=ct(),this._axesLayout={},this.dimensions=t.dimensions,this._model=t,this._init(t,e,n)}return t.prototype._init=function(t,e,n){var i=t.dimensions,r=t.parallelAxisIndex;pA(i,(function(t,n){var i=r[n],o=e.getComponent("parallelAxis",i),a=this._axesMap.set(t,new lA(t,yx(o),[0,0],o.get("type"),i)),s="category"===a.type;a.onBand=s&&o.get("boundaryGap"),a.inverse=o.get("inverse"),o.axis=a,a.model=o,a.coordinateSystem=o.coordinateSystem=this}),this)},t.prototype.update=function(t,e){this._updateAxesFromSeries(this._model,t)},t.prototype.containPoint=function(t){var e=this._makeLayoutInfo(),n=e.axisBase,i=e.layoutBase,r=e.pixelDimIndex,o=t[1-r],a=t[r];return o>=n&&o<=n+e.axisLength&&a>=i&&a<=i+e.layoutLength},t.prototype.getModel=function(){return this._model},t.prototype._updateAxesFromSeries=function(t,e){e.eachSeries((function(n){if(t.contains(n,e)){var i=n.getData();pA(this.dimensions,(function(t){var e=this._axesMap.get(t);e.scale.unionExtentFromData(i,i.mapDimension(t)),gx(e.scale,e.model)}),this)}}),this)},t.prototype.resize=function(t,e){this._rect=jc(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},t.prototype.getRect=function(){return this._rect},t.prototype._makeLayoutInfo=function(){var t,e=this._model,n=this._rect,i=["x","y"],r=["width","height"],o=e.get("layout"),a="horizontal"===o?0:1,s=n[r[a]],l=[0,s],u=this.dimensions.length,h=xA(e.get("axisExpandWidth"),l),c=xA(e.get("axisExpandCount")||0,[0,u]),p=e.get("axisExpandable")&&u>3&&u>c&&c>1&&h>0&&s>0,d=e.get("axisExpandWindow");d?(t=xA(d[1]-d[0],l),d[1]=d[0]+t):(t=xA(h*(c-1),l),(d=[h*(e.get("axisExpandCenter")||gA(u/2))-t/2])[1]=d[0]+t);var f=(s-t)/(u-c);f<3&&(f=0);var g=[gA(vA(d[0]/h,1))+1,yA(vA(d[1]/h,1))-1],y=f/h*d[0];return{layout:o,pixelDimIndex:a,layoutBase:n[i[a]],layoutLength:s,axisBase:n[i[1-a]],axisLength:n[r[1-a]],axisExpandable:p,axisExpandWidth:h,axisCollapseWidth:f,axisExpandWindow:d,axisCount:u,winInnerIndices:g,axisExpandWindow0Pos:y}},t.prototype._layoutAxes=function(){var t=this._rect,e=this._axesMap,n=this.dimensions,i=this._makeLayoutInfo(),r=i.layout;e.each((function(t){var e=[0,i.axisLength],n=t.inverse?1:0;t.setExtent(e[n],e[1-n])})),pA(n,(function(e,n){var o=(i.axisExpandable?wA:bA)(n,i),a={horizontal:{x:o.position,y:i.axisLength},vertical:{x:0,y:o.position}},s={horizontal:mA/2,vertical:0},l=[a[r].x+t.x,a[r].y+t.y],u=s[r],h=[1,0,0,1,0,0];Yn(h,h,u),Xn(h,h,l),this._axesLayout[e]={position:l,rotation:u,transform:h,axisNameAvailableWidth:o.axisNameAvailableWidth,axisLabelShow:o.axisLabelShow,nameTruncateMaxWidth:o.nameTruncateMaxWidth,tickDirection:1,labelDirection:1}}),this)},t.prototype.getAxis=function(t){return this._axesMap.get(t)},t.prototype.dataToPoint=function(t,e){return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t),e)},t.prototype.eachActiveState=function(t,e,n,i){null==n&&(n=0),null==i&&(i=t.count());var r=this._axesMap,o=this.dimensions,a=[],s=[];O(o,(function(e){a.push(t.mapDimension(e)),s.push(r.get(e).model)}));for(var l=this.hasAxisBrushed(),u=n;ur*(1-h[0])?(l="jump",a=s-r*(1-h[2])):(a=s-r*h[1])>=0&&(a=s-r*(1-h[1]))<=0&&(a=0),(a*=e.axisExpandWidth/u)?uA(a,i,o,"all"):l="none";else{var p=i[1]-i[0];(i=[fA(0,o[1]*s/p-p/2)])[1]=dA(o[1],i[0]+p),i[0]=i[1]-p}return{axisExpandWindow:i,behavior:l}},t}();function xA(t,e){return dA(fA(t,e[0]),e[1])}function bA(t,e){var n=e.layoutLength/(e.axisCount-1);return{position:n*t,axisNameAvailableWidth:n,axisLabelShow:!0}}function wA(t,e){var n,i,r=e.layoutLength,o=e.axisExpandWidth,a=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,u=s,h=!1;return t=0;n--)$i(e[n])},e.prototype.getActiveState=function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(+t))return"inactive";if(1===e.length){var n=e[0];if(n[0]<=t&&t<=n[1])return"active"}else for(var i=0,r=e.length;i6}(t)||o){if(a&&!o){"single"===s.brushMode&&WA(t);var l=S(s);l.brushType=ak(l.brushType,a),l.panelId=a===IA?null:a.panelId,o=t._creatingCover=NA(t,l),t._covers.push(o)}if(o){var u=uk[ak(t._brushType,a)];o.__brushOption.range=u.getCreatingRange(nk(t,o,t._track)),i&&(zA(t,o),u.updateCommon(t,o)),EA(t,o),r={isEnd:i}}}else i&&"single"===s.brushMode&&s.removeOnClick&&FA(t,e,n)&&WA(t)&&(r={isEnd:i,removeOnClick:!0});return r}function ak(t,e){return"auto"===t?e.defaultBrushType:t}var sk={mousedown:function(t){if(this._dragging)lk(this,t);else if(!t.target||!t.target.draggable){ik(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=FA(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=t.offsetX,n=t.offsetY,i=this.group.transformCoordToLocal(e,n);if(function(t,e,n){if(t._brushType&&!function(t,e,n){var i=t._zr;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}(t,e.offsetX,e.offsetY)){var i=t._zr,r=t._covers,o=FA(t,e,n);if(!t._dragging)for(var a=0;a=0&&(o[r[a].depth]=new Wh(r[a],this,e));if(i&&n)return RD(i,n,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getData().getItemLayout(e);if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t})),e.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getGraph().getEdgeByIndex(e).node1.getLayout();if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t}))})).data},e.prototype.setNodePosition=function(t,e){var n=(this.option.data||this.option.nodes)[t];n.localX=e[0],n.localY=e[1]},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.formatTooltip=function(t,e,n){function i(t){return isNaN(t)||null==t}if("edge"===n){var r=this.getDataParams(t,n),o=r.data,a=r.value;return bf("nameValue",{name:o.source+" -- "+o.target,value:a,noValue:i(a)})}var s=this.getGraph().getNodeByIndex(t).getLayout().value,l=this.getDataParams(t,n).data.name;return bf("nameValue",{name:null!=l?l+"":null,value:s,noValue:i(s)})},e.prototype.optionUpdated=function(){},e.prototype.getDataParams=function(e,n){var i=t.prototype.getDataParams.call(this,e,n);if(null==i.value&&"node"===n){var r=this.getGraph().getNodeByIndex(e).getLayout().value;i.value=r}return i},e.type="series.sankey",e.defaultOption={zlevel:0,z:2,coordinateSystem:"view",left:"5%",top:"5%",right:"20%",bottom:"5%",orient:"horizontal",nodeWidth:20,nodeGap:8,draggable:!0,layoutIterations:32,label:{show:!0,position:"right",fontSize:12},levels:[],nodeAlign:"justify",lineStyle:{color:"#314656",opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.5}},select:{itemStyle:{borderColor:"#212121"}},animationEasing:"linear",animationDuration:1e3},e}(Rf);function Mk(t,e){t.eachSeriesByType("sankey",(function(t){var n=t.get("nodeWidth"),i=t.get("nodeGap"),r=function(t,e){return jc(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=r;var o=r.width,a=r.height,s=t.getGraph(),l=s.nodes,u=s.edges;!function(t){O(t,(function(t){var e=Rk(t.outEdges,Ok),n=Rk(t.inEdges,Ok),i=t.getValue()||0,r=Math.max(e,n,i);t.setLayout({value:r},!0)}))}(l),function(t,e,n,i,r,o,a,s,l){(function(t,e,n,i,r,o,a){for(var s=[],l=[],u=[],h=[],c=0,p=0;p=0;v&&y.depth>d&&(d=y.depth),g.setLayout({depth:v?y.depth:c},!0),"vertical"===o?g.setLayout({dy:n},!0):g.setLayout({dx:n},!0);for(var m=0;mc-1?d:c-1;a&&"left"!==a&&function(t,e,n,i){if("right"===e){for(var r=[],o=t,a=0;o.length;){for(var s=0;s0;o--)Ck(s,l*=.99,a),Tk(s,r,n,i,a),Nk(s,l,a),Tk(s,r,n,i,a)}(t,e,o,r,i,a,s),function(t,e){var n="vertical"===e?"x":"y";O(t,(function(t){t.outEdges.sort((function(t,e){return t.node2.getLayout()[n]-e.node2.getLayout()[n]})),t.inEdges.sort((function(t,e){return t.node1.getLayout()[n]-e.node1.getLayout()[n]}))})),O(t,(function(t){var e=0,n=0;O(t.outEdges,(function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy})),O(t.inEdges,(function(t){t.setLayout({ty:n},!0),n+=t.getLayout().dy}))}))}(t,s)}(l,u,n,i,o,a,0!==z(l,(function(t){return 0===t.getLayout().value})).length?0:t.get("layoutIterations"),t.get("orient"),t.get("nodeAlign"))}))}function Ik(t){var e=t.hostGraph.data.getRawDataItem(t.dataIndex);return null!=e.depth&&e.depth>=0}function Tk(t,e,n,i,r){var o="vertical"===r?"x":"y";O(t,(function(t){var a,s,l;t.sort((function(t,e){return t.getLayout()[o]-e.getLayout()[o]}));for(var u=0,h=t.length,c="vertical"===r?"dx":"dy",p=0;p0&&(a=s.getLayout()[o]+l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]+s.getLayout()[c]+e;if((l=u-e-("vertical"===r?i:n))>0){a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0),u=a;for(p=h-2;p>=0;--p)(l=(s=t[p]).getLayout()[o]+s.getLayout()[c]+e-u)>0&&(a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]}}))}function Ck(t,e,n){O(t.slice().reverse(),(function(t){O(t,(function(t){if(t.outEdges.length){var i=Rk(t.outEdges,Dk,n)/Rk(t.outEdges,Ok);if(isNaN(i)){var r=t.outEdges.length;i=r?Rk(t.outEdges,Ak,n)/r:0}if("vertical"===n){var o=t.getLayout().x+(i-Pk(t,n))*e;t.setLayout({x:o},!0)}else{var a=t.getLayout().y+(i-Pk(t,n))*e;t.setLayout({y:a},!0)}}}))}))}function Dk(t,e){return Pk(t.node2,e)*t.getValue()}function Ak(t,e){return Pk(t.node2,e)}function kk(t,e){return Pk(t.node1,e)*t.getValue()}function Lk(t,e){return Pk(t.node1,e)}function Pk(t,e){return"vertical"===e?t.getLayout().x+t.getLayout().dx/2:t.getLayout().y+t.getLayout().dy/2}function Ok(t){return t.getValue()}function Rk(t,e,n){for(var i=0,r=t.length,o=-1;++oi&&(i=e)})),O(e,(function(e){var r=new iC({type:"color",mappingMethod:"linear",dataExtent:[n,i],visual:t.get("color")}).mapValueToVisual(e.getLayout().value),o=e.getModel().get(["itemStyle","color"]);null!=o?(e.setVisual("color",o),e.setVisual("style",{fill:o})):(e.setVisual("color",r),e.setVisual("style",{fill:r}))}))}}))}var Ek=function(){function t(){}return t.prototype.getInitialData=function(t,e){var n,i,r=e.getComponent("xAxis",this.get("xAxisIndex")),o=e.getComponent("yAxis",this.get("yAxisIndex")),a=r.get("type"),s=o.get("type");"category"===a?(t.layout="horizontal",n=r.getOrdinalMeta(),i=!0):"category"===s?(t.layout="vertical",n=o.getOrdinalMeta(),i=!0):t.layout=t.layout||"horizontal";var l=["x","y"],u="horizontal"===t.layout?0:1,h=this._baseAxisDim=l[u],c=l[1-u],p=[r,o],d=p[u].get("type"),f=p[1-u].get("type"),g=t.data;if(g&&i){var y=[];O(g,(function(t,e){var n;F(t)?(n=t.slice(),t.unshift(e)):F(t.value)?((n=T({},t)).value=n.value.slice(),t.value.unshift(e)):n=t,y.push(n)})),t.data=y}var v=this.defaultValueDimensions,m=[{name:h,type:Fm(d),ordinalMeta:n,otherDims:{tooltip:!1,itemName:0},dimsDef:["base"]},{name:c,type:Fm(f),dimsDef:v.slice()}];return JS(this,{coordDimensions:m,dimensionsCount:v.length+1,encodeDefaulter:G(mp,m,this)})},t.prototype.getBaseAxis=function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis},t}(),Vk=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"min",defaultTooltip:!0},{name:"Q1",defaultTooltip:!0},{name:"median",defaultTooltip:!0},{name:"Q3",defaultTooltip:!0},{name:"max",defaultTooltip:!0}],n.visualDrawType="stroke",n}return n(e,t),e.type="series.boxplot",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,boxWidth:[7,50],itemStyle:{color:"#fff",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2,shadowBlur:5,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0,0,0,0.2)"}},animationDuration:800},e}(Rf);L(Vk,Ek,!0);var Bk=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this.group,o=this._data;this._data||r.removeAll();var a="horizontal"===t.get("layout")?1:0;i.diff(o).add((function(t){if(i.hasValue(t)){var e=Hk(i.getItemLayout(t),i,t,a,!0);i.setItemGraphicEl(t,e),r.add(e)}})).update((function(t,e){var n=o.getItemGraphicEl(e);if(i.hasValue(t)){var s=i.getItemLayout(t);n?(Wu(n),Wk(s,n,i,t)):n=Hk(s,i,t,a),r.add(n),i.setItemGraphicEl(t,n)}else r.remove(n)})).remove((function(t){var e=o.getItemGraphicEl(t);e&&r.remove(e)})).execute(),this._data=i},e.prototype.remove=function(t){var e=this.group,n=this._data;this._data=null,n&&n.eachItemGraphicEl((function(t){t&&e.remove(t)}))},e.type="boxplot",e}(Yf),Gk=function(){},Fk=function(t){function e(e){var n=t.call(this,e)||this;return n.type="boxplotBoxPath",n}return n(e,t),e.prototype.getDefaultShape=function(){return new Gk},e.prototype.buildPath=function(t,e){var n=e.points,i=0;for(t.moveTo(n[i][0],n[i][1]),i++;i<4;i++)t.lineTo(n[i][0],n[i][1]);for(t.closePath();ig){var x=[v,_];i.push(x)}}}return{boxData:n,outliers:i}}(e.getRawData(),t.config);return[{dimensions:["ItemName","Low","Q1","Q2","Q3","High"],data:i.boxData},{data:i.outliers}]}};var qk=["color","borderColor"],Kk=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeClipPath(),this._updateDrawMode(t),this._isLargeDraw?this._renderLarge(t):this._renderNormal(t)},e.prototype.incrementalPrepareRender=function(t,e,n){this._clear(),this._updateDrawMode(t)},e.prototype.incrementalRender=function(t,e,n,i){this._isLargeDraw?this._incrementalRenderLarge(t,e):this._incrementalRenderNormal(t,e)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t){var e=t.getData(),n=this._data,i=this.group,r=e.getLayout("isSimpleBox"),o=t.get("clip",!0),a=t.coordinateSystem,s=a.getArea&&a.getArea();this._data||i.removeAll(),e.diff(n).add((function(n){if(e.hasValue(n)){var a=e.getItemLayout(n);if(o&&tL(s,a))return;var l=Qk(a,n,!0);Vu(l,{shape:{points:a.ends}},t,n),eL(l,e,n,r),i.add(l),e.setItemGraphicEl(n,l)}})).update((function(a,l){var u=n.getItemGraphicEl(l);if(e.hasValue(a)){var h=e.getItemLayout(a);o&&tL(s,h)?i.remove(u):(u?(Eu(u,{shape:{points:h.ends}},t,a),Wu(u)):u=Qk(h),eL(u,e,a,r),i.add(u),e.setItemGraphicEl(a,u))}else i.remove(u)})).remove((function(t){var e=n.getItemGraphicEl(t);e&&i.remove(e)})).execute(),this._data=e},e.prototype._renderLarge=function(t){this._clear(),oL(t,this.group);var e=t.get("clip",!0)?$w(t.coordinateSystem,!1,t):null;e?this.group.setClipPath(e):this.group.removeClipPath()},e.prototype._incrementalRenderNormal=function(t,e){for(var n,i=e.getData(),r=i.getLayout("isSimpleBox");null!=(n=t.next());){var o=Qk(i.getItemLayout(n));eL(o,i,n,r),o.incremental=!0,this.group.add(o)}},e.prototype._incrementalRenderLarge=function(t,e){oL(e,this.group,!0)},e.prototype.remove=function(t){this._clear()},e.prototype._clear=function(){this.group.removeAll(),this._data=null},e.type="candlestick",e}(Yf),$k=function(){},Jk=function(t){function e(e){var n=t.call(this,e)||this;return n.type="normalCandlestickBox",n}return n(e,t),e.prototype.getDefaultShape=function(){return new $k},e.prototype.buildPath=function(t,e){var n=e.points;this.__simpleBox?(t.moveTo(n[4][0],n[4][1]),t.lineTo(n[6][0],n[6][1])):(t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1]),t.lineTo(n[2][0],n[2][1]),t.lineTo(n[3][0],n[3][1]),t.closePath(),t.moveTo(n[4][0],n[4][1]),t.lineTo(n[5][0],n[5][1]),t.moveTo(n[6][0],n[6][1]),t.lineTo(n[7][0],n[7][1]))},e}(Qa);function Qk(t,e,n){var i=t.ends;return new Jk({shape:{points:n?nL(i,t):i},z2:100})}function tL(t,e){for(var n=!0,i=0;i0?"borderColor":"borderColor0"])||n.get(["itemStyle",t>0?"color":"color0"]),o=n.getModel("itemStyle").getItemStyle(qk);e.useStyle(o),e.style.fill=null,e.style.stroke=r}var sL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"open",defaultTooltip:!0},{name:"close",defaultTooltip:!0},{name:"lowest",defaultTooltip:!0},{name:"highest",defaultTooltip:!0}],n}return n(e,t),e.prototype.getShadowDim=function(){return"open"},e.prototype.brushSelector=function(t,e,n){var i=e.getItemLayout(t);return i&&n.rect(i.brushRect)},e.type="series.candlestick",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,clip:!0,itemStyle:{color:"#eb5454",color0:"#47b262",borderColor:"#eb5454",borderColor0:"#47b262",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,large:!0,largeThreshold:600,progressive:3e3,progressiveThreshold:1e4,progressiveChunkMode:"mod",animationEasing:"linear",animationDuration:300},e}(Rf);function lL(t){t&&F(t.series)&&O(t.series,(function(t){Y(t)&&"k"===t.type&&(t.type="candlestick")}))}L(sL,Ek,!0);var uL=["itemStyle","borderColor"],hL=["itemStyle","borderColor0"],cL=["itemStyle","color"],pL=["itemStyle","color0"],dL={seriesType:"candlestick",plan:Wf(),performRawSeries:!0,reset:function(t,e){function n(t,e){return e.get(t>0?cL:pL)}function i(t,e){return e.get(t>0?uL:hL)}if(!e.isSeriesFiltered(t))return!t.pipelineContext.large&&{progress:function(t,e){for(var r;null!=(r=t.next());){var o=e.getItemModel(r),a=e.getItemLayout(r).sign,s=o.getItemStyle();s.fill=n(a,o),s.stroke=i(a,o)||s.fill,T(e.ensureUniqueItemVisual(r,"style"),s)}}}}},fL="undefined"!=typeof Float32Array?Float32Array:Array,gL={seriesType:"candlestick",plan:Wf(),reset:function(t){var e=t.coordinateSystem,n=t.getData(),i=function(t,e){var n,i=t.getBaseAxis(),r="category"===i.type?i.getBandWidth():(n=i.getExtent(),Math.abs(n[1]-n[0])/e.count()),o=qi(et(t.get("barMaxWidth"),r),r),a=qi(et(t.get("barMinWidth"),1),r),s=t.get("barWidth");return null!=s?qi(s,r):Math.max(Math.min(r/2,o),a)}(t,n),r=["x","y"],o=n.getDimensionIndex(n.mapDimension(r[0])),a=R(n.mapDimensionsAll(r[1]),n.getDimensionIndex,n),s=a[0],l=a[1],u=a[2],h=a[3];if(n.setLayout({candleWidth:i,isSimpleBox:i<=1.3}),!(o<0||a.length<4))return{progress:t.pipelineContext.large?function(t,n){var i,r,a=new fL(4*t.count),c=0,p=[],d=[],f=n.getStore();for(;null!=(r=t.next());){var g=f.get(o,r),y=f.get(s,r),v=f.get(l,r),m=f.get(u,r),_=f.get(h,r);isNaN(g)||isNaN(m)||isNaN(_)?(a[c++]=NaN,c+=3):(a[c++]=yL(f,r,y,v,l),p[0]=g,p[1]=m,i=e.dataToPoint(p,null,d),a[c++]=i?i[0]:NaN,a[c++]=i?i[1]:NaN,p[1]=_,i=e.dataToPoint(p,null,d),a[c++]=i?i[1]:NaN)}n.setLayout("largePoints",a)}:function(t,n){var r,a=n.getStore();for(;null!=(r=t.next());){var c=a.get(o,r),p=a.get(s,r),d=a.get(l,r),f=a.get(u,r),g=a.get(h,r),y=Math.min(p,d),v=Math.max(p,d),m=S(y,c),_=S(v,c),x=S(f,c),b=S(g,c),w=[];M(w,_,0),M(w,m,1),w.push(T(b),T(_),T(x),T(m)),n.setItemLayout(r,{sign:yL(a,r,p,d,l),initBaseline:p>d?_[1]:m[1],ends:w,brushRect:I(f,g,c)})}function S(t,n){var i=[];return i[0]=n,i[1]=t,isNaN(n)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function M(t,e,n){var r=e.slice(),o=e.slice();r[0]=ih(r[0]+i/2,1,!1),o[0]=ih(o[0]-i/2,1,!0),n?t.push(r,o):t.push(o,r)}function I(t,e,n){var r=S(t,n),o=S(e,n);return r[0]-=i/2,o[0]-=i/2,{x:r[0],y:r[1],width:i,height:o[1]-r[1]}}function T(t){return t[0]=ih(t[0],1),t}}}}};function yL(t,e,n,i,r){return n>i?-1:n0?t.get(r,e-1)<=i?1:-1:1}function vL(t,e){var n=e.rippleEffectColor||e.color;t.eachChild((function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?n:null,fill:"fill"===e.brushType?n:null}})}))}var mL=function(t){function e(e,n){var i=t.call(this)||this,r=new kw(e,n),o=new Bi;return i.add(r),i.add(o),i.updateData(e,n),i}return n(e,t),e.prototype.stopEffectAnimation=function(){this.childAt(1).removeAll()},e.prototype.startEffectAnimation=function(t){for(var e=t.symbolType,n=t.color,i=t.rippleNumber,r=this.childAt(1),o=0;o0&&(a=this._getLineLength(i)/l*1e3),(a!==this._period||s!==this._loop)&&(i.stopAnimation(),a>0)){var h=void 0;h="function"==typeof u?u(n):u,i.__t>0&&(h=-a*i.__t),i.__t=0;var c=i.animate("",s).when(a,{__t:1}).delay(h).during((function(){r._updateSymbolPosition(i)}));s||c.done((function(){r.remove(i)})),c.start()}this._period=a,this._loop=s}},e.prototype._getLineLength=function(t){return Lt(t.__p1,t.__cp1)+Lt(t.__cp1,t.__p2)},e.prototype._updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},e.prototype.updateData=function(t,e,n){this.childAt(0).updateData(t,e,n),this._updateEffectSymbol(t,e)},e.prototype._updateSymbolPosition=function(t){var e=t.__p1,n=t.__p2,i=t.__cp1,r=t.__t,o=[t.x,t.y],a=o.slice(),s=Zo,l=jo;o[0]=s(e[0],i[0],n[0],r),o[1]=s(e[1],i[1],n[1],r);var u=l(e[0],i[0],n[0],r),h=l(e[1],i[1],n[1],r);t.rotation=-Math.atan2(h,u)-Math.PI/2,"line"!==this._symbolType&&"rect"!==this._symbolType&&"roundRect"!==this._symbolType||(void 0!==t.__lastT&&t.__lastT=0&&!(i[o]<=e);o--);o=Math.min(o,r-2)}else{for(o=a;oe);o++);o=Math.min(o-1,r-2)}var s=(e-i[o])/(i[o+1]-i[o]),l=n[o],u=n[o+1];t.x=l[0]*(1-s)+s*u[0],t.y=l[1]*(1-s)+s*u[1];var h=u[0]-l[0],c=u[1]-l[1];t.rotation=-Math.atan2(c,h)-Math.PI/2,this._lastFrame=o,this._lastFramePercent=e,t.ignore=!1}},e}(bL),ML=function(){this.polyline=!1,this.curveness=0,this.segs=[]},IL=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new ML},e.prototype.buildPath=function(t,e){var n=e.segs,i=e.curveness;if(e.polyline)for(var r=0;r0){t.moveTo(n[r++],n[r++]);for(var a=1;a0){var c=(s+u)/2-(l-h)*i,p=(l+h)/2-(u-s)*i;t.quadraticCurveTo(c,p,u,h)}else t.lineTo(u,h)}},e.prototype.findDataIndex=function(t,e){var n=this.shape,i=n.segs,r=n.curveness,o=this.style.lineWidth;if(n.polyline)for(var a=0,s=0;s0)for(var u=i[s++],h=i[s++],c=1;c0){if(za(u,h,(u+p)/2-(h-d)*r,(h+d)/2-(p-u)*r,p,d,o,t,e))return a}else if(Ra(u,h,p,d,o,t,e))return a;a++}return-1},e}(Qa),TL=function(){function t(){this.group=new Bi}return t.prototype.isPersistent=function(){return!this._incremental},t.prototype.updateData=function(t){this.group.removeAll();var e=new IL({rectHover:!0,cursor:"default"});e.setShape({segs:t.getLayout("linesPoints")}),this._setCommon(e,t),this.group.add(e),this._incremental=null},t.prototype.incrementalPrepareUpdate=function(t){this.group.removeAll(),this._clearIncremental(),t.count()>5e5?(this._incremental||(this._incremental=new Ou({silent:!0})),this.group.add(this._incremental)):this._incremental=null},t.prototype.incrementalUpdate=function(t,e){var n=new IL;n.setShape({segs:e.getLayout("linesPoints")}),this._setCommon(n,e,!!this._incremental),this._incremental?this._incremental.addDisplayable(n,!0):(n.rectHover=!0,n.cursor="default",n.__startIndex=t.start,this.group.add(n))},t.prototype.remove=function(){this._clearIncremental(),this._incremental=null,this.group.removeAll()},t.prototype._setCommon=function(t,e,n){var i=e.hostModel;t.setShape({polyline:i.get("polyline"),curveness:i.get(["lineStyle","curveness"])}),t.useStyle(i.getModel("lineStyle").getLineStyle()),t.style.strokeNoScale=!0;var r=e.getVisual("style");if(r&&r.stroke&&t.setStyle("stroke",r.stroke),t.setStyle("fill",null),!n){var o=Ss(t);o.seriesIndex=i.seriesIndex,t.on("mousemove",(function(e){o.dataIndex=null;var n=t.findDataIndex(e.offsetX,e.offsetY);n>0&&(o.dataIndex=n+t.__startIndex)}))}},t.prototype._clearIncremental=function(){var t=this._incremental;t&&t.clearDisplaybles()},t}(),CL={seriesType:"lines",plan:Wf(),reset:function(t){var e=t.coordinateSystem,n=t.get("polyline"),i=t.pipelineContext.large;return{progress:function(r,o){var a=[];if(i){var s=void 0,l=r.end-r.start;if(n){for(var u=0,h=r.start;h ")})},e.prototype.preventIncremental=function(){return!!this.get(["effect","show"])},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},e.type="series.lines",e.dependencies=["grid","polar","geo","calendar"],e.defaultOption={coordinateSystem:"geo",zlevel:0,z:2,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:"end"},lineStyle:{opacity:.5}},e}(Rf);function OL(t){return t instanceof Array||(t=[t,t]),t}var RL={seriesType:"lines",reset:function(t){var e=OL(t.get("symbol")),n=OL(t.get("symbolSize")),i=t.getData();return i.setVisual("fromSymbol",e&&e[0]),i.setVisual("toSymbol",e&&e[1]),i.setVisual("fromSymbolSize",n&&n[0]),i.setVisual("toSymbolSize",n&&n[1]),{dataEach:i.hasItemOption?function(t,e){var n=t.getItemModel(e),i=OL(n.getShallow("symbol",!0)),r=OL(n.getShallow("symbolSize",!0));i[0]&&t.setItemVisual(e,"fromSymbol",i[0]),i[1]&&t.setItemVisual(e,"toSymbol",i[1]),r[0]&&t.setItemVisual(e,"fromSymbolSize",r[0]),r[1]&&t.setItemVisual(e,"toSymbolSize",r[1])}:null}}};var NL=function(){function t(){this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={inRange:null,outOfRange:null};var t=D();this.canvas=t}return t.prototype.update=function(t,e,n,i,r,o){var a=this._getBrush(),s=this._getGradient(r,"inRange"),l=this._getGradient(r,"outOfRange"),u=this.pointSize+this.blurSize,h=this.canvas,c=h.getContext("2d"),p=t.length;h.width=e,h.height=n;for(var d=0;d0){var I=o(v)?s:l;v>0&&(v=v*S+w),_[x++]=I[M],_[x++]=I[M+1],_[x++]=I[M+2],_[x++]=I[M+3]*v*256}else x+=4}return c.putImageData(m,0,0),h},t.prototype._getBrush=function(){var t=this._brushCanvas||(this._brushCanvas=D()),e=this.pointSize+this.blurSize,n=2*e;t.width=n,t.height=n;var i=t.getContext("2d");return i.clearRect(0,0,n,n),i.shadowOffsetX=n,i.shadowBlur=this.blurSize,i.shadowColor="#000",i.beginPath(),i.arc(-e,e,this.pointSize,0,2*Math.PI,!0),i.closePath(),i.fill(),t},t.prototype._getGradient=function(t,e){for(var n=this._gradientPixels,i=n[e]||(n[e]=new Uint8ClampedArray(1024)),r=[0,0,0,0],o=0,a=0;a<256;a++)t[e](a/255,!0,r),i[o++]=r[0],i[o++]=r[1],i[o++]=r[2],i[o++]=r[3];return i},t}();function zL(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var EL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i;e.eachComponent("visualMap",(function(e){e.eachTargetSeries((function(n){n===t&&(i=e)}))})),this.group.removeAll(),this._incrementalDisplayable=null;var r=t.coordinateSystem;"cartesian2d"===r.type||"calendar"===r.type?this._renderOnCartesianAndCalendar(t,n,0,t.getData().count()):zL(r)&&this._renderOnGeo(r,t,i,n)},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll()},e.prototype.incrementalRender=function(t,e,n,i){var r=e.coordinateSystem;r&&(zL(r)?this.render(e,n,i):this._renderOnCartesianAndCalendar(e,i,t.start,t.end,!0))},e.prototype._renderOnCartesianAndCalendar=function(t,e,n,i,r){var o,a,s,l,u=t.coordinateSystem;if(Jw(u,"cartesian2d")){var h=u.getAxis("x"),c=u.getAxis("y");0,o=h.getBandWidth(),a=c.getBandWidth(),s=h.scale.getExtent(),l=c.scale.getExtent()}for(var p=this.group,d=t.getData(),f=t.getModel(["emphasis","itemStyle"]).getItemStyle(),g=t.getModel(["blur","itemStyle"]).getItemStyle(),y=t.getModel(["select","itemStyle"]).getItemStyle(),v=bh(t),m=t.get(["emphasis","focus"]),_=t.get(["emphasis","blurScope"]),x=Jw(u,"cartesian2d")?[d.mapDimension("x"),d.mapDimension("y"),d.mapDimension("value")]:[d.mapDimension("time"),d.mapDimension("value")],b=n;bs[1]||Il[1])continue;var T=u.dataToPoint([M,I]);w=new cs({shape:{x:Math.floor(Math.round(T[0])-o/2),y:Math.floor(Math.round(T[1])-a/2),width:Math.ceil(o),height:Math.ceil(a)},style:S})}else{if(isNaN(d.get(x[1],b)))continue;w=new cs({z2:1,shape:u.dataToRect([d.get(x[0],b)]).contentShape,style:S})}var C=d.getItemModel(b);if(d.hasItemOption){var D=C.getModel("emphasis");f=D.getModel("itemStyle").getItemStyle(),g=C.getModel(["blur","itemStyle"]).getItemStyle(),y=C.getModel(["select","itemStyle"]).getItemStyle(),m=D.get("focus"),_=D.get("blurScope"),v=bh(C)}var A=t.getRawValue(b),k="-";A&&null!=A[2]&&(k=A[2]+""),xh(w,v,{labelFetcher:t,labelDataIndex:b,defaultOpacity:S.opacity,defaultText:k}),w.ensureState("emphasis").style=f,w.ensureState("blur").style=g,w.ensureState("select").style=y,pl(w,m,_),w.incremental=r,r&&(w.states.emphasis.hoverLayer=!0),p.add(w),d.setItemGraphicEl(b,w)}},e.prototype._renderOnGeo=function(t,e,n,i){var r=n.targetVisuals.inRange,o=n.targetVisuals.outOfRange,a=e.getData(),s=this._hmLayer||this._hmLayer||new NL;s.blurSize=e.get("blurSize"),s.pointSize=e.get("pointSize"),s.minOpacity=e.get("minOpacity"),s.maxOpacity=e.get("maxOpacity");var l=t.getViewRect().clone(),u=t.getRoamTransform();l.applyTransform(u);var h=Math.max(l.x,0),c=Math.max(l.y,0),p=Math.min(l.width+l.x,i.getWidth()),d=Math.min(l.height+l.y,i.getHeight()),f=p-h,g=d-c,y=[a.mapDimension("lng"),a.mapDimension("lat"),a.mapDimension("value")],v=a.mapArray(y,(function(e,n,i){var r=t.dataToPoint([e,n]);return r[0]-=h,r[1]-=c,r.push(i),r})),m=n.getExtent(),_="visualMap.continuous"===n.type?function(t,e){var n=t[1]-t[0];return e=[(e[0]-t[0])/n,(e[1]-t[0])/n],function(t){return t>=e[0]&&t<=e[1]}}(m,n.option.range):function(t,e,n){var i=t[1]-t[0],r=(e=R(e,(function(e){return{interval:[(e.interval[0]-t[0])/i,(e.interval[1]-t[0])/i]}}))).length,o=0;return function(t){var i;for(i=o;i=0;i--){var a;if((a=e[i].interval)[0]<=t&&t<=a[1]){o=i;break}}return i>=0&&i0?1:o<0?-1:0}(n,o,r,i,c),function(t,e,n,i,r,o,a,s,l,u){var h,c=l.valueDim,p=l.categoryDim,d=Math.abs(n[p.wh]),f=t.getItemVisual(e,"symbolSize");h=F(f)?f.slice():null==f?["100%","100%"]:[f,f];h[p.index]=qi(h[p.index],d),h[c.index]=qi(h[c.index],i?d:Math.abs(o)),u.symbolSize=h,(u.symbolScale=[h[0]/s,h[1]/s])[c.index]*=(l.isHorizontal?-1:1)*a}(t,e,r,o,0,c.boundingLength,c.pxSign,u,i,c),function(t,e,n,i,r){var o=t.get(BL)||0;o&&(FL.attr({scaleX:e[0],scaleY:e[1],rotation:n}),FL.updateTransform(),o/=FL.getLineScale(),o*=e[i.valueDim.index]);r.valueLineWidth=o}(n,c.symbolScale,l,i,c);var p=c.symbolSize,d=ny(n.get("symbolOffset"),p);return function(t,e,n,i,r,o,a,s,l,u,h,c){var p=h.categoryDim,d=h.valueDim,f=c.pxSign,g=Math.max(e[d.index]+s,0),y=g;if(i){var v=Math.abs(l),m=tt(t.get("symbolMargin"),"15%")+"",_=!1;m.lastIndexOf("!")===m.length-1&&(_=!0,m=m.slice(0,m.length-1));var x=qi(m,e[d.index]),b=Math.max(g+2*x,0),w=_?0:2*x,S=fr(i),M=S?i:oP((v+w)/b);b=g+2*(x=(v-M*g)/2/(_?M:Math.max(M-1,1))),w=_?0:2*x,S||"fixed"===i||(M=u?oP((Math.abs(u)+w)/b):0),y=M*b-w,c.repeatTimes=M,c.symbolMargin=x}var I=f*(y/2),C=c.pathPosition=[];C[p.index]=n[p.wh]/2,C[d.index]="start"===a?I:"end"===a?l-I:l/2,o&&(C[0]+=o[0],C[1]+=o[1]);var D=c.bundlePosition=[];D[p.index]=n[p.xy],D[d.index]=n[d.xy];var A=c.barRectShape=T({},n);A[d.wh]=f*Math.max(Math.abs(n[d.wh]),Math.abs(C[d.index]+I)),A[p.wh]=n[p.wh];var k=c.clipShape={};k[p.xy]=-n[p.xy],k[p.wh]=h.ecSize[p.wh],k[d.xy]=0,k[d.wh]=n[d.wh]}(n,p,r,o,0,d,s,c.valueLineWidth,c.boundingLength,c.repeatCutLength,i,c),c}function UL(t,e){return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e)))}function XL(t){var e=t.symbolPatternSize,n=ty(t.symbolType,-e/2,-e/2,e,e);return n.attr({culling:!0}),"image"!==n.type&&n.setStyle({strokeNoScale:!0}),n}function YL(t,e,n,i){var r=t.__pictorialBundle,o=n.symbolSize,a=n.valueLineWidth,s=n.pathPosition,l=e.valueDim,u=n.repeatTimes||0,h=0,c=o[e.valueDim.index]+a+2*n.symbolMargin;for(nP(t,(function(t){t.__pictorialAnimationIndex=h,t.__pictorialRepeatTimes=u,h0:i<0)&&(r=u-1-t),e[l.index]=c*(r-u/2+.5)+s[l.index],{x:e[0],y:e[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation}}}function ZL(t,e,n,i){var r=t.__pictorialBundle,o=t.__pictorialMainPath;o?iP(o,null,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation},n,i):(o=t.__pictorialMainPath=XL(n),r.add(o),iP(o,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:0,scaleY:0,rotation:n.rotation},{scaleX:n.symbolScale[0],scaleY:n.symbolScale[1]},n,i))}function jL(t,e,n){var i=T({},e.barRectShape),r=t.__pictorialBarRect;r?iP(r,null,{shape:i},e,n):((r=t.__pictorialBarRect=new cs({z2:2,shape:i,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}})).disableMorphing=!0,t.add(r))}function qL(t,e,n,i){if(n.symbolClip){var r=t.__pictorialClipPath,o=T({},n.clipShape),a=e.valueDim,s=n.animationModel,l=n.dataIndex;if(r)Eu(r,{shape:o},s,l);else{o[a.wh]=0,r=new cs({shape:o}),t.__pictorialBundle.setClipPath(r),t.__pictorialClipPath=r;var u={};u[a.wh]=n.clipShape[a.wh],yh[i?"updateProps":"initProps"](r,{shape:u},s,l)}}}function KL(t,e){var n=t.getItemModel(e);return n.getAnimationDelayParams=$L,n.isAnimationEnabled=JL,n}function $L(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function JL(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function QL(t,e,n,i){var r=new Bi,o=new Bi;return r.add(o),r.__pictorialBundle=o,o.x=n.bundlePosition[0],o.y=n.bundlePosition[1],n.symbolRepeat?YL(r,e,n):ZL(r,0,n),jL(r,n,i),qL(r,e,n,i),r.__pictorialShapeStr=eP(t,n),r.__pictorialSymbolMeta=n,r}function tP(t,e,n,i){var r=i.__pictorialBarRect;r&&r.removeTextContent();var o=[];nP(i,(function(t){o.push(t)})),i.__pictorialMainPath&&o.push(i.__pictorialMainPath),i.__pictorialClipPath&&(n=null),O(o,(function(t){Gu(t,{scaleX:0,scaleY:0},n,e,(function(){i.parent&&i.parent.remove(i)}))})),t.setItemGraphicEl(e,null)}function eP(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function nP(t,e,n){O(t.__pictorialBundle.children(),(function(i){i!==t.__pictorialBarRect&&e.call(n,i)}))}function iP(t,e,n,i,r,o){e&&t.attr(e),i.symbolClip&&!r?n&&t.attr(n):n&&yh[r?"updateProps":"initProps"](t,n,i.animationModel,i.dataIndex,o)}function rP(t,e,n){var i=n.dataIndex,r=n.itemModel,o=r.getModel("emphasis"),a=o.getModel("itemStyle").getItemStyle(),s=r.getModel(["blur","itemStyle"]).getItemStyle(),l=r.getModel(["select","itemStyle"]).getItemStyle(),u=r.getShallow("cursor"),h=o.get("focus"),c=o.get("blurScope"),p=o.get("scale");nP(t,(function(t){if(t instanceof rs){var e=t.style;t.useStyle(T({image:e.image,x:e.x,y:e.y,width:e.width,height:e.height},n.style))}else t.useStyle(n.style);var i=t.ensureState("emphasis");i.style=a,p&&(i.scaleX=1.1*t.scaleX,i.scaleY=1.1*t.scaleY),t.ensureState("blur").style=s,t.ensureState("select").style=l,u&&(t.cursor=u),t.z2=n.z2}));var d=e.valueDim.posDesc[+(n.boundingLength>0)];xh(t.__pictorialBarRect,bh(r),{labelFetcher:e.seriesModel,labelDataIndex:i,defaultText:Dw(e.seriesModel.getData(),i),inheritColor:n.style.fill,defaultOpacity:n.style.opacity,defaultOutsidePosition:d}),pl(t,h,c)}function oP(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var aP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n.defaultSymbol="roundRect",n}return n(e,t),e.prototype.getInitialData=function(e){return e.stack=null,t.prototype.getInitialData.apply(this,arguments)},e.type="series.pictorialBar",e.dependencies=["grid"],e.defaultOption=Yh(fS.defaultOption,{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,emphasis:{scale:!1},select:{itemStyle:{borderColor:"#212121"}}}),e}(fS);var sP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._layers=[],n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this,o=this.group,a=t.getLayerSeries(),s=i.getLayout("layoutInfo"),l=s.rect,u=s.boundaryGap;function h(t){return t.name}o.x=0,o.y=l.y+u[0];var c=new Vm(this._layersSeries||[],a,h,h),p=[];function d(e,n,s){var l=r._layers;if("remove"!==e){for(var u,h,c=[],d=[],f=a[n].indices,g=0;go&&(o=s),i.push(s)}for(var u=0;uo&&(o=c)}return{y0:r,max:o}}(l),h=u.y0,c=n/u.max,p=o.length,d=o[0].indices.length,f=0;fMath.PI/2?"right":"left"):w&&"center"!==w?"left"===w?(v=r.r0+b,a>Math.PI/2&&(w="right")):"right"===w&&(v=r.r-b,a>Math.PI/2&&(w="left")):(v=(r.r+r.r0)/2,w="center"),d.style.align=w,d.style.verticalAlign=f(o,"verticalAlign")||"middle",d.x=v*s+r.cx,d.y=v*l+r.cy;var S=f(o,"rotate"),M=0;"radial"===S?(M=-a)<-Math.PI/2&&(M+=Math.PI):"tangential"===S?(M=Math.PI/2-a)>Math.PI/2?M-=Math.PI:M<-Math.PI/2&&(M+=Math.PI):"number"==typeof S&&(M=S*Math.PI/180),d.rotation=M})),h.dirtyStyle()},e}(ou),pP="sunburstRootToNode",dP="sunburstHighlight";var fP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this;this.seriesModel=t,this.api=n,this.ecModel=e;var o=t.getData(),a=o.tree.root,s=t.getViewRoot(),l=this.group,u=t.get("renderLabelForZeroData"),h=[];s.eachNode((function(t){h.push(t)}));var c=this._oldChildren||[];!function(i,r){if(0===i.length&&0===r.length)return;function s(t){return t.getId()}function h(s,h){!function(i,r){u||!i||i.getValue()||(i=null);if(i!==a&&r!==a)if(r&&r.piece)i?(r.piece.updateData(!1,i,t,e,n),o.setItemGraphicEl(i.dataIndex,r.piece)):function(t){if(!t)return;t.piece&&(l.remove(t.piece),t.piece=null)}(r);else if(i){var s=new cP(i,t,e,n);l.add(s),o.setItemGraphicEl(i.dataIndex,s)}}(null==s?null:i[s],null==h?null:r[h])}new Vm(r,i,s,s).add(h).update(h).remove(G(h,null)).execute()}(h,c),function(i,o){o.depth>0?(r.virtualPiece?r.virtualPiece.updateData(!1,i,t,e,n):(r.virtualPiece=new cP(i,t,e,n),l.add(r.virtualPiece)),o.piece.off("click"),r.virtualPiece.on("click",(function(t){r._rootToNode(o.parentNode)}))):r.virtualPiece&&(l.remove(r.virtualPiece),r.virtualPiece=null)}(a,s),this._initEvents(),this._oldChildren=h},e.prototype._initEvents=function(){var t=this;this.group.off("click"),this.group.on("click",(function(e){var n=!1;t.seriesModel.getViewRoot().eachNode((function(i){if(!n&&i.piece&&i.piece===e.target){var r=i.getModel().get("nodeClick");if("rootToNode"===r)t._rootToNode(i);else if("link"===r){var o=i.getModel(),a=o.get("link");if(a)Hc(a,o.get("target",!0)||"_blank")}n=!0}}))}))},e.prototype._rootToNode=function(t){t!==this.seriesModel.getViewRoot()&&this.api.dispatchAction({type:pP,from:this.uid,seriesId:this.seriesModel.id,targetNode:t})},e.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}},e.type="sunburst",e}(Yf),gP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreStyleOnData=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};yP(n);var i=this._levelModels=R(t.levels||[],(function(t){return new Wh(t,this,e)}),this),r=DT.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e),o=i[n.depth];return o&&(t.parentModel=o),t}))}));return r.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treePathInfo=PT(i,this),n},e.prototype.getLevelModel=function(t){return this._levelModels&&this._levelModels[t.depth]},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){BT(this)},e.type="series.sunburst",e.defaultOption={zlevel:0,z:2,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,stillShowZeroSum:!0,nodeClick:"rootToNode",renderLabelForZeroData:!1,label:{rotate:"radial",show:!0,opacity:1,align:"center",position:"inside",distance:5,silent:!0},itemStyle:{borderWidth:1,borderColor:"white",borderType:"solid",shadowBlur:0,shadowColor:"rgba(0, 0, 0, 0.2)",shadowOffsetX:0,shadowOffsetY:0,opacity:1},emphasis:{focus:"descendant"},blur:{itemStyle:{opacity:.2},label:{opacity:.1}},animationType:"expansion",animationDuration:1e3,animationDurationUpdate:500,data:[],sort:"desc"},e}(Rf);function yP(t){var e=0;O(t.children,(function(t){yP(t);var n=t.value;F(n)&&(n=n[0]),e+=n}));var n=t.value;F(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),F(t.value)?t.value[0]=n:t.value=n}var vP=Math.PI/180;function mP(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.get("center"),i=t.get("radius");F(i)||(i=[0,i]),F(e)||(e=[e,e]);var r=n.getWidth(),o=n.getHeight(),a=Math.min(r,o),s=qi(e[0],r),l=qi(e[1],o),u=qi(i[0],a/2),h=qi(i[1],a/2),c=-t.get("startAngle")*vP,p=t.get("minAngle")*vP,d=t.getData().tree.root,f=t.getViewRoot(),g=f.depth,y=t.get("sort");null!=y&&_P(f,y);var v=0;O(f.children,(function(t){!isNaN(t.getValue())&&v++}));var m=f.getValue(),_=Math.PI/(m||v)*2,x=f.depth>0,b=f.height-(x?-1:1),w=(h-u)/(b||1),S=t.get("clockwise"),M=t.get("stillShowZeroSum"),I=S?1:-1,T=function(e,n){if(e){var i=n;if(e!==d){var r=e.getValue(),o=0===m&&M?_:r*_;o1;)r=r.parentNode;var o=n.getColorFromPalette(r.name||r.dataIndex+"",e);return t.depth>1&&"string"==typeof o&&(o=Xe(o,(t.depth-1)/(i-1)*.5)),o}(r,t,i.root.height)),T(n.ensureUniqueItemVisual(r.dataIndex,"style"),o)}))}))}var bP={x:1,y:1,scaleX:1,scaleY:1,originX:1,originY:1,rotation:1},wP={color:"fill",borderColor:"stroke"},SP={symbol:1,symbolSize:1,symbolKeepAspect:1,legendIcon:1,visualMeta:1,liftZ:1,decal:1},MP=Rr(),IP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){this.currentZLevel=this.get("zlevel",!0),this.currentZ=this.get("z",!0)},e.prototype.getInitialData=function(t,e){return v_(null,this)},e.prototype.getDataParams=function(e,n,i){var r=t.prototype.getDataParams.call(this,e,n);return i&&(r.info=MP(i).info),r},e.type="series.custom",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,clip:!1},e}(Rf);function TP(t,e){return e=e||[0,0],R(["x","y"],(function(n,i){var r=this.getAxis(n),o=e[i],a=t[i]/2;return"category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a))}),this)}function CP(t,e){return e=e||[0,0],R([0,1],(function(n){var i=e[n],r=t[n]/2,o=[],a=[];return o[n]=i-r,a[n]=i+r,o[1-n]=a[1-n]=e[1-n],Math.abs(this.dataToPoint(o)[n]-this.dataToPoint(a)[n])}),this)}function DP(t,e){var n=this.getAxis(),i=e instanceof Array?e[0]:e,r=(t instanceof Array?t[0]:t)/2;return"category"===n.type?n.getBandWidth():Math.abs(n.dataToCoord(i-r)-n.dataToCoord(i+r))}function AP(t,e){return e=e||[0,0],R(["Radius","Angle"],(function(n,i){var r=this["get"+n+"Axis"](),o=e[i],a=t[i]/2,s="category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a));return"Angle"===n&&(s=s*Math.PI/180),s}),this)}function kP(t,e,n,i){return t&&(t.legacy||!1!==t.legacy&&!n&&!i&&"tspan"!==e&&("text"===e||ft(t,"text")))}function LP(t,e,n){var i,r,o,a=t;if("text"===e)o=a;else{o={},ft(a,"text")&&(o.text=a.text),ft(a,"rich")&&(o.rich=a.rich),ft(a,"textFill")&&(o.fill=a.textFill),ft(a,"textStroke")&&(o.stroke=a.textStroke),ft(a,"fontFamily")&&(o.fontFamily=a.fontFamily),ft(a,"fontSize")&&(o.fontSize=a.fontSize),ft(a,"fontStyle")&&(o.fontStyle=a.fontStyle),ft(a,"fontWeight")&&(o.fontWeight=a.fontWeight),r={type:"text",style:o,silent:!0},i={};var s=ft(a,"textPosition");n?i.position=s?a.textPosition:"inside":s&&(i.position=a.textPosition),ft(a,"textPosition")&&(i.position=a.textPosition),ft(a,"textOffset")&&(i.offset=a.textOffset),ft(a,"textRotation")&&(i.rotation=a.textRotation),ft(a,"textDistance")&&(i.distance=a.textDistance)}return PP(o,t),O(o.rich,(function(t){PP(t,t)})),{textConfig:i,textContent:r}}function PP(t,e){e&&(e.font=e.textFont||e.font,ft(e,"textStrokeWidth")&&(t.lineWidth=e.textStrokeWidth),ft(e,"textAlign")&&(t.align=e.textAlign),ft(e,"textVerticalAlign")&&(t.verticalAlign=e.textVerticalAlign),ft(e,"textLineHeight")&&(t.lineHeight=e.textLineHeight),ft(e,"textWidth")&&(t.width=e.textWidth),ft(e,"textHeight")&&(t.height=e.textHeight),ft(e,"textBackgroundColor")&&(t.backgroundColor=e.textBackgroundColor),ft(e,"textPadding")&&(t.padding=e.textPadding),ft(e,"textBorderColor")&&(t.borderColor=e.textBorderColor),ft(e,"textBorderWidth")&&(t.borderWidth=e.textBorderWidth),ft(e,"textBorderRadius")&&(t.borderRadius=e.textBorderRadius),ft(e,"textBoxShadowColor")&&(t.shadowColor=e.textBoxShadowColor),ft(e,"textBoxShadowBlur")&&(t.shadowBlur=e.textBoxShadowBlur),ft(e,"textBoxShadowOffsetX")&&(t.shadowOffsetX=e.textBoxShadowOffsetX),ft(e,"textBoxShadowOffsetY")&&(t.shadowOffsetY=e.textBoxShadowOffsetY))}function OP(t,e,n){var i=t;i.textPosition=i.textPosition||n.position||"inside",null!=n.offset&&(i.textOffset=n.offset),null!=n.rotation&&(i.textRotation=n.rotation),null!=n.distance&&(i.textDistance=n.distance);var r=i.textPosition.indexOf("inside")>=0,o=t.fill||"#000";RP(i,e);var a=null==i.textFill;return r?a&&(i.textFill=n.insideFill||"#fff",!i.textStroke&&n.insideStroke&&(i.textStroke=n.insideStroke),!i.textStroke&&(i.textStroke=o),null==i.textStrokeWidth&&(i.textStrokeWidth=2)):(a&&(i.textFill=t.fill||n.outsideFill||"#000"),!i.textStroke&&n.outsideStroke&&(i.textStroke=n.outsideStroke)),i.text=e.text,i.rich=e.rich,O(e.rich,(function(t){RP(t,t)})),i}function RP(t,e){e&&(ft(e,"fill")&&(t.textFill=e.fill),ft(e,"stroke")&&(t.textStroke=e.fill),ft(e,"lineWidth")&&(t.textStrokeWidth=e.lineWidth),ft(e,"font")&&(t.font=e.font),ft(e,"fontStyle")&&(t.fontStyle=e.fontStyle),ft(e,"fontWeight")&&(t.fontWeight=e.fontWeight),ft(e,"fontSize")&&(t.fontSize=e.fontSize),ft(e,"fontFamily")&&(t.fontFamily=e.fontFamily),ft(e,"align")&&(t.textAlign=e.align),ft(e,"verticalAlign")&&(t.textVerticalAlign=e.verticalAlign),ft(e,"lineHeight")&&(t.textLineHeight=e.lineHeight),ft(e,"width")&&(t.textWidth=e.width),ft(e,"height")&&(t.textHeight=e.height),ft(e,"backgroundColor")&&(t.textBackgroundColor=e.backgroundColor),ft(e,"padding")&&(t.textPadding=e.padding),ft(e,"borderColor")&&(t.textBorderColor=e.borderColor),ft(e,"borderWidth")&&(t.textBorderWidth=e.borderWidth),ft(e,"borderRadius")&&(t.textBorderRadius=e.borderRadius),ft(e,"shadowColor")&&(t.textBoxShadowColor=e.shadowColor),ft(e,"shadowBlur")&&(t.textBoxShadowBlur=e.shadowBlur),ft(e,"shadowOffsetX")&&(t.textBoxShadowOffsetX=e.shadowOffsetX),ft(e,"shadowOffsetY")&&(t.textBoxShadowOffsetY=e.shadowOffsetY),ft(e,"textShadowColor")&&(t.textShadowColor=e.textShadowColor),ft(e,"textShadowBlur")&&(t.textShadowBlur=e.textShadowBlur),ft(e,"textShadowOffsetX")&&(t.textShadowOffsetX=e.textShadowOffsetX),ft(e,"textShadowOffsetY")&&(t.textShadowOffsetY=e.textShadowOffsetY))}var NP={position:["x","y"],scale:["scaleX","scaleY"],origin:["originX","originY"]};function zP(t,e,n){var i=t[n],r=NP[n];i&&(e[r[0]]=i[0],e[r[1]]=i[1])}function EP(t,e,n){null!=t[n]&&(e[n]=t[n])}function VP(t,e,n){n&&(t[e]=n[e])}function BP(t,e,n,i,r){var o=n[t];if(o){var a,s=e[t],l=o.enterFrom;if(r&&l){!a&&(a=i[t]={});for(var u=V(l),h=0;h=0){!a&&(a=i[t]={});var d=V(s);for(h=0;hi[1]&&i.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:i[1],r0:i[0]},api:{coord:function(i){var r=e.dataToRadius(i[0]),o=n.dataToAngle(i[1]),a=t.coordToPoint([r,o]);return a.push(r,o*Math.PI/180),a},size:B(AP,t)}}},calendar:function(t){var e=t.getRect(),n=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:n.start,end:n.end,weeks:n.weeks,dayCount:n.allDay}},api:{coord:function(e,n){return t.dataToPoint(e,n)}}}}};function JP(t){return t instanceof Qa}function QP(t){return t instanceof To}var tO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this._data,o=t.getData(),a=this.group,s=lO(t,o,e,n);r||a.removeAll(),o.diff(r).add((function(e){hO(n,null,e,s(e,i),t,a,o)})).remove((function(e){_O(r.getItemGraphicEl(e),t,a)})).update((function(e,l){var u=r.getItemGraphicEl(l);hO(n,u,e,s(e,i),t,a,o)})).execute();var l=t.get("clip",!0)?$w(t.coordinateSystem,!1,t):null;l?a.setClipPath(l):a.removeClipPath(),this._data=o},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll(),this._data=null},e.prototype.incrementalRender=function(t,e,n,i,r){var o=e.getData(),a=lO(e,o,n,i);function s(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}for(var l=t.start;l=0){var p=t.getAnimationStyleProps(),d=p?p.style:null;if(d){!o&&(o=i.style={});var f=V(n);for(u=0;u=0?e.getStore().get(r,n):void 0}var o=e.get(i.name,n),a=i&&i.ordinalMeta;return a?a.categories[o]:o},styleEmphasis:function(n,i){0;null==i&&(i=s);var r=m(i,WP).getItemStyle(),o=_(i,WP),a=wh(o,null,null,!0,!0);a.text=o.getShallow("show")?nt(t.getFormattedLabel(i,WP),t.getFormattedLabel(i,UP),Dw(e,i)):null;var l=Sh(o,null,!0);return b(n,r),r=OP(r,a,l),n&&x(r,n),r.legacy=!0,r},visual:function(t,n){if(null==n&&(n=s),ft(wP,t)){var i=e.getItemVisual(n,"style");return i?i[wP[t]]:null}if(ft(SP,t))return e.getItemVisual(n,t)},barLayout:function(t){if("cartesian2d"===o.type){return function(t){var e=[],n=t.axis,i="axis0";if("category"===n.type){for(var r=n.getBandWidth(),o=0;o=c;p--)_O(e.childAt(p),r,e)}(t,p,n,i,r),s>=0?o.replaceAt(p,s):o.add(p),p}function pO(t,e,n){var i,r=MP(t),o=e.type,a=e.shape,s=e.style;return n.isUniversalTransitionEnabled()||null!=o&&o!==r.customGraphicType||"path"===o&&((i=a)&&(ft(i,"pathData")||ft(i,"d")))&&xO(a)!==r.customPathData||"image"===o&&ft(s,"image")&&s.image!==r.customImagePath}function dO(t,e,n){var i=e?fO(t,e):t,r=e?gO(t,i,WP):t.style,o=t.type,a=i?i.textConfig:null,s=t.textContent,l=s?e?fO(s,e):s:null;if(r&&(n.isLegacy||kP(r,o,!!a,!!l))){n.isLegacy=!0;var u=LP(r,o,!e);!a&&u.textConfig&&(a=u.textConfig),!l&&u.textContent&&(l=u.textContent)}if(!e&&l){var h=l;!h.type&&(h.type="text")}var c=e?n[e]:n.normal;c.cfg=a,c.conOpt=l}function fO(t,e){return e?t?t[e]:null:t}function gO(t,e,n){var i=e&&e.style;return null==i&&n===WP&&t&&(i=t.styleEmphasis),i}function yO(t,e){var n=t&&t.name;return null!=n?n:"e\0\0"+e}function vO(t,e){var n=this.context,i=null!=t?n.newChildren[t]:null,r=null!=e?n.oldChildren[e]:null;cO(n.api,r,n.dataIndex,i,n.seriesModel,n.group)}function mO(t){var e=this.context;_O(e.oldChildren[t],e.seriesModel,e.group)}function _O(t,e,n){if(t){var i=MP(t).leaveToProps;i?Eu(t,i,e,{cb:function(){n.remove(t)}}):n.remove(t)}}function xO(t){return t&&(t.pathData||t.d)}var bO=Rr(),wO=S,SO=B,MO=function(){function t(){this._dragging=!1,this.animationThreshold=15}return t.prototype.render=function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,s=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(s&&s.hide());a&&a.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,n);var u=l.graphicKey;u!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=u;var h=this._moveAnimation=this.determineAnimation(t,e);if(a){var c=G(IO,e,h);this.updatePointerEl(a,l,c),this.updateLabelEl(a,l,c,e)}else a=this._group=new Bi,this.createPointerEl(a,l,t,e),this.createLabelEl(a,l,t,e),n.getZr().add(a);AO(a,e,!0),this._renderHandle(r)}},t.prototype.remove=function(t){this.clear(t)},t.prototype.dispose=function(t){this.clear(t)},t.prototype.determineAnimation=function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=EM(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return!0===n},t.prototype.makeElOption=function(t,e,n,i,r){},t.prototype.createPointerEl=function(t,e,n,i){var r=e.pointer;if(r){var o=bO(t).pointerEl=new yh[r.type](wO(e.pointer));t.add(o)}},t.prototype.createLabelEl=function(t,e,n,i){if(e.label){var r=bO(t).labelEl=new fs(wO(e.label));t.add(r),CO(r,i)}},t.prototype.updatePointerEl=function(t,e,n){var i=bO(t).pointerEl;i&&e.pointer&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},t.prototype.updateLabelEl=function(t,e,n,i){var r=bO(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{x:e.label.x,y:e.label.y}),CO(r,i))},t.prototype._renderHandle=function(t){if(!this._dragging&&this.updateHandleTransform){var e,n=this._axisPointerModel,i=this._api.getZr(),r=this._handle,o=n.getModel("handle"),a=n.get("status");if(!o.get("show")||!a||"hide"===a)return r&&i.remove(r),void(this._handle=null);this._handle||(e=!0,r=this._handle=ch(o.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){ne(t.event)},onmousedown:SO(this._onHandleDragMove,this,0,0),drift:SO(this._onHandleDragMove,this),ondragend:SO(this._onHandleDragEnd,this)}),i.add(r)),AO(r,n,!1),r.setStyle(o.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));var s=o.get("size");F(s)||(s=[s,s]),r.scaleX=s[0]/2,r.scaleY=s[1]/2,ng(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},t.prototype._moveHandleToValue=function(t,e){IO(this._axisPointerModel,!e&&this._moveAnimation,this._handle,DO(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},t.prototype._onHandleDragMove=function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(DO(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(DO(i)),bO(n).lastProp=null,this._doDispatchAxisPointer()}},t.prototype._doDispatchAxisPointer=function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},t.prototype._onHandleDragEnd=function(){if(this._dragging=!1,this._handle){var t=this._axisPointerModel.get("value");this._moveHandleToValue(t),this._api.dispatchAction({type:"hideTip"})}},t.prototype.clear=function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null)},t.prototype.doClear=function(){},t.prototype.buildLabel=function(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}},t}();function IO(t,e,n,i){TO(bO(n).lastProp,i)||(bO(n).lastProp=i,e?Eu(n,i,t):(n.stopAnimation(),n.attr(i)))}function TO(t,e){if(Y(t)&&Y(e)){var n=!0;return O(e,(function(e,i){n=n&&TO(t[i],e)})),!!n}return t===e}function CO(t,e){t[e.get(["label","show"])?"show":"hide"]()}function DO(t){return{x:t.x||0,y:t.y||0,rotation:t.rotation||0}}function AO(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse((function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)}))}function kO(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle()).fill=null:"shadow"===n&&((e=i.getAreaStyle()).stroke=null),e}function LO(t,e,n,i,r){var o=PO(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get(["label","precision"]),formatter:n.get(["label","formatter"])}),a=n.getModel("label"),s=Pc(a.get("padding")||0),l=a.getFont(),u=Si(o,l),h=r.position,c=u.width+s[1]+s[3],p=u.height+s[0]+s[2],d=r.align;"right"===d&&(h[0]-=c),"center"===d&&(h[0]-=c/2);var f=r.verticalAlign;"bottom"===f&&(h[1]-=p),"middle"===f&&(h[1]-=p/2),function(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}(h,c,p,i);var g=a.get("backgroundColor");g&&"auto"!==g||(g=e.get(["axisLine","lineStyle","color"])),t.label={x:h[0],y:h[1],style:wh(a,{text:o,font:l,fill:a.getTextColor(),padding:s,backgroundColor:g}),z2:10}}function PO(t,e,n,i,r){t=e.scale.parse(t);var o=e.scale.getLabel({value:t},{precision:r.precision}),a=r.formatter;if(a){var s={value:mx(e,{value:t}),axisDimension:e.dim,axisIndex:e.index,seriesData:[]};O(i,(function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&s.seriesData.push(r)})),W(a)?o=a.replace("{value}",o):H(a)&&(o=a(s))}return o}function OO(t,e,n){var i=[1,0,0,1,0,0];return Yn(i,i,n.rotation),Xn(i,i,n.position),oh([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}function RO(t,e,n,i,r,o){var a=DM.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get(["label","margin"]),LO(e,i,r,o,{position:OO(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})}function NO(t,e,n){return{x1:t[n=n||0],y1:t[1-n],x2:e[n],y2:e[1-n]}}function zO(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}}function EO(t,e,n,i,r,o){return{cx:t,cy:e,r0:n,r:i,startAngle:r,endAngle:o,clockwise:!0}}var VO=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.grid,s=i.get("type"),l=BO(a,o).getOtherAxis(o).getGlobalExtent(),u=o.toGlobalCoord(o.dataToCoord(e,!0));if(s&&"none"!==s){var h=kO(i),c=GO[s](o,u,l);c.style=h,t.graphicKey=c.type,t.pointer=c}RO(e,t,xM(a.model,n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=xM(e.axis.grid.model,e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=OO(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),s=BO(o,r).getOtherAxis(r).getGlobalExtent(),l="x"===r.dim?0:1,u=[t.x,t.y];u[l]+=e[l],u[l]=Math.min(a[1],u[l]),u[l]=Math.max(a[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];c[l]=u[l];return{x:u[0],y:u[1],rotation:t.rotation,cursorPoint:c,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][l]}},e}(MO);function BO(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}var GO={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:NO([e,n[0]],[e,n[1]],FO(t))}},shadow:function(t,e,n){var i=Math.max(1,t.getBandWidth()),r=n[1]-n[0];return{type:"Rect",shape:zO([e-i/2,n[0]],[i,r],FO(t))}}};function FO(t){return"x"===t.dim?0:1}var HO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="axisPointer",e.defaultOption={show:"auto",zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#B9BEC9",width:1,type:"dashed"},shadowStyle:{color:"rgba(210,219,238,0.2)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},e}(ep),WO=Rr(),UO=O;function XO(t,e,n){if(!a.node){var i=e.getZr();WO(i).records||(WO(i).records={}),function(t,e){if(WO(t).initialized)return;function n(n,i){t.on(n,(function(n){var r=function(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}(e);UO(WO(t).records,(function(t){t&&i(t,n,r.dispatchAction)})),function(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]);n&&(n.dispatchAction=null,e.dispatchAction(n))}(r.pendings,e)}))}WO(t).initialized=!0,n("click",G(ZO,"click")),n("mousemove",G(ZO,"mousemove")),n("globalout",YO)}(i,e),(WO(i).records[t]||(WO(i).records[t]={})).handler=n}}function YO(t,e,n){t.handler("leave",null,n)}function ZO(t,e,n,i){e.handler(t,n,i)}function jO(t,e){if(!a.node){var n=e.getZr();(WO(n).records||{})[t]&&(WO(n).records[t]=null)}}var qO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=e.getComponent("tooltip"),r=t.get("triggerOn")||i&&i.get("triggerOn")||"mousemove|click";XO("axisPointer",n,(function(t,e,n){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})}))},e.prototype.remove=function(t,e){jO("axisPointer",e)},e.prototype.dispose=function(t,e){jO("axisPointer",e)},e.type="axisPointer",e}(Hf);function KO(t,e){var n,i=[],r=t.seriesIndex;if(null==r||!(n=e.getSeriesByIndex(r)))return{point:[]};var o=n.getData(),a=Or(o,t);if(null==a||a<0||F(a))return{point:[]};var s=o.getItemGraphicEl(a),l=n.coordinateSystem;if(n.getTooltipPosition)i=n.getTooltipPosition(a)||[];else if(l&&l.dataToPoint)if(t.isStacked){var u=l.getBaseAxis(),h=l.getOtherAxis(u).dim,c=u.dim,p="x"===h||"radius"===h?1:0,d=o.mapDimension(c),f=[];f[p]=o.get(d,a),f[1-p]=o.get(o.getCalculationInfo("stackResultDimension"),a),i=l.dataToPoint(f)||[]}else i=l.dataToPoint(o.getValues(R(l.dimensions,(function(t){return o.mapDimension(t)})),a))||[];else if(s){var g=s.getBoundingRect().clone();g.applyTransform(s.transform),i=[g.x+g.width/2,g.y+g.height/2]}return{point:i,el:s}}var $O=Rr();function JO(t,e,n){var i=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||B(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){iR(r)&&(r=KO({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=iR(r),u=o.axesInfo,h=s.axesInfo,c="leave"===i||iR(r),p={},d={},f={list:[],map:{}},g={showPointer:G(tR,d),showTooltip:G(eR,f)};O(s.coordSysMap,(function(t,e){var n=l||t.containPoint(r);O(s.coordSysAxesInfo[e],(function(t,e){var i=t.axis,o=function(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}(u,t);if(!c&&n&&(!u||o)){var a=o&&o.value;null!=a||l||(a=i.pointToData(r)),null!=a&&QO(t,a,g,!1,p)}}))}));var y={};return O(h,(function(t,e){var n=t.linkGroup;n&&!d[e]&&O(n.axesInfo,(function(e,i){var r=d[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,nR(e),nR(t)))),y[t.key]=o}}))})),O(y,(function(t,e){QO(h[e],t,g,!0,p)})),function(t,e,n){var i=n.axesInfo=[];O(e,(function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})}))}(d,h,p),function(t,e,n,i){if(iR(e)||!t.list.length)return void i({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}(f,r,t,a),function(t,e,n){var i=n.getZr(),r="axisPointerLastHighlights",o=$O(i)[r]||{},a=$O(i)[r]={};O(t,(function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&O(n.seriesDataIndices,(function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t}))}));var s=[],l=[];O(o,(function(t,e){!a[e]&&l.push(t)})),O(a,(function(t,e){!o[e]&&s.push(t)})),l.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,notBlur:!0,batch:l}),s.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,notBlur:!0,batch:s})}(h,0,n),p}}function QO(t,e,n,i,r){var o=t.axis;if(!o.scale.isBlank()&&o.containData(e))if(t.involveSeries){var a=function(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return O(e.seriesModels,(function(e,l){var u,h,c=e.getData().mapDimensionsAll(i);if(e.getAxisTooltipData){var p=e.getAxisTooltipData(c,t,n);h=p.dataIndices,u=p.nestestValue}else{if(!(h=e.getData().indicesOfNearest(c[0],t,"category"===n.type?.5:null)).length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var d=t-u,f=Math.abs(d);f<=a&&((f=0&&s<0)&&(a=f,s=d,r=u,o.length=0),O(h,(function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})})))}})),{payloadBatch:o,snapToValue:r}}(e,t),s=a.payloadBatch,l=a.snapToValue;s[0]&&null==r.seriesIndex&&T(r,s[0]),!i&&t.snap&&o.containData(l)&&null!=l&&(e=l),n.showPointer(t,e,s),n.showTooltip(t,a,l)}else n.showPointer(t,e)}function tR(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function eR(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=BM(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get(["label","precision"]),formatter:s.get(["label","formatter"])},seriesDataIndices:r.slice()})}}function nR(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function iR(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function rR(t){FM.registerAxisPointerClass("CartesianAxisPointer",VO),t.registerComponentModel(HO),t.registerComponentView(qO),t.registerPreprocessor((function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!F(e)&&(t.axisPointer.link=[e])}})),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,(function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=RM(t,e)})),t.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},JO)}var oR=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis;"angle"===o.dim&&(this.animationThreshold=Math.PI/18);var a=o.polar,s=a.getOtherAxis(o).getExtent(),l=o.dataToCoord(e),u=i.get("type");if(u&&"none"!==u){var h=kO(i),c=aR[u](o,a,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}var p=function(t,e,n,i,r){var o=e.axis,a=o.dataToCoord(t),s=i.getAngleAxis().getExtent()[0];s=s/180*Math.PI;var l,u,h,c=i.getRadiusAxis().getExtent();if("radius"===o.dim){var p=[1,0,0,1,0,0];Yn(p,p,s),Xn(p,p,[i.cx,i.cy]),l=oh([a,-r],p);var d=e.getModel("axisLabel").get("rotate")||0,f=DM.innerTextLayout(s,d*Math.PI/180,-1);u=f.textAlign,h=f.textVerticalAlign}else{var g=c[1];l=i.coordToPoint([g+r,a]);var y=i.cx,v=i.cy;u=Math.abs(l[0]-y)/g<.3?"center":l[0]>y?"left":"right",h=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:u,verticalAlign:h}}(e,n,0,a,i.get(["label","margin"]));LO(t,n,i,r,p)},e}(MO);var aR={line:function(t,e,n,i){return"angle"===t.dim?{type:"Line",shape:NO(e.coordToPoint([i[0],n]),e.coordToPoint([i[1],n]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:n}}},shadow:function(t,e,n,i){var r=Math.max(1,t.getBandWidth()),o=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:EO(e.cx,e.cy,i[0],i[1],(-n-r/2)*o,(r/2-n)*o)}:{type:"Sector",shape:EO(e.cx,e.cy,n-r/2,n+r/2,0,2*Math.PI)}}},sR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.findAxisModel=function(t){var e;return this.ecModel.eachComponent(t,(function(t){t.getCoordSysModel()===this&&(e=t)}),this),e},e.type="polar",e.dependencies=["radiusAxis","angleAxis"],e.defaultOption={zlevel:0,z:0,center:["50%","50%"],radius:"80%"},e}(ep),lR=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("polar",Vr).models[0]},e.type="polarAxis",e}(ep);L(lR,Mx);var uR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="angleAxis",e}(lR),hR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="radiusAxis",e}(lR),cR=function(t){function e(e,n){return t.call(this,"radius",e,n)||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e}(Hx);cR.prototype.dataToRadius=Hx.prototype.dataToCoord,cR.prototype.radiusToData=Hx.prototype.coordToData;var pR=Rr(),dR=function(t){function e(e,n){return t.call(this,"angle",e,n||[0,360])||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e.prototype.calculateCategoryInterval=function(){var t=this,e=t.getLabelModel(),n=t.scale,i=n.getExtent(),r=n.count();if(i[1]-i[0]<1)return 0;var o=i[0],a=t.dataToCoord(o+1)-t.dataToCoord(o),s=Math.abs(a),l=Si(null==o?"":o+"",e.getFont(),"center","top"),u=Math.max(l.height,7)/s;isNaN(u)&&(u=1/0);var h=Math.max(0,Math.floor(u)),c=pR(t.model),p=c.lastAutoInterval,d=c.lastTickCount;return null!=p&&null!=d&&Math.abs(p-h)<=1&&Math.abs(d-r)<=1&&p>h?h=p:(c.lastTickCount=r,c.lastAutoInterval=h),h},e}(Hx);dR.prototype.dataToAngle=Hx.prototype.dataToCoord,dR.prototype.angleToData=Hx.prototype.coordToData;var fR=["radius","angle"],gR=function(){function t(t){this.dimensions=fR,this.type="polar",this.cx=0,this.cy=0,this._radiusAxis=new cR,this._angleAxis=new dR,this.axisPointerEnabled=!0,this.name=t||"",this._radiusAxis.polar=this._angleAxis.polar=this}return t.prototype.containPoint=function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},t.prototype.containData=function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},t.prototype.getAxis=function(t){return this["_"+t+"Axis"]},t.prototype.getAxes=function(){return[this._radiusAxis,this._angleAxis]},t.prototype.getAxesByScale=function(t){var e=[],n=this._angleAxis,i=this._radiusAxis;return n.scale.type===t&&e.push(n),i.scale.type===t&&e.push(i),e},t.prototype.getAngleAxis=function(){return this._angleAxis},t.prototype.getRadiusAxis=function(){return this._radiusAxis},t.prototype.getOtherAxis=function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},t.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},t.prototype.getTooltipAxes=function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},t.prototype.dataToPoint=function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},t.prototype.pointToData=function(t,e){var n=this.pointToCoord(t);return[this._radiusAxis.radiusToData(n[0],e),this._angleAxis.angleToData(n[1],e)]},t.prototype.pointToCoord=function(t){var e=t[0]-this.cx,n=t[1]-this.cy,i=this.getAngleAxis(),r=i.getExtent(),o=Math.min(r[0],r[1]),a=Math.max(r[0],r[1]);i.inverse?o=a-360:a=o+360;var s=Math.sqrt(e*e+n*n);e/=s,n/=s;for(var l=Math.atan2(-n,e)/Math.PI*180,u=la;)l+=360*u;return[s,l]},t.prototype.coordToPoint=function(t){var e=t[0],n=t[1]/180*Math.PI;return[Math.cos(n)*e+this.cx,-Math.sin(n)*e+this.cy]},t.prototype.getArea=function(){var t=this.getAngleAxis(),e=this.getRadiusAxis().getExtent().slice();e[0]>e[1]&&e.reverse();var n=t.getExtent(),i=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:e[0],r:e[1],startAngle:-n[0]*i,endAngle:-n[1]*i,clockwise:t.inverse,contain:function(t,e){var n=t-this.cx,i=e-this.cy,r=n*n+i*i,o=this.r,a=this.r0;return r<=o*o&&r>=a*a}}},t.prototype.convertToPixel=function(t,e,n){return yR(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return yR(e)===this?this.pointToData(n):null},t}();function yR(t){var e=t.seriesModel,n=t.polarModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}function vR(t,e){var n=this,i=n.getAngleAxis(),r=n.getRadiusAxis();if(i.scale.setExtent(1/0,-1/0),r.scale.setExtent(1/0,-1/0),t.eachSeries((function(t){if(t.coordinateSystem===n){var e=t.getData();O(Sx(e,"radius"),(function(t){r.scale.unionExtentFromData(e,t)})),O(Sx(e,"angle"),(function(t){i.scale.unionExtentFromData(e,t)}))}})),gx(i.scale,i.model),gx(r.scale,r.model),"category"===i.type&&!i.onBand){var o=i.getExtent(),a=360/i.scale.count();i.inverse?o[1]+=a:o[1]-=a,i.setExtent(o[0],o[1])}}function mR(t,e){if(t.type=e.get("type"),t.scale=yx(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),function(t){return"angleAxis"===t.mainType}(e)){t.inverse=t.inverse!==e.get("clockwise");var n=e.get("startAngle");t.setExtent(n,n+(t.inverse?-360:360))}e.axis=t,t.model=e}var _R={dimensions:fR,create:function(t,e){var n=[];return t.eachComponent("polar",(function(t,i){var r=new gR(i+"");r.update=vR;var o=r.getRadiusAxis(),a=r.getAngleAxis(),s=t.findAxisModel("radiusAxis"),l=t.findAxisModel("angleAxis");mR(o,s),mR(a,l),function(t,e,n){var i=e.get("center"),r=n.getWidth(),o=n.getHeight();t.cx=qi(i[0],r),t.cy=qi(i[1],o);var a=t.getRadiusAxis(),s=Math.min(r,o)/2,l=e.get("radius");null==l?l=[0,"100%"]:F(l)||(l=[0,l]);var u=[qi(l[0],s),qi(l[1],s)];a.inverse?a.setExtent(u[1],u[0]):a.setExtent(u[0],u[1])}(r,t,e),n.push(r),t.coordinateSystem=r,r.model=t})),t.eachSeries((function(t){if("polar"===t.get("coordinateSystem")){var e=t.getReferringComponents("polar",Vr).models[0];0,t.coordinateSystem=e.coordinateSystem}})),n}},xR=["axisLine","axisLabel","axisTick","minorTick","splitLine","minorSplitLine","splitArea"];function bR(t,e,n){e[1]>e[0]&&(e=e.slice().reverse());var i=t.coordToPoint([e[0],n]),r=t.coordToPoint([e[1],n]);return{x1:i[0],y1:i[1],x2:r[0],y2:r[1]}}function wR(t){return t.getRadiusAxis().inverse?0:1}function SR(t){var e=t[0],n=t[t.length-1];e&&n&&Math.abs(Math.abs(e.coord-n.coord)-360)<1e-4&&t.pop()}var MR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="PolarAxisPointer",n}return n(e,t),e.prototype.render=function(t,e){if(this.group.removeAll(),t.get("show")){var n=t.axis,i=n.polar,r=i.getRadiusAxis().getExtent(),o=n.getTicksCoords(),a=n.getMinorTicksCoords(),s=R(n.getViewLabels(),(function(t){t=S(t);var e=n.scale,i="ordinal"===e.type?e.getRawOrdinalNumber(t.tickValue):t.tickValue;return t.coord=n.dataToCoord(i),t}));SR(s),SR(o),O(xR,(function(e){!t.get([e,"show"])||n.scale.isBlank()&&"axisLine"!==e||IR[e](this.group,t,i,o,a,r,s)}),this)}},e.type="angleAxis",e}(FM),IR={axisLine:function(t,e,n,i,r,o){var a,s=e.getModel(["axisLine","lineStyle"]),l=wR(n),u=l?0:1;(a=0===o[u]?new Hl({shape:{cx:n.cx,cy:n.cy,r:o[l]},style:s.getLineStyle(),z2:1,silent:!0}):new su({shape:{cx:n.cx,cy:n.cy,r:o[l],r0:o[u]},style:s.getLineStyle(),z2:1,silent:!0})).style.fill=null,t.add(a)},axisTick:function(t,e,n,i,r,o){var a=e.getModel("axisTick"),s=(a.get("inside")?-1:1)*a.get("length"),l=o[wR(n)],u=R(i,(function(t){return new yu({shape:bR(n,[l,l+s],t.coord)})}));t.add(eh(u,{style:C(a.getModel("lineStyle").getLineStyle(),{stroke:e.get(["axisLine","lineStyle","color"])})}))},minorTick:function(t,e,n,i,r,o){if(r.length){for(var a=e.getModel("axisTick"),s=e.getModel("minorTick"),l=(a.get("inside")?-1:1)*s.get("length"),u=o[wR(n)],h=[],c=0;cf?"left":"right",v=Math.abs(d[1]-g)/p<.3?"middle":d[1]>g?"top":"bottom";if(s&&s[c]){var m=s[c];Y(m)&&m.textStyle&&(a=new Wh(m.textStyle,l,l.ecModel))}var _=new fs({silent:DM.isLabelSilent(e),style:wh(a,{x:d[0],y:d[1],fill:a.getTextColor()||e.get(["axisLine","lineStyle","color"]),text:i.formattedLabel,align:y,verticalAlign:v})});if(t.add(_),h){var x=DM.makeAxisEventDataBase(e);x.targetType="axisLabel",x.value=i.rawLabel,Ss(_).eventData=x}}),this)},splitLine:function(t,e,n,i,r,o){var a=e.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=0;h=0?"p":"n",T=x;m&&(i[s][M]||(i[s][M]={p:x,n:x}),T=i[s][M][I]);var C=void 0,D=void 0,A=void 0,k=void 0;if("radius"===c.dim){var L=c.dataToCoord(S)-x,P=o.dataToCoord(M);Math.abs(L)=k})}}}))}var OR={startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:0}},RR={splitNumber:5},NR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="polar",e}(Hf);function zR(t,e){e=e||{};var n=t.coordinateSystem,i=t.axis,r={},o=i.position,a=i.orient,s=n.getRect(),l=[s.x,s.x+s.width,s.y,s.y+s.height],u={horizontal:{top:l[2],bottom:l[3]},vertical:{left:l[0],right:l[1]}};r.position=["vertical"===a?u.vertical[o]:l[0],"horizontal"===a?u.horizontal[o]:l[3]];r.rotation=Math.PI/2*{horizontal:0,vertical:1}[a];r.labelDirection=r.tickDirection=r.nameDirection={top:-1,bottom:1,right:1,left:-1}[o],t.get(["axisTick","inside"])&&(r.tickDirection=-r.tickDirection),tt(e.labelInside,t.get(["axisLabel","inside"]))&&(r.labelDirection=-r.labelDirection);var h=e.rotate;return null==h&&(h=t.get(["axisLabel","rotate"])),r.labelRotation="top"===o?-h:h,r.z2=1,r}var ER=["axisLine","axisTickLabel","axisName"],VR=["splitArea","splitLine"],BR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="SingleAxisPointer",n}return n(e,t),e.prototype.render=function(e,n,i,r){var o=this.group;o.removeAll();var a=this._axisGroup;this._axisGroup=new Bi;var s=zR(e),l=new DM(e,s);O(ER,l.add,l),o.add(this._axisGroup),o.add(l.getGroup()),O(VR,(function(t){e.get([t,"show"])&&GR[t](this,this.group,this._axisGroup,e)}),this),lh(a,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)},e.prototype.remove=function(){UM(this)},e.type="singleAxis",e}(FM),GR={splitLine:function(t,e,n,i){var r=i.axis;if(!r.scale.isBlank()){var o=i.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color");s=s instanceof Array?s:[s];for(var l=i.coordinateSystem.getRect(),u=r.isHorizontal(),h=[],c=0,p=r.getTicksCoords({tickModel:o}),d=[],f=[],g=0;g=e.y&&t[1]<=e.y+e.height:n.contain(n.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},t.prototype.pointToData=function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},t.prototype.dataToPoint=function(t){var e=this.getAxis(),n=this.getRect(),i=[],r="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),i[r]=e.toGlobalCoord(e.dataToCoord(+t)),i[1-r]=0===r?n.y+n.height/2:n.x+n.width/2,i},t.prototype.convertToPixel=function(t,e,n){return XR(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return XR(e)===this?this.pointToData(n):null},t}();function XR(t){var e=t.seriesModel,n=t.singleAxisModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}var YR={create:function(t,e){var n=[];return t.eachComponent("singleAxis",(function(i,r){var o=new UR(i,t,e);o.name="single_"+r,o.resize(i,e),i.coordinateSystem=o,n.push(o)})),t.eachSeries((function(t){if("singleAxis"===t.get("coordinateSystem")){var e=t.getReferringComponents("singleAxis",Vr).models[0];t.coordinateSystem=e&&e.coordinateSystem}})),n},dimensions:WR},ZR=["x","y"],jR=["width","height"],qR=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.coordinateSystem,s=JR(a,1-$R(o)),l=a.dataToPoint(e)[0],u=i.get("type");if(u&&"none"!==u){var h=kO(i),c=KR[u](o,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}RO(e,t,zR(n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=zR(e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=OO(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.coordinateSystem,a=$R(r),s=JR(o,a),l=[t.x,t.y];l[a]+=e[a],l[a]=Math.min(s[1],l[a]),l[a]=Math.max(s[0],l[a]);var u=JR(o,1-a),h=(u[1]+u[0])/2,c=[h,h];return c[a]=l[a],{x:l[0],y:l[1],rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}},e}(MO),KR={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:NO([e,n[0]],[e,n[1]],$R(t))}},shadow:function(t,e,n){var i=t.getBandWidth(),r=n[1]-n[0];return{type:"Rect",shape:zO([e-i/2,n[0]],[i,r],$R(t))}}};function $R(t){return t.isHorizontal()?0:1}function JR(t,e){var n=t.getRect();return[n[ZR[e]],n[ZR[e]]+n[jR[e]]]}var QR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="single",e}(Hf);var tN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e,n,i){var r=Jc(e);t.prototype.init.apply(this,arguments),eN(e,r)},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),eN(this.option,e)},e.prototype.getCellSize=function(){return this.option.cellSize},e.type="calendar",e.defaultOption={zlevel:0,z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",nameMap:"en",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",nameMap:"en",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},e}(ep);function eN(t,e){var n,i=t.cellSize;1===(n=F(i)?i:t.cellSize=[i,i]).length&&(n[1]=n[0]);var r=R([0,1],(function(t){return function(t,e){return null!=t[Xc[e][0]]||null!=t[Xc[e][1]]&&null!=t[Xc[e][2]]}(e,t)&&(n[t]="auto"),null!=n[t]&&"auto"!==n[t]}));$c(t,e,{type:"box",ignoreSize:r})}var nN={EN:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],CN:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},iN={EN:["S","M","T","W","T","F","S"],CN:["日","一","二","三","四","五","六"]},rN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this.group;i.removeAll();var r=t.coordinateSystem,o=r.getRangeInfo(),a=r.getOrient();this._renderDayRect(t,o,i),this._renderLines(t,o,a,i),this._renderYearText(t,o,a,i),this._renderMonthText(t,a,i),this._renderWeekText(t,o,a,i)},e.prototype._renderDayRect=function(t,e,n){for(var i=t.coordinateSystem,r=t.getModel("itemStyle").getItemStyle(),o=i.getCellWidth(),a=i.getCellHeight(),s=e.start.time;s<=e.end.time;s=i.getNextNDay(s,1).time){var l=i.dataToRect([s],!1).tl,u=new cs({shape:{x:l[0],y:l[1],width:o,height:a},cursor:"default",style:r});n.add(u)}},e.prototype._renderLines=function(t,e,n,i){var r=this,o=t.coordinateSystem,a=t.getModel(["splitLine","lineStyle"]).getLineStyle(),s=t.get(["splitLine","show"]),l=a.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=e.start,h=0;u.time<=e.end.time;h++){p(u.formatedDate),0===h&&(u=o.getDateInfo(e.start.y+"-"+e.start.m));var c=u.date;c.setMonth(c.getMonth()+1),u=o.getDateInfo(c)}function p(e){r._firstDayOfMonth.push(o.getDateInfo(e)),r._firstDayPoints.push(o.dataToRect([e],!1).tl);var l=r._getLinePointsOfOneWeek(t,e,n);r._tlpoints.push(l[0]),r._blpoints.push(l[l.length-1]),s&&r._drawSplitline(l,a,i)}p(o.getNextNDay(e.end.time,1).formatedDate),s&&this._drawSplitline(r._getEdgesPoints(r._tlpoints,l,n),a,i),s&&this._drawSplitline(r._getEdgesPoints(r._blpoints,l,n),a,i)},e.prototype._getEdgesPoints=function(t,e,n){var i=[t[0].slice(),t[t.length-1].slice()],r="horizontal"===n?0:1;return i[0][r]=i[0][r]-e/2,i[1][r]=i[1][r]+e/2,i},e.prototype._drawSplitline=function(t,e,n){var i=new du({z2:20,shape:{points:t},style:e});n.add(i)},e.prototype._getLinePointsOfOneWeek=function(t,e,n){for(var i=t.coordinateSystem,r=i.getDateInfo(e),o=[],a=0;a<7;a++){var s=i.getNextNDay(r.time,a),l=i.dataToRect([s.time],!1);o[2*s.day]=l.tl,o[2*s.day+1]=l["horizontal"===n?"bl":"tr"]}return o},e.prototype._formatterLabel=function(t,e){return"string"==typeof t&&t?(n=t,O(e,(function(t,e){n=n.replace("{"+e+"}",i?Nc(t):t)})),n):"function"==typeof t?t(e):e.nameMap;var n,i},e.prototype._yearTextPositionControl=function(t,e,n,i,r){var o=e[0],a=e[1],s=["center","bottom"];"bottom"===i?(a+=r,s=["center","top"]):"left"===i?o-=r:"right"===i?(o+=r,s=["center","top"]):a-=r;var l=0;return"left"!==i&&"right"!==i||(l=Math.PI/2),{rotation:l,x:o,y:a,style:{align:s[0],verticalAlign:s[1]}}},e.prototype._renderYearText=function(t,e,n,i){var r=t.getModel("yearLabel");if(r.get("show")){var o=r.get("margin"),a=r.get("position");a||(a="horizontal"!==n?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,u=(s[0][1]+s[1][1])/2,h="horizontal"===n?0:1,c={top:[l,s[h][1]],bottom:[l,s[1-h][1]],left:[s[1-h][0],u],right:[s[h][0],u]},p=e.start.y;+e.end.y>+e.start.y&&(p=p+"-"+e.end.y);var d=r.get("formatter"),f={start:e.start.y,end:e.end.y,nameMap:p},g=this._formatterLabel(d,f),y=new fs({z2:30,style:wh(r,{text:g})});y.attr(this._yearTextPositionControl(y,c[a],n,a,o)),i.add(y)}},e.prototype._monthTextPositionControl=function(t,e,n,i,r){var o="left",a="top",s=t[0],l=t[1];return"horizontal"===n?(l+=r,e&&(o="center"),"start"===i&&(a="bottom")):(s+=r,e&&(a="middle"),"start"===i&&(o="right")),{x:s,y:l,align:o,verticalAlign:a}},e.prototype._renderMonthText=function(t,e,n){var i=t.getModel("monthLabel");if(i.get("show")){var r=i.get("nameMap"),o=i.get("margin"),a=i.get("position"),s=i.get("align"),l=[this._tlpoints,this._blpoints];W(r)&&(r=nN[r.toUpperCase()]||[]);var u="start"===a?0:1,h="horizontal"===e?0:1;o="start"===a?-o:o;for(var c="center"===s,p=0;p=i.start.time&&n.timea.end.time&&t.reverse(),t},t.prototype._getRangeInfo=function(t){var e,n=[this.getDateInfo(t[0]),this.getDateInfo(t[1])];n[0].time>n[1].time&&(e=!0,n.reverse());var i=Math.floor(n[1].time/oN)-Math.floor(n[0].time/oN)+1,r=new Date(n[0].time),o=r.getDate(),a=n[1].date.getDate();r.setDate(o+i-1);var s=r.getDate();if(s!==a)for(var l=r.getTime()-n[1].time>0?1:-1;(s=r.getDate())!==a&&(r.getTime()-n[1].time)*l>0;)i-=l,r.setDate(s-l);var u=Math.floor((i+n[0].day+6)/7),h=e?1-u:u-1;return e&&n.reverse(),{range:[n[0].formatedDate,n[1].formatedDate],start:n[0],end:n[1],allDay:i,weeks:u,nthWeek:h,fweek:n[0].day,lweek:n[1].day}},t.prototype._getDateByWeeksAndDay=function(t,e,n){var i=this._getRangeInfo(n);if(t>i.weeks||0===t&&ei.lweek)return null;var r=7*(t-1)-i.fweek+e,o=new Date(i.start.time);return o.setDate(+i.start.d+r),this.getDateInfo(o)},t.create=function(e,n){var i=[];return e.eachComponent("calendar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeries((function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])})),i},t.dimensions=["time","value"],t}();function sN(t){var e=t.calendarModel,n=t.seriesModel;return e?e.coordinateSystem:n?n.coordinateSystem:null}var lN=Rr(),uN={path:null,compoundPath:null,group:Bi,image:rs,text:fs},hN=function(t){var e=t.graphic;F(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])},cN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.preventAutoZ=!0,n}return n(e,t),e.prototype.mergeOption=function(e,n){var i=this.option.elements;this.option.elements=null,t.prototype.mergeOption.call(this,e,n),this.option.elements=i},e.prototype.optionUpdated=function(t,e){var n=this.option,i=(e?n:t).elements,r=n.elements=e?[]:n.elements,o=[];this._flatten(i,o,null);var a=Cr(r,o,"normalMerge"),s=this._elOptionsToUpdate=[];O(a,(function(t,e){var n=t.newOption;n&&(s.push(n),function(t,e){var n=t.existing;if(e.id=t.keyInfo.id,!e.type&&n&&(e.type=n.type),null==e.parentId){var i=e.parentOption;i?e.parentId=i.id:n&&(e.parentId=n.parentId)}e.parentOption=null}(t,n),function(t,e,n){var i=T({},n),r=t[e],o=n.$action||"merge";if("merge"===o){if(r)M(r,i,!0),$c(r,i,{ignoreSize:!0}),Qc(n,r);else t[e]=i}else"replace"===o?t[e]=i:"remove"===o&&r&&(t[e]=null)}(r,e,n),function(t,e){if(!t)return;if(t.hv=e.hv=[gN(e,["left","right"]),gN(e,["top","bottom"])],"group"===t.type){var n=t,i=e;null==n.width&&(n.width=i.width=0),null==n.height&&(n.height=i.height=0)}}(r[e],n))}),this);for(var l=r.length-1;l>=0;l--)null==r[l]?r.splice(l,1):delete r[l].$action},e.prototype._flatten=function(t,e,n){O(t,(function(t){if(t){n&&(t.parentOption=n),e.push(t);var i=t.children;"group"===t.type&&i&&this._flatten(i,e,t),delete t.children}}),this)},e.prototype.useElOptionsToUpdate=function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t},e.type="graphic",e.defaultOption={elements:[]},e}(ep),pN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this._elMap=ct()},e.prototype.render=function(t,e,n){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t),this._relocate(t,n)},e.prototype._updateElements=function(t){var e=t.useElOptionsToUpdate();if(e){var n=this._elMap,i=this.group;O(e,(function(e){var r=kr(e.id,null),o=null!=r?n.get(r):null,a=kr(e.parentId,null),s=null!=a?n.get(a):i,l=e.type,u=e.style;"text"===l&&u&&e.hv&&e.hv[1]&&(u.textVerticalAlign=u.textBaseline=u.verticalAlign=u.align=null);var h=e.textContent,c=e.textConfig;if(u&&kP(u,l,!!c,!!h)){var p=LP(u,l,!0);!c&&p.textConfig&&(c=e.textConfig=p.textConfig),!h&&p.textContent&&(h=p.textContent)}var d=function(t){return t=T({},t),O(["id","parentId","$action","hv","bounding","textContent"].concat(Uc),(function(e){delete t[e]})),t}(e);var f=e.$action||"merge";"merge"===f?o?o.attr(d):dN(r,s,d,n):"replace"===f?(fN(o,n),dN(r,s,d,n)):"remove"===f&&fN(o,n);var g=n.get(r);if(g&&h)if("merge"===f){var y=g.getTextContent();y?y.attr(h):g.setTextContent(new fs(h))}else"replace"===f&&g.setTextContent(new fs(h));if(g){var v=lN(g);v.__ecGraphicWidthOption=e.width,v.__ecGraphicHeightOption=e.height,function(t,e,n){var i=Ss(t).eventData;t.silent||t.ignore||i||(i=Ss(t).eventData={componentType:"graphic",componentIndex:e.componentIndex,name:t.name});i&&(i.info=n.info)}(g,t,e),gh({el:g,componentModel:t,itemName:g.name,itemTooltipOption:e.tooltip})}}))}},e.prototype._relocate=function(t,e){for(var n=t.option.elements,i=this.group,r=this._elMap,o=e.getWidth(),a=e.getHeight(),s=0;s=0;s--){var c,p,d;if(d=null!=(p=kr((c=n[s]).id,null))?r.get(p):null){var f=d.parent;h=lN(f);qc(d,c,f===i?{width:o,height:a}:{width:h.__ecGraphicWidth,height:h.__ecGraphicHeight},null,{hv:c.hv,boundingMode:c.bounding})}}},e.prototype._clear=function(){var t=this._elMap;t.each((function(e){fN(e,t)})),this._elMap=ct()},e.prototype.dispose=function(){this._clear()},e.type="graphic",e}(Hf);function dN(t,e,n,i){var r=n.type;var o=ft(uN,r)?uN[r]:$u(r);var a=new o(n);e.add(a),i.set(t,a),lN(a).__ecGraphicId=t}function fN(t,e){var n=t&&t.parent;n&&("group"===t.type&&t.traverse((function(t){fN(t,e)})),e.removeKey(lN(t).__ecGraphicId),n.remove(t))}function gN(t,e){var n;return O(e,(function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)})),n}var yN=["x","y","radius","angle","single"],vN=["cartesian2d","polar","singleAxis"];function mN(t){return t+"Axis"}function _N(t,e){var n,i=ct(),r=[],o=ct();t.eachComponent({mainType:"dataZoom",query:e},(function(t){o.get(t.uid)||s(t)}));do{n=!1,t.eachComponent("dataZoom",a)}while(n);function a(t){!o.get(t.uid)&&function(t){var e=!1;return t.eachTargetAxis((function(t,n){var r=i.get(t);r&&r[n]&&(e=!0)})),e}(t)&&(s(t),n=!0)}function s(t){o.set(t.uid,!0),r.push(t),t.eachTargetAxis((function(t,e){(i.get(t)||i.set(t,[]))[e]=!0}))}return r}function xN(t){var e=t.ecModel,n={infoList:[],infoMap:ct()};return t.eachTargetAxis((function(t,i){var r=e.getComponent(mN(t),i);if(r){var o=r.getCoordSysModel();if(o){var a=o.uid,s=n.infoMap.get(a);s||(s={model:o,axisModels:[]},n.infoList.push(s),n.infoMap.set(a,s)),s.axisModels.push(r)}}})),n}var bN=function(){function t(){this.indexList=[],this.indexMap=[]}return t.prototype.add=function(t){this.indexMap[t]||(this.indexList.push(t),this.indexMap[t]=!0)},t}(),wN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._autoThrottle=!0,n._noTarget=!0,n._rangePropMode=["percent","percent"],n}return n(e,t),e.prototype.init=function(t,e,n){var i=SN(t);this.settledOption=i,this.mergeDefaultAndTheme(t,n),this._doInit(i)},e.prototype.mergeOption=function(t){var e=SN(t);M(this.option,t,!0),M(this.settledOption,e,!0),this._doInit(e)},e.prototype._doInit=function(t){var e=this.option;this._setDefaultThrottle(t),this._updateRangeUse(t);var n=this.settledOption;O([["start","startValue"],["end","endValue"]],(function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=n[t[0]]=null)}),this),this._resetTarget()},e.prototype._resetTarget=function(){var t=this.get("orient",!0),e=this._targetAxisInfoMap=ct();this._fillSpecifiedTargetAxis(e)?this._orient=t||this._makeAutoOrientByTargetAxis():(this._orient=t||"horizontal",this._fillAutoTargetAxisByOrient(e,this._orient)),this._noTarget=!0,e.each((function(t){t.indexList.length&&(this._noTarget=!1)}),this)},e.prototype._fillSpecifiedTargetAxis=function(t){var e=!1;return O(yN,(function(n){var i=this.getReferringComponents(mN(n),Br);if(i.specified){e=!0;var r=new bN;O(i.models,(function(t){r.add(t.componentIndex)})),t.set(n,r)}}),this),e},e.prototype._fillAutoTargetAxisByOrient=function(t,e){var n=this.ecModel,i=!0;if(i){var r="vertical"===e?"y":"x";o(n.findComponents({mainType:r+"Axis"}),r)}i&&o(n.findComponents({mainType:"singleAxis",filter:function(t){return t.get("orient",!0)===e}}),"single");function o(e,n){var r=e[0];if(r){var o=new bN;if(o.add(r.componentIndex),t.set(n,o),i=!1,"x"===n||"y"===n){var a=r.getReferringComponents("grid",Vr).models[0];a&&O(e,(function(t){r.componentIndex!==t.componentIndex&&a===t.getReferringComponents("grid",Vr).models[0]&&o.add(t.componentIndex)}))}}}i&&O(yN,(function(e){if(i){var r=n.findComponents({mainType:mN(e),filter:function(t){return"category"===t.get("type",!0)}});if(r[0]){var o=new bN;o.add(r[0].componentIndex),t.set(e,o),i=!1}}}),this)},e.prototype._makeAutoOrientByTargetAxis=function(){var t;return this.eachTargetAxis((function(e){!t&&(t=e)}),this),"y"===t?"vertical":"horizontal"},e.prototype._setDefaultThrottle=function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},e.prototype._updateRangeUse=function(t){var e=this._rangePropMode,n=this.get("rangeMode");O([["start","startValue"],["end","endValue"]],(function(i,r){var o=null!=t[i[0]],a=null!=t[i[1]];o&&!a?e[r]="percent":!o&&a?e[r]="value":n?e[r]=n[r]:o&&(e[r]="percent")}))},e.prototype.noTarget=function(){return this._noTarget},e.prototype.getFirstTargetAxisModel=function(){var t;return this.eachTargetAxis((function(e,n){null==t&&(t=this.ecModel.getComponent(mN(e),n))}),this),t},e.prototype.eachTargetAxis=function(t,e){this._targetAxisInfoMap.each((function(n,i){O(n.indexList,(function(n){t.call(e,i,n)}))}))},e.prototype.getAxisProxy=function(t,e){var n=this.getAxisModel(t,e);if(n)return n.__dzAxisProxy},e.prototype.getAxisModel=function(t,e){var n=this._targetAxisInfoMap.get(t);if(n&&n.indexMap[e])return this.ecModel.getComponent(mN(t),e)},e.prototype.setRawRange=function(t){var e=this.option,n=this.settledOption;O([["start","startValue"],["end","endValue"]],(function(i){null==t[i[0]]&&null==t[i[1]]||(e[i[0]]=n[i[0]]=t[i[0]],e[i[1]]=n[i[1]]=t[i[1]])}),this),this._updateRangeUse(t)},e.prototype.setCalculatedRange=function(t){var e=this.option;O(["start","startValue","end","endValue"],(function(n){e[n]=t[n]}))},e.prototype.getPercentRange=function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},e.prototype.getValueRange=function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},e.prototype.findRepresentativeAxisProxy=function(t){if(t)return t.__dzAxisProxy;for(var e,n=this._targetAxisInfoMap.keys(),i=0;i=0}(e)){var n=mN(this._dimName),i=e.getReferringComponents(n,Vr).models[0];i&&this._axisIndex===i.componentIndex&&t.push(e)}}),this),t},t.prototype.getAxisModel=function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},t.prototype.getMinMaxSpan=function(){return S(this._minMaxSpan)},t.prototype.calculateDataWindow=function(t){var e,n=this._dataExtent,i=this.getAxisModel().axis.scale,r=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[],s=[];CN(["start","end"],(function(l,u){var h=t[l],c=t[l+"Value"];"percent"===r[u]?(null==h&&(h=o[u]),c=i.parse(ji(h,o,n))):(e=!0,h=ji(c=null==c?n[u]:i.parse(c),n,o)),s[u]=c,a[u]=h})),DN(s),DN(a);var l=this._minMaxSpan;function u(t,e,n,r,o){var a=o?"Span":"ValueSpan";uA(0,t,n,"all",l["min"+a],l["max"+a]);for(var s=0;s<2;s++)e[s]=ji(t[s],n,r,!0),o&&(e[s]=i.parse(e[s]))}return e?u(s,a,n,o,!1):u(a,s,o,n,!0),{valueWindow:s,percentWindow:a}},t.prototype.reset=function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=function(t,e,n){var i=[1/0,-1/0];CN(n,(function(t){!function(t,e,n){e&&O(Sx(e,n),(function(n){var i=e.getApproximateExtent(n);i[0]t[1]&&(t[1]=i[1])}))}(i,t.getData(),e)}));var r=t.getAxisModel(),o=px(r.axis.scale,r,i).calculate();return[o.min,o.max]}(this,this._dimName,e),this._updateMinMaxSpan();var n=this.calculateDataWindow(t.settledOption);this._valueWindow=n.valueWindow,this._percentWindow=n.percentWindow,this._setAxisModel()}},t.prototype.filterData=function(t,e){if(t===this._dataZoomModel){var n=this._dimName,i=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow;"none"!==r&&CN(i,(function(t){var e=t.getData(),i=e.mapDimensionsAll(n);if(i.length){if("weakFilter"===r){var a=e.getStore(),s=R(i,(function(t){return e.getDimensionIndex(t)}),e);e.filterSelf((function(t){for(var e,n,r,l=0;lo[1];if(h&&!c&&!p)return!0;h&&(r=!0),c&&(e=!0),p&&(n=!0)}return r&&e&&n}))}else CN(i,(function(n){if("empty"===r)t.setData(e=e.map(n,(function(t){return function(t){return t>=o[0]&&t<=o[1]}(t)?t:NaN})));else{var i={};i[n]=o,e.selectRange(i)}}));CN(i,(function(t){e.setApproximateExtent(o,t)}))}}))}},t.prototype._updateMinMaxSpan=function(){var t=this._minMaxSpan={},e=this._dataZoomModel,n=this._dataExtent;CN(["min","max"],(function(i){var r=e.get(i+"Span"),o=e.get(i+"ValueSpan");null!=o&&(o=this.getAxisModel().axis.scale.parse(o)),null!=o?r=ji(n[0]+o,n,[0,100],!0):null!=r&&(o=ji(r,[0,100],n,!0)-n[0]),t[i+"Span"]=r,t[i+"ValueSpan"]=o}),this)},t.prototype._setAxisModel=function(){var t=this.getAxisModel(),e=this._percentWindow,n=this._valueWindow;if(e){var i=tr(n,[0,500]);i=Math.min(i,20);var r=t.axis.scale.rawExtentInfo;0!==e[0]&&r.setDeterminedMinMax("min",+n[0].toFixed(i)),100!==e[1]&&r.setDeterminedMinMax("max",+n[1].toFixed(i)),r.freeze()}},t}();var kN={getTargetSeries:function(t){function e(e){t.eachComponent("dataZoom",(function(n){n.eachTargetAxis((function(i,r){var o=t.getComponent(mN(i),r);e(i,r,o,n)}))}))}e((function(t,e,n,i){n.__dzAxisProxy=null}));var n=[];e((function(e,i,r,o){r.__dzAxisProxy||(r.__dzAxisProxy=new AN(e,i,o,t),n.push(r.__dzAxisProxy))}));var i=ct();return O(n,(function(t){O(t.getTargetSeriesModels(),(function(t){i.set(t.uid,t)}))})),i},overallReset:function(t,e){t.eachComponent("dataZoom",(function(t){t.eachTargetAxis((function(e,n){t.getAxisProxy(e,n).reset(t)})),t.eachTargetAxis((function(n,i){t.getAxisProxy(n,i).filterData(t,e)}))})),t.eachComponent("dataZoom",(function(t){var e=t.findRepresentativeAxisProxy();if(e){var n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setCalculatedRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]})}}))}};var LN=!1;function PN(t){LN||(LN=!0,t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,kN),function(t){t.registerAction("dataZoom",(function(t,e){O(_N(e,t),(function(e){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})}))}))}(t),t.registerSubTypeDefaulter("dataZoom",(function(){return"slider"})))}function ON(t){t.registerComponentModel(MN),t.registerComponentView(TN),PN(t)}var RN=function(){},NN={};function zN(t,e){NN[t]=e}function EN(t){return NN[t]}var VN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){t.prototype.optionUpdated.apply(this,arguments);var e=this.ecModel;O(this.option.feature,(function(t,n){var i=EN(n);i&&(i.getDefaultOption&&(i.defaultOption=i.getDefaultOption(e)),M(t,i.defaultOption))}))},e.type="toolbox",e.layoutMode={type:"box",ignoreSize:!0},e.defaultOption={show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}},tooltip:{show:!1,position:"bottom"}},e}(ep);function BN(t,e){var n=Pc(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),t=new cs({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}var GN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this.group;if(r.removeAll(),t.get("show")){var o=+t.get("itemSize"),a=t.get("feature")||{},s=this._features||(this._features={}),l=[];O(a,(function(t,e){l.push(e)})),new Vm(this._featureNames||[],l).add(u).update(u).remove(G(u,null)).execute(),this._featureNames=l,function(t,e,n){var i=e.getBoxLayoutParams(),r=e.get("padding"),o={width:n.getWidth(),height:n.getHeight()},a=jc(i,o,r);Zc(e.get("orient"),t,e.get("itemGap"),a.width,a.height),qc(t,i,o,r)}(r,t,n),r.add(BN(r.getBoundingRect(),t)),r.eachChild((function(t){var e=t.__title,i=t.ensureState("emphasis"),a=i.textConfig||(i.textConfig={}),s=t.getTextContent(),l=s&&s.states.emphasis;if(l&&!H(l)&&e){var u=l.style||(l.style={}),h=Si(e,fs.makeFont(u)),c=t.x+r.x,p=!1;t.y+r.y+o+h.height>n.getHeight()&&(a.position="top",p=!0);var d=p?-5-h.height:o+8;c+h.width/2>n.getWidth()?(a.position=["100%",d],u.align="right"):c-h.width/2<0&&(a.position=[0,d],u.align="left")}}))}function u(u,h){var c,p=l[u],d=l[h],f=a[p],g=new Wh(f,t,t.ecModel);if(i&&null!=i.newTitle&&i.featureName===p&&(f.title=i.newTitle),p&&!d){if(function(t){return 0===t.indexOf("my")}(p))c={onclick:g.option.onclick,featureName:p};else{var y=EN(p);if(!y)return;c=new y}s[p]=c}else if(!(c=s[d]))return;c.uid=Xh("toolbox-feature"),c.model=g,c.ecModel=e,c.api=n;var v=c instanceof RN;p||!d?!g.get("show")||v&&c.unusable?v&&c.remove&&c.remove(e,n):(!function(i,a,s){var l,u,h=i.getModel("iconStyle"),c=i.getModel(["emphasis","iconStyle"]),p=a instanceof RN&&a.getIcons?a.getIcons():i.get("icon"),d=i.get("title")||{};"string"==typeof p?(l={})[s]=p:l=p;"string"==typeof d?(u={})[s]=d:u=d;var f=i.iconPaths={};O(l,(function(s,l){var p=ch(s,{},{x:-o/2,y:-o/2,width:o,height:o});p.setStyle(h.getItemStyle()),p.ensureState("emphasis").style=c.getItemStyle();var d=new fs({style:{text:u[l],align:c.get("textAlign"),borderRadius:c.get("textBorderRadius"),padding:c.get("textPadding"),fill:null},ignore:!0});p.setTextContent(d),gh({el:p,componentModel:t,itemName:l,formatterParamsExtra:{title:u[l]}}),p.__title=u[l],p.on("mouseover",(function(){var e=c.getItemStyle(),n="vertical"===t.get("orient")?null==t.get("right")?"right":"left":null==t.get("bottom")?"bottom":"top";d.setStyle({fill:c.get("textFill")||e.fill||e.stroke||"#000",backgroundColor:c.get("textBackgroundColor")}),p.setTextConfig({position:c.get("textPosition")||n}),d.ignore=!t.get("showTitle"),Qs(this)})).on("mouseout",(function(){"emphasis"!==i.get(["iconStatus",l])&&tl(this),d.hide()})),("emphasis"===i.get(["iconStatus",l])?Qs:tl)(p),r.add(p),p.on("click",B(a.onclick,a,e,n,l)),f[l]=p}))}(g,c,p),g.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&("emphasis"===e?Qs:tl)(i[t])},c instanceof RN&&c.render&&c.render(g,e,n,i)):v&&c.dispose&&c.dispose(e,n)}},e.prototype.updateView=function(t,e,n,i){O(this._features,(function(t){t instanceof RN&&t.updateView&&t.updateView(t.model,e,n,i)}))},e.prototype.remove=function(t,e){O(this._features,(function(n){n instanceof RN&&n.remove&&n.remove(t,e)})),this.group.removeAll()},e.prototype.dispose=function(t,e){O(this._features,(function(n){n instanceof RN&&n.dispose&&n.dispose(t,e)}))},e.type="toolbox",e}(Hf);var FN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",r="svg"===e.getZr().painter.getType(),o=r?"svg":n.get("type",!0)||"png",s=e.getConnectedDataURL({type:o,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:n.get("connectedBackgroundColor"),excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")});if("function"!=typeof MouseEvent||!a.browser.newEdge&&(a.browser.ie||a.browser.edge))if(window.navigator.msSaveOrOpenBlob||r){var l=s.split(","),u=l[0].indexOf("base64")>-1,h=r?decodeURIComponent(l[1]):l[1];u&&(h=window.atob(h));var c=i+"."+o;if(window.navigator.msSaveOrOpenBlob){for(var p=h.length,d=new Uint8Array(p);p--;)d[p]=h.charCodeAt(p);var f=new Blob([d]);window.navigator.msSaveOrOpenBlob(f,c)}else{var g=document.createElement("iframe");document.body.appendChild(g);var y=g.contentWindow,v=y.document;v.open("image/svg+xml","replace"),v.write(h),v.close(),y.focus(),v.execCommand("SaveAs",!0,c),document.body.removeChild(g)}}else{var m=n.get("lang"),_='',x=window.open();x.document.write(_),x.document.title=i}else{var b=document.createElement("a");b.download=i+"."+o,b.target="_blank",b.href=s;var w=new MouseEvent("click",{view:document.defaultView,bubbles:!0,cancelable:!1});b.dispatchEvent(w)}},e.getDefaultOption=function(t){return{show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:t.getLocaleModel().get(["toolbox","saveAsImage","title"]),type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],lang:t.getLocaleModel().get(["toolbox","saveAsImage","lang"])}},e}(RN);FN.prototype.unusable=!a.canvasSupported;var HN="__ec_magicType_stack__",WN=[["line","bar"],["stack"]],UN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return O(t.get("type"),(function(t){e[t]&&(n[t]=e[t])})),n},e.getDefaultOption=function(t){return{show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:t.getLocaleModel().get(["toolbox","magicType","title"]),option:{},seriesIndex:{}}},e.prototype.onclick=function(t,e,n){var i=this.model,r=i.get(["seriesIndex",n]);if(XN[n]){var o,a={series:[]};O(WN,(function(t){A(t,n)>=0&&O(t,(function(t){i.setIconStatus(t,"normal")}))})),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==r?null:{seriesIndex:r}},(function(t){var e=t.subType,r=t.id,o=XN[n](e,r,t,i);o&&(C(o,t.option),a.series.push(o));var s=t.coordinateSystem;if(s&&"cartesian2d"===s.type&&("line"===n||"bar"===n)){var l=s.getAxesByScale("ordinal")[0];if(l){var u=l.dim+"Axis",h=t.getReferringComponents(u,Vr).models[0].componentIndex;a[u]=a[u]||[];for(var c=0;c<=h;c++)a[u][h]=a[u][h]||{};a[u][h].boundaryGap="bar"===n}}}));var s=n;"stack"===n&&(o=M({stack:i.option.title.tiled,tiled:i.option.title.stack},i.option.title),"emphasis"!==i.get(["iconStatus",n])&&(s="tiled")),e.dispatchAction({type:"changeMagicType",currentType:s,newOption:a,newTitle:o,featureName:"magicType"})}},e}(RN),XN={line:function(t,e,n,i){if("bar"===t)return M({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","line"])||{},!0)},bar:function(t,e,n,i){if("line"===t)return M({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","bar"])||{},!0)},stack:function(t,e,n,i){var r=n.get("stack")===HN;if("line"===t||"bar"===t)return i.setIconStatus("stack",r?"normal":"emphasis"),M({id:e,stack:r?"":HN},i.get(["option","stack"])||{},!0)}};Mm({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},(function(t,e){e.mergeOption(t.newOption)}));var YN=new Array(60).join("-"),ZN="\t";function jN(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}var qN=new RegExp("[\t]+","g");function KN(t,e){var n=t.split(new RegExp("\n*"+YN+"\n*","g")),i={series:[]};return O(n,(function(t,n){if(function(t){if(t.slice(0,t.indexOf("\n")).indexOf(ZN)>=0)return!0}(t)){var r=function(t){for(var e=t.split(/\n+/g),n=[],i=R(jN(e.shift()).split(qN),(function(t){return{name:t,data:[]}})),r=0;r=0)&&t(r,i._targetInfoList)}))}return t.prototype.setOutputRanges=function(t,e){return this.matchOutputRanges(t,e,(function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=hz[t.brushType](0,n,e);t.__rangeOffset={offset:pz[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})),t},t.prototype.matchOutputRanges=function(t,e,n){O(t,(function(t){var i=this.findTargetInfo(t,e);i&&!0!==i&&O(i.coordSyses,(function(i){var r=hz[t.brushType](1,i,t.range,!0);n(t,r.values,i,e)}))}),this)},t.prototype.setInputRanges=function(t,e){O(t,(function(t){var n,i,r,o,a,s=this.findTargetInfo(t,e);if(t.range=t.range||[],s&&!0!==s){t.panelId=s.panelId;var l=hz[t.brushType](0,s.coordSys,t.coordRange),u=t.__rangeOffset;t.range=u?pz[t.brushType](l.values,u.offset,(n=l.xyMinMax,i=u.xyMinMax,r=fz(n),o=fz(i),a=[r[0]/o[0],r[1]/o[1]],isNaN(a[0])&&(a[0]=1),isNaN(a[1])&&(a[1]=1),a)):l.values}}),this)},t.prototype.makePanelOpts=function(t,e){return R(this._targetInfoList,(function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e?e(n):null,clipPath:ck(i),isTargetByCursor:dk(i,t,n.coordSysModel),getLinearBrushOtherExtent:pk(i)}}))},t.prototype.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return!0===i||i&&A(i.coordSyses,e.coordinateSystem)>=0},t.prototype.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=az(e,t),r=0;rt[1]&&t.reverse(),t}function az(t,e){return zr(t,e,{includeMainTypes:iz})}var sz={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o=ct(),a={},s={};(n||i||r)&&(O(n,(function(t){var e=t.axis.grid.model;o.set(e.id,e),a[e.id]=!0})),O(i,(function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0})),O(r,(function(t){o.set(t.id,t),a[t.id]=!0,s[t.id]=!0})),o.each((function(t){var r=t.coordinateSystem,o=[];O(r.getCartesians(),(function(t,e){(A(n,t.getAxis("x").model)>=0||A(i,t.getAxis("y").model)>=0)&&o.push(t)})),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:uz.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})})))},geo:function(t,e){O(t.geoModels,(function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:uz.geo})}))}},lz=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],uz={grid:function(){return this.coordSys.master.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(rh(t)),e}},hz={lineX:G(cz,0),lineY:G(cz,1),rect:function(t,e,n,i){var r=t?e.pointToData([n[0][0],n[1][0]],i):e.dataToPoint([n[0][0],n[1][0]],i),o=t?e.pointToData([n[0][1],n[1][1]],i):e.dataToPoint([n[0][1],n[1][1]],i),a=[oz([r[0],o[0]]),oz([r[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,n,i){var r=[[1/0,-1/0],[1/0,-1/0]];return{values:R(n,(function(n){var o=t?e.pointToData(n,i):e.dataToPoint(n,i);return r[0][0]=Math.min(r[0][0],o[0]),r[1][0]=Math.min(r[1][0],o[1]),r[0][1]=Math.max(r[0][1],o[0]),r[1][1]=Math.max(r[1][1],o[1]),o})),xyMinMax:r}}};function cz(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=oz(R([0,1],(function(t){return e?r.coordToData(r.toLocalCoord(i[t]),!0):r.toGlobalCoord(r.dataToCoord(i[t]))}))),a=[];return a[t]=o,a[1-t]=[NaN,NaN],{values:o,xyMinMax:a}}var pz={lineX:G(dz,0),lineY:G(dz,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return R(t,(function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]}))}};function dz(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function fz(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var gz,yz,vz=O,mz=br+"toolbox-dataZoom_",_z=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){this._brushController||(this._brushController=new RA(n.getZr()),this._brushController.on("brush",B(this._onBrush,this)).mount()),function(t,e,n,i,r){var o=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive);n._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=new rz(bz(t),e,{include:["grid"]}).makePanelOpts(r,(function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"}));n._brushController.setPanels(a).enableBrush(!(!o||!a.length)&&{brushType:"auto",brushStyle:t.getModel("brushStyle").getItemStyle()})}(t,e,this,i,n),function(t,e){t.setIconStatus("back",function(t){return ez(t).length}(e)>1?"emphasis":"normal")}(t,e)},e.prototype.onclick=function(t,e,n){xz[n].call(this)},e.prototype.remove=function(t,e){this._brushController&&this._brushController.unmount()},e.prototype.dispose=function(t,e){this._brushController&&this._brushController.dispose()},e.prototype._onBrush=function(t){var e=t.areas;if(t.isEnd&&e.length){var n={},i=this.ecModel;this._brushController.updateCovers([]),new rz(bz(this.model),i,{include:["grid"]}).matchOutputRanges(e,i,(function(t,e,n){if("cartesian2d"===n.type){var i=t.brushType;"rect"===i?(r("x",n,e[0]),r("y",n,e[1])):r({lineX:"x",lineY:"y"}[i],n,e)}})),function(t,e){var n=ez(t);QN(e,(function(e,i){for(var r=n.length-1;r>=0&&!n[r][i];r--);if(r<0){var o=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(o){var a=o.getPercentRange();n[0][i]={dataZoomId:i,start:a[0],end:a[1]}}}})),n.push(e)}(i,n),this._dispatchZoomAction(n)}function r(t,e,r){var o=e.getAxis(t),a=o.model,s=function(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},(function(n){n.getAxisModel(t,e.componentIndex)&&(i=n)})),i}(t,a,i),l=s.findRepresentativeAxisProxy(a).getMinMaxSpan();null==l.minValueSpan&&null==l.maxValueSpan||(r=uA(0,r.slice(),o.scale.getExtent(),0,l.minValueSpan,l.maxValueSpan)),s&&(n[s.id]={dataZoomId:s.id,startValue:r[0],endValue:r[1]})}},e.prototype._dispatchZoomAction=function(t){var e=[];vz(t,(function(t,n){e.push(S(t))})),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},e.getDefaultOption=function(t){return{show:!0,filterMode:"filter",icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:t.getLocaleModel().get(["toolbox","dataZoom","title"]),brushStyle:{borderWidth:0,color:"rgba(210,219,238,0.2)"}}},e}(RN),xz={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(function(t){var e=ez(t),n=e[e.length-1];e.length>1&&e.pop();var i={};return QN(n,(function(t,n){for(var r=e.length-1;r>=0;r--)if(t=e[r][n]){i[n]=t;break}})),i}(this.ecModel))}};function bz(t){var e={xAxisIndex:t.get("xAxisIndex",!0),yAxisIndex:t.get("yAxisIndex",!0),xAxisId:t.get("xAxisId",!0),yAxisId:t.get("yAxisId",!0)};return null==e.xAxisIndex&&null==e.xAxisId&&(e.xAxisIndex="all"),null==e.yAxisIndex&&null==e.yAxisId&&(e.yAxisIndex="all"),e}gz="dataZoom",yz=function(t){var e=t.getComponent("toolbox",0),n=["feature","dataZoom"];if(e&&null!=e.get(n)){var i=e.getModel(n),r=[],o=zr(t,bz(i));return vz(o.xAxisModels,(function(t){return a(t,"xAxis","xAxisIndex")})),vz(o.yAxisModels,(function(t){return a(t,"yAxis","yAxisIndex")})),r}function a(t,e,n){var o=t.componentIndex,a={type:"select",$fromToolbox:!0,filterMode:i.get("filterMode",!0)||"filter",id:mz+e+o};a[n]=o,r.push(a)}},ot(null==Sp.get(gz)&&yz),Sp.set(gz,yz);var wz=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="tooltip",e.dependencies=["axisPointer"],e.defaultOption={zlevel:0,z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"#fff",shadowBlur:10,shadowColor:"rgba(0, 0, 0, .2)",shadowOffsetX:1,shadowOffsetY:2,borderRadius:4,borderWidth:1,padding:null,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#666",fontSize:14}},e}(ep);function Sz(t){var e=t.get("confine");return null!=e?!!e:"richText"===t.get("renderMode")}function Mz(t){if(a.domSupported)for(var e=document.documentElement.style,n=0,i=t.length;n-1?(u+="top:50%",h+="translateY(-50%) rotate("+(a="left"===s?-225:-45)+"deg)"):(u+="left:50%",h+="translateX(-50%) rotate("+(a="top"===s?225:45)+"deg)");var c=a*Math.PI/180,p=l+r,d=p*Math.abs(Math.cos(c))+p*Math.abs(Math.sin(c)),f=e+" solid "+r+"px;";return'
'}(n,i,r)),W(t))o.innerHTML=t+a;else if(t){o.innerHTML="",F(t)||(t=[t]);for(var s=0;s=0?this._tryShow(n,i):"leave"===e&&this._hide(i))}),this))},e.prototype._keepShow=function(){var t=this._tooltipModel,e=this._ecModel,n=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var i=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout((function(){!n.isDisposed()&&i.manuallyShowTip(t,e,n,{x:i._lastX,y:i._lastY,dataByCoordSys:i._lastDataByCoordSys})}))}},e.prototype.manuallyShowTip=function(t,e,n,i){if(i.from!==this.uid&&!a.node){var r=Uz(i,n);this._ticket="";var o=i.dataByCoordSys,s=function(t,e,n){var i=Er(t).queryOptionMap,r=i.keys()[0];if(!r||"series"===r)return;var o,a=Gr(e,r,i.get(r),{useDefault:!1,enableAll:!1,enableNone:!1}).models[0];if(!a)return;if(n.getViewOfComponentModel(a).group.traverse((function(e){var n=Ss(e).tooltipConfig;if(n&&n.name===t.name)return o=e,!0})),o)return{componentMainType:r,componentIndex:a.componentIndex,el:o}}(i,e,n);if(s){var l=s.el.getBoundingRect().clone();l.applyTransform(s.el.transform),this._tryShow({offsetX:l.x+l.width/2,offsetY:l.y+l.height/2,target:s.el,position:i.position,positionDefault:"bottom"},r)}else if(i.tooltip&&null!=i.x&&null!=i.y){var u=Fz;u.x=i.x,u.y=i.y,u.update(),Ss(u).tooltipConfig={name:null,option:i.tooltip},this._tryShow({offsetX:i.x,offsetY:i.y,target:u},r)}else if(o)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,dataByCoordSys:o,tooltipOption:i.tooltipOption},r);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var h=KO(i,e),c=h.point[0],p=h.point[1];null!=c&&null!=p&&this._tryShow({offsetX:c,offsetY:p,target:h.el,position:i.position,positionDefault:"bottom"},r)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target},r))}},e.prototype.manuallyHideTip=function(t,e,n,i){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=this._lastDataByCoordSys=null,i.from!==this.uid&&this._hide(Uz(i,n))},e.prototype._manuallyAxisShowTip=function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){var s=e.getSeriesByIndex(r);if(s)if("axis"===Wz([s.getData().getItemModel(o),s,(s.coordinateSystem||{}).model],this._tooltipModel).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},e.prototype._tryShow=function(t,e){var n=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var i=t.dataByCoordSys;if(i&&i.length)this._showAxisTooltip(i,t);else if(n){var r,o;this._lastDataByCoordSys=null,Hg(n,(function(t){return null!=Ss(t).dataIndex?(r=t,!0):null!=Ss(t).tooltipConfig?(o=t,!0):void 0}),!0),r?this._showSeriesItemTooltip(t,r,e):o?this._showComponentItemTooltip(t,o,e):this._hide(e)}else this._lastDataByCoordSys=null,this._hide(e)}},e.prototype._showOrMove=function(t,e){var n=t.get("showDelay");e=B(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},e.prototype._showAxisTooltip=function(t,e){var n=this._ecModel,i=this._tooltipModel,r=[e.offsetX,e.offsetY],o=Wz([e.tooltipOption],i),a=this._renderMode,s=[],l=bf("section",{blocks:[],noHeader:!0}),u=[],h=new kf;Bz(t,(function(t){Bz(t.dataByAxis,(function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),i=t.value;if(e&&null!=i){var r=PO(i,e.axis,n,t.seriesDataIndices,t.valueLabelOpt),o=bf("section",{header:r,noHeader:!at(r),sortBlocks:!0,blocks:[]});l.blocks.push(o),O(t.seriesDataIndices,(function(l){var c=n.getSeriesByIndex(l.seriesIndex),p=l.dataIndexInside,d=c.getDataParams(p);if(!(d.dataIndex<0)){d.axisDim=t.axisDim,d.axisIndex=t.axisIndex,d.axisType=t.axisType,d.axisId=t.axisId,d.axisValue=mx(e.axis,{value:i}),d.axisValueLabel=r,d.marker=h.makeTooltipMarker("item",Fc(d.color),a);var f=Ed(c.formatTooltip(p,!0,null));f.markupFragment&&o.blocks.push(f.markupFragment),f.markupText&&u.push(f.markupText),s.push(d)}}))}}))})),l.blocks.reverse(),u.reverse();var c=e.position,p=o.get("order"),d=Mf(l,h,a,p,n.get("useUTC"),o.get("textStyle"));d&&u.unshift(d);var f="richText"===a?"\n\n":"
",g=u.join(f);this._showOrMove(o,(function(){this._updateContentNotChangedOnAxis(t,s)?this._updatePosition(o,c,r[0],r[1],this._tooltipContent,s):this._showTooltipContent(o,g,s,Math.random()+"",r[0],r[1],c,null,h)}))},e.prototype._showSeriesItemTooltip=function(t,e,n){var i=this._ecModel,r=Ss(e),o=r.seriesIndex,a=i.getSeriesByIndex(o),s=r.dataModel||a,l=r.dataIndex,u=r.dataType,h=s.getData(u),c=this._renderMode,p=t.positionDefault,d=Wz([h.getItemModel(l),s,a&&(a.coordinateSystem||{}).model],this._tooltipModel,p?{position:p}:null),f=d.get("trigger");if(null==f||"item"===f){var g=s.getDataParams(l,u),y=new kf;g.marker=y.makeTooltipMarker("item",Fc(g.color),c);var v=Ed(s.formatTooltip(l,!1,u)),m=d.get("order"),_=v.markupFragment?Mf(v.markupFragment,y,c,m,i.get("useUTC"),d.get("textStyle")):v.markupText,x="item_"+s.name+"_"+l;this._showOrMove(d,(function(){this._showTooltipContent(d,_,g,x,t.offsetX,t.offsetY,t.position,t.target,y)})),n({type:"showTip",dataIndexInside:l,dataIndex:h.getRawIndex(l),seriesIndex:o,from:this.uid})}},e.prototype._showComponentItemTooltip=function(t,e,n){var i=Ss(e),r=i.tooltipConfig.option||{};if(W(r)){r={content:r,formatter:r}}var o=[r],a=this._ecModel.getComponent(i.componentMainType,i.componentIndex);a&&o.push(a),o.push({formatter:r.content});var s=t.positionDefault,l=Wz(o,this._tooltipModel,s?{position:s}:null),u=l.get("content"),h=Math.random()+"",c=new kf;this._showOrMove(l,(function(){var n=S(l.get("formatterParams")||{});this._showTooltipContent(l,u,n,h,t.offsetX,t.offsetY,t.position,e,c)})),n({type:"showTip",from:this.uid})},e.prototype._showTooltipContent=function(t,e,n,i,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var u=this._tooltipContent,h=t.get("formatter");a=a||t.get("position");var c=e,p=this._getNearestPoint([r,o],n,t.get("trigger"),t.get("borderColor")).color;if(h)if(W(h)){var d=t.ecModel.get("useUTC"),f=F(n)?n[0]:n;c=h,f&&f.axisType&&f.axisType.indexOf("time")>=0&&(c=dc(f.axisValue,c,d)),c=Bc(c,n,!0)}else if(H(h)){var g=Vz((function(e,i){e===this._ticket&&(u.setContent(i,l,t,p,a),this._updatePosition(t,a,r,o,u,n,s))}),this);this._ticket=i,c=h(n,i,g)}else c=h;u.setContent(c,l,t,p,a),u.show(t,p),this._updatePosition(t,a,r,o,u,n,s)}},e.prototype._getNearestPoint=function(t,e,n,i){return"axis"===n||F(e)?{color:i||("html"===this._renderMode?"#fff":"none")}:F(e)?void 0:{color:i||e.color||e.borderColor}},e.prototype._doUpdatePosition=function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u=r.getSize(),h=t.get("align"),c=t.get("verticalAlign"),p=a&&a.getBoundingRect().clone();if(a&&p.applyTransform(a.transform),H(e)&&(e=e([n,i],o,r.el,p,{viewSize:[s,l],contentSize:u.slice()})),F(e))n=Gz(e[0],s),i=Gz(e[1],l);else if(Y(e)){var d=e;d.width=u[0],d.height=u[1];var f=jc(d,{width:s,height:l});n=f.x,i=f.y,h=null,c=null}else if(W(e)&&a){var g=function(t,e,n,i){var r=n[0],o=n[1],a=Math.ceil(Math.SQRT2*i)+8,s=0,l=0,u=e.width,h=e.height;switch(t){case"inside":s=e.x+u/2-r/2,l=e.y+h/2-o/2;break;case"top":s=e.x+u/2-r/2,l=e.y-o-a;break;case"bottom":s=e.x+u/2-r/2,l=e.y+h+a;break;case"left":s=e.x-r-a,l=e.y+h/2-o/2;break;case"right":s=e.x+u+a,l=e.y+h/2-o/2}return[s,l]}(e,p,u,t.get("borderWidth"));n=g[0],i=g[1]}else{g=function(t,e,n,i,r,o,a){var s=n.getSize(),l=s[0],u=s[1];null!=o&&(t+l+o+2>i?t-=l+o:t+=o);null!=a&&(e+u+a>r?e-=u+a:e+=a);return[t,e]}(n,i,r,s,l,h?null:20,c?null:20);n=g[0],i=g[1]}if(h&&(n-=Xz(h)?u[0]/2:"right"===h?u[0]:0),c&&(i-=Xz(c)?u[1]/2:"bottom"===c?u[1]:0),Sz(t)){g=function(t,e,n,i,r){var o=n.getSize(),a=o[0],s=o[1];return t=Math.min(t+a,i)-a,e=Math.min(e+s,r)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}(n,i,r,s,l);n=g[0],i=g[1]}r.moveTo(n,i)},e.prototype._updateContentNotChangedOnAxis=function(t,e){var n=this._lastDataByCoordSys,i=this._cbParamsList,r=!!n&&n.length===t.length;return r&&Bz(n,(function(n,o){var a=n.dataByAxis||[],s=(t[o]||{}).dataByAxis||[];(r=r&&a.length===s.length)&&Bz(a,(function(t,n){var o=s[n]||{},a=t.seriesDataIndices||[],l=o.seriesDataIndices||[];(r=r&&t.value===o.value&&t.axisType===o.axisType&&t.axisId===o.axisId&&a.length===l.length)&&Bz(a,(function(t,e){var n=l[e];r=r&&t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})),i&&O(t.seriesDataIndices,(function(t){var n=t.seriesIndex,o=e[n],a=i[n];o&&a&&a.data!==o.data&&(r=!1)}))}))})),this._lastDataByCoordSys=t,this._cbParamsList=e,!!r},e.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},e.prototype.dispose=function(t,e){a.node||(this._tooltipContent.dispose(),jO("itemTooltip",e))},e.type="tooltip",e}(Hf);function Wz(t,e,n){var i,r=e.ecModel;n?(i=new Wh(n,r,r),i=new Wh(e.option,i,r)):i=e;for(var o=t.length-1;o>=0;o--){var a=t[o];a&&(a instanceof Wh&&(a=a.get("tooltip",!0)),W(a)&&(a={formatter:a}),a&&(i=new Wh(a,i,r)))}return i}function Uz(t,e){return t.dispatchAction||B(e.dispatchAction,e)}function Xz(t){return"center"===t||"middle"===t}var Yz=["rect","polygon","keep","clear"];function Zz(t,e){var n=wr(t?t.brush:[]);if(n.length){var i=[];O(n,(function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(i=i.concat(e))}));var r=t&&t.toolbox;F(r)&&(r=r[0]),r||(r={feature:{}},t.toolbox=[r]);var o=r.feature||(r.feature={}),a=o.brush||(o.brush={}),s=a.type||(a.type=[]);s.push.apply(s,i),function(t){var e={};O(t,(function(t){e[t]=1})),t.length=0,O(e,(function(e,n){t.push(n)}))}(s),e&&!s.length&&s.push.apply(s,Yz)}}var jz=O;function qz(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}function Kz(t,e,n){var i={};return jz(e,(function(e){var r,o=i[e]=((r=function(){}).prototype.__hidden=r.prototype,new r);jz(t[e],(function(t,i){if(iC.isValidType(i)){var r={type:i,visual:t};n&&n(r,e),o[i]=new iC(r),"opacity"===i&&((r=S(r)).type="colorAlpha",o.__hidden.__alphaForOpacity=new iC(r))}}))})),i}function $z(t,e,n){var i;O(n,(function(t){e.hasOwnProperty(t)&&qz(e[t])&&(i=!0)})),i&&O(n,(function(n){e.hasOwnProperty(n)&&qz(e[n])?t[n]=S(e[n]):delete t[n]}))}var Jz={lineX:Qz(0),lineY:Qz(1),rect:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])},rect:function(t,e,n){return t&&n.boundingRect.intersect(t)}},polygon:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])&&Jy(n.range,t[0],t[1])},rect:function(t,e,n){var i=n.range;if(!t||i.length<=1)return!1;var r=t.x,o=t.y,a=t.width,s=t.height,l=i[0];return!!(Jy(i,r,o)||Jy(i,r+a,o)||Jy(i,r,o+s)||Jy(i,r+a,o+s)||vi.create(t).contain(l[0],l[1])||ph(r,o,r+a,o,i)||ph(r,o,r,o+s,i)||ph(r+a,o,r+a,o+s,i)||ph(r,o+s,r+a,o+s,i))||void 0}}};function Qz(t){var e=["x","y"],n=["width","height"];return{point:function(e,n,i){if(e){var r=i.range;return tE(e[t],r)}},rect:function(i,r,o){if(i){var a=o.range,s=[i[e[t]],i[e[t]]+i[n[t]]];return s[1]e[0][1]&&(e[0][1]=o[0]),o[1]e[1][1]&&(e[1][1]=o[1])}return e&&uE(e)}};function uE(t){return new vi(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var hE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new RA(e.getZr())).on("brush",B(this._onBrush,this)).mount()},e.prototype.render=function(t,e,n,i){this.model=t,this._updateController(t,e,n,i)},e.prototype.updateTransform=function(t,e,n,i){rE(e),this._updateController(t,e,n,i)},e.prototype.updateVisual=function(t,e,n,i){this.updateTransform(t,e,n,i)},e.prototype.updateView=function(t,e,n,i){this._updateController(t,e,n,i)},e.prototype._updateController=function(t,e,n,i){(!i||i.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice())},e.prototype.dispose=function(){this._brushController.dispose()},e.prototype._onBrush=function(t){var e=this.model.id,n=this.model.brushTargetManager.setOutputRanges(t.areas,this.ecModel);(!t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:e,areas:S(n),$from:e}),t.isEnd&&this.api.dispatchAction({type:"brushEnd",brushId:e,areas:S(n),$from:e})},e.type="brush",e}(Hf),cE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.areas=[],n.brushOption={},n}return n(e,t),e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&$z(n,t,["inBrush","outOfBrush"]);var i=n.inBrush=n.inBrush||{};n.outOfBrush=n.outOfBrush||{color:"#ddd"},i.hasOwnProperty("liftZ")||(i.liftZ=5)},e.prototype.setAreas=function(t){t&&(this.areas=R(t,(function(t){return pE(this.option,t)}),this))},e.prototype.setBrushOption=function(t){this.brushOption=pE(this.option,t),this.brushType=this.brushOption.brushType},e.type="brush",e.dependencies=["geo","grid","xAxis","yAxis","parallel","series"],e.defaultOption={seriesIndex:"all",brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(210,219,238,0.3)",borderColor:"#D2DBEE"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},e}(ep);function pE(t,e){return M({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new Wh(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}var dE=["rect","polygon","lineX","lineY","keep","clear"],fE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n){var i,r,o;e.eachComponent({mainType:"brush"},(function(t){i=t.brushType,r=t.brushOption.brushMode||"single",o=o||!!t.areas.length})),this._brushType=i,this._brushMode=r,O(t.get("type",!0),(function(e){t.setIconStatus(e,("keep"===e?"multiple"===r:"clear"===e?o:e===i)?"emphasis":"normal")}))},e.prototype.updateView=function(t,e,n){this.render(t,e,n)},e.prototype.getIcons=function(){var t=this.model,e=t.get("icon",!0),n={};return O(t.get("type",!0),(function(t){e[t]&&(n[t]=e[t])})),n},e.prototype.onclick=function(t,e,n){var i=this._brushType,r=this._brushMode;"clear"===n?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===n?i:i!==n&&n,brushMode:"keep"===n?"multiple"===r?"single":"multiple":r}})},e.getDefaultOption=function(t){return{show:!0,type:dE.slice(),icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:t.getLocaleModel().get(["toolbox","brush","title"])}},e}(RN);var gE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode={type:"box",ignoreSize:!0},n}return n(e,t),e.type="title",e.defaultOption={zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bold",color:"#464646"},subtextStyle:{fontSize:12,color:"#6E7079"}},e}(ep),yE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,r=t.getModel("textStyle"),o=t.getModel("subtextStyle"),a=t.get("textAlign"),s=et(t.get("textBaseline"),t.get("textVerticalAlign")),l=new fs({style:wh(r,{text:t.get("text"),fill:r.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new fs({style:wh(o,{text:h,fill:o.getTextColor(),y:u.height+t.get("itemGap"),verticalAlign:"top"},{disableBox:!0}),z2:10}),p=t.get("link"),d=t.get("sublink"),f=t.get("triggerEvent",!0);l.silent=!p&&!f,c.silent=!d&&!f,p&&l.on("click",(function(){Hc(p,"_"+t.get("target"))})),d&&c.on("click",(function(){Hc(d,"_"+t.get("subtarget"))})),Ss(l).eventData=Ss(c).eventData=f?{componentType:"title",componentIndex:t.componentIndex}:null,i.add(l),h&&i.add(c);var g=i.getBoundingRect(),y=t.getBoxLayoutParams();y.width=g.width,y.height=g.height;var v=jc(y,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));a||("middle"===(a=t.get("left")||t.get("right"))&&(a="center"),"right"===a?v.x+=v.width:"center"===a&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),i.x=v.x,i.y=v.y,i.markRedraw();var m={align:a,verticalAlign:s};l.setStyle(m),c.setStyle(m),g=i.getBoundingRect();var _=v.margin,x=t.getItemStyle(["color","opacity"]);x.fill=t.get("backgroundColor");var b=new cs({shape:{x:g.x-_[3],y:g.y-_[0],width:g.width+_[1]+_[3],height:g.height+_[0]+_[2],r:t.get("borderRadius")},style:x,subPixelOptimize:!0,silent:!0});i.add(b)}},e.type="title",e}(Hf);var vE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode="box",n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._initData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this._initData()},e.prototype.setCurrentIndex=function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},e.prototype.getCurrentIndex=function(){return this.option.currentIndex},e.prototype.isIndexMax=function(){return this.getCurrentIndex()>=this._data.count()-1},e.prototype.setPlayState=function(t){this.option.autoPlay=!!t},e.prototype.getPlayState=function(){return!!this.option.autoPlay},e.prototype._initData=function(){var t,e=this.option,n=e.data||[],i=e.axisType,r=this._names=[];"category"===i?(t=[],O(n,(function(e,n){var i,o=kr(Ir(e),"");Y(e)?(i=S(e)).value=n:i=n,t.push(i),r.push(o)}))):t=n;var o={category:"ordinal",time:"time",value:"number"}[i]||"number";(this._data=new l_([{name:"value",type:o}],this)).initData(t,r)},e.prototype.getData=function(){return this._data},e.prototype.getCategories=function(){if("category"===this.get("axisType"))return this._names.slice()},e.type="timeline",e.defaultOption={zlevel:0,z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},e}(ep),mE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline.slider",e.defaultOption=Yh(vE.defaultOption,{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"circle",symbolSize:12,lineStyle:{show:!0,width:2,color:"#DAE1F5"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#A4B1D7"},itemStyle:{color:"#A4B1D7",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:15,color:"#316bf3",borderColor:"#fff",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0, 0, 0, 0.3)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:24,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z",prevIcon:"M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z",prevBtnSize:18,nextBtnSize:18,color:"#A4B1D7",borderColor:"#A4B1D7",borderWidth:1},emphasis:{label:{show:!0,color:"#6f778d"},itemStyle:{color:"#316BF3"},controlStyle:{color:"#316BF3",borderColor:"#316BF3",borderWidth:2}},progress:{lineStyle:{color:"#316BF3"},itemStyle:{color:"#316BF3"},label:{color:"#6f778d"}},data:[]}),e}(vE);L(mE,zd.prototype);var _E=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline",e}(Hf),xE=function(t){function e(e,n,i,r){var o=t.call(this,e,n,i)||this;return o.type=r||"value",o}return n(e,t),e.prototype.getLabelModel=function(){return this.model.getModel("label")},e.prototype.isHorizontal=function(){return"horizontal"===this.model.get("orient")},e}(Hx),bE=Math.PI,wE=Rr(),SE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.api=e},e.prototype.render=function(t,e,n){if(this.model=t,this.api=n,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var i=this._layout(t,n),r=this._createGroup("_mainGroup"),o=this._createGroup("_labelGroup"),a=this._axis=this._createAxis(i,t);t.formatTooltip=function(t){return bf("nameValue",{noName:!0,value:a.scale.getLabel({value:t})})},O(["AxisLine","AxisTick","Control","CurrentPointer"],(function(e){this["_render"+e](i,r,a,t)}),this),this._renderAxisLabel(i,o,a,t),this._position(i,t)}this._doPlayStop(),this._updateTicksStatus()},e.prototype.remove=function(){this._clearTimer(),this.group.removeAll()},e.prototype.dispose=function(){this._clearTimer()},e.prototype._layout=function(t,e){var n,i,r,o,a=t.get(["label","position"]),s=t.get("orient"),l=function(t,e){return jc(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}(t,e),u={horizontal:"center",vertical:(n=null==a||"auto"===a?"horizontal"===s?l.y+l.height/2=0||"+"===n?"left":"right"},h={horizontal:n>=0||"+"===n?"top":"bottom",vertical:"middle"},c={horizontal:0,vertical:bE/2},p="vertical"===s?l.height:l.width,d=t.getModel("controlStyle"),f=d.get("show",!0),g=f?d.get("itemSize"):0,y=f?d.get("itemGap"):0,v=g+y,m=t.get(["label","rotate"])||0;m=m*bE/180;var _=d.get("position",!0),x=f&&d.get("showPlayBtn",!0),b=f&&d.get("showPrevBtn",!0),w=f&&d.get("showNextBtn",!0),S=0,M=p;"left"===_||"bottom"===_?(x&&(i=[0,0],S+=v),b&&(r=[S,0],S+=v),w&&(o=[M-g,0],M-=v)):(x&&(i=[M-g,0],M-=v),b&&(r=[0,0],S+=v),w&&(o=[M-g,0],M-=v));var I=[S,M];return t.get("inverse")&&I.reverse(),{viewRect:l,mainLength:p,orient:s,rotation:c[s],labelRotation:m,labelPosOpt:n,labelAlign:t.get(["label","align"])||u[s],labelBaseline:t.get(["label","verticalAlign"])||t.get(["label","baseline"])||h[s],playPosition:i,prevBtnPosition:r,nextBtnPosition:o,axisExtent:I,controlSize:g,controlGap:y}},e.prototype._position=function(t,e){var n=this._mainGroup,i=this._labelGroup,r=t.viewRect;if("vertical"===t.orient){var o=[1,0,0,1,0,0],a=r.x,s=r.y+r.height;Xn(o,o,[-a,-s]),Yn(o,o,-bE/2),Xn(o,o,[a,s]),(r=r.clone()).applyTransform(o)}var l=y(r),u=y(n.getBoundingRect()),h=y(i.getBoundingRect()),c=[n.x,n.y],p=[i.x,i.y];p[0]=c[0]=l[0][0];var d,f=t.labelPosOpt;null==f||W(f)?(v(c,u,l,1,d="+"===f?0:1),v(p,h,l,1,1-d)):(v(c,u,l,1,d=f>=0?0:1),p[1]=c[1]+f);function g(t){t.originX=l[0][0]-t.x,t.originY=l[1][0]-t.y}function y(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function v(t,e,n,i,r){t[i]+=n[i][r]-e[i][r]}n.setPosition(c),i.setPosition(p),n.rotation=i.rotation=t.rotation,g(n),g(i)},e.prototype._createAxis=function(t,e){var n=e.getData(),i=e.get("axisType"),r=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new A_({ordinalMeta:t.getCategories(),extent:[1/0,-1/0]});case"time":return new X_({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new L_}}(e,i);r.getTicks=function(){return n.mapArray(["value"],(function(t){return{value:t}}))};var o=n.getDataExtent("value");r.setExtent(o[0],o[1]),r.niceTicks();var a=new xE("value",r,t.axisExtent,i);return a.model=e,a},e.prototype._createGroup=function(t){var e=this[t]=new Bi;return this.group.add(e),e},e.prototype._renderAxisLine=function(t,e,n,i){var r=n.getExtent();if(i.get(["lineStyle","show"])){var o=new yu({shape:{x1:r[0],y1:0,x2:r[1],y2:0},style:T({lineCap:"round"},i.getModel("lineStyle").getLineStyle()),silent:!0,z2:1});e.add(o);var a=this._progressLine=new yu({shape:{x1:r[0],x2:this._currentPointer?this._currentPointer.x:r[0],y1:0,y2:0},style:C({lineCap:"round",lineWidth:o.style.lineWidth},i.getModel(["progress","lineStyle"]).getLineStyle()),silent:!0,z2:1});e.add(a)}},e.prototype._renderAxisTick=function(t,e,n,i){var r=this,o=i.getData(),a=n.scale.getTicks();this._tickSymbols=[],O(a,(function(t){var a=n.dataToCoord(t.value),s=o.getItemModel(t.value),l=s.getModel("itemStyle"),u=s.getModel(["emphasis","itemStyle"]),h=s.getModel(["progress","itemStyle"]),c={x:a,y:0,onclick:B(r._changeTimeline,r,t.value)},p=ME(s,l,e,c);p.ensureState("emphasis").style=u.getItemStyle(),p.ensureState("progress").style=h.getItemStyle(),pl(p);var d=Ss(p);s.get("tooltip")?(d.dataIndex=t.value,d.dataModel=i):d.dataIndex=d.dataModel=null,r._tickSymbols.push(p)}))},e.prototype._renderAxisLabel=function(t,e,n,i){var r=this;if(n.getLabelModel().get("show")){var o=i.getData(),a=n.getViewLabels();this._tickLabels=[],O(a,(function(i){var a=i.tickValue,s=o.getItemModel(a),l=s.getModel("label"),u=s.getModel(["emphasis","label"]),h=s.getModel(["progress","label"]),c=n.dataToCoord(i.tickValue),p=new fs({x:c,y:0,rotation:t.labelRotation-t.rotation,onclick:B(r._changeTimeline,r,a),silent:!1,style:wh(l,{text:i.formattedLabel,align:t.labelAlign,verticalAlign:t.labelBaseline})});p.ensureState("emphasis").style=wh(u),p.ensureState("progress").style=wh(h),e.add(p),pl(p),wE(p).dataIndex=a,r._tickLabels.push(p)}))}},e.prototype._renderControl=function(t,e,n,i){var r=t.controlSize,o=t.rotation,a=i.getModel("controlStyle").getItemStyle(),s=i.getModel(["emphasis","controlStyle"]).getItemStyle(),l=i.getPlayState(),u=i.get("inverse",!0);function h(t,n,l,u){if(t){var h=Ci(et(i.get(["controlStyle",n+"BtnSize"]),r),r),c=function(t,e,n,i){var r=i.style,o=ch(t.get(["controlStyle",e]),i||{},new vi(n[0],n[1],n[2],n[3]));r&&o.setStyle(r);return o}(i,n+"Icon",[0,-h/2,h,h],{x:t[0],y:t[1],originX:r/2,originY:0,rotation:u?-o:0,rectHover:!0,style:a,onclick:l});c.ensureState("emphasis").style=s,e.add(c),pl(c)}}h(t.nextBtnPosition,"next",B(this._changeTimeline,this,u?"-":"+")),h(t.prevBtnPosition,"prev",B(this._changeTimeline,this,u?"+":"-")),h(t.playPosition,l?"stop":"play",B(this._handlePlayClick,this,!l),!0)},e.prototype._renderCurrentPointer=function(t,e,n,i){var r=i.getData(),o=i.getCurrentIndex(),a=r.getItemModel(o).getModel("checkpointStyle"),s=this,l={onCreate:function(t){t.draggable=!0,t.drift=B(s._handlePointerDrag,s),t.ondragend=B(s._handlePointerDragend,s),IE(t,s._progressLine,o,n,i,!0)},onUpdate:function(t){IE(t,s._progressLine,o,n,i)}};this._currentPointer=ME(a,a,this._mainGroup,{},this._currentPointer,l)},e.prototype._handlePlayClick=function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},e.prototype._handlePointerDrag=function(t,e,n){this._clearTimer(),this._pointerChangeTimeline([n.offsetX,n.offsetY])},e.prototype._handlePointerDragend=function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},e.prototype._pointerChangeTimeline=function(t,e){var n=this._toAxisCoord(t)[0],i=$i(this._axis.getExtent().slice());n>i[1]&&(n=i[1]),n=0&&(a[o]=+a[o].toFixed(c)),[a,h]}var NE={min:G(RE,"min"),max:G(RE,"max"),average:G(RE,"average"),median:G(RE,"median")};function zE(t,e){var n=t.getData(),i=t.coordinateSystem;if(e&&!function(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}(e)&&!F(e.coord)&&i){var r=i.dimensions,o=EE(e,n,i,t);if((e=S(e)).type&&NE[e.type]&&o.baseAxis&&o.valueAxis){var a=A(r,o.baseAxis.dim),s=A(r,o.valueAxis.dim),l=NE[e.type](n,o.baseDataDim,o.valueDataDim,a,s);e.coord=l[0],e.value=l[1]}else{for(var u=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],h=0;h<2;h++)NE[u[h]]&&(u[h]=GE(n,n.mapDimension(r[h]),u[h]));e.coord=u}}return e}function EE(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(function(t,e){var n=t.getData().getDimensionInfo(e);return n&&n.coordDim}(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function VE(t,e){return!(t&&t.containData&&e.coord&&!function(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}(e))||t.containData(e.coord)}function BE(t,e){return t?function(t,n,i,r){return Fd(r<2?t.coord&&t.coord[r]:t.value,e[r])}:function(t,n,i,r){return Fd(t.value,e[r])}}function GE(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,(function(t,e){isNaN(t)||(i+=t,r++)})),i/r}return"median"===n?t.getMedian(e):t.getDataExtent(e)["max"===n?1:0]}var FE=Rr(),HE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this.markerGroupMap=ct()},e.prototype.render=function(t,e,n){var i=this,r=this.markerGroupMap;r.each((function(t){FE(t).keep=!1})),e.eachSeries((function(t){var r=PE.getMarkerModelFromSeries(t,i.type);r&&i.renderSeries(t,r,e,n)})),r.each((function(t){!FE(t).keep&&i.group.remove(t.group)}))},e.prototype.markKeep=function(t){FE(t).keep=!0},e.prototype.blurSeries=function(t){var e=this;O(t,(function(t){var n=PE.getMarkerModelFromSeries(t,e.type);n&&n.getData().eachItemGraphicEl((function(t){t&&el(t)}))}))},e.type="marker",e}(Hf);function WE(t,e,n){var i=e.coordinateSystem;t.each((function(r){var o,a=t.getItemModel(r),s=qi(a.get("x"),n.getWidth()),l=qi(a.get("y"),n.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var u=t.get(i.dimensions[0],r),h=t.get(i.dimensions[1],r);o=i.dataToPoint([u,h])}}else o=[s,l];isNaN(s)||(o[0]=s),isNaN(l)||(o[1]=l),t.setItemLayout(r,o)}))}var UE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=PE.getMarkerModelFromSeries(t,"markPoint");e&&(WE(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout())}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new Nw),u=function(t,e,n){var i;i=t?R(t&&t.dimensions,(function(t){return T(T({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new l_(i,n),o=R(n.get("data"),G(zE,e));t&&(o=z(o,G(VE,t)));var a=BE(!!t,i);return r.initData(o,null,a),r}(r,t,e);e.setData(u),WE(e.getData(),t,i),u.each((function(t){var n=u.getItemModel(t),i=n.getShallow("symbol"),r=n.getShallow("symbolSize"),o=n.getShallow("symbolRotate"),s=n.getShallow("symbolOffset"),l=n.getShallow("symbolKeepAspect");if(H(i)||H(r)||H(o)||H(s)){var h=e.getRawValue(t),c=e.getDataParams(t);H(i)&&(i=i(h,c)),H(r)&&(r=r(h,c)),H(o)&&(o=o(h,c)),H(s)&&(s=s(h,c))}var p=n.getModel("itemStyle").getItemStyle(),d=Vg(a,"color");p.fill||(p.fill=d),u.setItemVisual(t,{symbol:i,symbolSize:r,symbolRotate:o,symbolOffset:s,symbolKeepAspect:l,style:p})})),l.updateData(u),this.group.add(l.group),u.eachItemGraphicEl((function(t){t.traverse((function(t){Ss(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markPoint",e}(HE);var XE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markLine",e.defaultOption={zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],symbolOffset:0,precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end",distance:5},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"},e}(PE),YE=Rr(),ZE=function(t,e,n,i){var r,o=t.getData();if(F(i))r=i;else{var a=i.type;if("min"===a||"max"===a||"average"===a||"median"===a||null!=i.xAxis||null!=i.yAxis){var s=void 0,l=void 0;if(null!=i.yAxis||null!=i.xAxis)s=e.getAxis(null!=i.yAxis?"y":"x"),l=tt(i.yAxis,i.xAxis);else{var u=EE(i,o,e,t);s=u.valueAxis,l=GE(o,y_(o,u.valueDataDim),a)}var h="x"===s.dim?0:1,c=1-h,p=S(i),d={coord:[]};p.type=null,p.coord=[],p.coord[c]=-1/0,d.coord[c]=1/0;var f=n.get("precision");f>=0&&"number"==typeof l&&(l=+l.toFixed(Math.min(f,20))),p.coord[h]=d.coord[h]=l,r=[p,d,{type:a,valueIndex:i.valueIndex,value:l}]}else r=[]}var g=[zE(t,r[0]),zE(t,r[1]),T({},r[2])];return g[2].type=g[2].type||null,M(g[2],g[0]),M(g[2],g[1]),g};function jE(t){return!isNaN(t)&&!isFinite(t)}function qE(t,e,n,i){var r=1-t,o=i.dimensions[t];return jE(e[r])&&jE(n[r])&&e[t]===n[t]&&i.getAxis(o).containData(e[t])}function KE(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(qE(1,n,i,t)||qE(0,n,i,t)))return!0}return VE(t,e[0])&&VE(t,e[1])}function $E(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=qi(s.get("x"),r.getWidth()),u=qi(s.get("y"),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(t.dimensions,e));else{var h=a.dimensions,c=t.get(h[0],e),p=t.get(h[1],e);o=a.dataToPoint([c,p])}if(Jw(a,"cartesian2d")){var d=a.getAxis("x"),f=a.getAxis("y");h=a.dimensions;jE(t.get(h[0],e))?o[0]=d.toGlobalCoord(d.getExtent()[n?0:1]):jE(t.get(h[1],e))&&(o[1]=f.toGlobalCoord(f.getExtent()[n?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];t.setItemLayout(e,o)}var JE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=PE.getMarkerModelFromSeries(t,"markLine");if(e){var i=e.getData(),r=YE(e).from,o=YE(e).to;r.each((function(e){$E(r,e,!0,t,n),$E(o,e,!1,t,n)})),i.each((function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])})),this.markerGroupMap.get(t.id).updateLayout()}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new gD);this.group.add(l.group);var u=function(t,e,n){var i;i=t?R(t&&t.dimensions,(function(t){return T(T({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new l_(i,n),o=new l_(i,n),a=new l_([],n),s=R(n.get("data"),G(ZE,e,t,n));t&&(s=z(s,G(KE,t)));var l=BE(!!t,i);return r.initData(R(s,(function(t){return t[0]})),null,l),o.initData(R(s,(function(t){return t[1]})),null,l),a.initData(R(s,(function(t){return t[2]}))),a.hasItemOption=!0,{from:r,to:o,line:a}}(r,t,e),h=u.from,c=u.to,p=u.line;YE(e).from=h,YE(e).to=c,e.setData(p);var d=e.get("symbol"),f=e.get("symbolSize"),g=e.get("symbolRotate"),y=e.get("symbolOffset");function v(e,n,r){var o=e.getItemModel(n);$E(e,n,r,t,i);var s=o.getModel("itemStyle").getItemStyle();null==s.fill&&(s.fill=Vg(a,"color")),e.setItemVisual(n,{symbolKeepAspect:o.get("symbolKeepAspect"),symbolOffset:et(o.get("symbolOffset",!0),y[r?0:1]),symbolRotate:et(o.get("symbolRotate",!0),g[r?0:1]),symbolSize:et(o.get("symbolSize"),f[r?0:1]),symbol:et(o.get("symbol",!0),d[r?0:1]),style:s})}F(d)||(d=[d,d]),F(f)||(f=[f,f]),F(g)||(g=[g,g]),F(y)||(y=[y,y]),u.from.each((function(t){v(h,t,!0),v(c,t,!1)})),p.each((function(t){var e=p.getItemModel(t).getModel("lineStyle").getLineStyle();p.setItemLayout(t,[h.getItemLayout(t),c.getItemLayout(t)]),null==e.stroke&&(e.stroke=h.getItemVisual(t,"style").fill),p.setItemVisual(t,{fromSymbolKeepAspect:h.getItemVisual(t,"symbolKeepAspect"),fromSymbolOffset:h.getItemVisual(t,"symbolOffset"),fromSymbolRotate:h.getItemVisual(t,"symbolRotate"),fromSymbolSize:h.getItemVisual(t,"symbolSize"),fromSymbol:h.getItemVisual(t,"symbol"),toSymbolKeepAspect:c.getItemVisual(t,"symbolKeepAspect"),toSymbolOffset:c.getItemVisual(t,"symbolOffset"),toSymbolRotate:c.getItemVisual(t,"symbolRotate"),toSymbolSize:c.getItemVisual(t,"symbolSize"),toSymbol:c.getItemVisual(t,"symbol"),style:e})})),l.updateData(p),u.line.eachItemGraphicEl((function(t,n){t.traverse((function(t){Ss(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markLine",e}(HE);var QE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markArea",e.defaultOption={zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}},e}(PE),tV=Rr(),eV=function(t,e,n,i){var r=zE(t,i[0]),o=zE(t,i[1]),a=r.coord,s=o.coord;a[0]=tt(a[0],-1/0),a[1]=tt(a[1],-1/0),s[0]=tt(s[0],1/0),s[1]=tt(s[1],1/0);var l=I([{},r,o]);return l.coord=[r.coord,o.coord],l.x0=r.x,l.y0=r.y,l.x1=o.x,l.y1=o.y,l};function nV(t){return!isNaN(t)&&!isFinite(t)}function iV(t,e,n,i){var r=1-t;return nV(e[r])&&nV(n[r])}function rV(t,e){var n=e.coord[0],i=e.coord[1];return!!(Jw(t,"cartesian2d")&&n&&i&&(iV(1,n,i)||iV(0,n,i)))||(VE(t,{coord:n,x:e.x0,y:e.y0})||VE(t,{coord:i,x:e.x1,y:e.y1}))}function oV(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=qi(s.get(n[0]),r.getWidth()),u=qi(s.get(n[1]),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(n,e));else{var h=[d=t.get(n[0],e),f=t.get(n[1],e)];a.clampData&&a.clampData(h,h),o=a.dataToPoint(h,!0)}if(Jw(a,"cartesian2d")){var c=a.getAxis("x"),p=a.getAxis("y"),d=t.get(n[0],e),f=t.get(n[1],e);nV(d)?o[0]=c.toGlobalCoord(c.getExtent()["x0"===n[0]?0:1]):nV(f)&&(o[1]=p.toGlobalCoord(p.getExtent()["y0"===n[1]?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];return o}var aV=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]],sV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=PE.getMarkerModelFromSeries(t,"markArea");if(e){var i=e.getData();i.each((function(e){var r=R(aV,(function(r){return oV(i,e,r,t,n)}));i.setItemLayout(e,r),i.getItemGraphicEl(e).setShape("points",r)}))}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,{group:new Bi});this.group.add(l.group),this.markKeep(l);var u=function(t,e,n){var i,r,o=["x0","y0","x1","y1"];if(t){var a=R(t&&t.dimensions,(function(t){var n=e.getData();return T(T({},n.getDimensionInfo(n.mapDimension(t))||{}),{name:t,ordinalMeta:null})}));r=R(o,(function(t,e){return{name:t,type:a[e%2].type}})),i=new l_(r,n)}else i=new l_(r=[{name:"value",type:"float"}],n);var s=R(n.get("data"),G(eV,e,t,n));t&&(s=z(s,G(rV,t)));var l=t?function(t,e,n,i){return Fd(t.coord[Math.floor(i/2)][i%2],r[i])}:function(t,e,n,i){return Fd(t.value,r[i])};return i.initData(s,null,l),i.hasItemOption=!0,i}(r,t,e);e.setData(u),u.each((function(e){var n=R(aV,(function(n){return oV(u,e,n,t,i)})),o=r.getAxis("x").scale,s=r.getAxis("y").scale,l=o.getExtent(),h=s.getExtent(),c=[o.parse(u.get("x0",e)),o.parse(u.get("x1",e))],p=[s.parse(u.get("y0",e)),s.parse(u.get("y1",e))];$i(c),$i(p);var d=!!(l[0]>c[1]||l[1]p[1]||h[1]=0},e.prototype.getOrient=function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}},e.type="legend.plain",e.dependencies=["series"],e.defaultOption={zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,symbolRotate:"inherit",symbolKeepAspect:!0,inactiveColor:"#ccc",inactiveBorderColor:"#ccc",inactiveBorderWidth:"auto",itemStyle:{color:"inherit",opacity:"inherit",borderColor:"inherit",borderWidth:"auto",borderCap:"inherit",borderJoin:"inherit",borderDashOffset:"inherit",borderMiterLimit:"inherit"},lineStyle:{width:"auto",color:"inherit",inactiveColor:"#ccc",inactiveWidth:2,opacity:"inherit",type:"inherit",cap:"inherit",join:"inherit",dashOffset:"inherit",miterLimit:"inherit"},textStyle:{color:"#333"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:"sans-serif",color:"#666",borderWidth:1,borderColor:"#666"},emphasis:{selectorLabel:{show:!0,color:"#eee",backgroundColor:"#666"}},selectorPosition:"auto",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},e}(ep),uV=G,hV=O,cV=Bi,pV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.newlineDisabled=!1,n}return n(e,t),e.prototype.init=function(){this.group.add(this._contentGroup=new cV),this.group.add(this._selectorGroup=new cV),this._isFirstRender=!0},e.prototype.getContentGroup=function(){return this._contentGroup},e.prototype.getSelectorGroup=function(){return this._selectorGroup},e.prototype.render=function(t,e,n){var i=this._isFirstRender;if(this._isFirstRender=!1,this.resetInner(),t.get("show",!0)){var r=t.get("align"),o=t.get("orient");r&&"auto"!==r||(r="right"===t.get("left")&&"vertical"===o?"right":"left");var a=t.get("selector",!0),s=t.get("selectorPosition",!0);!a||s&&"auto"!==s||(s="horizontal"===o?"end":"start"),this.renderInner(r,t,e,n,a,o,s);var l=t.getBoxLayoutParams(),u={width:n.getWidth(),height:n.getHeight()},h=t.get("padding"),c=jc(l,u,h),p=this.layoutInner(t,r,c,i,a,s),d=jc(C({width:p.width,height:p.height},l),u,h);this.group.x=d.x-p.x,this.group.y=d.y-p.y,this.group.markRedraw(),this.group.add(this._backgroundEl=BN(p,t))}},e.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},e.prototype.renderInner=function(t,e,n,i,r,o,a){var s=this.getContentGroup(),l=ct(),u=e.get("selectedMode"),h=[];n.eachRawSeries((function(t){!t.get("legendHoverLink")&&h.push(t.id)})),hV(e.getData(),(function(r,o){var a=r.get("name");if(!this.newlineDisabled&&(""===a||"\n"===a)){var c=new cV;return c.newline=!0,void s.add(c)}var p=n.getSeriesByName(a)[0];if(!l.get(a)){if(p){var d=p.getData(),f=d.getVisual("legendLineStyle")||{},g=d.getVisual("legendIcon"),y=d.getVisual("style");this._createItem(p,a,o,r,e,t,f,y,g,u).on("click",uV(dV,a,null,i,h)).on("mouseover",uV(gV,p.name,null,i,h)).on("mouseout",uV(yV,p.name,null,i,h)),l.set(a,!0)}else n.eachRawSeries((function(n){if(!l.get(a)&&n.legendVisualProvider){var s=n.legendVisualProvider;if(!s.containName(a))return;var c=s.indexOfName(a),p=s.getItemVisual(c,"style"),d=s.getItemVisual(c,"legendIcon"),f=We(p.fill);f&&0===f[3]&&(f[3]=.2,p.fill=Qe(f,"rgba")),this._createItem(n,a,o,r,e,t,{},p,d,u).on("click",uV(dV,null,a,i,h)).on("mouseover",uV(gV,null,a,i,h)).on("mouseout",uV(yV,null,a,i,h)),l.set(a,!0)}}),this);0}}),this),r&&this._createSelector(r,e,i,o,a)},e.prototype._createSelector=function(t,e,n,i,r){var o=this.getSelectorGroup();hV(t,(function(t){var i=t.type,r=new fs({style:{x:0,y:0,align:"center",verticalAlign:"middle"},onclick:function(){n.dispatchAction({type:"all"===i?"legendAllSelect":"legendInverseSelect"})}});o.add(r),xh(r,{normal:e.getModel("selectorLabel"),emphasis:e.getModel(["emphasis","selectorLabel"])},{defaultText:t.title}),pl(r)}))},e.prototype._createItem=function(t,e,n,i,r,o,a,s,l,u){var h=t.visualDrawType,c=r.get("itemWidth"),p=r.get("itemHeight"),d=r.isSelected(e),f=i.get("symbolRotate"),g=i.get("symbolKeepAspect"),y=i.get("icon"),v=function(t,e,n,i,r,o){function a(t,e){"auto"===t.lineWidth&&(t.lineWidth=e.lineWidth>0?2:0),hV(t,(function(n,i){"inherit"===t[i]&&(t[i]=e[i])}))}var s=e.getModel("itemStyle").getItemStyle(),l=0===t.lastIndexOf("empty",0)?"fill":"stroke";s.decal=i.decal,"inherit"===s.fill&&(s.fill=i[r]);"inherit"===s.stroke&&(s.stroke=i[l]);"inherit"===s.opacity&&(s.opacity=("fill"===r?i:n).opacity);a(s,i);var u=e.getModel("lineStyle"),h=u.getLineStyle();if(a(h,n),"auto"===s.fill&&(s.fill=i.fill),"auto"===s.stroke&&(s.stroke=i.fill),"auto"===h.stroke&&(h.stroke=i.fill),!o){var c=e.get("inactiveBorderWidth"),p=s[l];s.lineWidth="auto"===c?i.lineWidth>0&&p?2:0:s.lineWidth,s.fill=e.get("inactiveColor"),s.stroke=e.get("inactiveBorderColor"),h.stroke=u.get("inactiveColor"),h.lineWidth=u.get("inactiveWidth")}return{itemStyle:s,lineStyle:h}}(l=y||l||"roundRect",i,a,s,h,d),m=new cV,_=i.getModel("textStyle");if("function"!=typeof t.getLegendIcon||y&&"inherit"!==y){var x="inherit"===y&&t.getData().getVisual("symbol")?"inherit"===f?t.getData().getVisual("symbolRotate"):f:0;m.add(function(t){var e=t.icon||"roundRect",n=ty(e,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill,t.symbolKeepAspect);n.setStyle(t.itemStyle),n.rotation=(t.iconRotate||0)*Math.PI/180,n.setOrigin([t.itemWidth/2,t.itemHeight/2]),e.indexOf("empty")>-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2);return n}({itemWidth:c,itemHeight:p,icon:l,iconRotate:x,itemStyle:v.itemStyle,lineStyle:v.lineStyle,symbolKeepAspect:g}))}else m.add(t.getLegendIcon({itemWidth:c,itemHeight:p,icon:l,iconRotate:f,itemStyle:v.itemStyle,lineStyle:v.lineStyle,symbolKeepAspect:g}));var b="left"===o?c+5:-5,w=o,S=r.get("formatter"),M=e;"string"==typeof S&&S?M=S.replace("{name}",null!=e?e:""):"function"==typeof S&&(M=S(e));var I=i.get("inactiveColor");m.add(new fs({style:wh(_,{text:M,x:b,y:p/2,fill:d?_.getTextColor():I,align:w,verticalAlign:"middle"})}));var T=new cs({shape:m.getBoundingRect(),invisible:!0}),C=i.getModel("tooltip");return C.get("show")&&gh({el:T,componentModel:r,itemName:e,itemTooltipOption:C.option}),m.add(T),m.eachChild((function(t){t.silent=!0})),T.silent=!u,this.getContentGroup().add(m),pl(m),m.__legendDataIndex=n,m},e.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getContentGroup(),s=this.getSelectorGroup();Zc(t.get("orient"),a,t.get("itemGap"),n.width,n.height);var l=a.getBoundingRect(),u=[-l.x,-l.y];if(s.markRedraw(),a.markRedraw(),r){Zc("horizontal",s,t.get("selectorItemGap",!0));var h=s.getBoundingRect(),c=[-h.x,-h.y],p=t.get("selectorButtonGap",!0),d=t.getOrient().index,f=0===d?"width":"height",g=0===d?"height":"width",y=0===d?"y":"x";"end"===o?c[d]+=l[f]+p:u[d]+=h[f]+p,c[1-d]+=l[g]/2-h[g]/2,s.x=c[0],s.y=c[1],a.x=u[0],a.y=u[1];var v={x:0,y:0};return v[f]=l[f]+p+h[f],v[g]=Math.max(l[g],h[g]),v[y]=Math.min(0,h[y]+c[1-d]),v}return a.x=u[0],a.y=u[1],this.group.getBoundingRect()},e.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},e.type="legend.plain",e}(Hf);function dV(t,e,n,i){yV(t,e,n,i),n.dispatchAction({type:"legendToggleSelect",name:null!=t?t:e}),gV(t,e,n,i)}function fV(t){for(var e,n=t.getZr().storage.getDisplayList(),i=0,r=n.length;in[r],f=[-c.x,-c.y];e||(f[i]=l[s]);var g=[0,0],y=[-p.x,-p.y],v=et(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?y[i]+=n[r]-p[r]:g[i]+=p[r]+v);y[1-i]+=c[o]/2-p[o]/2,l.setPosition(f),u.setPosition(g),h.setPosition(y);var m={x:0,y:0};if(m[r]=d?n[r]:c[r],m[o]=Math.max(c[o],p[o]),m[a]=Math.min(0,p[a]+y[1-i]),u.__rectSize=n[r],d){var _={x:0,y:0};_[r]=Math.max(n[r]-p[r]-v,0),_[o]=m[o],u.setClipPath(new cs({shape:_})),u.__rectSize=_[r]}else h.eachChild((function(t){t.attr({invisible:!0,silent:!0})}));var x=this._getPageInfo(t);return null!=x.pageIndex&&Eu(l,{x:x.contentPosition[0],y:x.contentPosition[1]},d?t:null),this._updatePageInfoView(t,x),m},e.prototype._pageGo=function(t,e,n){var i=this._getPageInfo(e)[t];null!=i&&n.dispatchAction({type:"legendScroll",scrollDataIndex:i,legendId:e.id})},e.prototype._updatePageInfoView=function(t,e){var n=this._controllerGroup;O(["pagePrev","pageNext"],(function(i){var r=null!=e[i+"DataIndex"],o=n.childOfName(i);o&&(o.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),o.cursor=r?"pointer":"default")}));var i=n.childOfName("pageText"),r=t.get("pageFormatter"),o=e.pageIndex,a=null!=o?o+1:0,s=e.pageCount;i&&r&&i.setStyle("text",W(r)?r.replace("{current}",null==a?"":a+"").replace("{total}",null==s?"":s+""):r({current:a,total:s}))},e.prototype._getPageInfo=function(t){var e=t.get("scrollDataIndex",!0),n=this.getContentGroup(),i=this._containerGroup.__rectSize,r=t.getOrient().index,o=SV[r],a=MV[r],s=this._findTargetItemIndex(e),l=n.children(),u=l[s],h=l.length,c=h?1:0,p={contentPosition:[n.x,n.y],pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!u)return p;var d=m(u);p.contentPosition[r]=-d.s;for(var f=s+1,g=d,y=d,v=null;f<=h;++f)(!(v=m(l[f]))&&y.e>g.s+i||v&&!_(v,g.s))&&(g=y.i>g.i?y:v)&&(null==p.pageNextDataIndex&&(p.pageNextDataIndex=g.i),++p.pageCount),y=v;for(f=s-1,g=d,y=d,v=null;f>=-1;--f)(v=m(l[f]))&&_(y,v.s)||!(g.i=e&&t.s<=e+i}},e.prototype._findTargetItemIndex=function(t){return this._showController?(this.getContentGroup().eachChild((function(i,r){var o=i.__legendDataIndex;null==n&&null!=o&&(n=r),o===t&&(e=r)})),null!=e?e:n):0;var e,n},e.type="legend.scroll",e}(pV);function TV(t){Nm(_V),t.registerComponentModel(xV),t.registerComponentView(IV),function(t){t.registerAction("legendScroll","legendscroll",(function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},(function(t){t.setScrollDataIndex(n)}))}))}(t)}var CV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.inside",e.defaultOption=Yh(wN.defaultOption,{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),e}(wN),DV=Rr();function AV(t,e,n){DV(t).coordSysRecordMap.each((function(t){var i=t.dataZoomInfoMap.get(e.uid);i&&(i.getRange=n)}))}function kV(t,e){if(e){t.removeKey(e.model.uid);var n=e.controller;n&&n.dispose()}}function LV(t,e){t.dispatchAction({type:"dataZoom",animation:{easing:"cubicOut",duration:100},batch:e})}function PV(t,e,n,i){return t.coordinateSystem.containPoint([n,i])}function OV(t){t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,(function(t,e){var n=DV(e),i=n.coordSysRecordMap||(n.coordSysRecordMap=ct());i.each((function(t){t.dataZoomInfoMap=null})),t.eachComponent({mainType:"dataZoom",subType:"inside"},(function(t){O(xN(t).infoList,(function(n){var r=n.model.uid,o=i.get(r)||i.set(r,function(t,e){var n={model:e,containsPoint:G(PV,e),dispatchAction:G(LV,t),dataZoomInfoMap:null,controller:null},i=n.controller=new vI(t.getZr());return O(["pan","zoom","scrollMove"],(function(t){i.on(t,(function(e){var i=[];n.dataZoomInfoMap.each((function(r){if(e.isAvailableBehavior(r.model.option)){var o=(r.getRange||{})[t],a=o&&o(r.dzReferCoordSysInfo,n.model.mainType,n.controller,e);!r.model.get("disabled",!0)&&a&&i.push({dataZoomId:r.model.id,start:a[0],end:a[1]})}})),i.length&&n.dispatchAction(i)}))})),n}(e,n.model));(o.dataZoomInfoMap||(o.dataZoomInfoMap=ct())).set(t.uid,{dzReferCoordSysInfo:n,model:t,getRange:null})}))})),i.each((function(t){var e,n=t.controller,r=t.dataZoomInfoMap;if(r){var o=r.keys()[0];null!=o&&(e=r.get(o))}if(e){var a=function(t){var e,n="type_",i={type_true:2,type_move:1,type_false:0,type_undefined:-1},r=!0;return t.each((function(t){var o=t.model,a=!o.get("disabled",!0)&&(!o.get("zoomLock",!0)||"move");i[n+a]>i[n+e]&&(e=a),r=r&&o.get("preventDefaultMouseMove",!0)})),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!r}}}(r);n.enable(a.controlType,a.opt),n.setPointerChecker(t.containsPoint),ng(t,"dispatchAction",e.model.get("throttle",!0),"fixRate")}else kV(i,t)}))}))}var RV=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataZoom.inside",e}return n(e,t),e.prototype.render=function(e,n,i){t.prototype.render.apply(this,arguments),e.noTarget()?this._clear():(this.range=e.getPercentRange(),AV(i,e,{pan:B(NV.pan,this),zoom:B(NV.zoom,this),scrollMove:B(NV.scrollMove,this)}))},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){!function(t,e){for(var n=DV(t).coordSysRecordMap,i=n.keys(),r=0;r0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(o[1]-o[0])+o[0],u=Math.max(1/i.scale,0);o[0]=(o[0]-l)*u+l,o[1]=(o[1]-l)*u+l;var h=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return uA(0,o,[0,100],0,h.minSpan,h.maxSpan),this.range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}},pan:zV((function(t,e,n,i,r,o){var a=EV[i]([o.oldX,o.oldY],[o.newX,o.newY],e,r,n);return a.signal*(t[1]-t[0])*a.pixel/a.pixelLength})),scrollMove:zV((function(t,e,n,i,r,o){return EV[i]([0,0],[o.scrollDelta,o.scrollDelta],e,r,n).signal*(t[1]-t[0])*o.scrollDelta}))};function zV(t){return function(e,n,i,r){var o=this.range,a=o.slice(),s=e.axisModels[0];if(s)return uA(t(a,s,e,n,i,r),a,[0,100],"all"),this.range=a,o[0]!==a[0]||o[1]!==a[1]?a:void 0}}var EV={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};function VV(t){PN(t),t.registerComponentModel(CV),t.registerComponentView(RV),OV(t)}var BV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.slider",e.layoutMode="box",e.defaultOption=Yh(wN.defaultOption,{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,borderColor:"#d2dbee",borderRadius:3,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#d2dbee",width:.5},areaStyle:{color:"#d2dbee",opacity:.2}},selectedDataBackground:{lineStyle:{color:"#8fb0f7",width:.5},areaStyle:{color:"#8fb0f7",opacity:.2}},fillerColor:"rgba(135,175,274,0.2)",handleIcon:"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z",handleSize:"100%",handleStyle:{color:"#fff",borderColor:"#ACB8D1"},moveHandleSize:7,moveHandleIcon:"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z",moveHandleStyle:{color:"#D2DBEE",opacity:.7},showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#6E7079"},brushSelect:!0,brushStyle:{color:"rgba(135,175,274,0.15)"},emphasis:{handleStyle:{borderColor:"#8FB0F7"},moveHandleStyle:{color:"#8FB0F7"}}}),e}(wN),GV=cs,FV="horizontal",HV="vertical",WV=["line","bar","candlestick","scatter"],UV={easing:"cubicOut",duration:100,delay:0},XV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._displayables={},n}return n(e,t),e.prototype.init=function(t,e){this.api=e,this._onBrush=B(this._onBrush,this),this._onBrushEnd=B(this._onBrushEnd,this)},e.prototype.render=function(e,n,i,r){if(t.prototype.render.apply(this,arguments),ng(this,"_dispatchZoomAction",e.get("throttle"),"fixRate"),this._orient=e.getOrient(),!1!==e.get("show")){if(e.noTarget())return this._clear(),void this.group.removeAll();r&&"dataZoom"===r.type&&r.from===this.uid||this._buildView(),this._updateView()}else this.group.removeAll()},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){var t,e,n;(n=(t=this)[e="_dispatchZoomAction"])&&n[Jf]&&(t[e]=n[Jf]);var i=this.api.getZr();i.off("mousemove",this._onBrush),i.off("mouseup",this._onBrushEnd)},e.prototype._buildView=function(){var t=this.group;t.removeAll(),this._brushing=!1,this._displayables.brushRect=null,this._resetLocation(),this._resetInterval();var e=this._displayables.sliderGroup=new Bi;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},e.prototype._resetLocation=function(){var t=this.dataZoomModel,e=this.api,n=t.get("brushSelect")?7:0,i=this._findCoordRect(),r={width:e.getWidth(),height:e.getHeight()},o=this._orient===FV?{right:r.width-i.x-i.width,top:r.height-30-7-n,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=Jc(t.option);O(["right","top","width","height"],(function(t){"ph"===a[t]&&(a[t]=o[t])}));var s=jc(a,r);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===HV&&this._size.reverse()},e.prototype._positionGroup=function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.sliderGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==FV||r?n===FV&&r?{scaleY:a?1:-1,scaleX:-1}:n!==HV||r?{scaleY:a?-1:1,scaleX:-1,rotation:Math.PI/2}:{scaleY:a?-1:1,scaleX:1,rotation:Math.PI/2}:{scaleY:a?1:-1,scaleX:1});var s=t.getBoundingRect([o]);t.x=e.x-s.x,t.y=e.y-s.y,t.markRedraw()},e.prototype._getViewExtent=function(){return[0,this._size[0]]},e.prototype._renderBackground=function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.sliderGroup,i=t.get("brushSelect");n.add(new GV({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}));var r=new GV({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:B(this._onClickPanel,this)}),o=this.api.getZr();i?(r.on("mousedown",this._onBrushStart,this),r.cursor="crosshair",o.on("mousemove",this._onBrush),o.on("mouseup",this._onBrushEnd)):(o.off("mousemove",this._onBrush),o.off("mouseup",this._onBrushEnd)),n.add(r)},e.prototype._renderDataShadow=function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(this._displayables.dataShadowSegs=[],t){var e=this._size,n=t.series,i=n.getRawData(),r=n.getShadowDim?n.getShadowDim():t.otherDim;if(null!=r){var o=i.getDataExtent(r),a=.3*(o[1]-o[0]);o=[o[0]-a,o[1]+a];var s,l=[0,e[1]],u=[0,e[0]],h=[[e[0],0],[0,0]],c=[],p=u[1]/(i.count()-1),d=0,f=Math.round(i.count()/e[0]);i.each([r],(function(t,e){if(f>0&&e%f)d+=p;else{var n=null==t||isNaN(t)||""===t,i=n?0:ji(t,o,l,!0);n&&!s&&e?(h.push([h[h.length-1][0],0]),c.push([c[c.length-1][0],0])):!n&&s&&(h.push([d,0]),c.push([d,0])),h.push([d,i]),c.push([d,i]),d+=p,s=n}}));for(var g=this.dataZoomModel,y=0;y<3;y++){var v=m(1===y);this._displayables.sliderGroup.add(v),this._displayables.dataShadowSegs.push(v)}}}function m(t){var e=g.getModel(t?"selectedDataBackground":"dataBackground"),n=new Bi,i=new cu({shape:{points:h},segmentIgnoreThreshold:1,style:e.getModel("areaStyle").getAreaStyle(),silent:!0,z2:-20}),r=new du({shape:{points:c},segmentIgnoreThreshold:1,style:e.getModel("lineStyle").getLineStyle(),silent:!0,z2:-19});return n.add(i),n.add(r),n}},e.prototype._prepareDataShadowInfo=function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var n,i=this.ecModel;return t.eachTargetAxis((function(r,o){O(t.getAxisProxy(r,o).getTargetSeriesModels(),(function(t){if(!(n||!0!==e&&A(WV,t.get("type"))<0)){var a,s=i.getComponent(mN(r),o).axis,l={x:"y",y:"x",radius:"angle",angle:"radius"}[r],u=t.coordinateSystem;null!=l&&u.getOtherAxis&&(a=u.getOtherAxis(s).inverse),l=t.getData().mapDimension(l),n={thisAxis:s,series:t,thisDim:r,otherDim:l,otherAxisInverse:a}}}),this)}),this),n}},e.prototype._renderHandle=function(){var t=this.group,e=this._displayables,n=e.handles=[null,null],i=e.handleLabels=[null,null],r=this._displayables.sliderGroup,o=this._size,a=this.dataZoomModel,s=this.api,l=a.get("borderRadius")||0,u=a.get("brushSelect"),h=e.filler=new GV({silent:u,style:{fill:a.get("fillerColor")},textConfig:{position:"inside"}});r.add(h),r.add(new GV({silent:!0,subPixelOptimize:!0,shape:{x:0,y:0,width:o[0],height:o[1],r:l},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}})),O([0,1],(function(e){var o=a.get("handleIcon");!$g[o]&&o.indexOf("path://")<0&&o.indexOf("image://")<0&&(o="path://"+o);var s=ty(o,-1,0,2,2,null,!0);s.attr({cursor:YV(this._orient),draggable:!0,drift:B(this._onDragMove,this,e),ondragend:B(this._onDragEnd,this),onmouseover:B(this._showDataInfo,this,!0),onmouseout:B(this._showDataInfo,this,!1),z2:5});var l=s.getBoundingRect(),u=a.get("handleSize");this._handleHeight=qi(u,this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,s.setStyle(a.getModel("handleStyle").getItemStyle()),s.style.strokeNoScale=!0,s.rectHover=!0,s.ensureState("emphasis").style=a.getModel(["emphasis","handleStyle"]).getItemStyle(),pl(s);var h=a.get("handleColor");null!=h&&(s.style.fill=h),r.add(n[e]=s);var c=a.getModel("textStyle");t.add(i[e]=new fs({silent:!0,invisible:!0,style:wh(c,{x:0,y:0,text:"",verticalAlign:"middle",align:"center",fill:c.getTextColor(),font:c.getFont()}),z2:10}))}),this);var c=h;if(u){var p=qi(a.get("moveHandleSize"),o[1]),d=e.moveHandle=new cs({style:a.getModel("moveHandleStyle").getItemStyle(),silent:!0,shape:{r:[0,0,2,2],y:o[1]-.5,height:p}}),f=.8*p,g=e.moveHandleIcon=ty(a.get("moveHandleIcon"),-f/2,-f/2,f,f,"#fff",!0);g.silent=!0,g.y=o[1]+p/2-.5,d.ensureState("emphasis").style=a.getModel(["emphasis","moveHandleStyle"]).getItemStyle();var y=Math.min(o[1]/2,Math.max(p,10));(c=e.moveZone=new cs({invisible:!0,shape:{y:o[1]-y,height:p+y}})).on("mouseover",(function(){s.enterEmphasis(d)})).on("mouseout",(function(){s.leaveEmphasis(d)})),r.add(d),r.add(g),r.add(c)}c.attr({draggable:!0,cursor:YV(this._orient),drift:B(this._onDragMove,this,"all"),ondragstart:B(this._showDataInfo,this,!0),ondragend:B(this._onDragEnd,this),onmouseover:B(this._showDataInfo,this,!0),onmouseout:B(this._showDataInfo,this,!1)})},e.prototype._resetInterval=function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[ji(t[0],[0,100],e,!0),ji(t[1],[0,100],e,!0)]},e.prototype._updateInterval=function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];uA(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?ji(o.minSpan,a,r,!0):null,null!=o.maxSpan?ji(o.maxSpan,a,r,!0):null);var s=this._range,l=this._range=$i([ji(i[0],r,a,!0),ji(i[1],r,a,!0)]);return!s||s[0]!==l[0]||s[1]!==l[1]},e.prototype._updateView=function(t){var e=this._displayables,n=this._handleEnds,i=$i(n.slice()),r=this._size;O([0,1],(function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scaleX:o/2,scaleY:o/2,x:n[t]+(t?-1:1),y:r[1]/2-o/2})}),this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]});var o={x:i[0],width:i[1]-i[0]};e.moveHandle&&(e.moveHandle.setShape(o),e.moveZone.setShape(o),e.moveZone.getBoundingRect(),e.moveHandleIcon&&e.moveHandleIcon.attr("x",o.x+o.width/2));for(var a=e.dataShadowSegs,s=[0,i[0],i[1],r[0]],l=0;le[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2,o=this._updateInterval("all",n[0]-r);this._updateView(),o&&this._dispatchZoomAction(!1)}},e.prototype._onBrushStart=function(t){var e=t.offsetX,n=t.offsetY;this._brushStart=new li(e,n),this._brushing=!0,this._brushStartTime=+new Date},e.prototype._onBrushEnd=function(t){if(this._brushing){var e=this._displayables.brushRect;if(this._brushing=!1,e){e.attr("ignore",!0);var n=e.shape;if(!(+new Date-this._brushStartTime<200&&Math.abs(n.width)<5)){var i=this._getViewExtent(),r=[0,100];this._range=$i([ji(n.x,i,r,!0),ji(n.x+n.width,i,r,!0)]),this._handleEnds=[n.x,n.x+n.width],this._updateView(),this._dispatchZoomAction(!1)}}}},e.prototype._onBrush=function(t){this._brushing&&(ne(t.event),this._updateBrushRect(t.offsetX,t.offsetY))},e.prototype._updateBrushRect=function(t,e){var n=this._displayables,i=this.dataZoomModel,r=n.brushRect;r||(r=n.brushRect=new GV({silent:!0,style:i.getModel("brushStyle").getItemStyle()}),n.sliderGroup.add(r)),r.attr("ignore",!1);var o=this._brushStart,a=this._displayables.sliderGroup,s=a.transformCoordToLocal(t,e),l=a.transformCoordToLocal(o.x,o.y),u=this._size;s[0]=Math.max(Math.min(u[0],s[0]),0),r.setShape({x:l[0],y:0,width:s[0]-l[0],height:u[1]})},e.prototype._dispatchZoomAction=function(t){var e=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,animation:t?UV:null,start:e[0],end:e[1]})},e.prototype._findCoordRect=function(){var t,e=xN(this.dataZoomModel).infoList;if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}if(!t){var i=this.api.getWidth(),r=this.api.getHeight();t={x:.2*i,y:.2*r,width:.6*i,height:.6*r}}return t},e.type="dataZoom.slider",e}(IN);function YV(t){return"vertical"===t?"ns-resize":"ew-resize"}function ZV(t){t.registerComponentModel(BV),t.registerComponentView(XV),PN(t)}var jV=function(t,e,n){var i=S((qV[t]||{})[e]);return n&&F(i)?i[i.length-1]:i},qV={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}},KV=iC.mapVisual,$V=iC.eachVisual,JV=F,QV=O,tB=$i,eB=ji,nB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.stateList=["inRange","outOfRange"],n.replacableOptionKeys=["inRange","outOfRange","target","controller","color"],n.layoutMode={type:"box",ignoreSize:!0},n.dataBound=[-1/0,1/0],n.targetVisuals={},n.controllerVisuals={},n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},e.prototype.optionUpdated=function(t,e){var n=this.option;a.canvasSupported||(n.realtime=!1),!e&&$z(n,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},e.prototype.resetVisual=function(t){var e=this.stateList;t=B(t,this),this.controllerVisuals=Kz(this.option.controller,e,t),this.targetVisuals=Kz(this.option.target,e,t)},e.prototype.getItemSymbol=function(){return null},e.prototype.getTargetSeriesIndices=function(){var t=this.option.seriesIndex,e=[];return null==t||"all"===t?this.ecModel.eachSeries((function(t,n){e.push(n)})):e=wr(t),e},e.prototype.eachTargetSeries=function(t,e){O(this.getTargetSeriesIndices(),(function(n){var i=this.ecModel.getSeriesByIndex(n);i&&t.call(e,i)}),this)},e.prototype.isTargetSeries=function(t){var e=!1;return this.eachTargetSeries((function(n){n===t&&(e=!0)})),e},e.prototype.formatValueText=function(t,e,n){var i,r=this.option,o=r.precision,a=this.dataBound,s=r.formatter;n=n||["<",">"],F(t)&&(t=t.slice(),i=!0);var l=e?t:i?[u(t[0]),u(t[1])]:u(t);return W(s)?s.replace("{value}",i?l[0]:l).replace("{value2}",i?l[1]:l):H(s)?i?s(t[0],t[1]):s(t):i?t[0]===a[0]?n[0]+" "+l[1]:t[1]===a[1]?n[1]+" "+l[0]:l[0]+" - "+l[1]:l;function u(t){return t===a[0]?"min":t===a[1]?"max":(+t).toFixed(Math.min(o,20))}},e.prototype.resetExtent=function(){var t=this.option,e=tB([t.min,t.max]);this._dataExtent=e},e.prototype.getDataDimensionIndex=function(t){var e=this.option.dimension;if(null!=e)return t.getDimensionIndex(e);for(var n=t.dimensions,i=n.length-1;i>=0;i--){var r=n[i],o=t.getDimensionInfo(r);if(!o.isCalculationCoord)return o.storeDimIndex}},e.prototype.getExtent=function(){return this._dataExtent.slice()},e.prototype.completeVisualOption=function(){var t=this.ecModel,e=this.option,n={inRange:e.inRange,outOfRange:e.outOfRange},i=e.target||(e.target={}),r=e.controller||(e.controller={});M(i,n),M(r,n);var o=this.isCategory();function a(n){JV(e.color)&&!n.inRange&&(n.inRange={color:e.color.slice().reverse()}),n.inRange=n.inRange||{color:t.get("gradientColor")}}a.call(this,i),a.call(this,r),function(t,e,n){var i=t[e],r=t[n];i&&!r&&(r=t[n]={},QV(i,(function(t,e){if(iC.isValidType(e)){var n=jV(e,"inactive",o);null!=n&&(r[e]=n,"color"!==e||r.hasOwnProperty("opacity")||r.hasOwnProperty("colorAlpha")||(r.opacity=[0,0]))}})))}.call(this,i,"inRange","outOfRange"),function(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,n=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,i=this.get("inactiveColor"),r=this.getItemSymbol()||"roundRect";QV(this.stateList,(function(a){var s=this.itemSize,l=t[a];l||(l=t[a]={color:o?i:[i]}),null==l.symbol&&(l.symbol=e&&S(e)||(o?r:[r])),null==l.symbolSize&&(l.symbolSize=n&&S(n)||(o?s[0]:[s[0],s[0]])),l.symbol=KV(l.symbol,(function(t){return"none"===t?r:t}));var u=l.symbolSize;if(null!=u){var h=-1/0;$V(u,(function(t){t>h&&(h=t)})),l.symbolSize=KV(u,(function(t){return eB(t,[0,h],[0,s[0]],!0)}))}}),this)}.call(this,r)},e.prototype.resetItemSize=function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},e.prototype.isCategory=function(){return!!this.option.categories},e.prototype.setSelected=function(t){},e.prototype.getSelected=function(){return null},e.prototype.getValueState=function(t){return null},e.prototype.getVisualMeta=function(t){return null},e.type="visualMap",e.dependencies=["series"],e.defaultOption={show:!0,zlevel:0,z:4,seriesIndex:"all",min:0,max:200,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,textStyle:{color:"#333"}},e}(ep),iB=[20,140],rB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent(),this.resetVisual((function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()})),this._resetRange()},e.prototype.resetItemSize=function(){t.prototype.resetItemSize.apply(this,arguments);var e=this.itemSize;(null==e[0]||isNaN(e[0]))&&(e[0]=iB[0]),(null==e[1]||isNaN(e[1]))&&(e[1]=iB[1])},e.prototype._resetRange=function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):F(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},e.prototype.completeVisualOption=function(){t.prototype.completeVisualOption.apply(this,arguments),O(this.stateList,(function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=e[1]/3)}),this)},e.prototype.setSelected=function(t){this.option.range=t.slice(),this._resetRange()},e.prototype.getSelected=function(){var t=this.getExtent(),e=$i((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]=n[1]||t<=e[1])?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[];return this.eachTargetSeries((function(n){var i=[],r=n.getData();r.each(this.getDataDimensionIndex(r),(function(e,n){t[0]<=e&&e<=t[1]&&i.push(n)}),this),e.push({seriesId:n.id,dataIndex:i})}),this),e},e.prototype.getVisualMeta=function(t){var e=oB(this,"outOfRange",this.getExtent()),n=oB(this,"inRange",this.option.range.slice()),i=[];function r(e,n){i.push({value:e,color:t(e,n)})}for(var o=0,a=0,s=n.length,l=e.length;at[1])break;n.push({color:this.getControllerVisual(o,"color",e),offset:r/100})}return n.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),n},e.prototype._createBarPoints=function(t,e){var n=this.visualMapModel.itemSize;return[[n[0]-e[0],t[0]],[n[0],t[0]],[n[0],t[1]],[n[0]-e[1],t[1]]]},e.prototype._createBarGroup=function(t){var e=this._orient,n=this.visualMapModel.get("inverse");return new Bi("horizontal"!==e||n?"horizontal"===e&&n?{scaleX:"bottom"===t?-1:1,rotation:-Math.PI/2}:"vertical"!==e||n?{scaleX:"left"===t?1:-1}:{scaleX:"left"===t?1:-1,scaleY:-1}:{scaleX:"bottom"===t?1:-1,rotation:Math.PI/2})},e.prototype._updateHandle=function(t,e){if(this._useHandle){var n=this._shapes,i=this.visualMapModel,r=n.handleThumbs,o=n.handleLabels,a=i.itemSize,s=i.getExtent();cB([0,1],(function(l){var u=r[l];u.setStyle("fill",e.handlesColor[l]),u.y=t[l];var h=hB(t[l],[0,a[1]],s,!0),c=this.getControllerVisual(h,"symbolSize");u.scaleX=u.scaleY=c/a[0],u.x=a[0]-c/2;var p=oh(n.handleLabelPoints[l],rh(u,this.group));o[l].setStyle({x:p[0],y:p[1],text:i.formatValueText(this._dataInterval[l]),verticalAlign:"middle",align:"vertical"===this._orient?this._applyTransform("left",n.mainGroup):"center"})}),this)}},e.prototype._showIndicator=function(t,e,n,i){var r=this.visualMapModel,o=r.getExtent(),a=r.itemSize,s=[0,a[1]],l=this._shapes,u=l.indicator;if(u){u.attr("invisible",!1);var h=this.getControllerVisual(t,"color",{convertOpacityToAlpha:!0}),c=this.getControllerVisual(t,"symbolSize"),p=hB(t,o,s,!0),d=a[0]-c/2,f={x:u.x,y:u.y};u.y=p,u.x=d;var g=oh(l.indicatorLabelPoint,rh(u,this.group)),y=l.indicatorLabel;y.attr("invisible",!1);var v=this._applyTransform("left",l.mainGroup),m="horizontal"===this._orient;y.setStyle({text:(n||"")+r.formatValueText(e),verticalAlign:m?v:"middle",align:m?"center":v});var _={x:d,y:p,style:{fill:h}},x={style:{x:g[0],y:g[1]}};if(r.ecModel.isAnimationEnabled()&&!this._firstShowIndicator){var b={duration:100,easing:"cubicInOut",additive:!0};u.x=f.x,u.y=f.y,u.animateTo(_,b),y.animateTo(x,b)}else u.attr(_),y.attr(x);this._firstShowIndicator=!1;var w=this._shapes.handleLabels;if(w)for(var S=0;Sr[1]&&(u[1]=1/0),e&&(u[0]===-1/0?this._showIndicator(l,u[1],"< ",a):u[1]===1/0?this._showIndicator(l,u[0],"> ",a):this._showIndicator(l,l,"≈ ",a));var h=this._hoverLinkDataIndices,c=[];(e||yB(n))&&(c=this._hoverLinkDataIndices=n.findTargetDataIndices(u));var p=function(t,e){var n={},i={};return r(t||[],n),r(e||[],i,n),[o(n),o(i)];function r(t,e,n){for(var i=0,r=t.length;i=0&&(r.dimension=o,i.push(r))}})),t.getData().setVisual("visualMeta",i)}}];function bB(t,e,n,i){for(var r=e.targetVisuals[i],o=iC.prepareVisualTypes(r),a={color:Vg(t.getData(),"color")},s=0,l=o.length;s0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})),t.registerAction(mB,_B),O(xB,(function(e){t.registerVisual(t.PRIORITY.VISUAL.COMPONENT,e)})),t.registerPreprocessor(SB))}function CB(t){t.registerComponentModel(rB),t.registerComponentView(fB),TB(t)}var DB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._pieceList=[],n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent();var i=this._mode=this._determineMode();this._pieceList=[],AB[this._mode].call(this,this._pieceList),this._resetSelected(e,n);var r=this.option.categories;this.resetVisual((function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=S(r)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=R(this._pieceList,(function(t){return t=S(t),"inRange"!==e&&(t.visual=null),t})))}))},e.prototype.completeVisualOption=function(){var e=this.option,n={},i=iC.listVisualTypes(),r=this.isCategory();function o(t,e,n){return t&&t[e]&&t[e].hasOwnProperty(n)}O(e.pieces,(function(t){O(i,(function(e){t.hasOwnProperty(e)&&(n[e]=1)}))})),O(n,(function(t,n){var i=!1;O(this.stateList,(function(t){i=i||o(e,t,n)||o(e.target,t,n)}),this),!i&&O(this.stateList,(function(t){(e[t]||(e[t]={}))[n]=jV(n,"inRange"===t?"active":"inactive",r)}))}),this),t.prototype.completeVisualOption.apply(this,arguments)},e.prototype._resetSelected=function(t,e){var n=this.option,i=this._pieceList,r=(e?n:t).selected||{};if(n.selected=r,O(i,(function(t,e){var n=this.getSelectedMapKey(t);r.hasOwnProperty(n)||(r[n]=!0)}),this),"single"===n.selectedMode){var o=!1;O(i,(function(t,e){var n=this.getSelectedMapKey(t);r[n]&&(o?r[n]=!1:o=!0)}),this)}},e.prototype.getItemSymbol=function(){return this.get("itemSymbol")},e.prototype.getSelectedMapKey=function(t){return"categories"===this._mode?t.value+"":t.index+""},e.prototype.getPieceList=function(){return this._pieceList},e.prototype._determineMode=function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},e.prototype.setSelected=function(t){this.option.selected=S(t)},e.prototype.getValueState=function(t){var e=iC.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[],n=this._pieceList;return this.eachTargetSeries((function(i){var r=[],o=i.getData();o.each(this.getDataDimensionIndex(o),(function(e,i){iC.findPieceIndex(e,n)===t&&r.push(i)}),this),e.push({seriesId:i.id,dataIndex:r})}),this),e},e.prototype.getRepresentValue=function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var n=t.interval||[];e=n[0]===-1/0&&n[1]===1/0?0:(n[0]+n[1])/2}return e},e.prototype.getVisualMeta=function(t){if(!this.isCategory()){var e=[],n=["",""],i=this,r=this._pieceList.slice();if(r.length){var o=r[0].interval[0];o!==-1/0&&r.unshift({interval:[-1/0,o]}),(o=r[r.length-1].interval[1])!==1/0&&r.push({interval:[o,1/0]})}else r.push({interval:[-1/0,1/0]});var a=-1/0;return O(r,(function(t){var e=t.interval;e&&(e[0]>a&&s([a,e[0]],"outOfRange"),s(e.slice()),a=e[1])}),this),{stops:e,outerColors:n}}function s(r,o){var a=i.getRepresentValue({interval:r});o||(o=i.getValueState(a));var s=t(a,o);r[0]===-1/0?n[0]=s:r[1]===1/0?n[1]=s:e.push({value:r[0],color:s},{value:r[1],color:s})}},e.type="visualMap.piecewise",e.defaultOption=Yh(nB.defaultOption,{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieces:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0}),e}(nB),AB={splitNumber:function(t){var e=this.option,n=Math.min(e.precision,20),i=this.getExtent(),r=e.splitNumber;r=Math.max(parseInt(r,10),1),e.splitNumber=r;for(var o=(i[1]-i[0])/r;+o.toFixed(n)!==o&&n<5;)n++;e.precision=n,o=+o.toFixed(n),e.minOpen&&t.push({interval:[-1/0,i[0]],close:[0,0]});for(var a=0,s=i[0];a","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,n)}),this)}};function kB(t,e){var n=t.inverse;("vertical"===t.orient?!n:n)&&e.reverse()}var LB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.doRender=function(){var t=this.group;t.removeAll();var e=this.visualMapModel,n=e.get("textGap"),i=e.textStyleModel,r=i.getFont(),o=i.getTextColor(),a=this._getItemAlign(),s=e.itemSize,l=this._getViewData(),u=l.endsText,h=tt(e.get("showLabel",!0),!u);u&&this._renderEndsText(t,u[0],s,h,a),O(l.viewPieceList,(function(i){var l=i.piece,u=new Bi;u.onclick=B(this._onItemClick,this,l),this._enableHoverLink(u,i.indexInModelPieceList);var c=e.getRepresentValue(l);if(this._createItemSymbol(u,c,[0,0,s[0],s[1]]),h){var p=this.visualMapModel.getValueState(c);u.add(new fs({style:{x:"right"===a?-n:s[0]+n,y:s[1]/2,text:l.text,verticalAlign:"middle",align:a,font:r,fill:o,opacity:"outOfRange"===p?.5:1}}))}t.add(u)}),this),u&&this._renderEndsText(t,u[1],s,h,a),Zc(e.get("orient"),t,e.get("itemGap")),this.renderBackground(t),this.positionGroup(t)},e.prototype._enableHoverLink=function(t,e){var n=this;t.on("mouseover",(function(){return i("highlight")})).on("mouseout",(function(){return i("downplay")}));var i=function(t){var i=n.visualMapModel;i.option.hoverLink&&n.api.dispatchAction({type:t,batch:uB(i.findTargetDataIndices(e),i)})}},e.prototype._getItemAlign=function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return lB(t,this.api,t.itemSize);var n=e.align;return n&&"auto"!==n||(n="left"),n},e.prototype._renderEndsText=function(t,e,n,i,r){if(e){var o=new Bi,a=this.visualMapModel.textStyleModel;o.add(new fs({style:{x:i?"right"===r?n[0]:0:n[0]/2,y:n[1]/2,verticalAlign:"middle",align:i?r:"center",text:e,font:a.getFont(),fill:a.getTextColor()}})),t.add(o)}},e.prototype._getViewData=function(){var t=this.visualMapModel,e=R(t.getPieceList(),(function(t,e){return{piece:t,indexInModelPieceList:e}})),n=t.get("text"),i=t.get("orient"),r=t.get("inverse");return("horizontal"===i?r:!r)?e.reverse():n&&(n=n.slice().reverse()),{viewPieceList:e,endsText:n}},e.prototype._createItemSymbol=function(t,e,n){t.add(ty(this.getControllerVisual(e,"symbol"),n[0],n[1],n[2],n[3],this.getControllerVisual(e,"color")))},e.prototype._onItemClick=function(t){var e=this.visualMapModel,n=e.option,i=S(n.selected),r=e.getSelectedMapKey(t);"single"===n.selectedMode?(i[r]=!0,O(i,(function(t,e){i[e]=e===r}))):i[r]=!i[r],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:i})},e.type="visualMap.piecewise",e}(aB);function PB(t){t.registerComponentModel(DB),t.registerComponentView(LB),TB(t)}var OB={label:{enabled:!0},decal:{show:!1}},RB=Rr(),NB={};function zB(t,e){var n=t.getModel("aria");if(n.get("enabled")){var i=S(OB);M(i.label,t.getLocaleModel().get("aria"),!1),M(n.option,i,!1),function(){if(n.getModel("decal").get("show")){var e=ct();t.eachSeries((function(t){if(!t.isColorBySeries()){var n=e.get(t.type);n||(n={},e.set(t.type,n)),RB(t).scope=n}})),t.eachRawSeries((function(e){if(!t.isSeriesFiltered(e))if("function"!=typeof e.enableAriaDecal){var n=e.getData();if(e.isColorBySeries()){var i=kp(e.ecModel,e.name,NB,t.getSeriesCount()),r=n.getVisual("decal");n.setVisual("decal",u(r,i))}else{var o=e.getRawData(),a={},s=RB(e).scope;n.each((function(t){var e=n.getRawIndex(t);a[e]=t}));var l=o.count();o.each((function(t){var i=a[t],r=o.getName(t)||t+"",h=kp(e.ecModel,r,s,l),c=n.getItemVisual(i,"decal");n.setItemVisual(i,"decal",u(c,h))}))}}else e.enableAriaDecal();function u(t,e){var n=t?T(T({},e),t):e;return n.dirty=!0,n}}))}}(),function(){var i=t.getLocaleModel().get("aria"),o=n.getModel("label");if(o.option=C(o.option,i),!o.get("enabled"))return;var a=e.getZr().dom;if(o.get("description"))return void a.setAttribute("aria-label",o.get("description"));var s,l=t.getSeriesCount(),u=o.get(["data","maxCount"])||10,h=o.get(["series","maxCount"])||10,c=Math.min(l,h);if(l<1)return;var p=function(){var e=t.get("title");e&&e.length&&(e=e[0]);return e&&e.text}();if(p){var d=o.get(["general","withTitle"]);s=r(d,{title:p})}else s=o.get(["general","withoutTitle"]);var f=[],g=l>1?o.get(["series","multiple","prefix"]):o.get(["series","single","prefix"]);s+=r(g,{seriesCount:l}),t.eachSeries((function(e,n){if(n1?o.get(["series","multiple",a]):o.get(["series","single",a]),{seriesId:e.seriesIndex,seriesName:e.get("name"),seriesType:(_=e.subType,t.getLocaleModel().get(["series","typeNames"])[_]||"自定义图")});var s=e.getData();if(s.count()>u)i+=r(o.get(["data","partialData"]),{displayCnt:u});else i+=o.get(["data","allData"]);for(var h=[],p=0;p":"gt",">=":"gte","=":"eq","!=":"ne","<>":"ne"},BB=function(){function t(t){if(null==(this._condVal=W(t)?new RegExp(t):J(t)?t:null)){var e="";0,_r(e)}}return t.prototype.evaluate=function(t){var e=typeof t;return"string"===e?this._condVal.test(t):"number"===e&&this._condVal.test(t+"")},t}(),GB=function(){function t(){}return t.prototype.evaluate=function(){return this.value},t}(),FB=function(){function t(){}return t.prototype.evaluate=function(){for(var t=this.children,e=0;e2&&l.push(e),e=[t,n]}function f(t,n,i,r){tG(t,i)&&tG(n,r)||e.push(t,n,i,r,i,r)}function g(t,n,i,r,o,a){var s=Math.abs(n-t),l=4*Math.tan(s/4)/3,u=nM:C2&&l.push(e),l}function nG(t,e,n,i,r,o,a,s,l,u){if(tG(t,n)&&tG(e,i)&&tG(r,a)&&tG(o,s))l.push(a,s);else{var h=2/u,c=h*h,p=a-t,d=s-e,f=Math.sqrt(p*p+d*d);p/=f,d/=f;var g=n-t,y=i-e,v=r-a,m=o-s,_=g*g+y*y,x=v*v+m*m;if(_=0&&x-w*w=0)l.push(a,s);else{var S=[],M=[];Uo(t,n,r,a,.5,S),Uo(e,i,o,s,.5,M),nG(S[0],M[0],S[1],M[1],S[2],M[2],S[3],M[3],l,u),nG(S[4],M[4],S[5],M[5],S[6],M[6],S[7],M[7],l,u)}}}}function iG(t,e,n){var i=t[e],r=t[1-e],o=Math.abs(i/r),a=Math.ceil(Math.sqrt(o*n)),s=Math.floor(n/a);0===s&&(s=1,a=n);for(var l=[],u=0;u0)for(u=0;uMath.abs(u),c=iG([l,u],h?0:1,e),p=(h?s:u)/c.length,d=0;d1?null:new li(d*l+t,d*u+e)}function sG(t,e,n){var i=new li;li.sub(i,n,e),i.normalize();var r=new li;return li.sub(r,t,e),r.dot(i)}function lG(t,e){var n=t[t.length-1];n&&n[0]===e[0]&&n[1]===e[1]||t.push(e)}function uG(t){var e=t.points,n=[],i=[];sa(e,n,i);var r=new vi(n[0],n[1],i[0]-n[0],i[1]-n[1]),o=r.width,a=r.height,s=r.x,l=r.y,u=new li,h=new li;return o>a?(u.x=h.x=s+o/2,u.y=l,h.y=l+a):(u.y=h.y=l+a/2,u.x=s,h.x=s+o),function(t,e,n){for(var i=t.length,r=[],o=0;or,a=iG([i,r],o?0:1,e),s=o?"width":"height",l=o?"height":"width",u=o?"x":"y",h=o?"y":"x",c=t[s]/a.length,p=0;p0)for(var b=i/n,w=-i/2;w<=i/2;w+=b){var S=Math.sin(w),M=Math.cos(w),I=0;for(_=0;_0;l/=2){var u=0,h=0;(t&l)>0&&(u=1),(e&l)>0&&(h=1),s+=l*l*(3*u^h),0===h&&(1===u&&(t=l-1-t,e=l-1-e),a=t,t=e,e=a)}return s}function TG(t){var e=1/0,n=1/0,i=-1/0,r=-1/0,o=R(t,(function(t){var o=t.getBoundingRect(),a=t.getComputedTransform(),s=o.x+o.width/2+(a?a[4]:0),l=o.y+o.height/2+(a?a[5]:0);return e=Math.min(s,e),n=Math.min(l,n),i=Math.max(s,i),r=Math.max(l,r),[s,l]}));return R(o,(function(o,a){return{cp:o,z:IG(o[0],o[1],e,n,i,r),path:t[a]}})).sort((function(t,e){return t.z-e.z})).map((function(t){return t.path}))}function CG(t){return pG(t.path,t.count)}function DG(t){return F(t[0])}function AG(t,e){for(var n=[],i=t.length,r=0;r=0;r--)if(!n[r].many.length){var l=n[s].many;if(l.length<=1){if(!s)return n;s=0}o=l.length;var u=Math.ceil(o/2);n[r].many=l.slice(u,o),n[s].many=l.slice(0,u),s++}return n}var kG={clone:function(t){for(var e=[],n=1-Math.pow(1-t.path.style.opacity,1/t.count),i=0;i0){var s,l,u=i.getModel("universalTransition").get("delay"),h=Object.assign({setToFinal:!0},a);DG(t)&&(s=t,l=e),DG(e)&&(s=e,l=t);for(var c=s?s===t:t.length>e.length,p=s?AG(l,s):AG(c?e:t,[c?t:e]),d=0,f=0;f1e4))for(var i=n.getIndices(),r=function(t){for(var e=t.dimensions,n=0;n0&&i.group.traverse((function(t){t instanceof Qa&&!t.animators.length&&t.animateFrom({style:{opacity:0}},r)}))}))}function GG(t){var e=t.getModel("universalTransition").get("seriesKey");return e||t.id}function FG(t){return F(t)?t.sort().join(","):t}function HG(t){if(t.hostModel)return t.hostModel.getModel("universalTransition").get("divideShape")}function WG(t,e){for(var n=0;n=0&&r.push({data:e.oldData[n],divide:HG(e.oldData[n]),dim:t.dimension})})),O(wr(t.to),(function(t){var e=WG(n.updatedSeries,t);if(e>=0){var i=n.updatedSeries[e].getData();o.push({data:i,divide:HG(i),dim:t.dimension})}})),r.length>0&&o.length>0&&BG(r,o,i)}(t,i,n,e)}));else{var o=function(t,e){var n=ct(),i=ct(),r=ct();return O(t.oldSeries,(function(e,n){var o=t.oldData[n],a=GG(e),s=FG(a);i.set(s,o),F(a)&&O(a,(function(t){r.set(t,{data:o,key:s})}))})),O(e.updatedSeries,(function(t){if(t.isUniversalTransitionEnabled()&&t.isAnimationEnabled()){var e=t.getData(),o=GG(t),a=FG(o),s=i.get(a);if(s)n.set(a,{oldSeries:[{divide:HG(s),data:s}],newSeries:[{divide:HG(e),data:e}]});else if(F(o)){var l=[];O(o,(function(t){var e=i.get(t);e&&l.push({divide:HG(e),data:e})})),l.length&&n.set(a,{oldSeries:l,newSeries:[{data:e,divide:HG(e)}]})}else{var u=r.get(o);if(u){var h=n.get(u.key);h||(h={oldSeries:[{data:u.data,divide:HG(u.data)}],newSeries:[]},n.set(u.key,h)),h.newSeries.push({data:e,divide:HG(e)})}}}})),n}(i,n);O(o.keys(),(function(t){var n=o.get(t);BG(n.oldSeries,n.newSeries,e)}))}O(n.updatedSeries,(function(t){t.__universalTransitionEnabled&&(t.__universalTransitionEnabled=!1)}))}for(var a=t.getSeries(),s=i.oldSeries=[],l=i.oldData=[],u=0;u]*>/g, ''); +} +//浏览器桌面通知 +function notify(title, options, callback) { + + // 先检查浏览器是否支持 + if (!window.Notification) { + console.log("浏览器不支持notify"); + return; + } + options.body=replaceHtml(options.body); + console.log("浏览器notify权限:", Notification.permission); + // 检查用户曾经是否同意接受通知 + if (Notification.permission === 'granted') { + var notification = new Notification(title, options); // 显示通知 + if (notification && callback) { + notification.onclick = function(event) { + callback(notification, event); + } + setTimeout(function () { + notification.close(); + },3000); + } + } else { + Notification.requestPermission().then( (permission) =>function(){ + console.log("请求浏览器notify权限:", permission); + if (permission === 'granted') { + notification = new Notification(title, options); // 显示通知 + if (notification && callback) { + notification.onclick = function (event) { + callback(notification, event); + } + setTimeout(function () { + notification.close(); + }, 3000); + } + } else if (permission === 'default') { + console.log('用户关闭授权 可以再次请求授权'); + } else { + console.log('用户拒绝授权 不能显示通知'); + } + }); + } + +} +var titleTimer=0; +var titleNum=0; +var originTitle = document.title; +function flashTitle() { + if(titleTimer!=0){ + return; + } + titleTimer = setInterval(function(){ + titleNum++; + if (titleNum == 3) { + titleNum = 1; + } + if (titleNum == 1) { + document.title = '【】' + originTitle; + } + if (titleNum == 2) { + document.title = '【new message】' + originTitle; + } + }, 500); + +} +function clearFlashTitle() { + clearInterval(titleTimer); + document.title = originTitle; +} +var faceTitles = ["[微笑]", "[嘻嘻]", "[哈哈]", "[可爱]", "[可怜]", "[挖鼻]", "[吃惊]", "[害羞]", "[挤眼]", "[闭嘴]", "[鄙视]", "[爱你]", "[泪]", "[偷笑]", "[亲亲]", "[生病]", "[太开心]", "[白眼]", "[右哼哼]", "[左哼哼]", "[嘘]", "[衰]", "[委屈]", "[吐]", "[哈欠]", "[抱抱]", "[怒]", "[疑问]", "[馋嘴]", "[拜拜]", "[思考]", "[汗]", "[困]", "[睡]", "[钱]", "[失望]", "[酷]", "[色]", "[哼]", "[鼓掌]", "[晕]", "[悲伤]", "[抓狂]", "[黑线]", "[阴险]", "[怒骂]", "[互粉]", "[心]", "[伤心]", "[猪头]", "[熊猫]", "[兔子]", "[ok]", "[耶]", "[good]", "[NO]", "[赞]", "[来]", "[弱]", "[草泥马]", "[神马]", "[囧]", "[浮云]", "[给力]", "[围观]", "[威武]", "[奥特曼]", "[礼物]", "[钟]", "[话筒]", "[蜡烛]", "[蛋糕]"]; +function placeFace() { + var faces=[]; + for(var i=0;i'; + }) + .replace(/img\[(.*?)\]/g, function (face) { // 转义图片 + var src = face.replace(/^img\[/g, '').replace(/\]/g, '');; + return ''; + }) + .replace(/\n/g, '
'); // 转义换行 + content=replaceAttachment(content); + return content; +} +//替换附件展示 +function replaceAttachment(str){ + return str.replace(/attachment\[(.*?)\]/g, function (result) { + var mutiFiles=result.match(/attachment\[(.*?)\]/) + if (mutiFiles.length<2){ + return result; + } + //return result; + + var info=JSON.parse(mutiFiles[1]) + var imgSrc=""; + switch(info.ext){ + case ".mp3": + imgSrc="/static/images/ext/MP3.png"; + break; + case ".zip": + imgSrc="/static/images/ext/ZIP.png"; + break; + case ".txt": + imgSrc="/static/images/ext/TXT.png"; + break; + case ".7z": + imgSrc="/static/images/ext/7z.png"; + break; + case ".bpm": + imgSrc="/static/images/ext/BMP.png"; + break; + case ".png": + imgSrc="/static/images/ext/PNG.png"; + break; + case ".jpg": + imgSrc="/static/images/ext/JPG.png"; + break; + case ".jpeg": + imgSrc="/static/images/ext/JPEG.png"; + break; + case ".pdf": + imgSrc="/static/images/ext/PDF.png"; + break; + case ".doc": + imgSrc="/static/images/ext/DOC.png"; + break; + case ".docx": + imgSrc="/static/images/ext/DOCX.png"; + break; + case ".rar": + imgSrc="/static/images/ext/RAR.png"; + break; + case ".xlsx": + imgSrc="/static/images/ext/XLSX.png"; + break; + case ".csv": + imgSrc="/static/images/ext/XLSX.png"; + break; + default: + imgSrc="/static/images/ext/default.png"; + break; + } + var html= `
+
+
+
`+info.name+`
+
`+formatFileSize(info.size)+`
+
+
`; + return html; + }) +} +function formatFileSize(fileSize) { + if (fileSize < 1024) { + return fileSize + 'B'; + } else if (fileSize < (1024*1024)) { + var temp = fileSize / 1024; + temp = temp.toFixed(2); + return temp + 'KB'; + } else if (fileSize < (1024*1024*1024)) { + var temp = fileSize / (1024*1024); + temp = temp.toFixed(2); + return temp + 'MB'; + } else { + var temp = fileSize / (1024*1024*1024); + temp = temp.toFixed(2); + return temp + 'GB'; + } +} +function bigPic(src,isVisitor){ + if (isVisitor) { + window.open(src); + return; + } +} +function filter (obj){ + var imgType = ["image/jpeg","image/png","image/jpg","image/gif"]; + var filetypes = imgType; + var isnext = false; + for (var i = 0; i < filetypes.length; i++) { + if (filetypes[i] == obj.type) { + return true; + } + } + return false; +} +function sleep(time) { + var startTime = new Date().getTime() + parseInt(time, 10); + while(new Date().getTime() < startTime) {} +} +function checkLang(){ + var langs=["cn","en"]; + var lang=getQuery("lang"); + if(lang!=""&&langs.indexOf(lang) > 0 ){ + return lang; + } + return "cn"; +} +function getQuery(key) { + var query = window.location.search.substring(1); + var key_values = query.split("&"); + var params = {}; + key_values.map(function (key_val){ + var key_val_arr = key_val.split("="); + params[key_val_arr[0]] = key_val_arr[1]; + }); + if(typeof params[key]!="undefined"){ + return params[key]; + } + return ""; +} +function utf8ToB64(str) { + return window.btoa(unescape(encodeURIComponent(str))); +} +function b64ToUtf8(str) { + return decodeURIComponent(escape(window.atob(str))); +} +//播放声音 +function alertSound(id,src){ + var b = document.getElementById(id); + if(src!=""){ + b.src=src; + } + var p = b.play(); + p && p.then(function(){}).catch(function(e){}); +} +//日期格式化 +function formatDate(dateString, format = 'yyyy-MM-dd HH:mm:ss') { + const date = new Date(dateString); + + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hour = String(date.getHours()).padStart(2, '0'); + const minute = String(date.getMinutes()).padStart(2, '0'); + const second = String(date.getSeconds()).padStart(2, '0'); + + const formattedDate = format + .replace(/yyyy/g, year) + .replace(/MM/g, month) + .replace(/dd/g, day) + .replace(/HH/g, hour) + .replace(/mm/g, minute) + .replace(/ss/g, second); + + return formattedDate; +} +function copyText(text) { + var target = document.createElement('input') + target.value = text + document.body.appendChild(target) + target.select() + document.execCommand("copy"); + document.body.removeChild(target); + return true; +} +; diff --git a/static/js/gofly-front.js b/static/js/gofly-front.js new file mode 100644 index 0000000..455fc3f --- /dev/null +++ b/static/js/gofly-front.js @@ -0,0 +1,335 @@ +var GOFLY={ + GOFLY_URL:"", + GOFLY_KEFU_ID:"", + GOFLY_BTN_TEXT:"Chat with me", + GOFLY_LANG:"en", + GOFLY_EXTRA: {}, + GOFLY_AUTO_OPEN:true, + GOFLY_AUTO_SHOW:false, + GOFLY_WITHOUT_BTN:false, +}; +GOFLY.launchButtonFlag=false; +GOFLY.titleTimer=0; +GOFLY.titleNum=0; +GOFLY.noticeTimer=null; +GOFLY.originTitle=document.title; +GOFLY.chatPageTitle="GOFLY"; +GOFLY.kefuName=""; +GOFLY.kefuAvator=""; +GOFLY.init=function(config){ + var _this=this; + if(typeof config=="undefined"){ + return; + } + + if (typeof config.GOFLY_URL!="undefined"){ + this.GOFLY_URL=config.GOFLY_URL.replace(/([\w\W]+)\/$/,"$1"); + } + this.dynamicLoadCss(this.GOFLY_URL+"/static/css/gofly-front.css?v=1"); + + if (typeof config.GOFLY_KEFU_ID!="undefined"){ + this.GOFLY_KEFU_ID=config.GOFLY_KEFU_ID; + } + if (typeof config.GOFLY_BTN_TEXT!="undefined"){ + this.GOFLY_BTN_TEXT=config.GOFLY_BTN_TEXT; + } + if (typeof config.GOFLY_EXTRA!="undefined"){ + this.GOFLY_EXTRA=config.GOFLY_EXTRA; + } + if (typeof config.GOFLY_AUTO_OPEN!="undefined"){ + this.GOFLY_AUTO_OPEN=config.GOFLY_AUTO_OPEN; + } + if (typeof config.GOFLY_AUTO_SHOW!="undefined"){ + this.GOFLY_AUTO_SHOW=config.GOFLY_AUTO_SHOW; + } + if (typeof config.GOFLY_WITHOUT_BTN!="undefined"){ + this.GOFLY_WITHOUT_BTN=config.GOFLY_WITHOUT_BTN; + } + var refer=document.referrer?document.referrer:"无"; + this.GOFLY_EXTRA.refer=refer; + this.GOFLY_EXTRA.host=document.location.href; + this.GOFLY_EXTRA=JSON.stringify(_this.GOFLY_EXTRA); + + this.dynamicLoadJs(this.GOFLY_URL+"/assets/js/functions.js?v=1",function(){ + if (typeof config.GOFLY_LANG!="undefined"){ + _this.GOFLY_LANG=config.GOFLY_LANG; + }else{ + _this.GOFLY_LANG=checkLang(); + } + _this.GOFLY_EXTRA=utf8ToB64(_this.GOFLY_EXTRA); + }); + if (typeof $!="function"){ + this.dynamicLoadJs("https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js",function () { + _this.dynamicLoadJs("https://cdn.staticfile.org/layer/3.4.0/layer.min.js",function () { + _this.jsCallBack(); + }); + }); + }else{ + this.dynamicLoadJs("https://cdn.staticfile.org/layer/3.4.0/layer.min.js",function () { + _this.jsCallBack(); + }); + } + _this.addEventlisten(); +} +GOFLY.jsCallBack=function(){ + this.showKefuBtn(); + this.addClickEvent(); + this.getNotice(); +} +GOFLY.showKefuBtn=function(){ + var _this=this; + if(_this.GOFLY_WITHOUT_BTN){ + return; + } + var html="
" + + '
' + + '
1
' + + '
'+_this.GOFLY_BTN_TEXT+'
' + + '
' + + '
'; + $('body').append(html); +} +GOFLY.addClickEvent=function(){ + var _this=this; + $(".launchButton").on("click",function() { + _this.GOFLY_AUTO_SHOW=true; + _this.showKefu(); + $("#launchIcon").text(0).hide(); + }); + + $("body").on("click","#launchNoticeClose",function() { + $("#launchButtonNotice").hide(); + }); + + $("body").click(function () { + clearTimeout(_this.titleTimer); + document.title = _this.originTitle; + }); +} +GOFLY.addEventlisten=function(){ + var _this=this; + window.addEventListener('message',function(e){ + var msg=e.data; + if(msg.type=="message"){ + clearInterval(_this.noticeTimer); + var width=$(window).width(); + if(width>768){ + _this.flashTitle();//标题闪烁 + } + if (_this.launchButtonFlag){ + return; + } + var welcomeHtml="
"+msg.data.name+"" + + "×" + + "
"; + welcomeHtml+="
"+replaceContent(msg.data.content,_this.GOFLY_URL)+"
"; + $("#launchButtonNotice").html(welcomeHtml).show(); + var news=$("#launchIcon").text(); + $("#launchIcon").text(++news).show(); + } + if(msg.type=="focus"){ + clearTimeout(_this.titleTimer); + _this.titleTimer=0; + document.title = _this.originTitle; + } + }); + window.onfocus = function () { + clearTimeout(_this.titleTimer); + _this.titleTimer=0; + document.title = _this.originTitle; + }; +} +GOFLY.dynamicLoadCss=function(url){ + var head = document.getElementsByTagName('head')[0]; + var link = document.createElement('link'); + link.type='text/css'; + link.rel = 'stylesheet'; + link.href = url; + head.appendChild(link); +} +GOFLY.dynamicLoadJs=function(url, callback){ + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = url; + if(typeof(callback)=='function'){ + script.onload = script.onreadystatechange = function () { + if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete"){ + callback(); + script.onload = script.onreadystatechange = null; + } + }; + } + head.appendChild(script); +} + +GOFLY.getNotice=function(){ + var _this=this; + $.get(this.GOFLY_URL+"/notice?kefu_id="+this.GOFLY_KEFU_ID,function(res) { + if(res.result.status=='offline'){ + _this.chatPageTitle="
"; + }else{ + _this.chatPageTitle="
"; + setTimeout(function(){ + var userInfo=" "+res.result.username+"" + $('.launchButtonText').html(userInfo); + },3000); + } + _this.kefuAvator=res.result.avatar; + _this.kefuName=res.result.username; + _this.chatPageTitle+=""+res.result.username; + if(_this.GOFLY_AUTO_OPEN&&_this.isIE()<=0){ + _this.showKefu(); + $(".launchButtonBox").show(); + _this.launchButtonFlag=false; + } + if (res.result.welcome != null) { + var msg = res.result.welcome; + var len=msg.length; + var i=0; + if(len>0){ + + _this.noticeTimer=setInterval(function(){ + if(i>=len||typeof msg[i]=="undefined"||msg[i]==null){ + clearInterval(_this.noticeTimer); + return; + } + var content = msg[i]; + if(typeof content.content =="undefined"){ + return; + } + var welcomeHtml="
"+res.result.username+"" + + "×" + + "
"; + welcomeHtml+="
"+replaceContent(content.content,_this.GOFLY_URL)+"
"; + + var obj=$("#launchButtonNotice"); + if(obj[0]){ + obj[0].innerHTML=welcomeHtml; + obj.show(); + } + i++; + $("#launchIcon").text(i).show(); + },4000); + } + + } + }); +} +GOFLY.isIE=function(){ + var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 + var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判断是否IE<11浏览器 + var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器 + var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1; + if(isIE) { + var reIE = new RegExp("MSIE (\\d+\\.\\d+);"); + reIE.test(userAgent); + var fIEVersion = parseFloat(RegExp["$1"]); + if(fIEVersion == 7) { + return 7; + } else if(fIEVersion == 8) { + return 8; + } else if(fIEVersion == 9) { + return 9; + } else if(fIEVersion == 10) { + return 10; + } else { + return 6;//IE版本<=7 + } + } else if(isEdge) { + return 'edge';//edge + } else if(isIE11) { + return 11; //IE11 + }else{ + return -1;//不是ie浏览器 + } +} +GOFLY.showPanel=function (){ + var width=$(window).width(); + this.GOFLY_AUTO_SHOW=true; + if(this.isIE()>0){ + this.windowOpen(); + return; + } + if(width<768){ + this.layerOpen("100%","100%"); + return; + } + this.layerOpen("400px","530px"); + this.launchButtonFlag=true; +} +GOFLY.showKefu=function (){ + if (this.launchButtonFlag) return; + var width=$(window).width(); + if(this.isIE()>0){ + this.windowOpen(); + return; + } + if(width<768){ + this.layerOpen("100%","100%"); + return; + } + this.layerOpen("400px","530px"); + this.launchButtonFlag=true; + $(".launchButtonBox").hide(); +} +GOFLY.layerOpen=function (width,height){ + if (this.launchButtonFlag) return; + var layBox=$("#layui-layer19911116"); + if(layBox.css("display")=="none"){ + layBox.show(); + return; + } + var _this=this; + layer.index="19911115"; + layer.open({ + type: 2, + title: this.chatPageTitle, + closeBtn: 1, //不显示关闭按钮 + shade: 0, + area: [width, height], + offset: 'rb', //右下角弹出 + anim: 2, + content: [this.GOFLY_URL+'/chatIndex?kefu_id='+this.GOFLY_KEFU_ID+'&lang='+this.GOFLY_LANG+'&refer='+window.document.title+'&extra='+this.GOFLY_EXTRA , 'yes'], //iframe的url,no代表不显示滚动条 + success:function(){ + var layBox=$("#layui-layer19911116"); + if(_this.GOFLY_AUTO_SHOW&&layBox.css("display")=="none"){ + _this.launchButtonFlag=true; + layBox.show(); + } + }, + end: function(){ + _this.launchButtonFlag=false; + $(".launchButtonBox").show(); + }, + cancel: function(index, layero){ + $("#layui-layer19911116").hide(); + _this.launchButtonFlag=false; + $(".launchButtonBox").show(); + return false; + } + }); +} +GOFLY.windowOpen=function (){ + window.open(this.GOFLY_URL+'/chatIndex?kefu_id='+this.GOFLY_KEFU_ID+'&lang='+this.GOFLY_LANG+'&refer='+window.document.title+'&extra='+this.GOFLY_EXTRA); +} +GOFLY.flashTitle=function () { + if(this.titleTimer!=0){ + return; + } + this.titleTimer = setInterval("GOFLY.flashTitleFunc()", 500); +} +GOFLY.flashTitleFunc=function(){ + this.titleNum++; + if (this.titleNum >=3) { + this.titleNum = 1; + } + if (this.titleNum == 1) { + document.title = '【】' + this.originTitle; + } + if (this.titleNum == 2) { + document.title = '【new message】' + this.originTitle; + } +} + + diff --git a/static/js/index.js b/static/js/index.js new file mode 100644 index 0000000..b39a0a6 --- /dev/null +++ b/static/js/index.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("vue")):"function"==typeof define&&define.amd?define("ELEMENT",["vue"],t):"object"==typeof exports?exports.ELEMENT=t(require("vue")):e.ELEMENT=t(e.Vue)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/dist/",i(i.s=49)}([function(t,i){t.exports=e},function(e,t,i){var n=i(4);e.exports=function(e,t,i){return void 0===i?n(e,t,!1):n(e,i,!1!==t)}},function(e,t,i){var n;!function(r){"use strict";var s={},a=/d{1,4}|M{1,4}|yy(?:yy)?|S{1,3}|Do|ZZ|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g,o="[^\\s]+",l=/\[([^]*?)\]/gm,u=function(){};function c(e,t){for(var i=[],n=0,r=e.length;n3?0:(e-e%10!=10)*e%10]}};var g={D:function(e){return e.getDay()},DD:function(e){return d(e.getDay())},Do:function(e,t){return t.DoFn(e.getDate())},d:function(e){return e.getDate()},dd:function(e){return d(e.getDate())},ddd:function(e,t){return t.dayNamesShort[e.getDay()]},dddd:function(e,t){return t.dayNames[e.getDay()]},M:function(e){return e.getMonth()+1},MM:function(e){return d(e.getMonth()+1)},MMM:function(e,t){return t.monthNamesShort[e.getMonth()]},MMMM:function(e,t){return t.monthNames[e.getMonth()]},yy:function(e){return d(String(e.getFullYear()),4).substr(2)},yyyy:function(e){return d(e.getFullYear(),4)},h:function(e){return e.getHours()%12||12},hh:function(e){return d(e.getHours()%12||12)},H:function(e){return e.getHours()},HH:function(e){return d(e.getHours())},m:function(e){return e.getMinutes()},mm:function(e){return d(e.getMinutes())},s:function(e){return e.getSeconds()},ss:function(e){return d(e.getSeconds())},S:function(e){return Math.round(e.getMilliseconds()/100)},SS:function(e){return d(Math.round(e.getMilliseconds()/10),2)},SSS:function(e){return d(e.getMilliseconds(),3)},a:function(e,t){return e.getHours()<12?t.amPm[0]:t.amPm[1]},A:function(e,t){return e.getHours()<12?t.amPm[0].toUpperCase():t.amPm[1].toUpperCase()},ZZ:function(e){var t=e.getTimezoneOffset();return(t>0?"-":"+")+d(100*Math.floor(Math.abs(t)/60)+Math.abs(t)%60,4)}},b={d:["\\d\\d?",function(e,t){e.day=t}],Do:["\\d\\d?"+o,function(e,t){e.day=parseInt(t,10)}],M:["\\d\\d?",function(e,t){e.month=t-1}],yy:["\\d\\d?",function(e,t){var i=+(""+(new Date).getFullYear()).substr(0,2);e.year=""+(t>68?i-1:i)+t}],h:["\\d\\d?",function(e,t){e.hour=t}],m:["\\d\\d?",function(e,t){e.minute=t}],s:["\\d\\d?",function(e,t){e.second=t}],yyyy:["\\d{4}",function(e,t){e.year=t}],S:["\\d",function(e,t){e.millisecond=100*t}],SS:["\\d{2}",function(e,t){e.millisecond=10*t}],SSS:["\\d{3}",function(e,t){e.millisecond=t}],D:["\\d\\d?",u],ddd:[o,u],MMM:[o,h("monthNamesShort")],MMMM:[o,h("monthNames")],a:[o,function(e,t,i){var n=t.toLowerCase();n===i.amPm[0]?e.isPm=!1:n===i.amPm[1]&&(e.isPm=!0)}],ZZ:["[^\\s]*?[\\+\\-]\\d\\d:?\\d\\d|[^\\s]*?Z",function(e,t){var i,n=(t+"").match(/([+-]|\d\d)/gi);n&&(i=60*n[1]+parseInt(n[2],10),e.timezoneOffset="+"===n[0]?i:-i)}]};b.dd=b.d,b.dddd=b.ddd,b.DD=b.D,b.mm=b.m,b.hh=b.H=b.HH=b.h,b.MM=b.M,b.ss=b.s,b.A=b.a,s.masks={default:"ddd MMM dd yyyy HH:mm:ss",shortDate:"M/D/yy",mediumDate:"MMM d, yyyy",longDate:"MMMM d, yyyy",fullDate:"dddd, MMMM d, yyyy",shortTime:"HH:mm",mediumTime:"HH:mm:ss",longTime:"HH:mm:ss.SSS"},s.format=function(e,t,i){var n=i||s.i18n;if("number"==typeof e&&(e=new Date(e)),"[object Date]"!==Object.prototype.toString.call(e)||isNaN(e.getTime()))throw new Error("Invalid Date in fecha.format");t=s.masks[t]||t||s.masks.default;var r=[];return(t=(t=t.replace(l,function(e,t){return r.push(t),"@@@"})).replace(a,function(t){return t in g?g[t](e,n):t.slice(1,t.length-1)})).replace(/@@@/g,function(){return r.shift()})},s.parse=function(e,t,i){var n=i||s.i18n;if("string"!=typeof t)throw new Error("Invalid format in fecha.parse");if(t=s.masks[t]||t,e.length>1e3)return null;var r={},o=[],u=[];t=t.replace(l,function(e,t){return u.push(t),"@@@"});var c,h=(c=t,c.replace(/[|\\{()[^$+*?.-]/g,"\\$&")).replace(a,function(e){if(b[e]){var t=b[e];return o.push(t[1]),"("+t[0]+")"}return e});h=h.replace(/@@@/g,function(){return u.shift()});var d=e.match(new RegExp(h,"i"));if(!d)return null;for(var p=1;pe?u():!0!==t&&(r=setTimeout(n?function(){r=void 0}:u,void 0===n?e-o:e))}}},function(e,t){var i=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=i)},function(e,t){var i=/^(attrs|props|on|nativeOn|class|style|hook)$/;function n(e,t){return function(){e&&e.apply(this,arguments),t&&t.apply(this,arguments)}}e.exports=function(e){return e.reduce(function(e,t){var r,s,a,o,l;for(a in t)if(r=e[a],s=t[a],r&&i.test(a))if("class"===a&&("string"==typeof r&&(l=r,e[a]=r={},r[l]=!0),"string"==typeof s&&(l=s,t[a]=s={},s[l]=!0)),"on"===a||"nativeOn"===a||"hook"===a)for(o in s)r[o]=n(r[o],s[o]);else if(Array.isArray(r))e[a]=r.concat(s);else if(Array.isArray(s))e[a]=[r].concat(s);else for(o in s)r[o]=s[o];else e[a]=t[a];return e},{})}},function(e,t){var i={}.hasOwnProperty;e.exports=function(e,t){return i.call(e,t)}},function(e,t,i){"use strict";t.__esModule=!0;var n,r=i(56),s=(n=r)&&n.__esModule?n:{default:n};t.default=s.default||function(e){for(var t=1;t0?n:i)(e)}},function(e,t,i){var n=i(28)("keys"),r=i(21);e.exports=function(e){return n[e]||(n[e]=r(e))}},function(e,t,i){var n=i(14),r=i(5),s=r["__core-js_shared__"]||(r["__core-js_shared__"]={});(e.exports=function(e,t){return s[e]||(s[e]=void 0!==t?t:{})})("versions",[]).push({version:n.version,mode:i(20)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t){e.exports={}},function(e,t,i){var n=i(10).f,r=i(7),s=i(13)("toStringTag");e.exports=function(e,t,i){e&&!r(e=i?e:e.prototype,s)&&n(e,s,{configurable:!0,value:t})}},function(e,t,i){t.f=i(13)},function(e,t,i){var n=i(5),r=i(14),s=i(20),a=i(33),o=i(10).f;e.exports=function(e){var t=r.Symbol||(r.Symbol=s?{}:n.Symbol||{});"_"==e.charAt(0)||e in t||o(t,e,{value:a.f(e)})}},function(e,t,i){var n=i(4),r=i(1);e.exports={throttle:n,debounce:r}},function(e,t,i){e.exports=!i(11)&&!i(16)(function(){return 7!=Object.defineProperty(i(37)("div"),"a",{get:function(){return 7}}).a})},function(e,t,i){var n=i(15),r=i(5).document,s=n(r)&&n(r.createElement);e.exports=function(e){return s?r.createElement(e):{}}},function(e,t,i){var n=i(7),r=i(12),s=i(62)(!1),a=i(27)("IE_PROTO");e.exports=function(e,t){var i,o=r(e),l=0,u=[];for(i in o)i!=a&&n(o,i)&&u.push(i);for(;t.length>l;)n(o,i=t[l++])&&(~s(u,i)||u.push(i));return u}},function(e,t,i){var n=i(40);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==n(e)?e.split(""):Object(e)}},function(e,t){var i={}.toString;e.exports=function(e){return i.call(e).slice(8,-1)}},function(e,t,i){var n=i(25);e.exports=function(e){return Object(n(e))}},function(e,t,i){"use strict";var n=i(20),r=i(23),s=i(43),a=i(9),o=i(31),l=i(69),u=i(32),c=i(72),h=i(13)("iterator"),d=!([].keys&&"next"in[].keys()),p=function(){return this};e.exports=function(e,t,i,f,m,v,g){l(i,t,f);var b,y,w,_=function(e){if(!d&&e in S)return S[e];switch(e){case"keys":case"values":return function(){return new i(this,e)}}return function(){return new i(this,e)}},x=t+" Iterator",C="values"==m,k=!1,S=e.prototype,D=S[h]||S["@@iterator"]||m&&S[m],$=D||_(m),E=m?C?_("entries"):$:void 0,T="Array"==t&&S.entries||D;if(T&&(w=c(T.call(new e)))!==Object.prototype&&w.next&&(u(w,x,!0),n||"function"==typeof w[h]||a(w,h,p)),C&&D&&"values"!==D.name&&(k=!0,$=function(){return D.call(this)}),n&&!g||!d&&!k&&S[h]||a(S,h,$),o[t]=$,o[x]=p,m)if(b={values:C?$:_("values"),keys:v?$:_("keys"),entries:E},g)for(y in b)y in S||s(S,y,b[y]);else r(r.P+r.F*(d||k),t,b);return b}},function(e,t,i){e.exports=i(9)},function(e,t,i){var n=i(17),r=i(70),s=i(29),a=i(27)("IE_PROTO"),o=function(){},l=function(){var e,t=i(37)("iframe"),n=s.length;for(t.style.display="none",i(71).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" + + + + + + + + + + + + + diff --git a/static/templates/chat_main.html b/static/templates/chat_main.html new file mode 100644 index 0000000..3b441f9 --- /dev/null +++ b/static/templates/chat_main.html @@ -0,0 +1,1258 @@ + + + + + + GOFLY - Open Source Customer Support System + + + + + + + + + + + +
+ +
+ + + diff --git a/static/templates/chat_page.html b/static/templates/chat_page.html new file mode 100644 index 0000000..08e459d --- /dev/null +++ b/static/templates/chat_page.html @@ -0,0 +1,627 @@ + + + + + + + Live Chat Support + + + + + + + + + + + + +
+ +
+ + + + \ No newline at end of file diff --git a/static/templates/chat_video.html b/static/templates/chat_video.html new file mode 100644 index 0000000..d57195a --- /dev/null +++ b/static/templates/chat_video.html @@ -0,0 +1,87 @@ + + + 视频聊天 + + + + + +

本地视频

+ +
+ 自己ID(自动获取) + 对方ID(请手动输入) + +
+

远程视频

+ + + + + + + \ No newline at end of file diff --git a/static/templates/detail.html b/static/templates/detail.html new file mode 100644 index 0000000..e299dd4 --- /dev/null +++ b/static/templates/detail.html @@ -0,0 +1,15 @@ + + + + + + + {{.Title}} + + + {{.CssJs}} + + +{{.Content}} + + \ No newline at end of file diff --git a/static/templates/header.html b/static/templates/header.html new file mode 100644 index 0000000..af0a31c --- /dev/null +++ b/static/templates/header.html @@ -0,0 +1,17 @@ +{{define "header"}} + + + + + + Go Open Source Live Chat Software + + + + + + + + + +{{end}} \ No newline at end of file diff --git a/static/templates/index.html b/static/templates/index.html new file mode 100644 index 0000000..e69de29 diff --git a/static/templates/index_demo.html b/static/templates/index_demo.html new file mode 100644 index 0000000..bc207d6 --- /dev/null +++ b/static/templates/index_demo.html @@ -0,0 +1,13 @@ + + + + + + 开源免费客服系统-极简强大Go语言开发客服单页营销系统 - GOFLY + + +

:)

HELLO GOFLY LIVE CHAT !

Administrator English 中文

+ + \ No newline at end of file diff --git a/static/templates/install.html b/static/templates/install.html new file mode 100644 index 0000000..ec73620 --- /dev/null +++ b/static/templates/install.html @@ -0,0 +1,161 @@ + + + + + + + GOFLY客服系统安装页面 + + + + + + + + + + + + + diff --git a/static/templates/list.html b/static/templates/list.html new file mode 100644 index 0000000..7f33499 --- /dev/null +++ b/static/templates/list.html @@ -0,0 +1,100 @@ +{{template "header" }} +
+ + +
+ + + diff --git a/static/templates/login.html b/static/templates/login.html new file mode 100644 index 0000000..c002717 --- /dev/null +++ b/static/templates/login.html @@ -0,0 +1,224 @@ + + + + + + GoflyLiveChat - Open Source Live Chat + + + + + + + + + + + + \ No newline at end of file diff --git a/static/templates/mail_detail.html b/static/templates/mail_detail.html new file mode 100644 index 0000000..558b86f --- /dev/null +++ b/static/templates/mail_detail.html @@ -0,0 +1,108 @@ +{{.Header}} +
+ +
+ + + diff --git a/static/templates/mail_left.html b/static/templates/mail_left.html new file mode 100644 index 0000000..7e44a7f --- /dev/null +++ b/static/templates/mail_left.html @@ -0,0 +1,11 @@ + + + + 写信 + + + + <{v}> + + \ No newline at end of file diff --git a/static/templates/main.html b/static/templates/main.html new file mode 100644 index 0000000..27db83e --- /dev/null +++ b/static/templates/main.html @@ -0,0 +1,171 @@ + + + + + Open Source Customer Support System + + + + + + + + + + + +
+ +
+ + + \ No newline at end of file diff --git a/static/templates/nav.html b/static/templates/nav.html new file mode 100644 index 0000000..e69de29 diff --git a/static/templates/pannel.html b/static/templates/pannel.html new file mode 100644 index 0000000..a5b240d --- /dev/null +++ b/static/templates/pannel.html @@ -0,0 +1,86 @@ +{{template "header"}} + +
+ + +
+ + + +{{template "setting_bottom" .}} \ No newline at end of file diff --git a/static/templates/setting.html b/static/templates/setting.html new file mode 100644 index 0000000..0dc247f --- /dev/null +++ b/static/templates/setting.html @@ -0,0 +1,180 @@ +{{template "header"}} + +
+ +
+ +{{template "setting_bottom" .}} \ No newline at end of file diff --git a/static/templates/setting_avator.html b/static/templates/setting_avator.html new file mode 100644 index 0000000..2ad47ae --- /dev/null +++ b/static/templates/setting_avator.html @@ -0,0 +1,64 @@ +{{template "header" }} + +
+ + +
+ +{{template "setting_bottom" .}} diff --git a/static/templates/setting_bottom.html b/static/templates/setting_bottom.html new file mode 100644 index 0000000..b95e046 --- /dev/null +++ b/static/templates/setting_bottom.html @@ -0,0 +1,329 @@ +{{define "setting_bottom"}} + + + +{{end}} \ No newline at end of file diff --git a/static/templates/setting_config.html b/static/templates/setting_config.html new file mode 100644 index 0000000..e69de29 diff --git a/static/templates/setting_deploy.html b/static/templates/setting_deploy.html new file mode 100644 index 0000000..1152935 --- /dev/null +++ b/static/templates/setting_deploy.html @@ -0,0 +1,27 @@ +{{template "header" }} +
+ + +
+ +{{template "setting_bottom" .}} diff --git a/static/templates/setting_indexpages.html b/static/templates/setting_indexpages.html new file mode 100644 index 0000000..d72d3d0 --- /dev/null +++ b/static/templates/setting_indexpages.html @@ -0,0 +1,33 @@ +{{template "header" }} +
+ + +
+ +{{template "setting_bottom" .}} diff --git a/static/templates/setting_ipblack.html b/static/templates/setting_ipblack.html new file mode 100644 index 0000000..ca73e08 --- /dev/null +++ b/static/templates/setting_ipblack.html @@ -0,0 +1,34 @@ +{{template "header" }} +
+ + +
+ +{{template "setting_bottom" .}} diff --git a/static/templates/setting_kefu_list.html b/static/templates/setting_kefu_list.html new file mode 100644 index 0000000..e347b35 --- /dev/null +++ b/static/templates/setting_kefu_list.html @@ -0,0 +1,86 @@ +{{template "header" }} +
+ + +
+ +{{template "setting_bottom" .}} diff --git a/static/templates/setting_left.html b/static/templates/setting_left.html new file mode 100644 index 0000000..acddeea --- /dev/null +++ b/static/templates/setting_left.html @@ -0,0 +1,30 @@ +{{define "setting_left"}} + + + + + + 统计信息 + 修改密码 + 修改资料 + + + + + + 配置参数 + IP黑名单 + 网页部署 + + + + +{{end}} \ No newline at end of file diff --git a/static/templates/setting_modifypass.html b/static/templates/setting_modifypass.html new file mode 100644 index 0000000..8100ab4 --- /dev/null +++ b/static/templates/setting_modifypass.html @@ -0,0 +1,29 @@ +{{template "header" }} +
+ + +
+ +{{template "setting_bottom" .}} \ No newline at end of file diff --git a/static/templates/setting_mysql.html b/static/templates/setting_mysql.html new file mode 100644 index 0000000..75bee03 --- /dev/null +++ b/static/templates/setting_mysql.html @@ -0,0 +1,35 @@ +{{template "header" }} +
+ + +
+ +{{template "setting_bottom" .}} diff --git a/static/templates/setting_pageindex.html b/static/templates/setting_pageindex.html new file mode 100644 index 0000000..81ccd96 --- /dev/null +++ b/static/templates/setting_pageindex.html @@ -0,0 +1,47 @@ +{{template "header" }} +
+ + +
+ +{{template "setting_bottom" .}} diff --git a/static/templates/setting_role_list.html b/static/templates/setting_role_list.html new file mode 100644 index 0000000..aaf2e46 --- /dev/null +++ b/static/templates/setting_role_list.html @@ -0,0 +1,60 @@ +{{template "header" }} +
+ + +
+ +{{template "setting_bottom" .}} diff --git a/static/templates/setting_statistics.html b/static/templates/setting_statistics.html new file mode 100644 index 0000000..c092c5a --- /dev/null +++ b/static/templates/setting_statistics.html @@ -0,0 +1,34 @@ +{{template "header" }} +
+ +
+ +{{template "setting_bottom" .}} + + diff --git a/static/templates/setting_welcome.html b/static/templates/setting_welcome.html new file mode 100644 index 0000000..d87ba4d --- /dev/null +++ b/static/templates/setting_welcome.html @@ -0,0 +1,53 @@ +{{template "header" }} +
+ + +
+ +{{template "setting_bottom" .}} diff --git a/static/templates/write.html b/static/templates/write.html new file mode 100644 index 0000000..614085e --- /dev/null +++ b/static/templates/write.html @@ -0,0 +1,116 @@ +{{.Header}} +
+ + +
+ + + + diff --git a/stop.bat b/stop.bat new file mode 100644 index 0000000..f072133 --- /dev/null +++ b/stop.bat @@ -0,0 +1 @@ +taskkill -f -t -im go-fly.exe \ No newline at end of file diff --git a/stop.sh b/stop.sh new file mode 100644 index 0000000..789a676 --- /dev/null +++ b/stop.sh @@ -0,0 +1,2 @@ +ps -ef|grep "go-fly" +kill -9 $(pidof 'go-fly') \ No newline at end of file diff --git a/tmpl/chat.go b/tmpl/chat.go new file mode 100644 index 0000000..683c4e8 --- /dev/null +++ b/tmpl/chat.go @@ -0,0 +1,22 @@ +package tmpl + +import ( + "github.com/gin-gonic/gin" + "net/http" +) + +// 咨询界面 +func PageChat(c *gin.Context) { + kefuId := c.Query("kefu_id") + refer := c.Query("refer") + if refer == "" { + refer = c.Request.Referer() + } + if refer == "" { + refer = "​​Direct Link" + } + c.HTML(http.StatusOK, "chat_page.html", gin.H{ + "KEFU_ID": kefuId, + "Refer": refer, + }) +} diff --git a/tmpl/common.go b/tmpl/common.go new file mode 100644 index 0000000..1822378 --- /dev/null +++ b/tmpl/common.go @@ -0,0 +1,79 @@ +package tmpl + +import ( + "ai-css/tools" + "github.com/gin-gonic/gin" + "html/template" + "net/http" +) + +type CommonHtml struct { + Header template.HTML + Nav template.HTML + Left template.HTML + Bottom template.HTML + Rw http.ResponseWriter +} + +func NewRender(rw http.ResponseWriter) *CommonHtml { + obj := new(CommonHtml) + obj.Rw = rw + header := tools.FileGetContent("html/header.html") + nav := tools.FileGetContent("html/nav.html") + obj.Header = template.HTML(header) + obj.Nav = template.HTML(nav) + return obj +} +func (obj *CommonHtml) SetLeft(file string) { + leftStr := tools.FileGetContent("html/" + file + ".html") + obj.Left = template.HTML(leftStr) +} +func (obj *CommonHtml) SetBottom(file string) { + str := tools.FileGetContent("html/" + file + ".html") + obj.Bottom = template.HTML(str) +} +func (obj *CommonHtml) Display(file string, data interface{}) { + if data == nil { + data = obj + } + main := tools.FileGetContent("html/" + file + ".html") + t, _ := template.New(file).Parse(main) + t.Execute(obj.Rw, data) +} + +// 首页 +func PageIndex(c *gin.Context) { + if c.Request.RequestURI == "/favicon.ico" { + return + } + if noExist, _ := tools.IsFileNotExist("./install.lock"); noExist { + c.Redirect(302, "/install") + } + c.HTML(http.StatusOK, "index.html", gin.H{}) +} + +// 登陆界面 +func PageMain(c *gin.Context) { + nav := tools.FileGetContent("html/nav.html") + c.HTML(http.StatusOK, "main.html", gin.H{ + "Nav": template.HTML(nav), + }) +} + +// 客服界面 +func PageChatMain(c *gin.Context) { + c.HTML(http.StatusOK, "chat_main.html", nil) +} + +// 安装界面 +func PageInstall(c *gin.Context) { + if noExist, _ := tools.IsFileNotExist("./install.lock"); !noExist { + c.Redirect(302, "/login") + } + c.HTML(http.StatusOK, "install.html", nil) +} + +// 面板界面 +func PagePannel(c *gin.Context) { + c.HTML(http.StatusOK, "pannel.html", nil) +} diff --git a/tmpl/detail.go b/tmpl/detail.go new file mode 100644 index 0000000..d99be27 --- /dev/null +++ b/tmpl/detail.go @@ -0,0 +1,37 @@ +package tmpl + +import ( + "ai-css/models" + "github.com/gin-gonic/gin" + "html" + "html/template" + "net/http" +) + +func PageDetail(c *gin.Context) { + if c.Request.RequestURI == "/favicon.ico" { + return + } + page := c.Param("page") + lang, _ := c.Get("lang") + about := models.FindAboutByPageLanguage(page, lang.(string)) + cssJs := html.UnescapeString(about.CssJs) + title := about.TitleCn + keywords := about.KeywordsCn + desc := html.UnescapeString(about.DescCn) + content := html.UnescapeString(about.HtmlCn) + if lang == "en" { + title = about.TitleEn + keywords = about.KeywordsEn + desc = html.UnescapeString(about.DescEn) + content = html.UnescapeString(about.HtmlEn) + } + c.HTML(http.StatusOK, "detail.html", gin.H{ + "Lang": lang, + "Title": title, + "Keywords": keywords, + "Desc": desc, + "Content": template.HTML(content), + "CssJs": template.HTML(cssJs), + }) +} diff --git a/tmpl/folder.go b/tmpl/folder.go new file mode 100644 index 0000000..d9fb677 --- /dev/null +++ b/tmpl/folder.go @@ -0,0 +1,16 @@ +package tmpl + +import "net/http" + +type FolderHtml struct { + *CommonHtml + CurrentPage int + Fid string +} + +func NewFolderHtml(w http.ResponseWriter) *FolderHtml { + obj := new(FolderHtml) + parent := NewRender(w) + obj.CommonHtml = parent + return obj +} diff --git a/tmpl/login.go b/tmpl/login.go new file mode 100644 index 0000000..41693b9 --- /dev/null +++ b/tmpl/login.go @@ -0,0 +1,20 @@ +package tmpl + +import ( + "ai-css/tools" + "github.com/gin-gonic/gin" + "net/http" +) + +// 登陆界面 +func PageLogin(c *gin.Context) { + if noExist, _ := tools.IsFileNotExist("./install.lock"); noExist { + c.Redirect(302, "/install") + } + c.HTML(http.StatusOK, "login.html", nil) +} + +// 绑定界面 +func PageBind(c *gin.Context) { + c.HTML(http.StatusOK, "bind.html", gin.H{}) +} diff --git a/tmpl/mail.go b/tmpl/mail.go new file mode 100644 index 0000000..0c63771 --- /dev/null +++ b/tmpl/mail.go @@ -0,0 +1,12 @@ +package tmpl + +import ( + "github.com/gin-gonic/gin" + "net/http" +) + +//邮箱列表界面 +func PageMailList(c *gin.Context) { + return + c.HTML(http.StatusOK, "list.html", gin.H{}) +} diff --git a/tmpl/setting.go b/tmpl/setting.go new file mode 100644 index 0000000..7e90acd --- /dev/null +++ b/tmpl/setting.go @@ -0,0 +1,105 @@ +package tmpl + +import ( + "github.com/gin-gonic/gin" + "net/http" +) + +//设置界面 +func PageSetting(c *gin.Context) { + c.HTML(http.StatusOK, "setting.html", gin.H{ + "tab_index": "1-1", + "action": "setting", + }) +} + +//设置欢迎 +func PageSettingWelcome(c *gin.Context) { + c.HTML(http.StatusOK, "setting_welcome.html", gin.H{ + "tab_index": "1-2", + "action": "setting_welcome", + }) +} + +//统计 +func PageSettingStatis(c *gin.Context) { + c.HTML(http.StatusOK, "setting_statistics.html", gin.H{ + "tab_index": "1-3", + "action": "setting_statistics", + }) +} + +//设置mysql +func PageSettingMysql(c *gin.Context) { + c.HTML(http.StatusOK, "setting_mysql.html", gin.H{ + "tab_index": "2-4", + "action": "setting_mysql", + }) +} + +//设置部署 +func PageSettingDeploy(c *gin.Context) { + c.HTML(http.StatusOK, "setting_deploy.html", gin.H{ + "tab_index": "2-5", + "action": "setting_deploy", + }) +} + +func PageKefuList(c *gin.Context) { + c.HTML(http.StatusOK, "setting_kefu_list.html", gin.H{ + "tab_index": "3-2", + "action": "setting_kefu_list", + }) +} +func PageAvator(c *gin.Context) { + c.HTML(http.StatusOK, "setting_avator.html", gin.H{ + "tab_index": "3-2", + "action": "setting_avator", + }) +} +func PageModifypass(c *gin.Context) { + c.HTML(http.StatusOK, "setting_modifypass.html", gin.H{ + "tab_index": "3-2", + "action": "setting_modifypass", + }) +} + +//角色列表 +func PageRoleList(c *gin.Context) { + c.HTML(http.StatusOK, "setting_role_list.html", gin.H{ + "tab_index": "3-1", + "action": "roles_list", + }) +} + +//角色列表 +func PageIpblack(c *gin.Context) { + c.HTML(http.StatusOK, "setting_ipblack.html", gin.H{ + "tab_index": "4-5", + "action": "setting_ipblack", + }) +} + +//配置项列表 +func PageConfig(c *gin.Context) { + c.HTML(http.StatusOK, "setting_config.html", gin.H{ + "tab_index": "4-6", + "action": "setting_config", + }) +} + +//配置项编辑首页 +func PageSettingIndexPage(c *gin.Context) { + c.HTML(http.StatusOK, "setting_pageindex.html", gin.H{ + "tab_index": "4-7", + "action": "setting_pageindex", + }) +} + +//配置项编辑首页 +func PageSettingIndexPages(c *gin.Context) { + c.HTML(http.StatusOK, "setting_indexpages.html", gin.H{ + "tab_index": "4-7", + "action": "setting_indexpages", + }) +} diff --git a/tools/binsearch.go b/tools/binsearch.go new file mode 100644 index 0000000..e847f32 --- /dev/null +++ b/tools/binsearch.go @@ -0,0 +1,84 @@ +package tools + +func BinarySearch(nums []int, target int) int { + left := 0 + right := len(nums) - 1 //注意 + + for left <= right { //注意 + mid := left + (right-left)/2 + if nums[mid] == target { + return mid + } else if nums[mid] < target { + left = mid + 1 //注意 + } else if nums[mid] > target { + right = mid - 1 //注意 + } + } + return -1 +} +func LeftBound(nums []int, target int) int { + if len(nums) == 0 { + return -1 + } + left := 0 + right := len(nums) //注意 + + for left < right { //注意 + mid := left + (right-left)/2 + if nums[mid] == target { + right = mid + } else if nums[mid] < target { + left = mid + 1 + } else if nums[mid] > target { + right = mid //注意 + } + } + if left == len(nums) || nums[left] != target { + return -1 + } + return left +} +func LeftBound2(nums []int, target int) int { + left := 0 + right := len(nums) - 1 //注意 + + for left <= right { //注意 + mid := left + (right-left)/2 + if nums[mid] == target { + //收缩右侧边界 + right = mid - 1 + } else if nums[mid] < target { + //搜索区间变为 [mid+1, right] + left = mid + 1 //注意 + } else if nums[mid] > target { + //搜索区间变为 [left, mid-1] + right = mid - 1 + } + } + if left >= len(nums) || nums[left] != target { + return -1 + } + return left +} +func RightBound(nums []int, target int) int { + left := 0 + right := len(nums) - 1 //注意 + + for left <= right { //注意 + mid := left + (right-left)/2 + if nums[mid] == target { + //收缩左侧边界 + left = mid + 1 + } else if nums[mid] < target { + //搜索区间变为 [mid+1, right] + left = mid + 1 //注意 + } else if nums[mid] > target { + //搜索区间变为 [left, mid-1] + right = mid - 1 + } + } + if right < 0 || nums[right] != target { + return -1 + } + return right +} diff --git a/tools/binsearch_test.go b/tools/binsearch_test.go new file mode 100644 index 0000000..1833ddd --- /dev/null +++ b/tools/binsearch_test.go @@ -0,0 +1,49 @@ +package tools + +import "testing" + +func TestBinarySearch(t *testing.T) { + myTest := struct { + Arg1 []int + Arg2 int + Want int + }{ + []int{1, 4, 7, 9, 10}, + 9, + 3, + } + res := BinarySearch(myTest.Arg1, myTest.Arg2) + if res != myTest.Want { + t.Errorf("BinarySearch(%d,%d) == %d, want %d", myTest.Arg1, myTest.Arg2, res, myTest.Want) + } +} +func TestLeftBound(t *testing.T) { + myTest := struct { + Arg1 []int + Arg2 int + Want int + }{ + []int{1, 4, 4, 4, 7, 9, 10}, + 4, + 1, + } + res := LeftBound(myTest.Arg1, myTest.Arg2) + if res != myTest.Want { + t.Errorf("LeftBound(%d,%d) == %d, want %d", myTest.Arg1, myTest.Arg2, res, myTest.Want) + } +} +func TestRightBound(t *testing.T) { + myTest := struct { + Arg1 []int + Arg2 int + Want int + }{ + []int{1, 4, 4, 4, 7, 9, 10}, + 4, + 3, + } + res := RightBound(myTest.Arg1, myTest.Arg2) + if res != myTest.Want { + t.Errorf("RightBound(%d,%d) == %d, want %d", myTest.Arg1, myTest.Arg2, res, myTest.Want) + } +} diff --git a/tools/cookie.go b/tools/cookie.go new file mode 100644 index 0000000..e146210 --- /dev/null +++ b/tools/cookie.go @@ -0,0 +1,36 @@ +package tools + +import ( + "net/http" + "strings" +) + +func SetCookie(name string, value string, w *http.ResponseWriter) { + cookie := http.Cookie{ + Name: name, + Value: value, + } + http.SetCookie(*w, &cookie) +} +func GetCookie(r *http.Request, name string) string { + cookies := r.Cookies() + for _, cookie := range cookies { + if cookie.Name == name { + return cookie.Value + } + } + return "" +} +func GetMailServerFromCookie(r *http.Request) *MailServer { + auth := GetCookie(r, "auth") + if !strings.Contains(auth, "|") { + return nil + } + authStrings := strings.Split(auth, "|") + mailServer := &MailServer{ + Server: authStrings[0], + Email: authStrings[1], + Password: authStrings[2], + } + return mailServer +} diff --git a/tools/file.go b/tools/file.go new file mode 100644 index 0000000..e33aaca --- /dev/null +++ b/tools/file.go @@ -0,0 +1,29 @@ +package tools + +import "os" + +//判断文件文件夹是否存在(字节0也算不存在) +func IsFileExist(path string) (bool, error) { + fileInfo, err := os.Stat(path) + + if os.IsNotExist(err) { + return false, nil + } + //我这里判断了如果是0也算不存在 + if fileInfo.Size() == 0 { + return false, nil + } + if err == nil { + return true, nil + } + return false, err +} + +//判断文件文件夹不存在 +func IsFileNotExist(path string) (bool, error) { + _, err := os.Stat(path) + if os.IsNotExist(err) { + return true, nil + } + return false, err +} diff --git a/tools/hash.go b/tools/hash.go new file mode 100644 index 0000000..c6754f6 --- /dev/null +++ b/tools/hash.go @@ -0,0 +1,41 @@ +package tools + +import ( + "crypto/md5" + "crypto/sha256" + "encoding/base64" + "encoding/hex" + "strings" +) + +//md5加密 +func Md5(src string) string { + m := md5.New() + m.Write([]byte(src)) + res := hex.EncodeToString(m.Sum(nil)) + return res +} + +//Sha256加密 +func Sha256(src string) string { + m := sha256.New() + m.Write([]byte(src)) + res := hex.EncodeToString(m.Sum(nil)) + return res +} +func Base64Decode(str string) string { + reader := strings.NewReader(str) + decoder := base64.NewDecoder(base64.RawStdEncoding, reader) + // 以流式解码 + buf := make([]byte, 1024) + // 保存解码后的数据 + dst := "" + for { + n, err := decoder.Read(buf) + dst += string(buf[:n]) + if n == 0 || err != nil { + break + } + } + return dst +} diff --git a/tools/http.go b/tools/http.go new file mode 100644 index 0000000..587db87 --- /dev/null +++ b/tools/http.go @@ -0,0 +1,75 @@ +package tools + +import ( + "io/ioutil" + "net/http" + "net/url" + "regexp" + "strings" +) + +func Get(url string) string { + res, err := http.Get(url) + if err != nil { + return "" + } + robots, err := ioutil.ReadAll(res.Body) + res.Body.Close() + if err != nil { + return "" + } + return string(robots) +} + +//Post("http://xxxx","application/json;charset=utf-8",[]byte("{'aaa':'bbb'}")) +func Post(url string, contentType string, body []byte) (string, error) { + res, err := http.Post(url, contentType, strings.NewReader(string(body))) + if err != nil { + return "", err + } + defer res.Body.Close() + content, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", err + } + return string(content), nil +} +func PostHeader(url string, msg []byte, headers map[string]string) (string, error) { + client := &http.Client{} + + req, err := http.NewRequest("POST", url, strings.NewReader(string(msg))) + if err != nil { + return "", err + } + for key, header := range headers { + req.Header.Set(key, header) + } + resp, err := client.Do(req) + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + return string(body), nil +} +func IsMobile(userAgent string) bool { + mobileRe, _ := regexp.Compile("(?i:Mobile|iPod|iPhone|Android|Opera Mini|BlackBerry|webOS|UCWEB|Blazer|PSP)") + str := mobileRe.FindString(userAgent) + if str != "" { + return true + } + return false +} +//发送http post请求数据为form +func PostForm(url string, data url.Values) (string, error) { + resp, err := http.PostForm(url, data) + if err != nil { + return "", err + } + defer resp.Body.Close() + content, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + return string(content), nil +} \ No newline at end of file diff --git a/tools/http_tool.go b/tools/http_tool.go new file mode 100644 index 0000000..e2c2ba7 --- /dev/null +++ b/tools/http_tool.go @@ -0,0 +1,198 @@ +package tools + +import ( + "bytes" + "context" + "encoding/json" + "encoding/xml" + "fmt" + "io" + "io/ioutil" + "mime/multipart" + "net/http" + "os" +) + +// HTTPGet get 请求 +func HTTPGet(uri string) ([]byte, error) { + return HTTPGetContext(context.Background(), uri) +} + +// HTTPGetContext get 请求 +func HTTPGetContext(ctx context.Context, uri string) ([]byte, error) { + request, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) + if err != nil { + return nil, err + } + response, err := http.DefaultClient.Do(request) + if err != nil { + return nil, err + } + + defer response.Body.Close() + if response.StatusCode != http.StatusOK { + return nil, fmt.Errorf("http get error : uri=%v , statusCode=%v", uri, response.StatusCode) + } + return ioutil.ReadAll(response.Body) +} + +// HTTPPost post 请求 +func HTTPPost(uri string, data string) ([]byte, error) { + return HTTPPostContext(context.Background(), uri, data) +} + +// HTTPPostContext post 请求 +func HTTPPostContext(ctx context.Context, uri string, data string) ([]byte, error) { + body := bytes.NewBuffer([]byte(data)) + request, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, body) + if err != nil { + return nil, err + } + response, err := http.DefaultClient.Do(request) + if err != nil { + return nil, err + } + + defer response.Body.Close() + if response.StatusCode != http.StatusOK { + return nil, fmt.Errorf("http get error : uri=%v , statusCode=%v", uri, response.StatusCode) + } + return ioutil.ReadAll(response.Body) +} + +// PostJSON post json 数据请求 +func PostJSON(uri string, obj interface{}) ([]byte, error) { + jsonBuf := new(bytes.Buffer) + enc := json.NewEncoder(jsonBuf) + enc.SetEscapeHTML(false) + err := enc.Encode(obj) + if err != nil { + return nil, err + } + response, err := http.Post(uri, "application/json;charset=utf-8", jsonBuf) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != http.StatusOK { + return nil, fmt.Errorf("http get error : uri=%v , statusCode=%v", uri, response.StatusCode) + } + return ioutil.ReadAll(response.Body) +} + +// PostJSONWithRespContentType post json数据请求,且返回数据类型 +func PostJSONWithRespContentType(uri string, obj interface{}) ([]byte, string, error) { + jsonBuf := new(bytes.Buffer) + enc := json.NewEncoder(jsonBuf) + enc.SetEscapeHTML(false) + err := enc.Encode(obj) + if err != nil { + return nil, "", err + } + + response, err := http.Post(uri, "application/json;charset=utf-8", jsonBuf) + if err != nil { + return nil, "", err + } + defer response.Body.Close() + + if response.StatusCode != http.StatusOK { + return nil, "", fmt.Errorf("http get error : uri=%v , statusCode=%v", uri, response.StatusCode) + } + responseData, err := ioutil.ReadAll(response.Body) + contentType := response.Header.Get("Content-Type") + return responseData, contentType, err +} + +// PostFile 上传文件 +func PostFile(fieldname, filename, uri string) ([]byte, error) { + fields := []MultipartFormField{ + { + IsFile: true, + Fieldname: fieldname, + Filename: filename, + }, + } + return PostMultipartForm(fields, uri) +} + +// MultipartFormField 保存文件或其他字段信息 +type MultipartFormField struct { + IsFile bool + Fieldname string + Value []byte + Filename string +} + +// PostMultipartForm 上传文件或其他多个字段 +func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte, err error) { + bodyBuf := &bytes.Buffer{} + bodyWriter := multipart.NewWriter(bodyBuf) + + for _, field := range fields { + if field.IsFile { + fileWriter, e := bodyWriter.CreateFormFile(field.Fieldname, field.Filename) + if e != nil { + err = fmt.Errorf("error writing to buffer , err=%v", e) + return + } + + fh, e := os.Open(field.Filename) + if e != nil { + err = fmt.Errorf("error opening file , err=%v", e) + return + } + defer fh.Close() + + if _, err = io.Copy(fileWriter, fh); err != nil { + return + } + } else { + partWriter, e := bodyWriter.CreateFormField(field.Fieldname) + if e != nil { + err = e + return + } + valueReader := bytes.NewReader(field.Value) + if _, err = io.Copy(partWriter, valueReader); err != nil { + return + } + } + } + + contentType := bodyWriter.FormDataContentType() + bodyWriter.Close() + + resp, e := http.Post(uri, contentType, bodyBuf) + if e != nil { + err = e + return + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, err + } + respBody, err = ioutil.ReadAll(resp.Body) + return +} + +// PostXML perform a HTTP/POST request with XML body +func PostXML(uri string, obj interface{}) ([]byte, error) { + xmlData, err := xml.Marshal(obj) + if err != nil { + return nil, err + } + + body := bytes.NewBuffer(xmlData) + response, err := http.Post(uri, "application/xml;charset=utf-8", body) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != http.StatusOK { + return nil, fmt.Errorf("http code error : uri=%v , statusCode=%v", uri, response.StatusCode) + } + return ioutil.ReadAll(response.Body) +} diff --git a/tools/import_sql.go b/tools/import_sql.go new file mode 100644 index 0000000..b5f3fcd --- /dev/null +++ b/tools/import_sql.go @@ -0,0 +1,56 @@ +package tools + +import ( + "fmt" + _ "github.com/go-sql-driver/mysql" + "github.com/jinzhu/gorm" + "io/ioutil" + "log" + "os" + "strings" + "time" +) + +type ImportSqlTool struct { + SqlPath string + Username, Password, Server, Port, Database string +} + +func (this *ImportSqlTool) ImportSql() error { + _, err := os.Stat(this.SqlPath) + if os.IsNotExist(err) { + log.Println("数据库SQL文件不存在:", err) + return err + } + + dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", this.Username, this.Password, this.Server, this.Port, this.Database) + db, err := gorm.Open("mysql", dsn) + if err != nil { + log.Println("数据库连接失败:", err) + //panic("数据库连接失败!") + return err + } + db.SingularTable(true) + db.LogMode(true) + db.DB().SetMaxIdleConns(10) + db.DB().SetMaxOpenConns(100) + db.DB().SetConnMaxLifetime(59 * time.Second) + + sqls, _ := ioutil.ReadFile(this.SqlPath) + sqlArr := strings.Split(string(sqls), ";") + for _, sql := range sqlArr { + sql = strings.TrimSpace(sql) + if sql == "" { + continue + } + err := db.Exec(sql).Error + if err != nil { + log.Println("数据库导入失败:" + err.Error()) + return err + } else { + log.Println(sql, "\t success!") + } + } + return nil +} + diff --git a/tools/import_sql_test.go b/tools/import_sql_test.go new file mode 100644 index 0000000..8cb9fed --- /dev/null +++ b/tools/import_sql_test.go @@ -0,0 +1,15 @@ +package tools + +import "testing" + +func TestImportSql(t *testing.T) { + tool:=&ImportSqlTool{ + SqlPath: "../import.sql", + Username: "go-fly", + Password: "go-fly", + Server: "127.0.0.1", + Port: "3306", + Database: "go-fly", + } + tool.ImportSql() +} \ No newline at end of file diff --git a/tools/ip.go b/tools/ip.go new file mode 100644 index 0000000..5c79724 --- /dev/null +++ b/tools/ip.go @@ -0,0 +1,77 @@ +package tools + +import ( + "errors" + "github.com/ipipdotnet/ipdb-go" + "net" +) + +func ParseIp(myip string) *ipdb.CityInfo { + db, err := ipdb.NewCity("./config/city.free.ipdb") + if err != nil { + return nil + } + db.Reload("./config/city.free.ipdb") + c, err := db.FindInfo(myip, "CN") + if err != nil { + return nil + } + return c +} +func GetServerIP() (net.IP, error) { + ifaces, err := net.Interfaces() + if err != nil { + return nil, err + } + for _, iface := range ifaces { + if iface.Flags&net.FlagUp == 0 { + continue // interface down + } + if iface.Flags&net.FlagLoopback != 0 { + continue // loopback interface + } + addrs, err := iface.Addrs() + if err != nil { + return nil, err + } + for _, addr := range addrs { + ip := getIpFromAddr(addr) + if ip == nil { + continue + } + return ip, nil + } + } + return nil, errors.New("connected to the network?") +} +func getIpFromAddr(addr net.Addr) net.IP { + var ip net.IP + switch v := addr.(type) { + case *net.IPNet: + ip = v.IP + case *net.IPAddr: + ip = v.IP + } + if ip == nil || ip.IsLoopback() { + return nil + } + ip = ip.To4() + if ip == nil { + return nil // not an ipv4 address + } + + return ip +} + +//获取出站IP地址 +func GetOutboundIP() (net.IP, error) { + conn, err := net.Dial("udp", "8.8.8.8:80") + if err != nil { + return nil, err + } + defer conn.Close() + + localAddr := conn.LocalAddr().(*net.UDPAddr) + + return localAddr.IP, nil +} diff --git a/tools/ip_test.go b/tools/ip_test.go new file mode 100644 index 0000000..fe1e824 --- /dev/null +++ b/tools/ip_test.go @@ -0,0 +1,11 @@ +package tools + +import ( + "log" + "testing" +) + +func TestGetOutboundIP(t *testing.T) { + ip, err := GetOutboundIP() + log.Println(ip, err) +} diff --git a/tools/jwt.go b/tools/jwt.go new file mode 100644 index 0000000..e512be4 --- /dev/null +++ b/tools/jwt.go @@ -0,0 +1,23 @@ +package tools + +import ( + "github.com/golang-jwt/jwt" +) + +const SECRET = "golivechat" + +func MakeToken(obj map[string]interface{}) (string, error) { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims(obj)) + tokenString, err := token.SignedString([]byte(SECRET)) + return tokenString, err +} +func ParseToken(tokenStr string) map[string]interface{} { + token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (i interface{}, e error) { + return []byte(SECRET), nil + }) + if err != nil { + return nil + } + finToken := token.Claims.(jwt.MapClaims) + return finToken +} diff --git a/tools/limits.go b/tools/limits.go new file mode 100644 index 0000000..c6676e9 --- /dev/null +++ b/tools/limits.go @@ -0,0 +1,77 @@ +package tools + +import ( + "log" + "sync" + "time" +) + +type LimitQueeMap struct { + sync.RWMutex + LimitQueue map[string][]int64 +} + +func (l *LimitQueeMap) readMap(key string) ([]int64, bool) { + l.RLock() + value, ok := l.LimitQueue[key] + l.RUnlock() + return value, ok +} + +func (l *LimitQueeMap) writeMap(key string, value []int64) { + l.Lock() + l.LimitQueue[key] = value + l.Unlock() +} + +var LimitQueue = &LimitQueeMap{ + LimitQueue: make(map[string][]int64), +} +var ok bool + +func NewLimitQueue() { + cleanLimitQueue() +} +func cleanLimitQueue() { + go func() { + for { + log.Println("cleanLimitQueue start...") + LimitQueue.LimitQueue = nil + now := time.Now() + // 计算下一个零点 + next := now.Add(time.Hour * 24) + next = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, next.Location()) + t := time.NewTimer(next.Sub(now)) + <-t.C + } + }() +} + +//单机时间滑动窗口限流法 +func LimitFreqSingle(queueName string, count uint, timeWindow int64) bool { + currTime := time.Now().Unix() + if LimitQueue.LimitQueue == nil { + LimitQueue.LimitQueue = make(map[string][]int64) + } + if _, ok = LimitQueue.readMap(queueName); !ok { + LimitQueue.writeMap(queueName, make([]int64, 0)) + return true + } + q, _ := LimitQueue.readMap(queueName) + //队列未满 + if uint(len(q)) < count { + LimitQueue.writeMap(queueName, append(q, currTime)) + return true + } + //队列满了,取出最早访问的时间 + earlyTime := q[0] + //说明最早期的时间还在时间窗口内,还没过期,所以不允许通过 + if currTime-earlyTime <= timeWindow { + return false + } else { + //说明最早期的访问应该过期了,去掉最早期的 + q = q[1:] + LimitQueue.writeMap(queueName, append(q, currTime)) + } + return true +} diff --git a/tools/logger.go b/tools/logger.go new file mode 100644 index 0000000..44d8a45 --- /dev/null +++ b/tools/logger.go @@ -0,0 +1,102 @@ +package tools + +import ( + "github.com/sirupsen/logrus" + "log" + "os" + "path" + "time" +) + +var logrusObj *logrus.Logger + +func Logger() *logrus.Logger { + if logrusObj != nil { + src, _ := setOutputFile() + //设置输出 + logrusObj.Out = src + return logrusObj + } + + //实例化 + logger := logrus.New() + src, _ := setOutputFile() + //设置输出 + logger.Out = src + //设置日志级别 + logger.SetLevel(logrus.DebugLevel) + //设置日志格式 + logger.SetFormatter(&logrus.TextFormatter{ + TimestampFormat: "2006-01-02 15:04:05", + }) + logrusObj = logger + return logger +} +func setOutputFile() (*os.File, error) { + now := time.Now() + logFilePath := "" + if dir, err := os.Getwd(); err == nil { + logFilePath = dir + "/logs/" + } + _, err := os.Stat(logFilePath) + if os.IsNotExist(err) { + if err := os.MkdirAll(logFilePath, 0777); err != nil { + log.Println(err.Error()) + return nil, err + } + } + logFileName := now.Format("2006-01-02") + ".log" + //日志文件 + fileName := path.Join(logFilePath, logFileName) + if _, err := os.Stat(fileName); err != nil { + if _, err := os.Create(fileName); err != nil { + log.Println(err.Error()) + return nil, err + } + } + //写入文件 + src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend) + if err != nil { + log.Println(err) + return nil, err + } + return src, nil +} + +//func LoggerToFile() gin.HandlerFunc { +// logger := Logger() +// return func(c *gin.Context) { +// // 开始时间 +// startTime := time.Now() +// +// // 处理请求 +// c.Next() +// +// // 结束时间 +// endTime := time.Now() +// +// // 执行时间 +// latencyTime := endTime.Sub(startTime) +// +// // 请求方式 +// reqMethod := c.Request.Method +// +// // 请求路由 +// reqUri := c.Request.RequestURI +// +// // 状态码 +// statusCode := c.Writer.Status() +// +// // 请求IP +// clientIP := c.ClientIP() +// +// //日志格式 +// logger.Infof("| %3d | %13v | %15s | %s | %s |", +// statusCode, +// latencyTime, +// clientIP, +// reqMethod, +// reqUri, +// ) +// } +//} diff --git a/tools/mytest.go b/tools/mytest.go new file mode 100644 index 0000000..bd3bba9 --- /dev/null +++ b/tools/mytest.go @@ -0,0 +1,52 @@ +package tools + +import "fmt" + +func MyTest() { + type MConn struct { + Name string + } + var conn *MConn + var conn2 MConn + conn3 := new(MConn) + conn4 := &MConn{} + fmt.Printf("%v,%v,%v,%v \r\n", conn, conn2, conn3, conn4) + + var mMap map[string][]*MConn + m1, _ := mMap["name"] + //if ok { + // m1.Name = "qqq" + //} + fmt.Printf("ssss%T", m1) +} +func MyStruct() { + type s2 struct { + name string + } + aa := s2{ + name: "aa", + } + bb := s2{ + name: "aa", + } + fmt.Printf("%v\n", aa == bb) + + type s1 struct { + one map[string]string + two []string + three string + } + + a := &s1{ + one: map[string]string{"aaa": "bbb"}, + two: []string{"aaa", "bbb"}, + three: "aaaa", + } + b := &s1{ + one: map[string]string{"aaa": "bbb"}, + two: []string{"aaa", "bbb"}, + three: "aaaa", + } + c := a + fmt.Printf("%v;%v", a == b, a == c) +} diff --git a/tools/mytest_test.go b/tools/mytest_test.go new file mode 100644 index 0000000..8bdfa4f --- /dev/null +++ b/tools/mytest_test.go @@ -0,0 +1,49 @@ +package tools + +import ( + "sync" + "testing" +) + +func TestMyTest(t *testing.T) { + MyTest() +} +func TestMyStruct(t *testing.T) { + MyStruct() +} + +type SMap struct { + sync.RWMutex + Map map[int]int +} + +func (l *SMap) readMap(key int) (int, bool) { + l.RLock() + value, ok := l.Map[key] + l.RUnlock() + return value, ok +} + +func (l *SMap) writeMap(key int, value int) { + l.Lock() + l.Map[key] = value + l.Unlock() +} + +var mMap *SMap + +func TestMyMap(t *testing.T) { + mMap = &SMap{ + Map: make(map[int]int), + } + + for i := 0; i < 10000; i++ { + go func() { + mMap.writeMap(i, i) + }() + go readMap(i) + } +} +func readMap(i int) (int, bool) { + return mMap.readMap(i) +} diff --git a/tools/paniclog_linux.go b/tools/paniclog_linux.go new file mode 100644 index 0000000..fa53a81 --- /dev/null +++ b/tools/paniclog_linux.go @@ -0,0 +1,19 @@ +// Log the panic under unix to the log file + +//+build linux + +package tools + +import ( + "log" + "os" + "syscall" +) + +// redirectStderr to the file passed in +func RedirectStderr(f *os.File) { + err := syscall.Dup2(int(f.Fd()), int(os.Stderr.Fd())) + if err != nil { + log.Printf("Failed to redirect stderr to file: %v", err) + } +} diff --git a/tools/paniclog_windows.go b/tools/paniclog_windows.go new file mode 100644 index 0000000..25a862b --- /dev/null +++ b/tools/paniclog_windows.go @@ -0,0 +1,41 @@ +// Log the panic under windows to the log file +// +// Code from minix, via +// +// http://play.golang.org/p/kLtct7lSUg + +//+build windows + +package tools + +import ( + "log" + "os" + "syscall" +) + +var ( + kernel32 = syscall.MustLoadDLL("kernel32.dll") + procSetStdHandle = kernel32.MustFindProc("SetStdHandle") +) + +func setStdHandle(stdhandle int32, handle syscall.Handle) error { + r0, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0) + if r0 == 0 { + if e1 != 0 { + return error(e1) + } + return syscall.EINVAL + } + return nil +} + +// redirectStderr to the file passed in +func RedirectStderr(f *os.File) { + err := setStdHandle(syscall.STD_ERROR_HANDLE, syscall.Handle(f.Fd())) + if err != nil { + log.Printf("Failed to redirect stderr to file: %v", err) + } + // SetStdHandle does not affect prior references to stderr + os.Stderr = f +} diff --git a/tools/reverse_test.go b/tools/reverse_test.go new file mode 100644 index 0000000..1d2703e --- /dev/null +++ b/tools/reverse_test.go @@ -0,0 +1,19 @@ +package tools + +import "testing" + +func TestReverse(t *testing.T) { + cases := []struct { + in, want string + }{ + {"Hello, world", "dlrow ,olleH"}, + {"Hello, 世界", "界世 ,olleH"}, + {"", ""}, + } + for _, c := range cases { + got := Reverse(c.in) + if got != c.want { + t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want) + } + } +} diff --git a/tools/rpc_test.go b/tools/rpc_test.go new file mode 100644 index 0000000..5f4b9fd --- /dev/null +++ b/tools/rpc_test.go @@ -0,0 +1,13 @@ +package tools + +import ( + "go-fly-muti/frpc" + "testing" +) + +func TestClientRpc(t *testing.T) { + frpc.ClientRpc() +} +func TestServerRpc(t *testing.T) { + frpc.NewRpcServer("127.0.0.1:8082") +} diff --git a/tools/session.go b/tools/session.go new file mode 100644 index 0000000..8d315c0 --- /dev/null +++ b/tools/session.go @@ -0,0 +1,24 @@ +package tools + +import ( + "github.com/gin-contrib/sessions" + "github.com/gin-contrib/sessions/cookie" + "github.com/gin-gonic/gin" +) + +// 中间件,处理session +func Session(keyPairs string) gin.HandlerFunc { + store := SessionConfig() + return sessions.Sessions(keyPairs, store) +} +func SessionConfig() sessions.Store { + sessionMaxAge := 3600 + sessionSecret := "gofly" + var store sessions.Store + store = cookie.NewStore([]byte(sessionSecret)) + store.Options(sessions.Options{ + MaxAge: sessionMaxAge, //seconds + Path: "/", + }) + return store +} diff --git a/tools/singlelist.go b/tools/singlelist.go new file mode 100644 index 0000000..3c28efa --- /dev/null +++ b/tools/singlelist.go @@ -0,0 +1,91 @@ +package tools + +// 单链表节点的结构 +type ListNode struct { + val int + next *ListNode +} + +func NewListNode(x int) *ListNode { + return &ListNode{ + val: x, + } +} +func ReverseList(head *ListNode) *ListNode { + if head.next == nil { + return head + } + last := ReverseList(head.next) + head.next.next = head + head.next = nil + return last +} + +var successor *ListNode // 后驱节点 +// 将链表的前 n 个节点反转(n <= 链表长度) +func ReverseListN(head *ListNode, n int) *ListNode { + if n == 1 { + // 记录第 n + 1 个节点 + successor = head.next + return head + } + // 以 head.next 为起点,需要反转前 n - 1 个节点 + last := ReverseListN(head.next, n-1) + head.next.next = head + // 让反转之后的 head 节点和后面的节点连起来 + head.next = successor + return last +} + +func ReverseBetween(head *ListNode, m int, n int) *ListNode { + if m == 1 { + return ReverseListN(head, m) + } + // 前进到反转的起点触发 base case + head.next = ReverseBetween(head.next, m-1, n-1) + return head +} + +/** 反转区间 [a, b) 的元素,注意是左闭右开 */ +func ReverseSingleList(a *ListNode, b *ListNode) *ListNode { + var ( + pre, cur, nxt *ListNode + ) + pre = nil + cur = a + nxt = a + //终止的条件改一下就行了 + for cur != b { + nxt = cur.next + // 逐个结点反转 + cur.next = pre + // 更新指针位置 + pre = cur + cur = nxt + } + // 返回反转后的头结点 + return pre +} +func ReverseKGroup(head *ListNode, k int) *ListNode { + if head == nil { + return nil + } + // 区间 [a, b) 包含 k 个待反转元素 + var ( + a, b *ListNode + ) + b = head + a = head + for i := 0; i < k; i++ { + // 不足 k 个,不需要反转,base case + if b == nil { + return head + } + b = b.next + } + // 反转前 k 个元素 + newHead := ReverseSingleList(a, b) + // 递归反转后续链表并连接起来 + a.next = ReverseKGroup(b, k) + return newHead +} diff --git a/tools/smtp.go b/tools/smtp.go new file mode 100644 index 0000000..2fabcfe --- /dev/null +++ b/tools/smtp.go @@ -0,0 +1,25 @@ +package tools + +import ( + "encoding/base64" + "github.com/emersion/go-sasl" + "github.com/emersion/go-smtp" + "strings" +) + +func SendSmtp(server string, from string, password string, to []string, subject string, body string) error { + auth := sasl.NewPlainClient("", from, password) + subjectBase := base64.StdEncoding.EncodeToString([]byte(subject)) + msg := strings.NewReader( + "From: " + from + "\r\n" + + "To: " + strings.Join(to, ",") + "\r\n" + + "Subject: =?UTF-8?B?" + subjectBase + "?=\r\n" + + "Content-Type: text/html; charset=UTF-8" + + "\r\n\r\n" + + body + "\r\n") + err := smtp.SendMail(server, auth, from, to, msg) + if err != nil { + return err + } + return nil +} diff --git a/tools/smtp_test.go b/tools/smtp_test.go new file mode 100644 index 0000000..ae5b99a --- /dev/null +++ b/tools/smtp_test.go @@ -0,0 +1,8 @@ +package tools + +import "testing" + +func TestSendSmtp(t *testing.T) { + body := "hello" + SendSmtp("smtp.sina.cn:25", "taoshihan1@sina.com", "382e8a5e11cfae8c", []string{"taoshihan1@sina.com"}, "123456", body) +} diff --git a/tools/snowflake.go b/tools/snowflake.go new file mode 100644 index 0000000..99c7422 --- /dev/null +++ b/tools/snowflake.go @@ -0,0 +1,81 @@ +package tools + +import ( + "errors" + "sync" + "time" +) + +/* +* Snowflake +* +* 1 42 52 64 +* +-----------------------------------------------+------------+---------------+ +* | timestamp(ms) | workerid | sequence | +* +-----------------------------------------------+------------+---------------+ +* | 0000000000 0000000000 0000000000 0000000000 0 | 0000000000 | 0000000000 00 | +* +-----------------------------------------------+------------+---------------+ +* +* 1. 41位时间截(毫秒级),注意这是时间截的差值(当前时间截 - 开始时间截)。可以使用约70年: (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69 +* 2. 10位数据机器位,可以部署在1024个节点 +* 3. 12位序列,毫秒内的计数,同一机器,同一时间截并发4096个序号 + */ + +const ( + twepoch = int64(1483228800000) //开始时间截 (2017-01-01) + workeridBits = uint(10) //机器id所占的位数 + sequenceBits = uint(12) //序列所占的位数 + workeridMax = int64(-1 ^ (-1 << workeridBits)) //支持的最大机器id数量 + sequenceMask = int64(-1 ^ (-1 << sequenceBits)) // + workeridShift = sequenceBits //机器id左移位数 + timestampShift = sequenceBits + workeridBits //时间戳左移位数 +) + +// A Snowflake struct holds the basic information needed for a snowflake generator worker +type Snowflake struct { + sync.Mutex + timestamp int64 + workerid int64 + sequence int64 +} + +// NewNode returns a new snowflake worker that can be used to generate snowflake IDs +func NewSnowflake(workerid int64) (*Snowflake, error) { + + if workerid < 0 || workerid > workeridMax { + return nil, errors.New("workerid must be between 0 and 1023") + } + + return &Snowflake{ + timestamp: 0, + workerid: workerid, + sequence: 0, + }, nil +} + +// Generate creates and returns a unique snowflake ID +func (s *Snowflake) Generate() int64 { + + s.Lock() + + now := time.Now().UnixNano() / 1000000 + + if s.timestamp == now { + s.sequence = (s.sequence + 1) & sequenceMask + + if s.sequence == 0 { + for now <= s.timestamp { + now = time.Now().UnixNano() / 1000000 + } + } + } else { + s.sequence = 0 + } + + s.timestamp = now + + r := int64((now-twepoch)<= right { + return + } + privot := partition(arr, left, right) + QuickSort(arr, left, privot-1) + QuickSort(arr, privot+1, right) +} + +//快速排序2 +//找到一个基准,左边是所有比它小的,右边是比它大的,分别递归左右 +func QuickSort2(arr *[]int, left int, right int) { + if left >= right { + return + } + privot := (*arr)[left] + i := left + j := right + for i < j { + for i < j && (*arr)[j] > privot { + j-- + } + for i < j && (*arr)[i] <= privot { + i++ + } + temp := (*arr)[i] + (*arr)[i] = (*arr)[j] + (*arr)[j] = temp + } + (*arr)[left] = (*arr)[i] + (*arr)[i] = privot + + QuickSort(arr, left, i-1) + QuickSort(arr, i+1, right) +} + +//冒泡排序 +//比较相邻元素,较大的往右移 +func BubbleSort(arr *[]int) { + flag := true + lastSwapIndex := 0 + for i := 0; i < len(*arr)-1; i++ { + sortBorder := len(*arr) - 1 - i + for j := 0; j < sortBorder; j++ { + if (*arr)[j] > (*arr)[j+1] { + temp := (*arr)[j] + (*arr)[j] = (*arr)[j+1] + (*arr)[j+1] = temp + flag = false + lastSwapIndex = j + } + } + sortBorder = lastSwapIndex + if flag { + break + } + } +} + +//插入排序 +//将未排序部分插入到已排序部分的适当位置 +func InsertionSort(arr *[]int) { + for i := 1; i < len(*arr); i++ { + curKey := (*arr)[i] + j := i - 1 + for curKey < (*arr)[j] { + (*arr)[j+1] = (*arr)[j] + j-- + if j < 0 { + break + } + } + (*arr)[j+1] = curKey + } +} + +//选择排序 +//选择一个最小值,再寻找比它还小的进行交换 +func SelectionSort(arr *[]int) { + for i := 0; i < len(*arr); i++ { + minIndex := i + for j := i + 1; j < len(*arr); j++ { + if (*arr)[j] < (*arr)[minIndex] { + minIndex = j + } + } + temp := (*arr)[i] + (*arr)[i] = (*arr)[minIndex] + (*arr)[minIndex] = temp + } +} + +//归并排序 +//合久必分,分久必合,利用临时数组合并两个有序数组 +func MergeSort(arr *[]int, left int, right int) { + if left >= right { + return + } + + mid := (left + right) / 2 + MergeSort(arr, left, mid) + MergeSort(arr, mid+1, right) + + i := left + j := mid + 1 + p := 0 + temp := make([]int, right-left+1) + for i <= mid && j <= right { + if (*arr)[i] <= (*arr)[j] { + temp[p] = (*arr)[i] + i++ + } else { + temp[p] = (*arr)[j] + j++ + } + p++ + } + + for i <= mid { + temp[p] = (*arr)[i] + i++ + p++ + } + for j <= right { + temp[p] = (*arr)[j] + j++ + p++ + } + for i = 0; i < len(temp); i++ { + (*arr)[left+i] = temp[i] + } +} diff --git a/tools/sorts_test.go b/tools/sorts_test.go new file mode 100644 index 0000000..4e34f46 --- /dev/null +++ b/tools/sorts_test.go @@ -0,0 +1,45 @@ +package tools + +import ( + "testing" +) + +func TestQuickSort(t *testing.T) { + arr := []int{6, 8, 3, 9, 4, 5, 4, 7} + t.Log(arr) + QuickSort(&arr, 0, len(arr)-1) + t.Log(arr) +} +func TestQuickSort2(t *testing.T) { + arr := []int{6, 8, 3, 9, 4, 5, 4, 7} + t.Log(arr) + QuickSort2(&arr, 0, len(arr)-1) + t.Log(arr) +} +func TestBubbleSort(t *testing.T) { + arr := []int{6, 8, 3, 9, 4, 5, 4, 7} + t.Log(arr) + BubbleSort(&arr) + t.Log(arr) +} +func TestInsertionSort(t *testing.T) { + arr := []int{6, 8, 3, 9, 4, 5, 4, 7} + t.Log(arr) + InsertionSort(&arr) + t.Log(arr) +} +func TestSelectionSort(t *testing.T) { + arr := []int{6, 8, 3, 9, 4, 5, 4, 7} + t.Log(arr) + SelectionSort(&arr) + t.Log(arr) +} +func TestMergeSort(t *testing.T) { + arr := []int{6, 8, 3, 9, 4, 5, 4, 7} + t.Log(arr) + MergeSort(&arr, 0, len(arr)-1) + t.Log(arr) +} +func TestNilChannel(t *testing.T) { + NilChannel() +} diff --git a/tools/stringutil.go b/tools/stringutil.go new file mode 100644 index 0000000..395b72e --- /dev/null +++ b/tools/stringutil.go @@ -0,0 +1,63 @@ +// stringutil 包含有用于处理字符串的工具函数。 +package tools + +import ( + "fmt" + "github.com/gobuffalo/packr/v2" + "net/http" +) + +//获取URL的GET参数 +func GetUrlArg(r *http.Request, name string) string { + var arg string + values := r.URL.Query() + arg = values.Get(name) + return arg +} + +// Reverse 将其实参字符串以符文为单位左右反转。 +func Reverse(s string) string { + r := []rune(s) + for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { + r[i], r[j] = r[j], r[i] + } + return string(r) +} + +// Reverse2 将其实参字符串以符文为单位左右反转。 +func Reverse2(s string) string { + r := []rune(s) + left := 0 + right := len(r) - 1 + for left < right { + r[left], r[right] = r[right], r[left] + left++ + right-- + } + return string(r) +} + +//获取文件内容,可以打包到二进制 +func FileGetContent(file string) string { + str := "" + box := packr.New("tmpl", "../static") + content, err := box.FindString(file) + if err != nil { + return str + } + return content +} + +func ShowStringByte(str string) { + s := []byte(str) + for i, c := range s { + fmt.Println(i, c) + } +} +func NilChannel() { + var ch chan int + ch <- 1 +} +func Int2Str(i interface{}) string { + return fmt.Sprintf("%v", i) +} diff --git a/tools/stringutil_test.go b/tools/stringutil_test.go new file mode 100644 index 0000000..4934577 --- /dev/null +++ b/tools/stringutil_test.go @@ -0,0 +1,22 @@ +package tools + +import "testing" + +func TestShowString(t *testing.T) { + ShowStringByte("hello,世界") +} +func TestReverse2(t *testing.T) { + cases := []struct { + in, want string + }{ + {"Hello, world", "dlrow ,olleH"}, + {"Hello, 世界", "界世 ,olleH"}, + {"", ""}, + } + for _, c := range cases { + got := Reverse2(c.in) + if got != c.want { + t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want) + } + } +} diff --git a/tools/test.go b/tools/test.go new file mode 100644 index 0000000..7efbc5a --- /dev/null +++ b/tools/test.go @@ -0,0 +1,5 @@ +package tools + +func MyPointer() { + +} diff --git a/tools/test_test.go b/tools/test_test.go new file mode 100644 index 0000000..f7eca12 --- /dev/null +++ b/tools/test_test.go @@ -0,0 +1 @@ +package tools diff --git a/tools/types.go b/tools/types.go new file mode 100644 index 0000000..29a5fa6 --- /dev/null +++ b/tools/types.go @@ -0,0 +1,54 @@ +package tools + +import "html/template" + +type MailServer struct { + Server, Email, Password string +} +type ViewHtml struct { + Header template.HTML + Nav template.HTML +} +type IndexData struct { + ViewHtml + Folders map[string]int + Mails interface{} + MailPagelist []*MailItem + CurrentPage int + Fid string + NextPage, PrePage string + NumPages template.HTML +} +type ViewData struct { + Folders map[string]int + HtmlBody template.HTML + MailItem +} +type MailItem struct { + Subject string + Fid string + Id uint32 + From string + To string + Body string + Date string +} +type MailPageList struct { + MailItems []*MailItem +} +type JsonResult struct { + Code int `json:"code"` + Msg string `json:"msg"` +} +type JsonListResult struct { + JsonResult + Result interface{} `json:"result"` +} +type SmtpBody struct { + Smtp string + From string + To []string + Password string + Subject string + Body string +} diff --git a/tools/uuid.go b/tools/uuid.go new file mode 100644 index 0000000..06d816e --- /dev/null +++ b/tools/uuid.go @@ -0,0 +1,10 @@ +package tools + +import ( + "github.com/satori/go.uuid" +) + +func Uuid() string { + u2 := uuid.NewV4() + return u2.String() +} diff --git a/ws/user.go b/ws/user.go new file mode 100644 index 0000000..fd59782 --- /dev/null +++ b/ws/user.go @@ -0,0 +1,119 @@ +package ws + +import ( + "ai-css/models" + "ai-css/tools" + "encoding/json" + "log" + "time" + + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" +) + +func NewKefuServer(c *gin.Context) { + kefuName, _ := c.Get("kefu_name") + kefuInfo := models.FindUser(kefuName.(string)) + if kefuInfo.ID == 0 { + c.JSON(200, gin.H{ + "code": 400, + "msg": "用户不存在", + }) + return + } + + //go kefuServerBackend() + conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + log.Print("upgrade:", err) + return + } + //获取GET参数,创建WS + var kefu User + kefu.Id = kefuInfo.Name + kefu.Name = kefuInfo.Nickname + kefu.Avator = kefuInfo.Avator + kefu.Conn = conn + AddKefuToList(&kefu) + + for { + //接受消息 + var receive []byte + messageType, receive, err := conn.ReadMessage() + if err != nil { + log.Println("ws/user.go ", err) + conn.Close() + return + } + + message <- &Message{ + conn: conn, + content: receive, + context: c, + messageType: messageType, + } + } +} +func AddKefuToList(kefu *User) { + oldUser, ok := KefuList[kefu.Id] + if oldUser != nil || ok { + msg := TypeMessage{ + Type: "close", + Data: kefu.Id, + } + str, _ := json.Marshal(msg) + if err := oldUser.Conn.WriteMessage(websocket.TextMessage, str); err != nil { + oldUser.Conn.Close() + } + } + KefuList[kefu.Id] = kefu +} + +// 给指定客服发消息 +func OneKefuMessage(toId string, str []byte) { + kefu, ok := KefuList[toId] + if ok { + log.Println("OneKefuMessage lock") + kefu.Mux.Lock() + defer kefu.Mux.Unlock() + log.Println("OneKefuMessage unlock") + error := kefu.Conn.WriteMessage(websocket.TextMessage, str) + tools.Logger().Println("send_kefu_message", error, string(str)) + } +} +func KefuMessage(visitorId, content string, kefuInfo models.User) { + msg := TypeMessage{ + Type: "message", + Data: ClientMessage{ + Name: kefuInfo.Nickname, + Avator: kefuInfo.Avator, + Id: visitorId, + Time: time.Now().Format("2006-01-02 15:04:05"), + ToId: visitorId, + Content: content, + IsKefu: "yes", + }, + } + str, _ := json.Marshal(msg) + OneKefuMessage(kefuInfo.Name, str) +} + +// 给客服客户端发送消息判断客户端是否在线 +func SendPingToKefuClient() { + msg := TypeMessage{ + Type: "many pong", + } + str, _ := json.Marshal(msg) + for kefuId, kefu := range KefuList { + if kefu == nil { + continue + } + kefu.Mux.Lock() + defer kefu.Mux.Unlock() + err := kefu.Conn.WriteMessage(websocket.TextMessage, str) + if err != nil { + log.Println("定时发送ping给客服,失败", err.Error()) + delete(KefuList, kefuId) + } + } +} diff --git a/ws/visitor.go b/ws/visitor.go new file mode 100644 index 0000000..4dd3683 --- /dev/null +++ b/ws/visitor.go @@ -0,0 +1,206 @@ +package ws + +import ( + "ai-css/common" + "ai-css/models" + "encoding/json" + "log" + "time" + + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" +) + +func NewVisitorServer(c *gin.Context) { + //go kefuServerBackend() + conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + log.Print("upgrade:", err) + return + } + //获取GET参数,创建WS + vistorInfo := models.FindVisitorByVistorId(c.Query("visitor_id")) + if vistorInfo.VisitorId == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "访客不存在", + }) + return + } + user := &User{ + Conn: conn, + Name: vistorInfo.Name, + Avator: vistorInfo.Avator, + Id: vistorInfo.VisitorId, + To_id: vistorInfo.ToId, + UpdateTime: time.Now(), + } + go models.UpdateVisitorStatus(vistorInfo.VisitorId, 1) + //go SendServerJiang(vistorInfo.Name, "来了", c.Request.Host) + + AddVisitorToList(user) + + for { + //接受消息 + var receive []byte + messageType, receive, err := conn.ReadMessage() + if err != nil { + for _, visitor := range ClientList { + if visitor.Conn == conn { + log.Println("删除用户", visitor.Id) + delete(ClientList, visitor.Id) + VisitorOffline(visitor.To_id, visitor.Id, visitor.Name) + } + } + log.Println(err) + return + } + + message <- &Message{ + conn: conn, + content: receive, + context: c, + messageType: messageType, + } + } +} +func AddVisitorToList(user *User) { + //用户id对应的连接 + oldUser, ok := ClientList[user.Id] + if oldUser != nil || ok { + msg := TypeMessage{ + Type: "close", + Data: user.Id, + } + str, _ := json.Marshal(msg) + if err := oldUser.Conn.WriteMessage(websocket.TextMessage, str); err != nil { + oldUser.Conn.Close() + user.UpdateTime = oldUser.UpdateTime + delete(ClientList, user.Id) + } + } + ClientList[user.Id] = user + lastMessage := models.FindLastMessageByVisitorId(user.Id) + userInfo := make(map[string]string) + userInfo["uid"] = user.Id + userInfo["username"] = user.Name + userInfo["avator"] = user.Avator + userInfo["last_message"] = lastMessage.Content + if userInfo["last_message"] == "" { + userInfo["last_message"] = "new visitor" + } + msg := TypeMessage{ + Type: "userOnline", + Data: userInfo, + } + str, _ := json.Marshal(msg) + + //新版 + OneKefuMessage(user.To_id, str) +} +func VisitorOnline(kefuId string, visitor models.Visitor) { + lastMessage := models.FindLastMessageByVisitorId(visitor.VisitorId) + userInfo := make(map[string]string) + userInfo["uid"] = visitor.VisitorId + userInfo["username"] = visitor.Name + userInfo["avator"] = visitor.Avator + userInfo["last_message"] = lastMessage.Content + if userInfo["last_message"] == "" { + userInfo["last_message"] = "new visitor" + } + msg := TypeMessage{ + Type: "userOnline", + Data: userInfo, + } + str, _ := json.Marshal(msg) + OneKefuMessage(kefuId, str) +} +func VisitorOffline(kefuId string, visitorId string, visitorName string) { + + models.UpdateVisitorStatus(visitorId, 0) + userInfo := make(map[string]string) + userInfo["uid"] = visitorId + userInfo["name"] = visitorName + msg := TypeMessage{ + Type: "userOffline", + Data: userInfo, + } + str, _ := json.Marshal(msg) + //新版 + OneKefuMessage(kefuId, str) +} +func VisitorNotice(visitorId string, notice string) { + msg := TypeMessage{ + Type: "notice", + Data: notice, + } + str, _ := json.Marshal(msg) + visitor, ok := ClientList[visitorId] + if !ok || visitor == nil || visitor.Conn == nil { + return + } + visitor.Conn.WriteMessage(websocket.TextMessage, str) +} +func VisitorMessage(visitorId, content string, kefuInfo models.User) { + msg := TypeMessage{ + Type: "message", + Data: ClientMessage{ + Name: kefuInfo.Nickname, + Avator: kefuInfo.Avator, + Id: kefuInfo.Name, + Time: time.Now().Format("2006-01-02 15:04:05"), + ToId: visitorId, + Content: content, + IsKefu: "no", + }, + } + str, _ := json.Marshal(msg) + visitor, ok := ClientList[visitorId] + if !ok || visitor == nil || visitor.Conn == nil { + return + } + visitor.Conn.WriteMessage(websocket.TextMessage, str) +} +func VisitorAutoReply(vistorInfo models.Visitor, kefuInfo models.User, content string) { + kefu, ok := KefuList[kefuInfo.Name] + reply := models.FindReplyItemByUserIdTitle(kefuInfo.Name, content) + if reply.Content != "" { + time.Sleep(1 * time.Second) + VisitorMessage(vistorInfo.VisitorId, reply.Content, kefuInfo) + KefuMessage(vistorInfo.VisitorId, reply.Content, kefuInfo) + models.CreateMessage(kefuInfo.Name, vistorInfo.VisitorId, reply.Content, "kefu") + } + if !ok || kefu == nil { + time.Sleep(1 * time.Second) + config := models.FindConfigByUserId(kefuInfo.Name, "OfflineMessage") + if config.ConfValue == "" || reply.Content != "" { + return + } + VisitorMessage(vistorInfo.VisitorId, config.ConfValue, kefuInfo) + models.CreateMessage(kefuInfo.Name, vistorInfo.VisitorId, config.ConfValue, "kefu") + } +} +func CleanVisitorExpire() { + go func() { + log.Println("cleanVisitorExpire start...") + for { + for _, user := range ClientList { + diff := time.Now().Sub(user.UpdateTime).Seconds() + if diff >= common.VisitorExpire { + msg := TypeMessage{ + Type: "auto_close", + Data: user.Id, + } + str, _ := json.Marshal(msg) + if err := user.Conn.WriteMessage(websocket.TextMessage, str); err != nil { + user.Conn.Close() + delete(ClientList, user.Id) + } + log.Println(user.Name + ":cleanVisitorExpire finshed") + } + } + t := time.NewTimer(time.Second * 5) + <-t.C + } + }() +} diff --git a/ws/ws.go b/ws/ws.go new file mode 100644 index 0000000..6974c29 --- /dev/null +++ b/ws/ws.go @@ -0,0 +1,156 @@ +package ws + +import ( + "ai-css/models" + "ai-css/tools" + "encoding/json" + "fmt" + "log" + "net/http" + "strconv" + "sync" + "time" + + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" +) + +const ( + MaxAIAnswerCycleTimes int = 3 +) + +type User struct { + Conn *websocket.Conn + Name string + Id string + Avator string + To_id string + Role_id string + Mux sync.Mutex + UpdateTime time.Time + AIAnswerCycle int +} +type Message struct { + conn *websocket.Conn + context *gin.Context + content []byte + messageType int + Mux sync.Mutex +} +type TypeMessage struct { + Type interface{} `json:"type"` + Data interface{} `json:"data"` +} +type ClientMessage struct { + Name string `json:"name"` + Avator string `json:"avator"` + Id string `json:"id"` + VisitorId string `json:"visitor_id"` + Group string `json:"group"` + Time string `json:"time"` + ToId string `json:"to_id"` + Content string `json:"content"` + City string `json:"city"` + ClientIp string `json:"client_ip"` + Refer string `json:"refer"` + IsKefu string `json:"is_kefu"` +} + +var ClientList = make(map[string]*User) +var KefuList = make(map[string]*User) +var message = make(chan *Message, 10) +var upgrader = websocket.Upgrader{} +var Mux sync.RWMutex + +func init() { + upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + // 解决跨域问题 + CheckOrigin: func(r *http.Request) bool { + return true + }, + } + go UpdateVisitorStatusCron() +} +func SendServerJiang(title string, content string, domain string) string { + noticeServerJiang, err := strconv.ParseBool(models.FindConfig("NoticeServerJiang")) + serverJiangAPI := models.FindConfig("ServerJiangAPI") + if err != nil || !noticeServerJiang || serverJiangAPI == "" { + log.Println("do not notice serverjiang:", serverJiangAPI, noticeServerJiang) + return "" + } + sendStr := fmt.Sprintf("%s%s", title, content) + desp := title + ":" + content + "[登录](http://" + domain + "/main)" + url := serverJiangAPI + "?text=" + sendStr + "&desp=" + desp + //log.Println(url) + res := tools.Get(url) + return res +} +func SendFlyServerJiang(title string, content string, domain string) string { + return "" +} + +// 定时给更新数据库状态 +func UpdateVisitorStatusCron() { + for { + visitors := models.FindVisitorsOnline() + for _, visitor := range visitors { + if visitor.VisitorId == "" { + continue + } + _, ok := ClientList[visitor.VisitorId] + if !ok { + models.UpdateVisitorStatus(visitor.VisitorId, 0) + } + } + SendPingToKefuClient() + time.Sleep(60 * time.Second) + } +} + +// 后端广播发送消息 +func WsServerBackend() { + for { + message := <-message + var typeMsg TypeMessage + json.Unmarshal(message.content, &typeMsg) + conn := message.conn + if typeMsg.Type == nil || typeMsg.Data == nil { + continue + } + msgType := typeMsg.Type.(string) + log.Println("客户端:", string(message.content)) + + switch msgType { + //心跳 + case "ping": + msg := TypeMessage{ + Type: "pong", + } + str, _ := json.Marshal(msg) + message.Mux.Lock() + defer message.Mux.Unlock() + conn.WriteMessage(websocket.TextMessage, str) + case "inputing": + data := typeMsg.Data.(map[string]interface{}) + from := data["from"].(string) + to := data["to"].(string) + //限流 + if tools.LimitFreqSingle("inputing:"+from, 1, 2) { + OneKefuMessage(to, message.content) + } + } + + } +} +func UpdateVisitorUser(visitorId string, toId string) { + guest, ok := ClientList[visitorId] + if ok { + guest.To_id = toId + } +} + +func AIAnswerAvailable(u *User) bool { + return u.AIAnswerCycle < MaxAIAnswerCycleTimes +}