First commit.

master
Thomas BELLEMBOIS 3 years ago
commit a6a5a24524

@ -0,0 +1,20 @@
kind: pipeline
type: docker
name: build
trigger:
event:
- push
steps:
- name: docker-build
image: plugins/docker
settings:
dockerfile: Dockerfile
context: .
registry: hub.codefirst.iut.uca.fr
repo: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-home
username:
from_secret: SECRET_REGISTRY_USERNAME
password:
from_secret: SECRET_REGISTRY_PASSWORD

23
.gitignore vendored

@ -0,0 +1,23 @@
# ---> Go
# If you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
#
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
# Go workspace file
go.work

@ -0,0 +1,102 @@
# options for analysis running
run:
# timeout for analysis, e.g. 30s, 5m, default is 1m
timeout: 1m
# exit code when at least one issue was found, default is 1
issues-exit-code: 0
# include test files or not, default is true
tests: false
# which dirs to skip: issues from them won't be reported;
# can use regexp here: generated.*, regexp is applied on full path;
# default value is empty list, but default dirs are skipped independently
# from this option's value (see skip-dirs-use-default).
# "/" will be replaced by current OS file path separator to properly work
# on Windows.
skip-dirs:
- wasm
- static
- node_modules
- documents
- docker
- bind-*
# default is true. Enables skipping of directories:
# vendor$, third_party$, testdata$, examples$, Godeps$, builtin$
skip-dirs-use-default: true
# by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules":
# If invoked with -mod=readonly, the go command is disallowed from the implicit
# automatic updating of go.mod described above. Instead, it fails when any changes
# to go.mod are needed. This setting is most useful to check that go.mod does
# not need updates, such as in a continuous integration and testing system.
# If invoked with -mod=vendor, the go command assumes that the vendor
# directory holds the correct copies of dependencies and ignores
# the dependency descriptions in go.mod.
modules-download-mode: mod
# Allow multiple parallel golangci-lint instances running.
# If false (default) - golangci-lint acquires file lock on start.
allow-parallel-runners: true
# output configuration options
output:
# colored-line-number|line-number|json|tab|checkstyle|code-climate|junit-xml|github-actions
# default is "colored-line-number"
format: colored-line-number
# print lines of code with issue, default is true
print-issued-lines: true
# print linter name in the end of issue text, default is true
print-linter-name: true
# make issues output unique by line, default is true
uniq-by-line: true
# add a prefix to the output file references; default is no prefix
path-prefix: ""
# sorts results by: filepath, line and column
sort-results: false
# all available settings of specific linters
linters-settings:
gofmt:
# simplify code: gofmt with `-s` option, true by default
simplify: true
staticcheck:
# Select the Go version to target. The default is '1.13'.
go: "1.19"
# https://staticcheck.io/docs/options#checks
checks: ["all"]
stylecheck:
# Select the Go version to target. The default is '1.13'.
go: "1.19"
# https://staticcheck.io/docs/options#checks
checks: ["all"]
errcheck:
# report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`;
# default is false: such cases aren't reported by default.
check-blank: true
linters:
enable:
# go install github.com/kisielk/errcheck@latest
# go install github.com/gordonklaus/ineffassign@latest
# go install honnef.co/go/tools/cmd/staticcheck@latest
# go install gitlab.com/opennota/check/cmd/varcheck@latest
# go install github.com/go-critic/go-critic/cmd/gocritic@latest
- errcheck
- staticcheck
- stylecheck
- ineffassign
- varcheck
- gofmt
- gocritic
- wsl
fast: false

@ -0,0 +1,18 @@
FROM golang:1.19-bullseye
LABEL author="Thomas Bellembois"
# Copying sources.
WORKDIR /go/src/github.com/tbellembois/codefirst-home/
COPY . .
# Installing.
RUN go install -v ./...
RUN chmod +x /go/bin/codefirst-home
# Copying entrypoint.
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
USER www-data
EXPOSE 8081
CMD ["/entrypoint.sh"]

@ -0,0 +1,14 @@
# Code#0 home page
Background generated with:
```bash
grep -v "///" /tmp/TarotController.cs | tr -d "\n" > /tmp/text.txt
sed -i 's/ */ /g' text.txt
convert -background "#000000" -fill "#ffffff" -font "B612-Mono-Regular" -pointsize 14 -blur 0x2 -size 1280x1024 caption:@/tmp/text.txt /tmp/output.png
```
# TODO
- remove hard coded URLs

