diff --git a/README.md b/README.md index ccca502d..98607926 100644 --- a/README.md +++ b/README.md @@ -18,12 +18,20 @@ Simple command line based HTTP file server to share local file system. - Zero third party dependency ## Compile -Minimal required Go version is 1.18. +Minimal required Go version is 1.9. +Ensure this project is located at `GOPATH/src/mjpclab.dev/ghfs`. ```sh go build main.go ``` Will generate executable file "main" in current directory. +If default html template files under `src/tpl` changed, need to re-embed templates into go files: +```bash +cd src +make tpls +``` +Then compile the project like above. + ## Examples Start server on port 8080, root directory is current working directory: ```sh diff --git a/README.zh-CN.md b/README.zh-CN.md index a0f52762..53761f3f 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -18,12 +18,20 @@ - 零第三方依赖 ## 编译 -至少需要Go 1.18版本。 +至少需要Go 1.9版本。 +确保该项目位于 `GOPATH/src/mjpclab.dev/ghfs`。 ```sh go build main.go ``` 会在当前目录生成"main"可执行文件。 +如果修改过`src/tpl`下的默认html模板,需要将其重新嵌入go文件: +```bash +cd src +make tpls +``` +然后再像上面那样编译。 + ## 举例 在8080端口启动服务器,根目录为当前工作目录: ```sh diff --git a/build/build-all-by-docker.sh b/build/build-all-by-docker.sh index 30168d2b..f202d40d 100755 --- a/build/build-all-by-docker.sh +++ b/build/build-all-by-docker.sh @@ -26,6 +26,7 @@ buildByDocker() { sed -i -e "s;://[^/ ]*;://mirrors.aliyun.com;" /etc/apt/sources.list; apt-get update; apt-get install -yq git zip; + dpkg -i '"$ghfs"'/build/pkg/*.deb elif [ -e /etc/apt/sources.list.d/debian.sources ]; then sed -i -e "s;://[^/ ]*;://mirrors.aliyun.com;" /etc/apt/sources.list.d/debian.sources; apt-get update; @@ -42,24 +43,35 @@ buildByDocker() { "$@" } -gover=latest -buildByDocker "$gover" "${builds[@]}" +#gover=1.15 +#builds=() +#builds+=('linux 386' 'linux amd64' 'linux arm' 'linux arm64' 'windows 386' 'windows amd64' 'windows arm' 'darwin amd64' 'darwin arm64') +#builds+=('freebsd 386' 'freebsd amd64' 'freebsd arm' 'freebsd arm64') +#builds+=('openbsd 386' 'openbsd amd64' 'openbsd arm' 'openbsd arm64') +#builds+=('netbsd 386' 'netbsd amd64' 'netbsd arm' 'netbsd arm64') +#buildByDocker "$gover" "${builds[@]}" + +#gover=1.15-alpine +#builds=('linux amd64 -musl' 'linux arm64 -musl') +#buildByDocker "$gover" "${builds[@]}" -#gover=1.24 -#builds=('darwin amd64 -11-big-sur' 'darwin arm64 -11-big-sur') +#gover=1.14 +#builds=('darwin 386 -10.11-el_capitan' 'darwin amd64 -10.11-el_capitan') #buildByDocker "$gover" "${builds[@]}" -#gover=1.22 -#builds=('darwin amd64 -10.15-catalina' 'darwin arm64 -10.15-catalina') +#gover=1.12 +#builds=() +#builds+=('darwin 386 -10.10-yosemite' 'darwin amd64 -10.10-yosemite') +#builds+=('freebsd 386 -10.x' 'freebsd amd64 -10.x' 'freebsd arm -9.x') #buildByDocker "$gover" "${builds[@]}" -gover=1.20 +gover=1.10 builds=() -builds+=('windows 386 -7-8' 'windows amd64 -7-8') -#builds+=('windows amd64,v2 -7-8' 'windows amd64,v3 -7-8') -#builds+=('darwin amd64 -10.13-high-sierra-10.14-mojave' 'darwin arm64 -10.13-high-sierra-10.14-mojave') +builds+=('windows 386 -xp-vista' 'windows amd64 -xp-vista') +#builds+=('darwin 386 -10.8-mountain_lion' 'darwin amd64 -10.8-mountain_lion') +#builds+=('openbsd 386 -6.0' 'openbsd amd64 -6.0' 'openbsd arm -6.0') buildByDocker "$gover" "${builds[@]}" -#gover=1.16 -#builds=('darwin amd64 -10.12-sierra' 'darwin arm64 -10.12-sierra') +#gover=1.9 +#builds=('freebsd 386 -9.x' 'freebsd amd64 -9.x' 'freebsd arm -9.x') #buildByDocker "$gover" "${builds[@]}" diff --git a/build/pkg/zip_3.0-11+b1_amd64.deb b/build/pkg/zip_3.0-11+b1_amd64.deb new file mode 100644 index 00000000..d15c22f2 Binary files /dev/null and b/build/pkg/zip_3.0-11+b1_amd64.deb differ diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 00000000..6a43f361 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,16 @@ +define embedStr + sed -i -e '/= `/,/`/ { /`/!d }' $(1).go + sed -i -e '/= `/r$(1)' $(1).go + #sed -i -e '/= `/,/`/ { /`/! { /^\s*$$/d; s/^\s\s*// } }' $(1).go +endef + +define embedHex + sed -i -e '/= \[\]byte/,/\}/ { /[{}]/!d }' $(1).go + od -An -tx1 -w16 -v $(1) | sed -e 's/^\s*/\t/g' | sed -E -e 's/[0-9a-fA-F]+/0x&,/g' | sed -i -e '/= \[\]byte/r/dev/stdin' $(1).go +endef + +tpls: + $(call embedStr, tpl/defaultTheme/frontend/index.html) + $(call embedStr, tpl/defaultTheme/frontend/index.css) + $(call embedStr, tpl/defaultTheme/frontend/index.js) + $(call embedHex, tpl/defaultTheme/frontend/favicon.ico) diff --git a/src/goNixArgParser/helper.go b/src/goNixArgParser/helper.go index 79d0f954..d32b38a5 100644 --- a/src/goNixArgParser/helper.go +++ b/src/goNixArgParser/helper.go @@ -1,7 +1,7 @@ package goNixArgParser import ( - "io" + "io/ioutil" "os" "regexp" ) @@ -79,7 +79,7 @@ func LoadConfigArgs(filename string) (args []string, err error) { defer file.Close() } - bytesConfig, err := io.ReadAll(file) + bytesConfig, err := ioutil.ReadAll(file) if err != nil { return nil, err } diff --git a/src/goVirtualHost/vhost.go b/src/goVirtualHost/vhost.go index e5f3a09c..d8f5dd9f 100644 --- a/src/goVirtualHost/vhost.go +++ b/src/goVirtualHost/vhost.go @@ -56,13 +56,6 @@ func (vh *vhost) lookupCertificate(hello *tls.ClientHelloInfo) (*tls.Certificate return vh.loadedCerts[0], nil } - for _, cert := range vh.loadedCerts { - err := hello.SupportsCertificate(cert) - if err == nil { - return cert, err - } - } - for _, cert := range vh.loadedCerts { if cert.Leaf == nil { cert.Leaf, _ = x509.ParseCertificate(cert.Certificate[0]) diff --git a/src/serverHandler/pathValues.go b/src/serverHandler/pathValues.go index 221196ad..8822e9b6 100644 --- a/src/serverHandler/pathValues.go +++ b/src/serverHandler/pathValues.go @@ -4,26 +4,26 @@ package serverHandler type prefixFilter func(whole, prefix string) bool -// pathValues +// pathInts -type pathValues[T any] struct { +type pathInts struct { path string - values []T + values []int } -type pathValuesList[T any] []pathValues[T] +type pathIntsList []pathInts -func (list pathValuesList[T]) mergePrefixMatched(mergeWith []T, matchPrefix prefixFilter, refPath string) []T { - var result []T +func (list pathIntsList) mergePrefixMatched(mergeWith []int, matchPrefix prefixFilter, refPath string) []int { + var result []int if mergeWith != nil { - result = make([]T, len(mergeWith)) + result = make([]int, len(mergeWith)) copy(result, mergeWith) } for i := range list { if matchPrefix(refPath, list[i].path) { if result == nil { - result = []T{} + result = []int{} } result = append(result, list[i].values...) } @@ -36,8 +36,8 @@ func (list pathValuesList[T]) mergePrefixMatched(mergeWith []T, matchPrefix pref } } -func (list pathValuesList[T]) filterSuccessor(includeSelfPredecessor bool, matchPrefix prefixFilter, refPath string) pathValuesList[T] { - var result pathValuesList[T] +func (list pathIntsList) filterSuccessor(includeSelfPredecessor bool, matchPrefix prefixFilter, refPath string) pathIntsList { + var result pathIntsList for i := range list { if len(list[i].path) <= len(refPath) { @@ -56,20 +56,109 @@ func (list pathValuesList[T]) filterSuccessor(includeSelfPredecessor bool, match } } -// pathInts +// pathStrings -type pathInts = pathValues[int] -type pathIntsList = pathValuesList[int] +type pathStrings struct { + path string + values []string +} -// pathStrings +type pathStringsList []pathStrings + +func (list pathStringsList) mergePrefixMatched(mergeWith []string, matchPrefix prefixFilter, refPath string) []string { + var result []string + if mergeWith != nil { + result = make([]string, len(mergeWith)) + copy(result, mergeWith) + } + + for i := range list { + if matchPrefix(refPath, list[i].path) { + if result == nil { + result = []string{} + } + result = append(result, list[i].values...) + } + } + + if mergeWith != nil && len(mergeWith) == len(result) { + return mergeWith + } else { + return result + } +} -type pathStrings = pathValues[string] -type pathStringsList = pathValuesList[string] +func (list pathStringsList) filterSuccessor(includeSelfPredecessor bool, matchPrefix prefixFilter, refPath string) pathStringsList { + var result pathStringsList + + for i := range list { + if len(list[i].path) <= len(refPath) { + if includeSelfPredecessor && matchPrefix(refPath, list[i].path) { + result = append(result, list[i]) + } + } else if matchPrefix(list[i].path, refPath) { + result = append(result, list[i]) + } + } + + if len(list) == len(result) { + return list + } else { + return result + } +} // pathHeaders -type pathHeaders = pathValues[[2]string] -type pathHeadersList = pathValuesList[[2]string] +type pathHeaders struct { + path string + values [][2]string +} + +type pathHeadersList []pathHeaders + +func (list pathHeadersList) mergePrefixMatched(mergeWith [][2]string, matchPrefix prefixFilter, refPath string) [][2]string { + var result [][2]string + if mergeWith != nil { + result = make([][2]string, len(mergeWith)) + copy(result, mergeWith) + } + + for i := range list { + if matchPrefix(refPath, list[i].path) { + if result == nil { + result = [][2]string{} + } + result = append(result, list[i].values...) + } + } + + if mergeWith != nil && len(mergeWith) == len(result) { + return mergeWith + } else { + return result + } +} + +func (list pathHeadersList) filterSuccessor(includeSelfPredecessor bool, matchPrefix prefixFilter, refPath string) pathHeadersList { + var result pathHeadersList + + for i := range list { + if len(list[i].path) <= len(refPath) { + if includeSelfPredecessor && matchPrefix(refPath, list[i].path) { + result = append(result, list[i]) + } + } else if matchPrefix(list[i].path, refPath) { + result = append(result, list[i]) + } + } + + if len(list) == len(result) { + return list + } else { + return result + } +} // []string diff --git a/src/serverHandler/util.go b/src/serverHandler/util.go index 38564e39..71b83771 100644 --- a/src/serverHandler/util.go +++ b/src/serverHandler/util.go @@ -68,7 +68,7 @@ func NeedResponseBody(method string) bool { } func lacksHeader(header http.Header, key string) bool { - return len(header.Values(key)) == 0 + return len(header.Get(key)) == 0 } func getCleanFilePath(requestPath string) (filePath string, ok bool) { diff --git a/src/tpl/defaultTheme/defaultTheme.go b/src/tpl/defaultTheme/defaultTheme.go index 7e3f206b..f897a5d4 100644 --- a/src/tpl/defaultTheme/defaultTheme.go +++ b/src/tpl/defaultTheme/defaultTheme.go @@ -2,35 +2,24 @@ package defaultTheme import ( "bytes" - _ "embed" + "mjpclab.dev/ghfs/src/tpl/defaultTheme/frontend" "mjpclab.dev/ghfs/src/tpl/theme" + "strings" ) -//go:embed frontend/index.html -var defaultTplStr string - -//go:embed frontend/index.css -var defaultCss []byte - -//go:embed frontend/index.js -var defaultJs []byte - -//go:embed frontend/favicon.ico -var defaultFavicon []byte - var DefaultTheme theme.MemTheme func init() { var err error - DefaultTheme.Template, err = theme.ParsePageTpl(defaultTplStr) + DefaultTheme.Template, err = theme.ParsePageTpl(frontend.DefaultTplStr) if err != nil { DefaultTheme.Template, _ = theme.ParsePageTpl("Builtin Template Error") } DefaultTheme.Assets = theme.Assets{ - {"index.css", "text/css; charset=utf-8", bytes.NewReader(defaultCss)}, - {"index.js", "application/javascript; charset=utf-8", bytes.NewReader(defaultJs)}, - {"favicon.ico", "image/x-icon", bytes.NewReader(defaultFavicon)}, + {"index.css", "text/css; charset=utf-8", strings.NewReader(frontend.DefaultCss)}, + {"index.js", "application/javascript; charset=utf-8", strings.NewReader(frontend.DefaultJs)}, + {"favicon.ico", "image/x-icon", bytes.NewReader(frontend.DefaultFavicon)}, } } diff --git a/src/tpl/defaultTheme/frontend/favicon.ico.go b/src/tpl/defaultTheme/frontend/favicon.ico.go new file mode 100644 index 00000000..47f62b07 --- /dev/null +++ b/src/tpl/defaultTheme/frontend/favicon.ico.go @@ -0,0 +1,341 @@ +package frontend + +var DefaultFavicon = []byte{ + 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xa8, 0x08, + 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xc8, 0x06, + 0x00, 0x00, 0xde, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x68, 0x05, + 0x00, 0x00, 0xa6, 0x0f, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x08, 0x08, + 0x08, 0x00, 0x17, 0x17, 0x17, 0x00, 0x27, 0x27, 0x27, 0x00, 0x37, 0x37, 0x37, 0x00, 0x47, 0x47, + 0x47, 0x00, 0x57, 0x57, 0x57, 0x00, 0x67, 0x67, 0x67, 0x00, 0x77, 0x77, 0x77, 0x00, 0x87, 0x87, + 0x87, 0x00, 0x97, 0x97, 0x97, 0x00, 0xa7, 0xa7, 0xa7, 0x00, 0xb7, 0xb7, 0xb7, 0x00, 0xc7, 0xc7, + 0xc7, 0x00, 0xd7, 0xd7, 0xd7, 0x00, 0xe7, 0xe7, 0xe7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x19, 0x19, + 0xff, 0x00, 0x4c, 0x4c, 0xfe, 0x00, 0x7f, 0x7f, 0xff, 0x00, 0xb2, 0xb2, 0xff, 0x00, 0x00, 0x10, + 0x4c, 0x00, 0x00, 0x1b, 0x7f, 0x00, 0x00, 0x26, 0xb2, 0x00, 0x00, 0x31, 0xe5, 0x00, 0x19, 0x4a, + 0xff, 0x00, 0x4c, 0x72, 0xfe, 0x00, 0x7f, 0x9a, 0xff, 0x00, 0xb2, 0xc2, 0xff, 0x00, 0x00, 0x20, + 0x4c, 0x00, 0x00, 0x36, 0x7f, 0x00, 0x00, 0x4c, 0xb2, 0x00, 0x00, 0x62, 0xe5, 0x00, 0x19, 0x7b, + 0xff, 0x00, 0x4c, 0x99, 0xfe, 0x00, 0x7f, 0xb6, 0xff, 0x00, 0xb2, 0xd3, 0xff, 0x00, 0x00, 0x31, + 0x4c, 0x00, 0x00, 0x51, 0x7f, 0x00, 0x00, 0x72, 0xb2, 0x00, 0x00, 0x93, 0xe5, 0x00, 0x19, 0xad, + 0xff, 0x00, 0x4c, 0xbf, 0xfe, 0x00, 0x7f, 0xd1, 0xff, 0x00, 0xb2, 0xe3, 0xff, 0x00, 0x00, 0x41, + 0x4c, 0x00, 0x00, 0x6d, 0x7f, 0x00, 0x00, 0x99, 0xb2, 0x00, 0x00, 0xc4, 0xe5, 0x00, 0x19, 0xde, + 0xff, 0x00, 0x4c, 0xe5, 0xfe, 0x00, 0x7f, 0xec, 0xff, 0x00, 0xb2, 0xf4, 0xff, 0x00, 0x00, 0x4c, + 0x47, 0x00, 0x00, 0x7f, 0x76, 0x00, 0x00, 0xb2, 0xa5, 0x00, 0x00, 0xe5, 0xd5, 0x00, 0x19, 0xff, + 0xee, 0x00, 0x4c, 0xfe, 0xf2, 0x00, 0x7f, 0xff, 0xf5, 0x00, 0xb2, 0xff, 0xf9, 0x00, 0x00, 0x4c, + 0x36, 0x00, 0x00, 0x7f, 0x5b, 0x00, 0x00, 0xb2, 0x7f, 0x00, 0x00, 0xe5, 0xa3, 0x00, 0x19, 0xff, + 0xbd, 0x00, 0x4c, 0xfe, 0xcc, 0x00, 0x7f, 0xff, 0xda, 0x00, 0xb2, 0xff, 0xe9, 0x00, 0x00, 0x4c, + 0x26, 0x00, 0x00, 0x7f, 0x3f, 0x00, 0x00, 0xb2, 0x59, 0x00, 0x00, 0xe5, 0x72, 0x00, 0x19, 0xff, + 0x8c, 0x00, 0x4c, 0xfe, 0xa5, 0x00, 0x7f, 0xff, 0xbf, 0x00, 0xb2, 0xff, 0xd8, 0x00, 0x00, 0x4c, + 0x15, 0x00, 0x00, 0x7f, 0x24, 0x00, 0x00, 0xb2, 0x33, 0x00, 0x00, 0xe5, 0x41, 0x00, 0x19, 0xff, + 0x5b, 0x00, 0x4c, 0xfe, 0x7f, 0x00, 0x7f, 0xff, 0xa3, 0x00, 0xb2, 0xff, 0xc8, 0x00, 0x00, 0x4c, + 0x05, 0x00, 0x00, 0x7f, 0x09, 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, 0xe5, 0x10, 0x00, 0x19, 0xff, + 0x29, 0x00, 0x4c, 0xfe, 0x59, 0x00, 0x7f, 0xff, 0x88, 0x00, 0xb2, 0xff, 0xb7, 0x00, 0x0a, 0x4c, + 0x00, 0x00, 0x12, 0x7f, 0x00, 0x00, 0x19, 0xb2, 0x00, 0x00, 0x20, 0xe5, 0x00, 0x00, 0x3a, 0xff, + 0x19, 0x00, 0x66, 0xfe, 0x4c, 0x00, 0x91, 0xff, 0x7f, 0x00, 0xbd, 0xff, 0xb2, 0x00, 0x1b, 0x4c, + 0x00, 0x00, 0x2d, 0x7f, 0x00, 0x00, 0x3f, 0xb2, 0x00, 0x00, 0x51, 0xe5, 0x00, 0x00, 0x6b, 0xff, + 0x19, 0x00, 0x8c, 0xfe, 0x4c, 0x00, 0xad, 0xff, 0x7f, 0x00, 0xcd, 0xff, 0xb2, 0x00, 0x2b, 0x4c, + 0x00, 0x00, 0x48, 0x7f, 0x00, 0x00, 0x65, 0xb2, 0x00, 0x00, 0x83, 0xe5, 0x00, 0x00, 0x9c, 0xff, + 0x19, 0x00, 0xb2, 0xfe, 0x4c, 0x00, 0xc8, 0xff, 0x7f, 0x00, 0xde, 0xff, 0xb2, 0x00, 0x3c, 0x4c, + 0x00, 0x00, 0x64, 0x7f, 0x00, 0x00, 0x8c, 0xb2, 0x00, 0x00, 0xb4, 0xe5, 0x00, 0x00, 0xcd, 0xff, + 0x19, 0x00, 0xd8, 0xfe, 0x4c, 0x00, 0xe3, 0xff, 0x7f, 0x00, 0xee, 0xff, 0xb2, 0x00, 0x4c, 0x4c, + 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xb2, 0xb2, 0x00, 0x00, 0xe5, 0xe5, 0x00, 0x00, 0xff, 0xff, + 0x19, 0x00, 0xfe, 0xfe, 0x4c, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xb2, 0x00, 0x4c, 0x3c, + 0x00, 0x00, 0x7f, 0x64, 0x00, 0x00, 0xb2, 0x8c, 0x00, 0x00, 0xe5, 0xb4, 0x00, 0x00, 0xff, 0xcd, + 0x19, 0x00, 0xfe, 0xd8, 0x4c, 0x00, 0xff, 0xe3, 0x7f, 0x00, 0xff, 0xee, 0xb2, 0x00, 0x4c, 0x2b, + 0x00, 0x00, 0x7f, 0x48, 0x00, 0x00, 0xb2, 0x66, 0x00, 0x00, 0xe5, 0x83, 0x00, 0x00, 0xff, 0x9c, + 0x19, 0x00, 0xfe, 0xb2, 0x4c, 0x00, 0xff, 0xc8, 0x7f, 0x00, 0xff, 0xde, 0xb2, 0x00, 0x4c, 0x1b, + 0x00, 0x00, 0x7f, 0x2d, 0x00, 0x00, 0xb2, 0x3f, 0x00, 0x00, 0xe5, 0x51, 0x00, 0x00, 0xff, 0x6b, + 0x19, 0x00, 0xfe, 0x8c, 0x4c, 0x00, 0xff, 0xad, 0x7f, 0x00, 0xff, 0xcd, 0xb2, 0x00, 0x4c, 0x0a, + 0x00, 0x00, 0x7f, 0x12, 0x00, 0x00, 0xb2, 0x19, 0x00, 0x00, 0xe5, 0x20, 0x00, 0x00, 0xff, 0x3a, + 0x19, 0x00, 0xfe, 0x65, 0x4c, 0x00, 0xff, 0x91, 0x7f, 0x00, 0xff, 0xbd, 0xb2, 0x00, 0x4c, 0x00, + 0x05, 0x00, 0x7f, 0x00, 0x09, 0x00, 0xb2, 0x00, 0x0c, 0x00, 0xe5, 0x00, 0x10, 0x00, 0xff, 0x19, + 0x29, 0x00, 0xfe, 0x4c, 0x59, 0x00, 0xff, 0x7f, 0x88, 0x00, 0xff, 0xb2, 0xb7, 0x00, 0x4c, 0x00, + 0x15, 0x00, 0x7f, 0x00, 0x24, 0x00, 0xb2, 0x00, 0x32, 0x00, 0xe5, 0x00, 0x41, 0x00, 0xff, 0x19, + 0x5b, 0x00, 0xfe, 0x4c, 0x7f, 0x00, 0xff, 0x7f, 0xa3, 0x00, 0xff, 0xb2, 0xc8, 0x00, 0x4c, 0x00, + 0x26, 0x00, 0x7f, 0x00, 0x3f, 0x00, 0xb2, 0x00, 0x59, 0x00, 0xe5, 0x00, 0x72, 0x00, 0xff, 0x19, + 0x8c, 0x00, 0xfe, 0x4c, 0xa5, 0x00, 0xff, 0x7f, 0xbf, 0x00, 0xff, 0xb2, 0xd8, 0x00, 0x4c, 0x00, + 0x36, 0x00, 0x7f, 0x00, 0x5b, 0x00, 0xb2, 0x00, 0x7f, 0x00, 0xe5, 0x00, 0xa3, 0x00, 0xff, 0x19, + 0xbd, 0x00, 0xfe, 0x4c, 0xcc, 0x00, 0xff, 0x7f, 0xda, 0x00, 0xff, 0xb2, 0xe9, 0x00, 0x4c, 0x00, + 0x47, 0x00, 0x7f, 0x00, 0x76, 0x00, 0xb2, 0x00, 0xa5, 0x00, 0xe5, 0x00, 0xd5, 0x00, 0xff, 0x19, + 0xee, 0x00, 0xfe, 0x4c, 0xf2, 0x00, 0xff, 0x7f, 0xf5, 0x00, 0xff, 0xb2, 0xf9, 0x00, 0x41, 0x00, + 0x4c, 0x00, 0x6d, 0x00, 0x7f, 0x00, 0x99, 0x00, 0xb2, 0x00, 0xc4, 0x00, 0xe5, 0x00, 0xde, 0x19, + 0xff, 0x00, 0xe5, 0x4c, 0xfe, 0x00, 0xec, 0x7f, 0xff, 0x00, 0xf4, 0xb2, 0xff, 0x00, 0x31, 0x00, + 0x4c, 0x00, 0x51, 0x00, 0x7f, 0x00, 0x72, 0x00, 0xb2, 0x00, 0x93, 0x00, 0xe5, 0x00, 0xad, 0x19, + 0xff, 0x00, 0xbf, 0x4c, 0xfe, 0x00, 0xd1, 0x7f, 0xff, 0x00, 0xe3, 0xb2, 0xff, 0x00, 0x20, 0x00, + 0x4c, 0x00, 0x36, 0x00, 0x7f, 0x00, 0x4c, 0x00, 0xb2, 0x00, 0x62, 0x00, 0xe5, 0x00, 0x7b, 0x19, + 0xff, 0x00, 0x99, 0x4c, 0xfe, 0x00, 0xb6, 0x7f, 0xff, 0x00, 0xd3, 0xb2, 0xff, 0x00, 0x10, 0x00, + 0x4c, 0x00, 0x1b, 0x00, 0x7f, 0x00, 0x26, 0x00, 0xb2, 0x00, 0x31, 0x00, 0xe5, 0x00, 0x4a, 0x19, + 0xff, 0x00, 0x72, 0x4c, 0xfe, 0x00, 0x9a, 0x7f, 0xff, 0x00, 0xc2, 0xb2, 0xff, 0x00, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x08, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x08, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x08, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x08, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x08, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x08, + 0x08, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x1d, 0x08, + 0x08, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x08, 0x08, 0x08, 0x00, 0x17, 0x17, 0x17, 0x00, 0x27, 0x27, + 0x27, 0x00, 0x37, 0x37, 0x37, 0x00, 0x47, 0x47, 0x47, 0x00, 0x57, 0x57, 0x57, 0x00, 0x67, 0x67, + 0x67, 0x00, 0x77, 0x77, 0x77, 0x00, 0x87, 0x87, 0x87, 0x00, 0x97, 0x97, 0x97, 0x00, 0xa7, 0xa7, + 0xa7, 0x00, 0xb7, 0xb7, 0xb7, 0x00, 0xc7, 0xc7, 0xc7, 0x00, 0xd7, 0xd7, 0xd7, 0x00, 0xe7, 0xe7, + 0xe7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, + 0xb2, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x19, 0x19, 0xff, 0x00, 0x4c, 0x4c, 0xfe, 0x00, 0x7f, 0x7f, + 0xff, 0x00, 0xb2, 0xb2, 0xff, 0x00, 0x00, 0x10, 0x4c, 0x00, 0x00, 0x1b, 0x7f, 0x00, 0x00, 0x26, + 0xb2, 0x00, 0x00, 0x31, 0xe5, 0x00, 0x19, 0x4a, 0xff, 0x00, 0x4c, 0x72, 0xfe, 0x00, 0x7f, 0x9a, + 0xff, 0x00, 0xb2, 0xc2, 0xff, 0x00, 0x00, 0x20, 0x4c, 0x00, 0x00, 0x36, 0x7f, 0x00, 0x00, 0x4c, + 0xb2, 0x00, 0x00, 0x62, 0xe5, 0x00, 0x19, 0x7b, 0xff, 0x00, 0x4c, 0x99, 0xfe, 0x00, 0x7f, 0xb6, + 0xff, 0x00, 0xb2, 0xd3, 0xff, 0x00, 0x00, 0x31, 0x4c, 0x00, 0x00, 0x51, 0x7f, 0x00, 0x00, 0x72, + 0xb2, 0x00, 0x00, 0x93, 0xe5, 0x00, 0x19, 0xad, 0xff, 0x00, 0x4c, 0xbf, 0xfe, 0x00, 0x7f, 0xd1, + 0xff, 0x00, 0xb2, 0xe3, 0xff, 0x00, 0x00, 0x41, 0x4c, 0x00, 0x00, 0x6d, 0x7f, 0x00, 0x00, 0x99, + 0xb2, 0x00, 0x00, 0xc4, 0xe5, 0x00, 0x19, 0xde, 0xff, 0x00, 0x4c, 0xe5, 0xfe, 0x00, 0x7f, 0xec, + 0xff, 0x00, 0xb2, 0xf4, 0xff, 0x00, 0x00, 0x4c, 0x47, 0x00, 0x00, 0x7f, 0x76, 0x00, 0x00, 0xb2, + 0xa5, 0x00, 0x00, 0xe5, 0xd5, 0x00, 0x19, 0xff, 0xee, 0x00, 0x4c, 0xfe, 0xf2, 0x00, 0x7f, 0xff, + 0xf5, 0x00, 0xb2, 0xff, 0xf9, 0x00, 0x00, 0x4c, 0x36, 0x00, 0x00, 0x7f, 0x5b, 0x00, 0x00, 0xb2, + 0x7f, 0x00, 0x00, 0xe5, 0xa3, 0x00, 0x19, 0xff, 0xbd, 0x00, 0x4c, 0xfe, 0xcc, 0x00, 0x7f, 0xff, + 0xda, 0x00, 0xb2, 0xff, 0xe9, 0x00, 0x00, 0x4c, 0x26, 0x00, 0x00, 0x7f, 0x3f, 0x00, 0x00, 0xb2, + 0x59, 0x00, 0x00, 0xe5, 0x72, 0x00, 0x19, 0xff, 0x8c, 0x00, 0x4c, 0xfe, 0xa5, 0x00, 0x7f, 0xff, + 0xbf, 0x00, 0xb2, 0xff, 0xd8, 0x00, 0x00, 0x4c, 0x15, 0x00, 0x00, 0x7f, 0x24, 0x00, 0x00, 0xb2, + 0x33, 0x00, 0x00, 0xe5, 0x41, 0x00, 0x19, 0xff, 0x5b, 0x00, 0x4c, 0xfe, 0x7f, 0x00, 0x7f, 0xff, + 0xa3, 0x00, 0xb2, 0xff, 0xc8, 0x00, 0x00, 0x4c, 0x05, 0x00, 0x00, 0x7f, 0x09, 0x00, 0x00, 0xb2, + 0x0c, 0x00, 0x00, 0xe5, 0x10, 0x00, 0x19, 0xff, 0x29, 0x00, 0x4c, 0xfe, 0x59, 0x00, 0x7f, 0xff, + 0x88, 0x00, 0xb2, 0xff, 0xb7, 0x00, 0x0a, 0x4c, 0x00, 0x00, 0x12, 0x7f, 0x00, 0x00, 0x19, 0xb2, + 0x00, 0x00, 0x20, 0xe5, 0x00, 0x00, 0x3a, 0xff, 0x19, 0x00, 0x66, 0xfe, 0x4c, 0x00, 0x91, 0xff, + 0x7f, 0x00, 0xbd, 0xff, 0xb2, 0x00, 0x1b, 0x4c, 0x00, 0x00, 0x2d, 0x7f, 0x00, 0x00, 0x3f, 0xb2, + 0x00, 0x00, 0x51, 0xe5, 0x00, 0x00, 0x6b, 0xff, 0x19, 0x00, 0x8c, 0xfe, 0x4c, 0x00, 0xad, 0xff, + 0x7f, 0x00, 0xcd, 0xff, 0xb2, 0x00, 0x2b, 0x4c, 0x00, 0x00, 0x48, 0x7f, 0x00, 0x00, 0x65, 0xb2, + 0x00, 0x00, 0x83, 0xe5, 0x00, 0x00, 0x9c, 0xff, 0x19, 0x00, 0xb2, 0xfe, 0x4c, 0x00, 0xc8, 0xff, + 0x7f, 0x00, 0xde, 0xff, 0xb2, 0x00, 0x3c, 0x4c, 0x00, 0x00, 0x64, 0x7f, 0x00, 0x00, 0x8c, 0xb2, + 0x00, 0x00, 0xb4, 0xe5, 0x00, 0x00, 0xcd, 0xff, 0x19, 0x00, 0xd8, 0xfe, 0x4c, 0x00, 0xe3, 0xff, + 0x7f, 0x00, 0xee, 0xff, 0xb2, 0x00, 0x4c, 0x4c, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xb2, 0xb2, + 0x00, 0x00, 0xe5, 0xe5, 0x00, 0x00, 0xff, 0xff, 0x19, 0x00, 0xfe, 0xfe, 0x4c, 0x00, 0xff, 0xff, + 0x7f, 0x00, 0xff, 0xff, 0xb2, 0x00, 0x4c, 0x3c, 0x00, 0x00, 0x7f, 0x64, 0x00, 0x00, 0xb2, 0x8c, + 0x00, 0x00, 0xe5, 0xb4, 0x00, 0x00, 0xff, 0xcd, 0x19, 0x00, 0xfe, 0xd8, 0x4c, 0x00, 0xff, 0xe3, + 0x7f, 0x00, 0xff, 0xee, 0xb2, 0x00, 0x4c, 0x2b, 0x00, 0x00, 0x7f, 0x48, 0x00, 0x00, 0xb2, 0x66, + 0x00, 0x00, 0xe5, 0x83, 0x00, 0x00, 0xff, 0x9c, 0x19, 0x00, 0xfe, 0xb2, 0x4c, 0x00, 0xff, 0xc8, + 0x7f, 0x00, 0xff, 0xde, 0xb2, 0x00, 0x4c, 0x1b, 0x00, 0x00, 0x7f, 0x2d, 0x00, 0x00, 0xb2, 0x3f, + 0x00, 0x00, 0xe5, 0x51, 0x00, 0x00, 0xff, 0x6b, 0x19, 0x00, 0xfe, 0x8c, 0x4c, 0x00, 0xff, 0xad, + 0x7f, 0x00, 0xff, 0xcd, 0xb2, 0x00, 0x4c, 0x0a, 0x00, 0x00, 0x7f, 0x12, 0x00, 0x00, 0xb2, 0x19, + 0x00, 0x00, 0xe5, 0x20, 0x00, 0x00, 0xff, 0x3a, 0x19, 0x00, 0xfe, 0x65, 0x4c, 0x00, 0xff, 0x91, + 0x7f, 0x00, 0xff, 0xbd, 0xb2, 0x00, 0x4c, 0x00, 0x05, 0x00, 0x7f, 0x00, 0x09, 0x00, 0xb2, 0x00, + 0x0c, 0x00, 0xe5, 0x00, 0x10, 0x00, 0xff, 0x19, 0x29, 0x00, 0xfe, 0x4c, 0x59, 0x00, 0xff, 0x7f, + 0x88, 0x00, 0xff, 0xb2, 0xb7, 0x00, 0x4c, 0x00, 0x15, 0x00, 0x7f, 0x00, 0x24, 0x00, 0xb2, 0x00, + 0x32, 0x00, 0xe5, 0x00, 0x41, 0x00, 0xff, 0x19, 0x5b, 0x00, 0xfe, 0x4c, 0x7f, 0x00, 0xff, 0x7f, + 0xa3, 0x00, 0xff, 0xb2, 0xc8, 0x00, 0x4c, 0x00, 0x26, 0x00, 0x7f, 0x00, 0x3f, 0x00, 0xb2, 0x00, + 0x59, 0x00, 0xe5, 0x00, 0x72, 0x00, 0xff, 0x19, 0x8c, 0x00, 0xfe, 0x4c, 0xa5, 0x00, 0xff, 0x7f, + 0xbf, 0x00, 0xff, 0xb2, 0xd8, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x7f, 0x00, 0x5b, 0x00, 0xb2, 0x00, + 0x7f, 0x00, 0xe5, 0x00, 0xa3, 0x00, 0xff, 0x19, 0xbd, 0x00, 0xfe, 0x4c, 0xcc, 0x00, 0xff, 0x7f, + 0xda, 0x00, 0xff, 0xb2, 0xe9, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x7f, 0x00, 0x76, 0x00, 0xb2, 0x00, + 0xa5, 0x00, 0xe5, 0x00, 0xd5, 0x00, 0xff, 0x19, 0xee, 0x00, 0xfe, 0x4c, 0xf2, 0x00, 0xff, 0x7f, + 0xf5, 0x00, 0xff, 0xb2, 0xf9, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x6d, 0x00, 0x7f, 0x00, 0x99, 0x00, + 0xb2, 0x00, 0xc4, 0x00, 0xe5, 0x00, 0xde, 0x19, 0xff, 0x00, 0xe5, 0x4c, 0xfe, 0x00, 0xec, 0x7f, + 0xff, 0x00, 0xf4, 0xb2, 0xff, 0x00, 0x31, 0x00, 0x4c, 0x00, 0x51, 0x00, 0x7f, 0x00, 0x72, 0x00, + 0xb2, 0x00, 0x93, 0x00, 0xe5, 0x00, 0xad, 0x19, 0xff, 0x00, 0xbf, 0x4c, 0xfe, 0x00, 0xd1, 0x7f, + 0xff, 0x00, 0xe3, 0xb2, 0xff, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x7f, 0x00, 0x4c, 0x00, + 0xb2, 0x00, 0x62, 0x00, 0xe5, 0x00, 0x7b, 0x19, 0xff, 0x00, 0x99, 0x4c, 0xfe, 0x00, 0xb6, 0x7f, + 0xff, 0x00, 0xd3, 0xb2, 0xff, 0x00, 0x10, 0x00, 0x4c, 0x00, 0x1b, 0x00, 0x7f, 0x00, 0x26, 0x00, + 0xb2, 0x00, 0x31, 0x00, 0xe5, 0x00, 0x4a, 0x19, 0xff, 0x00, 0x72, 0x4c, 0xfe, 0x00, 0x9a, 0x7f, + 0xff, 0x00, 0xc2, 0xb2, 0xff, 0x00, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x08, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x08, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x08, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x08, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x08, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x08, + 0x08, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x08, 0x08, + 0x1d, 0x1d, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x08, 0x08, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x08, 0x08, + 0x08, 0x00, 0x17, 0x17, 0x17, 0x00, 0x27, 0x27, 0x27, 0x00, 0x37, 0x37, 0x37, 0x00, 0x47, 0x47, + 0x47, 0x00, 0x57, 0x57, 0x57, 0x00, 0x67, 0x67, 0x67, 0x00, 0x77, 0x77, 0x77, 0x00, 0x87, 0x87, + 0x87, 0x00, 0x97, 0x97, 0x97, 0x00, 0xa7, 0xa7, 0xa7, 0x00, 0xb7, 0xb7, 0xb7, 0x00, 0xc7, 0xc7, + 0xc7, 0x00, 0xd7, 0xd7, 0xd7, 0x00, 0xe7, 0xe7, 0xe7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x19, 0x19, + 0xff, 0x00, 0x4c, 0x4c, 0xfe, 0x00, 0x7f, 0x7f, 0xff, 0x00, 0xb2, 0xb2, 0xff, 0x00, 0x00, 0x10, + 0x4c, 0x00, 0x00, 0x1b, 0x7f, 0x00, 0x00, 0x26, 0xb2, 0x00, 0x00, 0x31, 0xe5, 0x00, 0x19, 0x4a, + 0xff, 0x00, 0x4c, 0x72, 0xfe, 0x00, 0x7f, 0x9a, 0xff, 0x00, 0xb2, 0xc2, 0xff, 0x00, 0x00, 0x20, + 0x4c, 0x00, 0x00, 0x36, 0x7f, 0x00, 0x00, 0x4c, 0xb2, 0x00, 0x00, 0x62, 0xe5, 0x00, 0x19, 0x7b, + 0xff, 0x00, 0x4c, 0x99, 0xfe, 0x00, 0x7f, 0xb6, 0xff, 0x00, 0xb2, 0xd3, 0xff, 0x00, 0x00, 0x31, + 0x4c, 0x00, 0x00, 0x51, 0x7f, 0x00, 0x00, 0x72, 0xb2, 0x00, 0x00, 0x93, 0xe5, 0x00, 0x19, 0xad, + 0xff, 0x00, 0x4c, 0xbf, 0xfe, 0x00, 0x7f, 0xd1, 0xff, 0x00, 0xb2, 0xe3, 0xff, 0x00, 0x00, 0x41, + 0x4c, 0x00, 0x00, 0x6d, 0x7f, 0x00, 0x00, 0x99, 0xb2, 0x00, 0x00, 0xc4, 0xe5, 0x00, 0x19, 0xde, + 0xff, 0x00, 0x4c, 0xe5, 0xfe, 0x00, 0x7f, 0xec, 0xff, 0x00, 0xb2, 0xf4, 0xff, 0x00, 0x00, 0x4c, + 0x47, 0x00, 0x00, 0x7f, 0x76, 0x00, 0x00, 0xb2, 0xa5, 0x00, 0x00, 0xe5, 0xd5, 0x00, 0x19, 0xff, + 0xee, 0x00, 0x4c, 0xfe, 0xf2, 0x00, 0x7f, 0xff, 0xf5, 0x00, 0xb2, 0xff, 0xf9, 0x00, 0x00, 0x4c, + 0x36, 0x00, 0x00, 0x7f, 0x5b, 0x00, 0x00, 0xb2, 0x7f, 0x00, 0x00, 0xe5, 0xa3, 0x00, 0x19, 0xff, + 0xbd, 0x00, 0x4c, 0xfe, 0xcc, 0x00, 0x7f, 0xff, 0xda, 0x00, 0xb2, 0xff, 0xe9, 0x00, 0x00, 0x4c, + 0x26, 0x00, 0x00, 0x7f, 0x3f, 0x00, 0x00, 0xb2, 0x59, 0x00, 0x00, 0xe5, 0x72, 0x00, 0x19, 0xff, + 0x8c, 0x00, 0x4c, 0xfe, 0xa5, 0x00, 0x7f, 0xff, 0xbf, 0x00, 0xb2, 0xff, 0xd8, 0x00, 0x00, 0x4c, + 0x15, 0x00, 0x00, 0x7f, 0x24, 0x00, 0x00, 0xb2, 0x33, 0x00, 0x00, 0xe5, 0x41, 0x00, 0x19, 0xff, + 0x5b, 0x00, 0x4c, 0xfe, 0x7f, 0x00, 0x7f, 0xff, 0xa3, 0x00, 0xb2, 0xff, 0xc8, 0x00, 0x00, 0x4c, + 0x05, 0x00, 0x00, 0x7f, 0x09, 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, 0xe5, 0x10, 0x00, 0x19, 0xff, + 0x29, 0x00, 0x4c, 0xfe, 0x59, 0x00, 0x7f, 0xff, 0x88, 0x00, 0xb2, 0xff, 0xb7, 0x00, 0x0a, 0x4c, + 0x00, 0x00, 0x12, 0x7f, 0x00, 0x00, 0x19, 0xb2, 0x00, 0x00, 0x20, 0xe5, 0x00, 0x00, 0x3a, 0xff, + 0x19, 0x00, 0x66, 0xfe, 0x4c, 0x00, 0x91, 0xff, 0x7f, 0x00, 0xbd, 0xff, 0xb2, 0x00, 0x1b, 0x4c, + 0x00, 0x00, 0x2d, 0x7f, 0x00, 0x00, 0x3f, 0xb2, 0x00, 0x00, 0x51, 0xe5, 0x00, 0x00, 0x6b, 0xff, + 0x19, 0x00, 0x8c, 0xfe, 0x4c, 0x00, 0xad, 0xff, 0x7f, 0x00, 0xcd, 0xff, 0xb2, 0x00, 0x2b, 0x4c, + 0x00, 0x00, 0x48, 0x7f, 0x00, 0x00, 0x65, 0xb2, 0x00, 0x00, 0x83, 0xe5, 0x00, 0x00, 0x9c, 0xff, + 0x19, 0x00, 0xb2, 0xfe, 0x4c, 0x00, 0xc8, 0xff, 0x7f, 0x00, 0xde, 0xff, 0xb2, 0x00, 0x3c, 0x4c, + 0x00, 0x00, 0x64, 0x7f, 0x00, 0x00, 0x8c, 0xb2, 0x00, 0x00, 0xb4, 0xe5, 0x00, 0x00, 0xcd, 0xff, + 0x19, 0x00, 0xd8, 0xfe, 0x4c, 0x00, 0xe3, 0xff, 0x7f, 0x00, 0xee, 0xff, 0xb2, 0x00, 0x4c, 0x4c, + 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xb2, 0xb2, 0x00, 0x00, 0xe5, 0xe5, 0x00, 0x00, 0xff, 0xff, + 0x19, 0x00, 0xfe, 0xfe, 0x4c, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xb2, 0x00, 0x4c, 0x3c, + 0x00, 0x00, 0x7f, 0x64, 0x00, 0x00, 0xb2, 0x8c, 0x00, 0x00, 0xe5, 0xb4, 0x00, 0x00, 0xff, 0xcd, + 0x19, 0x00, 0xfe, 0xd8, 0x4c, 0x00, 0xff, 0xe3, 0x7f, 0x00, 0xff, 0xee, 0xb2, 0x00, 0x4c, 0x2b, + 0x00, 0x00, 0x7f, 0x48, 0x00, 0x00, 0xb2, 0x66, 0x00, 0x00, 0xe5, 0x83, 0x00, 0x00, 0xff, 0x9c, + 0x19, 0x00, 0xfe, 0xb2, 0x4c, 0x00, 0xff, 0xc8, 0x7f, 0x00, 0xff, 0xde, 0xb2, 0x00, 0x4c, 0x1b, + 0x00, 0x00, 0x7f, 0x2d, 0x00, 0x00, 0xb2, 0x3f, 0x00, 0x00, 0xe5, 0x51, 0x00, 0x00, 0xff, 0x6b, + 0x19, 0x00, 0xfe, 0x8c, 0x4c, 0x00, 0xff, 0xad, 0x7f, 0x00, 0xff, 0xcd, 0xb2, 0x00, 0x4c, 0x0a, + 0x00, 0x00, 0x7f, 0x12, 0x00, 0x00, 0xb2, 0x19, 0x00, 0x00, 0xe5, 0x20, 0x00, 0x00, 0xff, 0x3a, + 0x19, 0x00, 0xfe, 0x65, 0x4c, 0x00, 0xff, 0x91, 0x7f, 0x00, 0xff, 0xbd, 0xb2, 0x00, 0x4c, 0x00, + 0x05, 0x00, 0x7f, 0x00, 0x09, 0x00, 0xb2, 0x00, 0x0c, 0x00, 0xe5, 0x00, 0x10, 0x00, 0xff, 0x19, + 0x29, 0x00, 0xfe, 0x4c, 0x59, 0x00, 0xff, 0x7f, 0x88, 0x00, 0xff, 0xb2, 0xb7, 0x00, 0x4c, 0x00, + 0x15, 0x00, 0x7f, 0x00, 0x24, 0x00, 0xb2, 0x00, 0x32, 0x00, 0xe5, 0x00, 0x41, 0x00, 0xff, 0x19, + 0x5b, 0x00, 0xfe, 0x4c, 0x7f, 0x00, 0xff, 0x7f, 0xa3, 0x00, 0xff, 0xb2, 0xc8, 0x00, 0x4c, 0x00, + 0x26, 0x00, 0x7f, 0x00, 0x3f, 0x00, 0xb2, 0x00, 0x59, 0x00, 0xe5, 0x00, 0x72, 0x00, 0xff, 0x19, + 0x8c, 0x00, 0xfe, 0x4c, 0xa5, 0x00, 0xff, 0x7f, 0xbf, 0x00, 0xff, 0xb2, 0xd8, 0x00, 0x4c, 0x00, + 0x36, 0x00, 0x7f, 0x00, 0x5b, 0x00, 0xb2, 0x00, 0x7f, 0x00, 0xe5, 0x00, 0xa3, 0x00, 0xff, 0x19, + 0xbd, 0x00, 0xfe, 0x4c, 0xcc, 0x00, 0xff, 0x7f, 0xda, 0x00, 0xff, 0xb2, 0xe9, 0x00, 0x4c, 0x00, + 0x47, 0x00, 0x7f, 0x00, 0x76, 0x00, 0xb2, 0x00, 0xa5, 0x00, 0xe5, 0x00, 0xd5, 0x00, 0xff, 0x19, + 0xee, 0x00, 0xfe, 0x4c, 0xf2, 0x00, 0xff, 0x7f, 0xf5, 0x00, 0xff, 0xb2, 0xf9, 0x00, 0x41, 0x00, + 0x4c, 0x00, 0x6d, 0x00, 0x7f, 0x00, 0x99, 0x00, 0xb2, 0x00, 0xc4, 0x00, 0xe5, 0x00, 0xde, 0x19, + 0xff, 0x00, 0xe5, 0x4c, 0xfe, 0x00, 0xec, 0x7f, 0xff, 0x00, 0xf4, 0xb2, 0xff, 0x00, 0x31, 0x00, + 0x4c, 0x00, 0x51, 0x00, 0x7f, 0x00, 0x72, 0x00, 0xb2, 0x00, 0x93, 0x00, 0xe5, 0x00, 0xad, 0x19, + 0xff, 0x00, 0xbf, 0x4c, 0xfe, 0x00, 0xd1, 0x7f, 0xff, 0x00, 0xe3, 0xb2, 0xff, 0x00, 0x20, 0x00, + 0x4c, 0x00, 0x36, 0x00, 0x7f, 0x00, 0x4c, 0x00, 0xb2, 0x00, 0x62, 0x00, 0xe5, 0x00, 0x7b, 0x19, + 0xff, 0x00, 0x99, 0x4c, 0xfe, 0x00, 0xb6, 0x7f, 0xff, 0x00, 0xd3, 0xb2, 0xff, 0x00, 0x10, 0x00, + 0x4c, 0x00, 0x1b, 0x00, 0x7f, 0x00, 0x26, 0x00, 0xb2, 0x00, 0x31, 0x00, 0xe5, 0x00, 0x4a, 0x19, + 0xff, 0x00, 0x72, 0x4c, 0xfe, 0x00, 0x9a, 0x7f, 0xff, 0x00, 0xc2, 0xb2, 0xff, 0x00, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x08, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x0f, 0x0f, + 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, + 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x08, + 0x08, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x1d, 0x08, 0x08, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x08, + 0x08, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, 0x1d, 0x08, 0x08, 0x1d, 0x08, 0x08, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} diff --git a/src/tpl/defaultTheme/frontend/index.css.go b/src/tpl/defaultTheme/frontend/index.css.go new file mode 100644 index 00000000..75268ef6 --- /dev/null +++ b/src/tpl/defaultTheme/frontend/index.css.go @@ -0,0 +1,665 @@ +package frontend + +const DefaultCss = ` +html, body { + margin: 0; + padding: 0; + background: #fff; +} + +html { + font-family: "roboto_condensedbold", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +body { + color: #333; + font-size: 0.625em; + font-variant-ligatures: none; + font-variant-numeric: tabular-nums; + font-kerning: none; + -webkit-text-size-adjust: none; + text-size-adjust: none; + hyphens: none; + padding-bottom: 2em; +} + +body, input, textarea, button { + font-family: "Cascadia Mono", Consolas, "Lucida Console", "San Francisco Mono", Menlo, Monaco, "Andale Mono", "DejaVu Sans Mono", "Jetbrains Mono NL", monospace; +} + +input::-ms-clear { + display: none; +} + +form { + margin: 0; + padding: 0; +} + +ul, ol, li { + display: block; + margin: 0; + padding: 0; +} + +a { + display: block; + padding: 0.5em; + color: #000; + text-decoration: none; + outline: 0; +} + +a:hover { + background: #f5f5f5; +} + +a:focus { + background: #fffae0; +} + +a:hover:focus { + background: #faf7ea; +} + +input, button { + min-width: 0; + margin: 0; + padding: 0.25em 0; +} + +input[type=button], +input[type=submit], +input[type=reset], +button { + cursor: pointer; +} + +input:disabled[type=button], +input:disabled[type=submit], +input:disabled[type=reset], +button:disabled { + cursor: default; +} + +input[type=text] { + padding: 0.25em; +} + +em { + font-style: normal; + font-weight: normal; + padding: 0 0.2em; + border: 1px #ddd solid; + border-radius: 3px; +} + +.none, :root body .none { + display: none; +} + +.hidden { + visibility: hidden; +} + + +html::before { + display: none; + content: ''; + position: absolute; + position: fixed; + z-index: 2; + left: 0; + top: 0; + right: 0; + bottom: 0; + opacity: 0.7; + background: #c9c; +} + +html.dragging::before { + display: block; +} + + +.path-list { + font-size: 1.5em; + line-height: 1.2; + overflow: hidden; + border-bottom: 1px #999 solid; + zoom: 1; +} + +.path-list li { + position: relative; + float: left; + text-align: center; + white-space: nowrap; +} + +.path-list a { + display: block; + padding-right: 1.2em; + min-width: 1em; + white-space: pre-wrap; +} + +.path-list a:after { + content: ''; + position: absolute; + top: 50%; + right: 0.5em; + width: 0.4em; + height: 0.4em; + border: 1px solid; + border-color: #ccc #ccc transparent transparent; + -webkit-transform: rotate(45deg) translateY(-50%); + transform: rotate(45deg) translateY(-50%); +} + +.path-list li:last-child a { + padding-right: 0.5em; +} + +.path-list li:last-child a:after { + display: none; +} + +.login { + position: absolute; + z-index: 1; + right: 0; + padding: 0.5em 1em; +} + +.tab { + display: flex; + white-space: nowrap; + margin: 1em 1em -1em 1em; +} + +.tab label { + flex: 0 0 auto; + margin-right: 0.5em; + padding: 1em; + cursor: pointer; +} + +.tab label:focus { + outline: 0; + text-decoration: underline; + text-decoration-style: dotted; +} + +.tab label:hover { + background: #fbfbfb; +} + +.tab label.active { + color: #000; + background: #f7f7f7; +} + +.tab label:last-child { + margin-right: 0; +} + +.panel { + margin: 1em; + padding: 1em; + background: #f7f7f7; +} + +.upload-status { + visibility: hidden; + position: absolute; + position: sticky; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 4px; + margin-bottom: -4px; + background: #faf5fa; + background-color: rgba(204, 153, 204, 0.1); + pointer-events: none; +} + +.upload-status.uploading, +.upload-status.failed { + visibility: visible; +} + +.upload-status .label { + position: absolute; + left: 0; + top: 0; + width: 100%; + color: #fff; + text-align: center; + opacity: 0; + transition: transform .2s, opacity .2s; +} + +.upload-status .label .content { + position: relative; + display: inline-block; + vertical-align: top; + text-align: left; + text-align: start; + padding: 0.5em 1em; + box-sizing: border-box; + overflow-wrap: break-word; + word-break: break-word; +} + +.upload-status .info .content { + padding-left: 2.5em; + background: #c9c; + background-color: rgba(204, 153, 204, 0.8); +} + +@keyframes wheel { + from { + transform: rotate(0); + } + to { + transform: rotate(360deg); + } +} + +.upload-status .info .content:before, +.upload-status .info .content:after { + content: ''; + position: absolute; + left: 1em; + top: 0.70em; + width: 1em; + height: 1em; + box-sizing: border-box; + border: 2px solid rgba(255, 255, 255, 0.3); + border-radius: 50%; + animation: wheel 1s linear infinite; +} + +.upload-status .info .content:after { + border-color: currentColor transparent transparent transparent; +} + +.upload-status .warn .content { + background: #800000; + background-color: rgba(128, 0, 0, 0.8); +} + +.upload-status.uploading .info, +.upload-status.failed .warn { + opacity: 1; + -webkit-transform: translateY(25%); + transform: translateY(25%); +} + +.upload-status .progress { + position: absolute; + left: 0; + top: 0; + width: 0; + height: 100%; + background: #c9c; +} + +.upload { + position: relative; +} + +.upload input, +.upload button { + display: block; + width: 100%; + box-sizing: border-box; +} + +.upload button { + position: relative; + margin-top: 0.5em; + overflow: hidden; +} + +.upload button span { + position: relative; +} + +.archive { + margin: 1em; + overflow: hidden; + zoom: 1; +} + +.archive a { + position: relative; + float: left; + margin: 0 0.5em; + padding: 1em 1em 1em 3em; + border: 2px #f5f5f5 solid; +} + +.archive a:hover { + border-color: #ddd; +} + +.archive a:before { + content: ''; + position: absolute; + left: 1.1em; + top: 1em; + height: 1em; + width: 3px; + background: #aaa; +} + +.archive a:after { + content: ''; + position: absolute; + left: 0.6em; + top: 1em; + width: 0.5em; + height: 0.5em; + margin-left: 1px; + border: 3px #aaa solid; + border-top-color: transparent; + border-left-color: transparent; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +.mkdir form { + display: flex; + align-items: center; +} + +.mkdir .name { + flex: 1 1 auto; +} + +.mkdir .submit { + padding-left: 0.5em; + padding-right: 0.5em; +} + +.filter { + display: none; +} + +:root .filter { + display: block; +} + +.filter .form { + position: relative; + display: flex; +} + +.filter input { + flex: 1 1 auto; + width: 97%; + padding-right: 1.5em; + box-sizing: border-box; +} + +.filter button { + display: none; + position: absolute; + right: 0; + top: 0; + bottom: 0; + border: 0; + background: none; + padding: 0 0.5em; +} + +.item-list { + margin: 1em; + line-height: 1.2; +} + +.item-list li { + position: relative; + zoom: 1; +} + +.item-list a { + padding: 0.6em; +} + +.item-list .detail, +.item-list .delete { + display: flex; + flex-flow: row nowrap; + align-items: center; + border-bottom: 1px #f5f5f5 solid; + overflow: hidden; + zoom: 1; +} + +.has-deletable .detail { + padding-right: 2.2em; +} + +.item-list .field { + margin: 0 0 0 1em; + flex-shrink: 0; +} + +.item-list .name { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + margin-left: 0; + font-size: 1.5em; + white-space: pre-wrap; + word-break: break-all; +} + +.item-list .size { + white-space: nowrap; + text-align: right; + color: #666; +} + +.item-list .time { + color: #999; + text-align: right; + white-space: nowrap; + overflow: hidden; +} + +.item-list .delete { + position: absolute; + top: 0; + right: 0; + bottom: 0; + display: flex; + align-items: stretch; +} + +.item-list .delete button { + border: 0; + color: #800000; + background: none; + font-weight: bold; + font-size: 1.6em; + line-height: 1em; + padding: 0.1875em 0.3125em 0.3125em; +} + +.item-list .delete button:hover { + background: #fee; +} + +.item-list .header .detail { + background: #fcfcfc; +} + +.item-list .header .field { + display: inline-block; + margin: 0; + font-size: 1.5em; + color: #808080; + overflow: hidden; +} + +.item-list .header .time { + width: 6.5em; + text-align: center; +} + +.error { + margin: 1em; + padding: 1em; + background: #ffc; +} + +@media only screen and (prefers-color-scheme: light) { + html { + color-scheme: light; + } +} + +@media only screen and (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } + + html, body { + background: #111; + } + + body { + color: #ccc; + } + + a { + color: #ddd; + } + + a:hover { + background-color: #333; + } + + a:focus { + background-color: #330; + } + + a:hover:focus { + background-color: #33331a; + } + + em { + border-color: #555; + } + + .path-list { + border-bottom-color: #999; + } + + .path-list a:after { + border-color: #555 #555 transparent transparent; + } + + .tab label:hover { + background-color: #181818; + } + + .tab label.active { + color: #fff; + background-color: #222; + } + + .panel { + background-color: #222; + } + + .archive a { + border-color: #222; + } + + .archive a:hover { + border-color: #555; + } + + .item-list .detail, + .item-list .delete { + border-bottom-color: #222; + } + + .item-list .size { + color: #999; + } + + .item-list .time { + color: #666; + } + + .item-list .delete button { + color: #f99; + } + + .item-list .delete button:hover { + background-color: #433; + } + + .item-list .header .detail { + background-color: #181818; + } + + .error { + background: #663; + } +} + +@media only screen and (max-width: 375px) { + .item-list .header .time { + width: 4.05em; + } + + .item-list .detail .time span { + display: none; + } +} + +@media only screen and (max-width: 350px) { + .item-list .detail .time { + display: none; + } +} + +@media print { + .panel, .archive { + display: none; + } + + :root .panel { + display: none; + } + + .tab { + display: none; + } + + .item-list li { + page-break-inside: avoid; + break-inside: avoid; + } + + .item-list li.parent { + display: none; + } + + .has-deletable .detail { + padding-right: 0; + } + + .has-deletable .delete { + display: none; + } +} +` diff --git a/src/tpl/defaultTheme/frontend/index.html.go b/src/tpl/defaultTheme/frontend/index.html.go new file mode 100644 index 00000000..36514e22 --- /dev/null +++ b/src/tpl/defaultTheme/frontend/index.html.go @@ -0,0 +1,149 @@ +package frontend + +const DefaultTplStr = ` + + +
+ + + + + +