init commit

This commit is contained in:
r0n1n7an
2024-05-01 23:52:26 +08:00
commit 1b1ee673bb
426 changed files with 1647 additions and 0 deletions
BIN
View File
Binary file not shown.
+340
View File
@@ -0,0 +1,340 @@
package main
import (
"database/sql"
"flag"
"fmt"
"log"
"net/http"
"os"
"strings"
"text/template"
"time"
"github.com/go-echarts/go-echarts/v2/charts"
"github.com/go-echarts/go-echarts/v2/opts"
_ "github.com/go-sql-driver/mysql"
ini "gopkg.in/ini.v1"
)
var verb bool = false
var file string = ""
var cfg *ini.File
type DataSet struct {
Alias string
Item string
Result string
UpdateTime string
}
func main() {
flag.BoolVar(&verb, "v", false, "Show Verbose Debug Messages")
flag.StringVar(&file, "f", "", "Config File Path")
flag.Parse()
log.SetOutput(os.Stdout)
log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds)
if file == "" {
file = strings.TrimSuffix(os.Args[0], ".exe") + ".ini"
}
var err error
cfg, err = ini.Load(file)
if err != nil {
log.Printf("[ERR] %v\r\n", err)
os.Exit(1)
}
addr := cfg.Section("HTTP").Key("ListenIP").String()
port := cfg.Section("HTTP").Key("ListenPort").String()
http.HandleFunc("/", handleIndex)
http.HandleFunc("/echart/", eChart)
http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets"))))
http.ListenAndServe(addr+":"+port, nil)
}
func handleIndex(w http.ResponseWriter, r *http.Request) {
if r.RequestURI == "/favicon.ico" {
return
}
log.Printf("[MSG] Received Request: %s, %s\r\n", r.RemoteAddr, r.RequestURI)
defer r.Body.Close()
type Data struct {
Title string
Host string
}
data := Data{
Title: cfg.Section("HTTP").Key("Title").String(),
Host: cfg.Section("HTTP").Key("Host").String(),
}
tpl, err := template.ParseFiles("root.html")
if err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
err = tpl.Execute(w, data)
if err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
}
func eChart(w http.ResponseWriter, r *http.Request) {
if r.RequestURI == "/favicon.ico" {
return
}
log.Printf("[MSG] Received Request: %s, %s\r\n", r.RemoteAddr, r.RequestURI)
defer r.Body.Close()
if err := r.ParseForm(); err != nil {
log.Printf("[ERR] %v\r\n", err)
}
type Params struct {
Range string ""
Alias string ""
Class string ""
Scope string ""
}
var params Params
params.Range = r.Form.Get("range")
params.Scope = r.Form.Get("scope")
params.Alias = r.Form.Get("alias")
params.Class = r.Form.Get("class")
log.Printf("[MSG] Request Params: %#v\r\n", params)
timeAxis := make([]string, 0)
endTime := time.Now()
beginTime := endTime.AddDate(0, 0, -7)
bt := beginTime
for i := 1; i <= 60*24*7; i++ {
bt = bt.Add(time.Minute)
timeAxis = append(timeAxis, bt.Format("01-02 15:04"))
}
// Parsing Config - Database
cfg.Reload()
dbHost := cfg.Section("Database").Key("Host").MustString("127.0.0.1")
dbPort := cfg.Section("Database").Key("Port").MustString("3306")
dbSchema := cfg.Section("Database").Key("Database").MustString("monitoring")
dbTable := cfg.Section("Database").Key("Table").MustString("server")
dbColumns := cfg.Section("Database").Key("Columns").MustString("alias,item,result,update_time")
dbUsername := cfg.Section("Database").Key("Username").String()
dbPassword := cfg.Section("Database").Key("Password").String()
if dbUsername == "" || dbPassword == "" {
log.Println("[ERR] Invalid Database Configuration.")
return
}
qry := fmt.Sprintf(
"SELECT %s FROM %s WHERE alias='%s' AND item='%s' AND update_stmp>=%d ORDER BY seqid ASC;",
dbColumns,
dbTable,
params.Alias,
params.Class,
beginTime.Unix(),
)
log.Printf("[MSG] Query SQL: \r\n%s\r\n", qry)
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", dbUsername, dbPassword, dbHost, dbPort, dbSchema)
conn, err := sql.Open("mysql", dsn)
if err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
defer conn.Close()
if err := conn.Ping(); err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
defer conn.Close()
rows, err := conn.Query(qry)
if err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
defer rows.Close()
log.Println("[MSG] Query Successed.")
baseData := make(map[string]string, 0)
for rows.Next() {
var data DataSet
err := rows.Scan(&data.Alias, &data.Item, &data.Result, &data.UpdateTime)
if err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
baseData[data.UpdateTime] = data.Result
}
log.Printf("[MSG] Total Scanned: %d\r\n", len(baseData))
var dots []opts.LineData = make([]opts.LineData, 0)
for _, t := range timeAxis {
tmp, ok := baseData[t]
if ok {
dots = append(dots, opts.LineData{Value: tmp})
} else {
dots = append(dots, opts.LineData{Value: "null"})
}
}
log.Println("[MSG] Finished Sort Metadata.")
// Parsing Config - Chart Titles
chartTitle := cfg.Section("Chart").Key("Title").String()
chartSubtitle := cfg.Section("Chart").Key("Subtitle").String()
chartSeries := cfg.Section("Chart").Key("Series").String()
assetsURL := cfg.Section("Chart").Key("AssetsURL").String()
var xPercent float32 = 75
if params.Range == "all" {
xPercent = 0
}
if params.Range == "half" {
xPercent = 50
}
if params.Range == "quarter" {
xPercent = 75
}
if params.Range == "octant" {
xPercent = 87.5
}
if params.Alias != "" {
chartSubtitle = params.Alias
}
if params.Class != "" {
chartTitle = params.Class
}
chart := charts.NewLine()
// lang := make([]string, 0)
// lang = append(lang, "data view")
// lang = append(lang, "turn off")
// lang = append(lang, "refresh")
chart.SetGlobalOptions(
charts.WithTitleOpts(
opts.Title{
Left: "center",
Top: "0",
Title: chartTitle,
TitleStyle: &opts.TextStyle{
Color: "#000000",
FontSize: 18,
FontFamily: "Calibri",
},
Subtitle: chartSubtitle,
SubtitleStyle: &opts.TextStyle{
Color: "#222222",
FontSize: 16,
FontFamily: "Calibri",
},
},
),
charts.WithInitializationOpts(
opts.Initialization{
PageTitle: "eChart",
BackgroundColor: "#FFFFFF",
Width: "800px",
Height: "600px",
AssetsHost: assetsURL,
},
),
charts.WithDataZoomOpts(
opts.DataZoom{
Type: "inside",
Start: xPercent,
End: 100,
},
),
charts.WithXAxisOpts(
opts.XAxis{
Min: "dataMin",
Max: "dataMax",
AxisLabel: &opts.AxisLabel{
ShowMinLabel: true,
ShowMaxLabel: true,
Rotate: 45,
FontSize: "14",
FontWeight: "600",
FontFamily: "Calibri",
LineHeight: "200",
},
},
),
charts.WithTooltipOpts(
opts.Tooltip{
Show: true,
Trigger: "axis",
},
),
charts.WithToolboxOpts(
opts.Toolbox{
Show: true,
Feature: &opts.ToolBoxFeature{
SaveAsImage: &opts.ToolBoxFeatureSaveAsImage{
Show: true,
Type: "png",
},
DataView: &opts.ToolBoxFeatureDataView{
Show: true,
},
Restore: &opts.ToolBoxFeatureRestore{
Show: true,
},
},
},
),
// charts.WithLegendOpts(
// opts.Legend{
// Show: true,
// },
// ),
)
chart.SetXAxis(timeAxis).AddSeries(chartSeries, dots).
SetSeriesOptions(
charts.WithLineChartOpts(
opts.LineChart{
ConnectNulls: true,
},
),
charts.WithMarkPointNameTypeItemOpts(
opts.MarkPointNameTypeItem{
Name: "Max",
Type: "max",
},
opts.MarkPointNameTypeItem{
Name: "Min",
Type: "min",
},
),
charts.WithMarkPointStyleOpts(
opts.MarkPointStyle{
SymbolSize: 50,
Label: &opts.Label{
Show: true,
Position: "inside",
},
},
),
charts.WithMarkLineNameTypeItemOpts(
opts.MarkLineNameTypeItem{
Name: "Avrg",
Type: "average",
},
),
// charts.WithLabelOpts(
// opts.Label{
// Show: true,
// Position: "top",
// },
// ),
)
chart.Render(w)
}
+18
View File
@@ -0,0 +1,18 @@
[HTTP]
ListenIP=0.0.0.0
ListenPort=8081
[Chart]
AssetsURL=http://127.0.0.1:8081/assets/
Title=PXE Loading
Subtitle=DA1/DA2
Series=Value
[Database]
Host=192.168.3.31
Port=3306
Username=root
Password=1qaz@WSX
Database=monitoring
Table=server
Columns=alias,item,result,DATE_FORMAT(update_time, '%m-%d %H:%i')
+1
View File
File diff suppressed because one or more lines are too long
+1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+21
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
!function(e,o){"function"==typeof define&&define.amd?define(["exports","echarts"],o):"object"==typeof exports&&"string"!=typeof exports.nodeName?o(exports,require("echarts")):o({},e.echarts)}(this,function(e,o){var t=function(e){"undefined"!=typeof console&&console&&console.error&&console.error(e)}
return o?o.registerMap?void o.registerMap("澳门",{type:"FeatureCollection",features:[{id:"820001",type:"Feature",geometry:{type:"MultiPolygon",coordinates:[["@@LADC^umZ@DONWE@DALBBF@H@DFBBTC"],["@@P@LC@AGM@OECMBABBTCD@DDH"]],encodeOffsets:[[[116285,22746]],[[116303,22746]]]},properties:{cp:[113.552965,22.207882],name:"花地玛堂区",childNum:2}},{id:"820002",type:"Feature",geometry:{type:"Polygon",coordinates:["@@MK@CA@AAGDEB@NVFJG"],encodeOffsets:[[116281,22734]]},properties:{cp:[113.549052,22.199175],name:"花王堂区",childNum:1}},{id:"820003",type:"Feature",geometry:{type:"Polygon",coordinates:["@@EGOB@DNLHE@C"],encodeOffsets:[[116285,22729]]},properties:{cp:[113.550252,22.193791],name:"望德堂区",childNum:1}},{id:"820004",type:"Feature",geometry:{type:"Polygon",coordinates:["@@ŸYMVAN@BFCBBDAFHDBBFDHIJJEFDPCHHlYJQ"],encodeOffsets:[[116313,22707]]},properties:{cp:[113.55374,22.188119],name:"大堂区",childNum:1}},{id:"820005",type:"Feature",geometry:{type:"Polygon",coordinates:["@@JICGAECACGEBAAEDBFNXB@"],encodeOffsets:[[116266,22728]]},properties:{cp:[113.54167,22.187778],name:"风顺堂区",childNum:1}},{id:"820006",type:"Feature",geometry:{type:"Polygon",coordinates:["@@ ZNWRquZCBCC@AEA@@ADCDCAACEAGBQ@INEL"],encodeOffsets:[[116265,22694]]},properties:{cp:[113.558783,22.154124],name:"嘉模堂区",childNum:1}},{id:"820007",type:"Feature",geometry:{type:"Polygon",coordinates:["@@MOIAIEI@@GE@AAUCBdCFIFR@HAFBBDDBDCBC@@FB@BDDDA\\M"],encodeOffsets:[[116316,22676]]},properties:{cp:[113.56925,22.136546],name:"路凼填海区",childNum:1}},{id:"820008",type:"Feature",geometry:{type:"Polygon",coordinates:["@@DKMMa_GC_COD@dVDBBF@@HJ@JFJBNPZK"],encodeOffsets:[[116329,22670]]},properties:{cp:[113.559954,22.124049],name:"圣方济各堂区",childNum:1}}],UTF8Encoding:!0}):void t("ECharts Map is not loaded"):void t("ECharts is not Loaded")})
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
!function(B,A){"function"==typeof define&&define.amd?define(["exports","echarts"],A):"object"==typeof exports&&"string"!=typeof exports.nodeName?A(exports,require("echarts")):A({},B.echarts)}(this,function(B,A){var D=function(B){"undefined"!=typeof console&&console&&console.error&&console.error(B)}
return A?A.registerMap?void A.registerMap("嘉峪关",{type:"FeatureCollection",features:[{type:"Feature",id:"620200",properties:{name:"嘉峪关市",cp:[98.289419,39.772554],childNum:2},geometry:{type:"MultiPolygon",coordinates:[["@@HEDADA@ABABA@@@C@C@G@@@ABA@A@C@@@@B@D@BB@A@@BA@I@A@AAAAAAACAAAEEAA@AC@AAA@@AA@AAEECCAAAAAA@AACAC@E@@@A@@AE@ACE@AAC@AAC@AAACEACAAEAGEAAAAABADCDCDAB@BA@C@AAEBC@CBA@@@CBA@IDG@@BGA@B@@A@A@@@AAA@AACA@@C@A@@@A@@@A@AB@@CBA@@BC@CBA@ABABCBEBEBABABA@EFEDABABCB@@A@@BADCBCBA@@BC@@@ABABA@ABABCAC@CAA@ODEBA@@BABAD@DAD@@ABKBCB@@CBC@A@A@A@AB@@@BBBB@@BBF@BBBDDBDBBAB@@A@A@C@CCC@CBWLIDGBM@M@MAI@OCIAECCAMMEGEECE@AAA@EAE@@@@G@wBS@c@ÁB@A‡emWSIIJGFCDAFQVCDCDAB@B@BCDCBEBEBEBC@K@A@C@EDC@ABEAC@C@KDSDGBA@GFCBO@[@C@AB@@DB^RBBFDHDDBBBTLB@DDJDBBBBHDB@NHBBHFB@RLJFJDDDLFPJBBJFHDLFDDDB@@BBBDBDFHBBFLDD@BBBBDBBBDDFBBDBBBHDJDFBDBB@BBBBFBFDFBJDHDBBB@BB@@@@GHADuxORCFMPAB@@@@@BBB@@@BFDDF@@@@B@BDFDJDBBHDDB@@B@@BBB@@BBDBBBHDB@B@DBBBB@DBDBF@@@DDDBFB@@B@@B@@@@AB@@C@AB@@A@@@A@@@@@ABA@ABC@A@CB@@A@ABA@A@CAEBA@@@@@@@@@@@@@A@A@A@@@A@@BA@@@A@A@@@@@A@ABA@A@BBD@BBDBB@@B@@@BC@@@@B@@@B@@BBDBB@B@B@B@B@B@B@@@BB@@@DBBB@@ABB@@B@@@BB@@A@@B@B@B@B@B@@B@@@@B@B@@BB@B@@B@B@DBB@DADBB@B@DBDBB@D@@@BA@@B@DBB@BD@BB@BBD@FBB@B@DA@@B@BB@@BAB@@@BBD@BBB@B@BB@@@@@BA@AB@@@BAB@B@B@B@BAD@@@@@B@@@BA@@B@@BB@BB@B@@B@B@BA@@BBBBDB@@@@B@D@BABAB@DABADADABCDCBAB@B@@@B@BDBDBD@JChINCDAJAFAPETCBAFAD@PCdILCFAZAL@ZAJ@XATAN@LAH@H@D@F@B@FAB@L@RApAPAD@B@D@DB@A@@@@AA@A@A@@@@@AB@@@B@FBJAD@F@B@B@@@@@B@@@B@@AD@BAF@BA@@F@JBJ@J@DBF@D@DAD@BBD@D@B@B@@@@B@@@B@@@@@@B@@@DADAF@BA@BF@BBB@BBDBD@HBDBDBBBBBB@@@BBB@BAFAB@@@D@D@FAB@B@@ADCBAB@HABABAB@BABAB@F@N@J@H@F@BBD@DDDBD@HFJDHBBBB@@B@B@D@@BBF@H@@AB@JGBADE@AFCHEDCDCD@@AD@@A@A@@CA@AA@@ABA@ABCBC@A@A@AAA@AA@@AACAC@A@A@A@ABC@A@EBA@@BC@@@CB@DAB@B@D@HAHA@@@AB@BAB@D@B@BAB@B@@A@@CICEACAA@@JI@@@@KIMKEEEEECIICA@@A@@A@AA@AAAAA@CA@@@@FC@@@A@@@AA@AAAABA@@@AB@BAB@@AB@@AAABABCBADE@A@@@C@@AAAAAAGECACAA@OA@ACA@@A@A@@@AA@AA@@@CAAACACAAA@@A@AAA@EACCA@@@A@EAAAOGE@ECA@CAAAA@UIMECAOEA@GCICUI@@KEEA@@A@@@AAYI@A@@@AA@CA@AA@@ABABG@@BA@ABG@CDABEBCBA@@FCDABADA@AB@DABAD@DCD@DAVGB@BAJE"],["@@HDFBHBB@@@B@@@CAAAAAAAA@@AAC@@ABID@@@@"]],encodeOffsets:[[[100760,40692]],[[100197,40667]]]}}],UTF8Encoding:!0}):void D("ECharts Map is not loaded"):void D("ECharts is not Loaded")})
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
!function(e,o){"function"==typeof define&&define.amd?define(["exports","echarts"],o):"object"==typeof exports&&"string"!=typeof exports.nodeName?o(exports,require("echarts")):o({},e.echarts)}(this,function(e,o){var t=function(e){"undefined"!=typeof console&&console&&console.error&&console.error(e)}
return o?o.registerMap?void o.registerMap("东沙群岛",{type:"FeatureCollection",features:[{type:"Feature",id:"442100",properties:{name:"东沙群岛",cp:[116.887613,20.617825],childNum:4},geometry:{type:"MultiPolygon",coordinates:[["@@N\\`ZrDVBrCf]\\mRmBqWY]OoFyZe^a\\SfA^"],["@@JVZNT@B@TSno\\cB_ES@AWCaAaR]dOfId"],["@@IBGBIBEBID@@AB@BB@@@BBA@BD@@DBDBB@B@B@DAFCFAD@B@DCB@B@@ADGBCA@E@"],["@@tJrHtC^BvGj[JK\\{R§CS]{Ycc_q]‹K{AuLUJSPCJBLFHNF„KŠNlRtn`‚C€MhQJ]BuDUCKCIBIHOFK@[AQAKDCJDHHBFFCN@HDF"]],encodeOffsets:[[[118726,21604]],[[118709,21486]],[[119538,21192]],[[119573,21271]]]}}],UTF8Encoding:!0}):void t("ECharts Map is not loaded"):void t("ECharts is not Loaded")})
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
!function(A,B){"function"==typeof define&&define.amd?define(["exports","echarts"],B):"object"==typeof exports&&"string"!=typeof exports.nodeName?B(exports,require("echarts")):B({},A.echarts)}(this,function(A,B){var C=function(A){"undefined"!=typeof console&&console&&console.error&&console.error(A)}
return B?B.registerMap?void B.registerMap("中山",{type:"FeatureCollection",features:[{type:"Feature",id:"442000",properties:{name:"中山市",cp:[113.39277,22.517585],childNum:1},geometry:{type:"Polygon",coordinates:["@@FCDABABA@AC@GAEACAA@ICCACA@@EA@@A@ACEGEA@@KCCAICEAOE@@CCAAA@G@GBIBCFCDEFOTCDINEFA@A@CAAAA@ADAB@B@@A@EDAAC@ABCBA@SJMJCBCD@@EFCHCDCJCJABCJAFAFADKXITCLAFAF@@@B@@@J@RGLEJMLEH@@@@KN@@QVCDABKLGJEHCBSLAJCJCJAH@H@H@D@N@V@FELCFEH@@EHEL@FADCPEJADGJADKN@B@@@@GLADCFEJKLABMJABQTIHD\\CT@D@DADALADADCFCHABAFABA@@BADCBCDIL@BCJAB@B@@A@@@CD@@@@CDA@FDAD@@@@@D@@@B@B@@AB@@AD@BDHAB@@@@ADDN@DBHDFBF@@@@@@@@BBDAB@B@D@BB@@@H@FC@C@@ACJABC@ADD@@BBBB@D@ADABEFBBDB@@@@@@@@B@BABBBB@@@@BB@@@@BB@B@@B@@@@BB@BABDBAB@A@DDDABCB@@@BABAD@@ADABAB@B@B@B@BBD@D@DB@@D@@@AB@BAD@FFHBBDD@@@B@B@D@HJBHHHHBB@@DDDFBBBFDDDHHLDJBBBNFD@BDBDBB@JABAHEB@HIBEDEFEDCJBBD@@FFFH@@@@HFDBB@N@DAFAJAB@DBD@H@@@FBJBF@JDHB@@BB@@@BAB@@@BA@@B@B@@BB@BBB@@@BB@B@BBB@BBB@BB@@B@BB@@BB@@BBB@@BB@@@@@B@@BB@@@BBB@DB@@BBB@B@BBB@D@BBB@BBDHHHHCHGDAJEDCTK@@@@JEHC@AFCB@DANGJCLCFAL@F@H@DANADAfK@@EM@@@@AANKBA@@HELGBARMNIFABAJELGHELGNIVOAQEAC@C@@A@@@AHMJOFIDELQ@AFKDABCHKFG@AFFHEFFFCBBDEJGDAFCFAB@L@DAPIJELKfVuDKTAjATBo‡‹Gk}ki][I@IBU@A@ODAAODABA@CAA@CAACCAABABC@AAAAAC@AA@CACBEFCDC@ECAACACAGAACBM@GCAC@CCECAE@CBEBCDCDC@@AEBEACAC@A@AD@BABA@EB@@AAA@@@A@EAA@@AAAA@A@CBC@@@AA@@@A@@CBEB@FADAAC@CBAB@DABABAAABCDABA@AACCAOGE@C@@BA@@@A@CBAAA@BA@A@@@@AA@@AAA@A@@@A@AA@@A@A@@B@@@AA@@BCCAACCBA@@B@DCDAAA@@@@BA@@BAB@@BBABBBCBA@@B@JIAAJIBC@@AADC@@@AB@@AB@BA@A@A@@BABABC@@DB@@CE@@B@@@BACADEDABCDB@BB@BBBAFG@@@ABABC@@@@@C@A@@@A@C@@@@@A@@AA@A@@@@@A@CGDAC@ACCEAA@A@A@AA@@C@AAA@A@A@A@@AA@A@@@AAABA@CACAA@CCC@@EBC@A"],encodeOffsets:[[116204,22767]]}}],UTF8Encoding:!0}):void C("ECharts Map is not loaded"):void C("ECharts is not Loaded")})
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More