@ -0,0 +1,9 @@
#!/usr/bin/env bash
if [ -z "$CODEFIRSTURL" ] || [ -z "$REGISTRYURL" ]
then
echo "Missing parameter."
exit 1
fi
/go/bin/codefirst-home -codefirsturl=$CODEFIRSTURL -registryurl=$REGISTRYURL

@ -0,0 +1,12 @@
module codefirst.iut.uca.fr/tbellembois/codefirst-home
go 1.19
require (
github.com/BurntSushi/toml v1.2.0
github.com/maragudk/gomponents v0.18.0
github.com/nicksnyder/go-i18n/v2 v2.2.0
golang.org/x/text v0.3.7
)
require gopkg.in/yaml.v2 v2.4.0 // indirect

@ -0,0 +1,17 @@
github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/maragudk/gomponents v0.18.0 h1:EcdeRUWsWW6hK9ftnGAoyXR00SQWecCBxuXghQvdEcc=
github.com/maragudk/gomponents v0.18.0/go.mod h1:0OdlqOoqxcwvhBFrp8wlKHnEXhNB7IVhb8GuARmd+tI=
github.com/nicksnyder/go-i18n/v2 v2.2.0 h1:MNXbyPvd141JJqlU6gJKrczThxJy+kdCNivxZpBQFkw=
github.com/nicksnyder/go-i18n/v2 v2.2.0/go.mod h1:4OtLfzqyAxsscyCb//3gfqSvBc81gImX91LrZzczN1o=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.3.0/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=

@ -0,0 +1,10 @@
changePassword = "Change my password"
logout = "Logout"
projects = "Enter Code#0"
documentation = "My generated code documentation"
cicd = "CI/CD"
codeAnalyse = "code analyse"
registry = "docker registry"
api = "docker runner"
chat = "discussions"

@ -0,0 +1,10 @@
changePassword = "Changer mon mot de passe"
logout = "Me déconnecter"
projects = "Entrer sur Code#0"
documentation = "ma documentation de code générée"
cicd = "CI/CD"
codeAnalyse = "analyse de code"
registry = "registre docker"
api = "lanceur docker"
chat = "discussions"

@ -0,0 +1,201 @@
package main
import (
"embed"
"flag"
"fmt"
"log"
"net/http"
"os"
"strings"
"github.com/BurntSushi/toml"
g "github.com/maragudk/gomponents"
c "github.com/maragudk/gomponents/components"
. "github.com/maragudk/gomponents/html"
"golang.org/x/text/language"
"github.com/nicksnyder/go-i18n/v2/i18n"
)
var (
//go:embed web/*
embedWebBox embed.FS
i18nBundle *i18n.Bundle
test bool
codefirsturl, registryurl string
proxypath string
)
func init() {
i18nBundle = i18n.NewBundle(language.English)
i18nBundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
i18nBundle.MustLoadMessageFile("lang/en.toml")
i18nBundle.MustLoadMessageFile("lang/fr.toml")
flag.StringVar(&codefirsturl, "codefirsturl", "", "code#0 main URL")
flag.StringVar(&registryurl, "registryurl", "", "code#0 registry URL")
flag.StringVar(&proxypath, "proxypath", "/home/", "application proxy path (default: /home)")
flag.BoolVar(&test, "test", false, "render the page for development purposes")
flag.Parse()
if !test && (codefirsturl == "" || registryurl == "") {
fmt.Println("Missing parameter.")
os.Exit(1)
}
if test {
proxypath = "/"
}
codefirsturl = strings.TrimSuffix(codefirsturl, "/")
registryurl = strings.TrimSuffix(registryurl, "/")
}
func handler(w http.ResponseWriter, r *http.Request) {
xForwardedUser := r.Header["X-Forwarded-User"]
if test {
xForwardedUser = []string{"test@test.com"}
}
if len(xForwardedUser) == 0 || xForwardedUser[0] == "" {
w.WriteHeader(http.StatusUnauthorized)
return
}
lang := r.FormValue("lang")
accept := r.Header.Get("Accept-Language")
localizer := i18n.NewLocalizer(i18nBundle, lang, accept)
// changePasswordMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
// DefaultMessage: &i18n.Message{
// ID: "changePassword",
// },
// })
logoutMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
DefaultMessage: &i18n.Message{
ID: "logout",
},
})
projectsMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
DefaultMessage: &i18n.Message{
ID: "projects",
},
})
// cicdMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
// DefaultMessage: &i18n.Message{
// ID: "cicd",
// },
// })
// codeAnalyseMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
// DefaultMessage: &i18n.Message{
// ID: "codeAnalyse",
// },
// })
// registryMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
// DefaultMessage: &i18n.Message{
// ID: "registry",
// },
// })
// apiMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
// DefaultMessage: &i18n.Message{
// ID: "api",
// },
// })
// documentationMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
// DefaultMessage: &i18n.Message{
// ID: "documentation",
// },
// })
// chatMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
// DefaultMessage: &i18n.Message{
// ID: "chat",
// },
// })
pageContent := Div(Class("card mx-auto mt-5 p-3"), StyleAttr("width: 29rem;"),
Img(Src(proxypath+"web/img/logo.png"), Width("110px"), Class("mx-auto d-block")),
Div(Class("card-body"),
P(Class("card-text text-center fst-italic"), g.Text(xForwardedUser[0])),
Div(Class("row"),
A(Href(fmt.Sprintf("%s/git/user/oauth2/keycloak", codefirsturl)), Span(Class("mdi mdi-24px mdi-git"), g.Text(projectsMessage))),
),
Div(Class("row"),
A(Href(fmt.Sprintf("%s/keycloak/realms/master/protocol/openid-connect/logout", codefirsturl)), Span(Class("mdi mdi-24px mdi-logout"), g.Text(logoutMessage))),
),
// Div(Class("row"),
// A(Href(fmt.Sprintf("%s/keycloak/realms/master/account/?referrer=security-admin-console&referrer_uri=%s/keycloak/auth/admin/master/console/%23%2Fforbidden#/security/signingin", codefirsturl, codefirsturl)), Span(Class("mdi mdi-24px mdi-lock-reset"), g.Text(changePasswordMessage))),
// ),
// Div(Class("row"),
// A(Href(fmt.Sprintf("%s/login", codefirsturl)), Span(Class("mdi mdi-24px mdi-flash"), g.Text(cicdMessage))),
// ),
// Div(Class("row"),
// A(Href(fmt.Sprintf("%s/sonar/sessions/init/oidc?return_to=/sonar/", codefirsturl)), Span(Class("mdi mdi-24px mdi-radar"), g.Text(codeAnalyseMessage))),
// ),
// Div(Class("row"),
// A(Href(registryurl), Span(Class("mdi mdi-24px mdi-docker"), g.Text(registryMessage))),
// ),
// Div(Class("row"),
// A(Href(fmt.Sprintf("%s/cinny/", codefirsturl)), Span(Class("mdi mdi-24px mdi-wechat"), g.Text(chatMessage))),
// ),
// Div(Class("row"),
// A(Href(fmt.Sprintf("%s/dockerrunner/static/html/", codefirsturl)), Span(Class("mdi mdi-24px mdi-api"), g.Text(apiMessage))),
// ),
// Div(Class("row"),
// A(Href(fmt.Sprintf("%s/documentation/", codefirsturl)), Span(Class("mdi mdi-24px mdi-file-document-edit-outline"), g.Text(documentationMessage))),
// ),
),
Div(Class("mt-sm-4"),
Img(Src(proxypath+"web/img/logo_UCA.png"), Height("50px"), Class("m-sm-2 float-start mx-auto d-block")),
Img(Src(proxypath+"web/img/logo_I-SITE.png"), Height("50px"), Class("m-sm-2 float-start mx-auto d-block")),
Img(Src(proxypath+"web/img/logo_LIA.png"), Height("50px"), Class("m-sm-2 float-start mx-auto d-block")),
Img(Src(proxypath+"web/img/logo_investir.png"), Height("50px"), Class("m-sm-2 float-start mx-auto d-block"))),
)
page := c.HTML5(c.HTML5Props{
Title: "Code#0",
Language: "fr",
Head: []g.Node{
Link(Rel("stylesheet"), Href(proxypath+"web/css/materialdesignicons.min.css")),
Link(Rel("stylesheet"), Href(proxypath+"web/css/bootstrap.min.css")),
StyleEl(Type("text/css"), g.Raw(`
body {
height: 100%;
background-image: url('`+proxypath+`web/img/home_background.png');
background-position: center;
background-repeat-x: no-repeat;
background-repeat-y: repeat;
background-size: cover;
}
`)),
},
Body: []g.Node{
Div(Class("container"), ID("indexPage"), pageContent),
Div(g.Group([]g.Node{
Script(Src(proxypath + "web/js/bootstrap.bundle.min.js")),
g.Raw(`
<script>
</script>
`),
}),
),
},
})
if err := page.Render(w); err != nil {
panic(err)
}
}
func main() {
http.Handle("/web/", http.FileServer(http.FS(embedWebBox)))
http.HandleFunc("/", handler)
log.Println("Server running.")
log.Fatal(http.ListenAndServe(":8081", nil))
}

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
sodipodi:docname="logo_src.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.1189113"
inkscape:cx="248.4558"
inkscape:cy="116.18437"
inkscape:window-width="1680"
inkscape:window-height="971"
inkscape:window-x="1919"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<rect
x="-336.70795"
y="127.99328"
width="209.87611"
height="149.73874"
id="rect12524" />
<rect
x="172.61521"
y="238.41853"
width="42.56784"
height="60.495624"
id="rect8717" />
<rect
x="251.56507"
y="248.60825"
width="50.496166"
height="48.975785"
id="rect4017" />
<linearGradient
id="linearGradient1887"
inkscape:swatch="solid">
<stop
style="stop-color:#ff0000;stop-opacity:1;"
offset="0"
id="stop1885" />
</linearGradient>
</defs>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g1847"
transform="translate(-23.20122,17.155155)"
style="stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
inkscape:export-filename="/home/thbellem/workspace/workspace_go/src/github.com/tbellembois/codefirst-home/web/img/logo.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<path
id="path97"
style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.09943;stroke-opacity:1;fill-opacity:1"
d="M 362.23828,47.744141 A 150.63138,150.63138 0 0 0 211.60547,198.375 150.63138,150.63138 0 0 0 362.23828,349.00586 150.63138,150.63138 0 0 0 512.86914,198.375 150.63138,150.63138 0 0 0 480.29688,104.82812 l -26.8711,26.8711 A 112.97354,112.97354 0 0 1 475.21094,198.375 112.97354,112.97354 0 0 1 362.23828,311.34961 112.97354,112.97354 0 0 1 249.26367,198.375 112.97354,112.97354 0 0 1 362.23828,85.402344 112.97354,112.97354 0 0 1 428.91406,107.1875 L 455.78711,80.314453 A 150.63138,150.63138 0 0 0 362.23828,47.744141 Z"
transform="scale(0.26458333)" />
</g>
<circle
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.308562;stroke-opacity:1"
id="path2035"
cx="72.640732"
cy="69.641876"
r="12.61682"
inkscape:export-filename="/home/thbellem/workspace/workspace_go/src/github.com/tbellembois/codefirst-home/web/img/logo.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
<text
xml:space="preserve"
transform="matrix(0.65793161,0,0,0.55335418,-100.39821,-80.152448)"
id="text4015"
style="font-style:normal;font-weight:bold;font-size:40px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect4017);fill:#ffffff;fill-opacity:1;stroke:none;-inkscape-font-specification:'sans-serif, Bold';font-stretch:normal;font-variant:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
inkscape:export-filename="/home/thbellem/workspace/workspace_go/src/github.com/tbellembois/codefirst-home/web/img/logo.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"><tspan
x="251.56445"
y="285.00243"
id="tspan853">0</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.64987515,0,0,0.69128672,-69.360458,-110.46111)"
id="text8715"
style="font-style:normal;font-weight:bold;font-size:40px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect8717);fill:#000000;fill-opacity:1;stroke:none;-inkscape-font-specification:'sans-serif, Bold';font-stretch:normal;font-variant:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
inkscape:export-filename="/home/thbellem/workspace/workspace_go/src/github.com/tbellembois/codefirst-home/web/img/logo.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"><tspan
x="172.61523"
y="274.81298"
id="tspan855">#</tspan></text>
<path
style="color:#000000;fill:#000000;stroke-linecap:round;-inkscape-stroke:none"
d="m 150.63511,99.489997 -8.17383,5.447263 8.17383,5.44922 v -3.94922 h 42.28684 l 1.32422,2.64649 h 9.9668 l -2.07227,-4.14453 2.07227,-4.14649 h -9.9668 l -1.32422,2.64453 h -42.28684 z"
id="path1050"
sodipodi:nodetypes="ccccccccccccc" />
<path
style="color:#000000;fill:#000000;stroke-linecap:round;-inkscape-stroke:none"
d="m 80.34328,54.272826 -1.92798,9.63157 9.63296,-1.926593 -2.79252,-2.792519 29.90126,-29.901318 2.80771,0.934981 7.04759,-7.047592 -4.39594,-1.465309 -1.46669,-4.397323 -7.0476,7.047591 0.9336,2.806331 -29.90125,29.901319 z"
id="path1050-1"
sodipodi:nodetypes="ccccccccccccc"
inkscape:export-filename="/home/thbellem/workspace/workspace_go/src/github.com/tbellembois/codefirst-home/web/img/logo.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

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
Loading…
Cancel
Save